diff options
Diffstat (limited to 'kteatime/timeedit.cpp')
-rw-r--r-- | kteatime/timeedit.cpp | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/kteatime/timeedit.cpp b/kteatime/timeedit.cpp new file mode 100644 index 0000000..c101de0 --- /dev/null +++ b/kteatime/timeedit.cpp @@ -0,0 +1,146 @@ +/* ------------------------------------------------------------- + + timeedit.cpp + + (C) 2003 by Daniel Teske (teske@bigfoot.com) + + ------------------------------------------------------------- */ + +#include <klocale.h> +#include <qlabel.h> +#include <qlayout.h> + +#include "timeedit.h" +#include "timeedit.moc" + +WrappingSpinBox::WrappingSpinBox(int minValue, int maxValue, int step, QWidget *parent, const char *name) + : QSpinBox(minValue, maxValue, step, parent, name) +{ +} + +WrappingSpinBox::~WrappingSpinBox() +{ +} + + +/** Overloaded QSpinBox method */ +void WrappingSpinBox::stepUp() +{ + bool wrap = false; + if (value() == 59) + wrap = true; + if (wrap) + emit wrapUp(); // must wrap first (to avoid double-step-up) + QSpinBox::stepUp(); +} + +/** Overloaded QSpinBox method */ +void WrappingSpinBox::stepDown() +{ + bool wrap = false; + if (value() == 0) + wrap = true; + QSpinBox::stepDown(); + if (wrap) + emit wrapDown(); +} + + +// ------------------------------------------------------------------------- + + +TimeEdit::TimeEdit(QWidget* parent, const char* name) + : QWidget(parent, name) +{ + layout = new QHBoxLayout(this); + minuteBox = new QSpinBox(0, 300, 1, this); +// minuteBox->setFixedSize(minuteBox->sizeHint()); + + QLabel* min = new QLabel(i18n(" min"), this); + min->setFixedSize(min->sizeHint()); + secondBox = new WrappingSpinBox(0, 59, 1, this); + secondBox->setWrapping(true); +// secondBox->setFixedSize(secondBox->sizeHint()); + + QLabel* sec = new QLabel(i18n(" sec"),this); + sec->setFixedSize(sec->sizeHint()); + + layout->addWidget(minuteBox); + layout->addWidget(min); + + layout->addWidget(secondBox); + layout->addWidget(sec); + + connect(minuteBox, SIGNAL(valueChanged(int)), SLOT(spinBoxValueChanged(int)) ); + connect(secondBox, SIGNAL(valueChanged(int)), SLOT(spinBoxValueChanged(int)) ); + connect(secondBox, SIGNAL(wrapUp()), SLOT(wrappedUp())); + connect(secondBox, SIGNAL(wrapDown()), SLOT(wrappedDown())); +} + +TimeEdit::~TimeEdit() +{ +} + +/** Set to specified number of seconds. */ +void TimeEdit::setValue(int val) +{ + if (val < 0) + return; + + // block signals to avoid receiption of valueChanged() + // between changing of minutes and seconds + secondBox->blockSignals(true); + minuteBox->blockSignals(true); + + secondBox->setValue(val % 60); + minuteBox->setValue(val / 60); + + secondBox->blockSignals(false); + minuteBox->blockSignals(false); + + emit valueChanged(value()); +} + +/** Return current value in seconds. */ +int TimeEdit::value() +{ + return minuteBox->value()*60 + secondBox->value(); +} + +/** SLOT: Handle wrap-up of seconds-box */ +void TimeEdit::wrappedUp() +{ + if (minuteBox->value() != minuteBox->maxValue()) { + minuteBox->stepUp(); + } else { + secondBox->setValue(58); // ugly: must cater for wrapping-first + } +} + +/** SLOT: Handle wrap-down of seconds-box */ +void TimeEdit::wrappedDown() +{ + // well, the "if" should always be true + if (minuteBox->value() != minuteBox->minValue()) { + minuteBox->stepDown(); + } else { + secondBox->setValue(0); + } +} + +/** SLOT: Handle any change in minutes of seconds */ +void TimeEdit::spinBoxValueChanged(int) +{ + if (value() == 0) { + secondBox->stepUp(); // this will give another spinBoxValueChanged() invocation + return; + } + + emit valueChanged(value()); +} + +/** SLOT (overloading QSpinBox): set focus */ +void TimeEdit::setFocus() +{ + minuteBox->setFocus(); +} |