kde-playground/kdepim/kalarm/timeselector.cpp
2015-04-14 21:49:29 +00:00

180 lines
5.3 KiB
C++

/*
* timeselector.cpp - widget to optionally set a time period
* Program: kalarm
* Copyright © 2004,2005,2007,2009-2011 by David Jarvie <djarvie@kde.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "kalarm.h"
#include "checkbox.h"
#include "combobox.h"
#include "timeselector.h"
#include <klocale.h>
#include <kdialog.h>
#include <khbox.h>
#include <kdebug.h>
#include <QHBoxLayout>
#ifdef USE_AKONADI
using namespace KCalCore;
#else
using namespace KCal;
#endif
TimeSelector::TimeSelector(const QString& selectText, const QString& selectWhatsThis,
const QString& valueWhatsThis, bool allowHourMinute, QWidget* parent)
: QFrame(parent),
mSignWidget(0),
mReadOnly(false)
{
QHBoxLayout* layout = new QHBoxLayout(this);
layout->setMargin(0);
layout->setSpacing(KDialog::spacingHint());
mSelect = new CheckBox(selectText, this);
mSelect->setFixedSize(mSelect->sizeHint());
connect(mSelect, SIGNAL(toggled(bool)), SLOT(selectToggled(bool)));
mSelect->setWhatsThis(selectWhatsThis);
layout->addWidget(mSelect);
KHBox* box = new KHBox(this); // to group widgets for QWhatsThis text
box->setSpacing(KDialog::spacingHint());
layout->addWidget(box);
mPeriod = new TimePeriod(allowHourMinute, box);
mPeriod->setFixedSize(mPeriod->sizeHint());
mPeriod->setSelectOnStep(false);
#ifdef USE_AKONADI
connect(mPeriod, SIGNAL(valueChanged(KCalCore::Duration)), SLOT(periodChanged(KCalCore::Duration)));
#else
connect(mPeriod, SIGNAL(valueChanged(KCal::Duration)), SLOT(periodChanged(KCal::Duration)));
#endif
mSelect->setFocusWidget(mPeriod);
mPeriod->setEnabled(false);
box->setWhatsThis(valueWhatsThis);
layout->addStretch();
}
/******************************************************************************
* Create a ComboBox used to select the time period's sign.
* The caller is responsible for populating the ComboBox and handling its value.
*/
ComboBox* TimeSelector::createSignCombo()
{
delete mSignWidget;
mSignWidget = new ComboBox(mPeriod->parentWidget());
mSignWidget->setEnabled(mPeriod->isEnabled());
return mSignWidget;
}
/******************************************************************************
* Set the read-only status.
*/
void TimeSelector::setReadOnly(bool ro)
{
if ((int)ro != (int)mReadOnly)
{
mReadOnly = ro;
mSelect->setReadOnly(mReadOnly);
mPeriod->setReadOnly(mReadOnly);
if (mSignWidget)
mSignWidget->setReadOnly(mReadOnly);
}
}
bool TimeSelector::isChecked() const
{
return mSelect->isChecked();
}
void TimeSelector::setChecked(bool on)
{
if (on != mSelect->isChecked())
{
mSelect->setChecked(on);
emit valueChanged(period());
}
}
void TimeSelector::setMaximum(int hourmin, int days)
{
mPeriod->setMaximum(hourmin, days);
}
void TimeSelector::setDateOnly(bool dateOnly)
{
mPeriod->setDateOnly(dateOnly);
}
/******************************************************************************
* Get the specified number of minutes.
* Reply = 0 if unselected.
*/
Duration TimeSelector::period() const
{
return mSelect->isChecked() ? mPeriod->period() : Duration(0);
}
/******************************************************************************
* Initialise the controls with a specified time period.
* If minutes = 0, it will be deselected.
* The time unit combo-box is initialised to 'defaultUnits', but if 'dateOnly'
* is true, it will never be initialised to hours/minutes.
*/
void TimeSelector::setPeriod(const Duration& period, bool dateOnly, TimePeriod::Units defaultUnits)
{
mSelect->setChecked(period);
mPeriod->setEnabled(period);
if (mSignWidget)
mSignWidget->setEnabled(period);
mPeriod->setPeriod(period, dateOnly, defaultUnits);
}
/******************************************************************************
* Set the input focus on the count field.
*/
void TimeSelector::setFocusOnCount()
{
mPeriod->setFocusOnCount();
}
/******************************************************************************
* Called when the TimeSelector checkbox is toggled.
*/
void TimeSelector::selectToggled(bool on)
{
mPeriod->setEnabled(on);
if (mSignWidget)
mSignWidget->setEnabled(on);
if (on)
mPeriod->setFocus();
emit toggled(on);
emit valueChanged(period());
}
/******************************************************************************
* Called when the period value changes.
*/
void TimeSelector::periodChanged(const Duration& period)
{
if (mSelect->isChecked())
emit valueChanged(period);
}
// vim: et sw=4: