diff --git a/ui/widgets/time_input.cpp b/ui/widgets/time_input.cpp index ee80060..aea09ca 100644 --- a/ui/widgets/time_input.cpp +++ b/ui/widgets/time_input.cpp @@ -76,13 +76,15 @@ private: }; -int Number(not_null field) { +std::optional Number(not_null field) { const auto text = field->getLastText(); auto ref = text.midRef(0); - while (!ref.isEmpty() && ref.at(0) == '0') { + while (ref.size() > 1 && ref.at(0) == '0') { ref = ref.mid(1); } - return ref.toInt(); + return QRegularExpression("^\\d+$").match(ref).hasMatch() + ? std::make_optional(ref.toInt()) + : std::nullopt; } void TimePart::setMaxValue(int value) { @@ -118,7 +120,11 @@ void TimePart::keyPressEvent(QKeyEvent *e) { void TimePart::wheelEvent(QWheelEvent *e) { const auto direction = WheelDirection(e); - auto time = Number(this) + (direction * _wheelStep); + const auto now = Number(this); + if (!now.has_value()) { + return; + } + auto time = *now + (direction * _wheelStep); const auto max = _maxValue + 1; if (time < 0) { time += max; @@ -248,13 +254,13 @@ TimeInput::TimeInput( }, lifetime()); const auto submitHour = [=] { - if (hour()) { + if (hour().has_value()) { _minute->setFocus(); } }; const auto submitMinute = [=] { - if (minute()) { - if (hour()) { + if (minute().has_value()) { + if (hour().has_value()) { _submitRequests.fire({}); } else { _hour->setFocus(); @@ -290,7 +296,7 @@ void TimeInput::erasePrevious(const object_ptr &field) { } bool TimeInput::setFocusFast() { - if (hour()) { + if (hour().has_value()) { _minute->setFocusFast(); } else { _hour->setFocusFast(); @@ -298,18 +304,18 @@ bool TimeInput::setFocusFast() { return true; } -int TimeInput::hour() const { +std::optional TimeInput::hour() const { return Number(_hour); } -int TimeInput::minute() const { +std::optional TimeInput::minute() const { return Number(_minute); } QString TimeInput::valueCurrent() const { const auto result = QString("%1:%2" - ).arg(hour() - ).arg(minute(), 2, 10, QChar('0')); + ).arg(hour().value_or(0) + ).arg(minute().value_or(0), 2, 10, QChar('0')); return ValidateTime(result).isValid() ? result : QString(); } @@ -422,7 +428,7 @@ void TimeInput::showError() { } void TimeInput::setInnerFocus() { - if (hour()) { + if (hour().has_value()) { _minute->setFocus(); } else { _hour->setFocus(); diff --git a/ui/widgets/time_input.h b/ui/widgets/time_input.h index bc8a187..e8edd5a 100644 --- a/ui/widgets/time_input.h +++ b/ui/widgets/time_input.h @@ -26,10 +26,10 @@ public: const style::margins &stSeparatorPadding); bool setFocusFast(); - rpl::producer value() const; - rpl::producer<> submitRequests() const; - rpl::producer<> focuses() const; - QString valueCurrent() const; + [[nodiscard]] rpl::producer value() const; + [[nodiscard]] rpl::producer<> submitRequests() const; + [[nodiscard]] rpl::producer<> focuses() const; + [[nodiscard]] QString valueCurrent() const; void showError(); int resizeGetHeight(int width) override; @@ -49,8 +49,8 @@ private: template bool insideSeparator(QPoint position, const Widget &widget) const; - int hour() const; - int minute() const; + [[nodiscard]] std::optional hour() const; + [[nodiscard]] std::optional minute() const; const style::InputField &_stField; const style::InputField &_stDateField;