File indexing completed on 2024-05-12 12:41:37

0001 /*
0002  *   SPDX-FileCopyrightText: 2019 David Edmundson <davidedmundson@kde.org>
0003  *
0004  *   SPDX-License-Identifier: LGPL-2.0-or-later
0005  */
0006 
0007 #include "timeinputvalidator.h"
0008 
0009 #include "qdatetimeparser_p.h"
0010 
0011 static QDateTime nullDateTime()
0012 {
0013     return QDateTime(QDate::currentDate(), QTime(0, 0));
0014 }
0015 
0016 class TimeInputValidatorPrivate : public QDateTimeParser
0017 {
0018 public:
0019     TimeInputValidatorPrivate();
0020 
0021     void fixup(QString &input) const;
0022     QValidator::State validate(QString &input, int &pos) const;
0023 
0024     QDateTime defaultValue;
0025     QString format;
0026 };
0027 
0028 TimeInputValidatorPrivate::TimeInputValidatorPrivate()
0029     : QDateTimeParser(QMetaType::QDateTime, Context::DateTimeEdit)
0030     , defaultValue(nullDateTime())
0031 {
0032 }
0033 
0034 void TimeInputValidatorPrivate::fixup(QString &input) const
0035 {
0036     if (input.isEmpty()) {
0037         return;
0038     }
0039 
0040     if (format.isEmpty()) {
0041         return;
0042     }
0043 
0044     const StateNode stateNode = parse(input, cursorPosition(), defaultValue, true);
0045 
0046     input = stateNode.input;
0047 }
0048 
0049 QValidator::State TimeInputValidatorPrivate::validate(QString &input, int &pos) const
0050 {
0051     if (input.isEmpty()) {
0052         return QValidator::State::Invalid;
0053     }
0054 
0055     if (format.isEmpty()) {
0056         return QValidator::State::Invalid;
0057     }
0058 
0059     const StateNode stateNode = parse(input, pos, defaultValue, false);
0060 
0061     // TODO: Take conflicts field into account?
0062     input = stateNode.input;
0063     pos += stateNode.padded;
0064 
0065     return QValidator::State(stateNode.state);
0066 }
0067 
0068 TimeInputValidator::TimeInputValidator(QObject *parent)
0069     : QValidator(parent)
0070     , d(new TimeInputValidatorPrivate)
0071 {
0072 }
0073 
0074 TimeInputValidator::~TimeInputValidator()
0075 {
0076 }
0077 
0078 void TimeInputValidator::fixup(QString &input) const
0079 {
0080     d->fixup(input);
0081 }
0082 
0083 QValidator::State TimeInputValidator::validate(QString &input, int &pos) const
0084 {
0085     return d->validate(input, pos);
0086 }
0087 
0088 QString TimeInputValidator::format() const
0089 {
0090     return d->format;
0091 }
0092 
0093 void TimeInputValidator::setFormat(const QString &format)
0094 {
0095     if (d->format == format) {
0096         return;
0097     }
0098     if (!d->parseFormat(format)) {
0099         return;
0100     }
0101     d->format = format;
0102     Q_EMIT formatChanged();
0103 }
0104 
0105 #include "moc_timeinputvalidator.cpp"