From 6664907bd504983d1a55be51e00fe097446c0653 Mon Sep 17 00:00:00 2001 From: tetektoza Date: Sat, 7 Jun 2025 21:00:27 +0200 Subject: [PATCH] Sketcher: Allow user to reset OVP state using backspace key Currently if user tries to reset OVP, they can only do that by entering "0" for example, and then the parameters will get unset in unsetOnViewParameter. But that will only happen if user types a value that's under confusion point (typically 1e^-7). In my opinion, it would be cool to reset that state if user deletes all content in the label, to allow them to specify coordinates with mouse once again. Also, this patch fixes a regression with backspace, where deleting stuff from OVP was working on unix systems, but seems like on Windows it doesn't pass the check. --- src/Gui/EditableDatumLabel.cpp | 9 ++++++++- src/Gui/EditableDatumLabel.h | 1 + src/Gui/QuantitySpinBox.cpp | 5 +++++ src/Mod/Sketcher/Gui/DrawSketchController.h | 10 ++++++++++ src/Mod/Sketcher/Gui/DrawSketchKeyboardManager.cpp | 7 +++++-- 5 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/Gui/EditableDatumLabel.cpp b/src/Gui/EditableDatumLabel.cpp index 8608704d53..f863b76ab0 100644 --- a/src/Gui/EditableDatumLabel.cpp +++ b/src/Gui/EditableDatumLabel.cpp @@ -186,9 +186,16 @@ void EditableDatumLabel::startEdit(double val, QObject* eventFilteringObj, bool return; } - isSet = true; + if (!spinBox->hasValidInput()) { + // unset parameters in DrawSketchController, this is needed in a case + // when user removes values we reset state of the OVP + Q_EMIT this->parameterUnset(); + return; + } + value = spinBox->rawValue(); + isSet = true; Q_EMIT this->valueChanged(value); }; diff --git a/src/Gui/EditableDatumLabel.h b/src/Gui/EditableDatumLabel.h index 320f391a0e..380532a681 100644 --- a/src/Gui/EditableDatumLabel.h +++ b/src/Gui/EditableDatumLabel.h @@ -94,6 +94,7 @@ public: Q_SIGNALS: void valueChanged(double val); + void parameterUnset(); protected: bool eventFilter(QObject* watched, QEvent* event) override; diff --git a/src/Gui/QuantitySpinBox.cpp b/src/Gui/QuantitySpinBox.cpp index 4631b45c75..333f89d9b8 100644 --- a/src/Gui/QuantitySpinBox.cpp +++ b/src/Gui/QuantitySpinBox.cpp @@ -571,6 +571,11 @@ void QuantitySpinBox::userInput(const QString & text) } else { d->validInput = false; + + // we have to emit here signal explicitly as validator will not pass + // this value further but we want to check it to disable isSet flag if + // it has been set previously + Q_EMIT valueChanged(d->quantity.getValue()); return; } diff --git a/src/Mod/Sketcher/Gui/DrawSketchController.h b/src/Mod/Sketcher/Gui/DrawSketchController.h index 3642f9eca5..cf59ba0efb 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchController.h +++ b/src/Mod/Sketcher/Gui/DrawSketchController.h @@ -618,6 +618,16 @@ protected: parameter->setColor(colorManager.dimConstrColor); onViewValueChanged(i, value); }); + + // this gets triggered whenever user deletes content in OVP, we remove the + // constraints and unset everything to give user another change to select stuff + // with mouse + QObject::connect(parameter, + &Gui::EditableDatumLabel::parameterUnset, + [this, parameter]() { + unsetOnViewParameter(parameter); + finishControlsChanged(); + }); } } diff --git a/src/Mod/Sketcher/Gui/DrawSketchKeyboardManager.cpp b/src/Mod/Sketcher/Gui/DrawSketchKeyboardManager.cpp index 498200f70b..d678fa2aef 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchKeyboardManager.cpp +++ b/src/Mod/Sketcher/Gui/DrawSketchKeyboardManager.cpp @@ -101,8 +101,11 @@ void DrawSketchKeyboardManager::detectKeyboardEventHandlingMode(QKeyEvent* keyEv if (keyEvent->key() == Qt::Key_Enter || keyEvent->key() == Qt::Key_Return || keyEvent->key() == Qt::Key_Tab || keyEvent->key() == Qt::Key_Backtab || keyEvent->key() == Qt::Key_Minus || keyEvent->key() == Qt::Key_Period - || keyEvent->key() == Qt::Key_Comma || match.hasMatch() - || keyEvent->matches(QKeySequence::Backspace) || keyEvent->matches(QKeySequence::Delete)) { + || keyEvent->key() == Qt::Key_Comma + || match.hasMatch() + // double check for backspace as there may be windows/unix inconsistencies + || keyEvent->key() == Qt::Key_Backspace || keyEvent->matches(QKeySequence::Backspace) + || keyEvent->matches(QKeySequence::Delete)) { keyMode = KeyboardEventHandlingMode::DSHControl; timer.start(timeOutValue); }