From 6aec424aa52a9c23a6327d78d931f547a60507ca Mon Sep 17 00:00:00 2001 From: wmayer Date: Wed, 5 Jan 2022 20:15:03 +0100 Subject: [PATCH] Gui: override QuantitySpinBox::setExpression and validate expression to update internal representation --- src/Gui/QuantitySpinBox.cpp | 40 +++++++++++++++++++++++++++---------- src/Gui/QuantitySpinBox.h | 2 ++ 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/Gui/QuantitySpinBox.cpp b/src/Gui/QuantitySpinBox.cpp index 1e8d60fd89..dd36f976a1 100644 --- a/src/Gui/QuantitySpinBox.cpp +++ b/src/Gui/QuantitySpinBox.cpp @@ -455,6 +455,21 @@ void QuantitySpinBox::updateText(const Quantity &quant) handlePendingEmit(); } +void QuantitySpinBox::validateInput() +{ + Q_D(QuantitySpinBox); + + int pos = 0; + QValidator::State state; + QString text = lineEdit()->text(); + d->validateAndInterpret(text, pos, state); + if (state != QValidator::Acceptable) { + lineEdit()->setText(d->validStr); + } + + handlePendingEmit(); +} + Base::Quantity QuantitySpinBox::value() const { Q_D(const QuantitySpinBox); @@ -700,6 +715,19 @@ QString QuantitySpinBox::getUserString(const Base::Quantity& val) const } } +void QuantitySpinBox::setExpression(std::shared_ptr expr) +{ + Q_ASSERT(isBound()); + + try { + ExpressionBinding::setExpression(expr); + validateInput(); + } + catch (const Base::Exception & e) { + showInvalidExpression(QString::fromLatin1(e.what())); + } +} + QAbstractSpinBox::StepEnabled QuantitySpinBox::stepEnabled() const { Q_D(const QuantitySpinBox); @@ -869,17 +897,7 @@ void QuantitySpinBox::focusInEvent(QFocusEvent * event) void QuantitySpinBox::focusOutEvent(QFocusEvent * event) { - Q_D(QuantitySpinBox); - - int pos = 0; - QString text = lineEdit()->text(); - QValidator::State state; - d->validateAndInterpret(text, pos, state); - if (state != QValidator::Acceptable) { - lineEdit()->setText(d->validStr); - } - - handlePendingEmit(); + validateInput(); QToolTip::hideText(); QAbstractSpinBox::focusOutEvent(event); diff --git a/src/Gui/QuantitySpinBox.h b/src/Gui/QuantitySpinBox.h index d0f34fa11c..49872e3b70 100644 --- a/src/Gui/QuantitySpinBox.h +++ b/src/Gui/QuantitySpinBox.h @@ -141,6 +141,7 @@ protected Q_SLOTS: void handlePendingEmit(); protected: + virtual void setExpression(std::shared_ptr expr); virtual void openFormulaDialog(); virtual StepEnabled stepEnabled() const; virtual void showEvent(QShowEvent * event); @@ -153,6 +154,7 @@ protected: virtual void paintEvent(QPaintEvent *event); private: + void validateInput(); void updateText(const Base::Quantity&); void updateFromCache(bool); QString getUserString(const Base::Quantity& val, double& factor, QString& unitString) const;