From 9cc78c4d9ed4e791e1d3dda71dbefc9bcc026352 Mon Sep 17 00:00:00 2001 From: wmayer Date: Mon, 19 Dec 2022 13:47:15 +0100 Subject: [PATCH] Gui: support of range checks in DlgExpressionInput --- src/Gui/DlgExpressionInput.cpp | 44 +++++++++++++++++++++++++++++++++- src/Gui/DlgExpressionInput.h | 16 +++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/src/Gui/DlgExpressionInput.cpp b/src/Gui/DlgExpressionInput.cpp index 76658d645d..53c3a8efd9 100644 --- a/src/Gui/DlgExpressionInput.cpp +++ b/src/Gui/DlgExpressionInput.cpp @@ -111,6 +111,45 @@ DlgExpressionInput::~DlgExpressionInput() delete ui; } +void NumberRange::setRange(double min, double max) +{ + minimum = min; + maximum = max; + defined = true; +} + +void NumberRange::clearRange() +{ + defined = false; +} + +void NumberRange::throwIfOutOfRange(const Base::Quantity& value) const +{ + if (!defined) + return; + + if (value.getValue() < minimum || value.getValue() > maximum) { + Base::Quantity minVal(minimum, value.getUnit()); + Base::Quantity maxVal(maximum, value.getUnit()); + QString valStr = value.getUserString(); + QString minStr = minVal.getUserString(); + QString maxStr = maxVal.getUserString(); + QString error = QString::fromLatin1("Value out of range (%1 out of [%2, %3])").arg(valStr, minStr, maxStr); + + throw Base::ValueError(error.toStdString()); + } +} + +void DlgExpressionInput::setRange(double minimum, double maximum) +{ + numberRange.setRange(minimum, maximum); +} + +void DlgExpressionInput::clearRange() +{ + numberRange.clearRange(); +} + QPoint DlgExpressionInput::expressionPosition() const { return ui->expression->pos(); @@ -179,10 +218,13 @@ void DlgExpressionInput::textChanged(const QString &text) ui->msg->setPalette(p); } + numberRange.throwIfOutOfRange(value); + ui->msg->setText(msg); } - else + else { ui->msg->setText(Base::Tools::fromStdString(result->toString())); + } } } diff --git a/src/Gui/DlgExpressionInput.h b/src/Gui/DlgExpressionInput.h index e11081bb64..180cdf2000 100644 --- a/src/Gui/DlgExpressionInput.h +++ b/src/Gui/DlgExpressionInput.h @@ -46,6 +46,19 @@ namespace Gui { namespace Dialog { +class GuiExport NumberRange +{ +public: + void setRange(double minimum, double maximum); + void clearRange(); + void throwIfOutOfRange(const Base::Quantity&) const; + +private: + double minimum{}; + double maximum{}; + bool defined{false}; +}; + class GuiExport DlgExpressionInput : public QDialog { Q_OBJECT @@ -54,6 +67,8 @@ public: explicit DlgExpressionInput(const App::ObjectIdentifier & _path, std::shared_ptr _expression, const Base::Unit &_impliedUnit, QWidget *parent = nullptr); ~DlgExpressionInput() override; + void setRange(double minimum, double maximum); + void clearRange(); std::shared_ptr getExpression() const { return expression; } bool discardedFormula() const { return discarded; } @@ -81,6 +96,7 @@ private: App::ObjectIdentifier path; bool discarded; const Base::Unit impliedUnit; + NumberRange numberRange; int minimumWidth; };