File indexing completed on 2024-05-12 16:14:34
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"