diff --git a/src/ktimecombobox.cpp b/src/ktimecombobox.cpp --- a/src/ktimecombobox.cpp +++ b/src/ktimecombobox.cpp @@ -22,9 +22,72 @@ #include #include #include +#include #include "kmessagebox.h" +class KTimeValidator : public QValidator +{ + Q_OBJECT +public: + KTimeValidator(QString timeFormat, QObject *parent = Q_NULLPTR); + KTimeValidator(QString timeFormat, QTime min, QTime max, QObject *parent = Q_NULLPTR); + ~KTimeValidator(); + virtual State validate(QString &input, int &pos) const Q_DECL_OVERRIDE; + void setMin(QTime min); + void setMax(QTime max); + +private: + QString m_timeFormat; + QTime m_min, m_max; +}; + +KTimeValidator::KTimeValidator(QString timeFormat, QObject *parent) + : QValidator(parent) + , m_timeFormat(timeFormat) +{ +} + +KTimeValidator::KTimeValidator(QString timeFormat, QTime min, QTime max, QObject *parent) + : QValidator(parent) + , m_timeFormat(timeFormat) + , m_min(min) + , m_max(max) +{ +} + +KTimeValidator::~KTimeValidator() +{ +} + +void KTimeValidator::setMax(QTime max) +{ + m_max = max; +} + +void KTimeValidator::setMin(QTime min) +{ + m_min = min; +} + +QValidator::State KTimeValidator::validate(QString &input, int &pos) const +{ + Q_UNUSED(pos); + QTime t = QTime::fromString(input, m_timeFormat); + if (t.isValid()) { + if (m_min.isValid() && t < m_min) { + return State::Invalid; + } + if (m_max.isValid() && t > m_max) { + return State::Invalid; + } + + return State::Acceptable; + } else { + return State::Invalid; + } +} + class KTimeComboBoxPrivate { public: @@ -62,14 +125,16 @@ QLocale::FormatType m_displayFormat; int m_timeListInterval; QList m_timeList; + KTimeValidator *m_validator; }; KTimeComboBoxPrivate::KTimeComboBoxPrivate(KTimeComboBox *q) - : q(q), - m_time(QTime(0, 0, 0)), - m_warningShown(false), - m_displayFormat(QLocale::ShortFormat), - m_timeListInterval(15) + : q(q) + , m_time(QTime(0, 0, 0)) + , m_warningShown(false) + , m_displayFormat(QLocale::ShortFormat) + , m_timeListInterval(15) + , m_validator(Q_NULLPTR) { m_options = KTimeComboBox::EditTime | KTimeComboBox::SelectTime; m_minTime = defaultMinTime(); @@ -78,6 +143,9 @@ KTimeComboBoxPrivate::~KTimeComboBoxPrivate() { + if (m_validator) { + delete m_validator; + } } QTime KTimeComboBoxPrivate::defaultMinTime() @@ -154,6 +222,14 @@ const QLocale locale = q->locale(); q->lineEdit()->setInputMask(timeFormatToInputMask(locale.timeFormat(m_displayFormat))); m_nullString = timeFormatToInputMask(locale.timeFormat(m_displayFormat), true); + // Set the validator for the current format + if (m_validator) { + q->lineEdit()->setValidator(Q_NULLPTR); + delete m_validator; + } + m_validator = new KTimeValidator(locale.timeFormat(m_displayFormat), + m_minTime, m_maxTime); + q->lineEdit()->setValidator(m_validator); // If EditTime then set the line edit q->lineEdit()->setReadOnly((m_options & KTimeComboBox::EditTime) != KTimeComboBox::EditTime); @@ -320,10 +396,7 @@ bool KTimeComboBox::isValid() const { - d->parseTime(); - return d->m_time.isValid() && - d->m_time >= d->m_minTime && - d->m_time <= d->m_maxTime; + return lineEdit()->hasAcceptableInput(); } bool KTimeComboBox::isNull() const @@ -532,3 +605,4 @@ } #include "moc_ktimecombobox.cpp" +#include "ktimecombobox.moc"