diff --git a/src/Mod/Sketcher/Gui/DrawSketchController.h b/src/Mod/Sketcher/Gui/DrawSketchController.h index e58b53db22..03906081a8 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchController.h +++ b/src/Mod/Sketcher/Gui/DrawSketchController.h @@ -520,7 +520,7 @@ protected: virtual void afterEnforceControlParameters() { // Give focus to current on-view parameter. In case user interacted outside of 3dview. - if (parameterWithFocus >= 0) { + if (focusAutoPassing && parameterWithFocus >= 0) { setFocusToOnViewParameter(parameterWithFocus); } } @@ -736,6 +736,8 @@ protected: return keymanager.get(); } + bool focusAutoPassing = true; + private: /** @name helper functions */ //@{ diff --git a/src/Mod/Sketcher/Gui/DrawSketchDefaultWidgetController.h b/src/Mod/Sketcher/Gui/DrawSketchDefaultWidgetController.h index f52ff94594..b9e210e947 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchDefaultWidgetController.h +++ b/src/Mod/Sketcher/Gui/DrawSketchDefaultWidgetController.h @@ -100,7 +100,7 @@ private: using Connection = boost::signals2::connection; - Connection connectionParameterFocusOut; + Connection connectionParameterTabOrEnterPressed; Connection connectionParameterValueChanged; Connection connectionCheckboxCheckedChanged; Connection connectionComboboxSelectionChanged; @@ -128,7 +128,7 @@ public: ~DrawSketchDefaultWidgetController() override { - connectionParameterFocusOut.disconnect(); + connectionParameterTabOrEnterPressed.disconnect(); connectionParameterValueChanged.disconnect(); connectionCheckboxCheckedChanged.disconnect(); connectionComboboxSelectionChanged.disconnect(); @@ -147,10 +147,16 @@ public: { adaptDrawingToParameterChange(parameterindex, value); // specialisation interface + // we block the auto passing of focus back to OVP that would occur in mouseMove + // triggered in finishControlsChanged + ControllerBase::focusAutoPassing = false; + ControllerBase::finishControlsChanged(); + + ControllerBase::focusAutoPassing = true; } - void parameterFocusOut(int parameterindex) + void parameterTabOrEnterPressed(int parameterindex) { Q_UNUSED(parameterindex); passFocusToNextParameter(); @@ -355,8 +361,10 @@ private: { toolWidget = static_cast(widget); // NOLINT - connectionParameterFocusOut = toolWidget->registerParameterFocusOut( - std::bind(&DrawSketchDefaultWidgetController::parameterFocusOut, this, sp::_1)); + connectionParameterTabOrEnterPressed = toolWidget->registerParameterTabOrEnterPressed( + std::bind(&DrawSketchDefaultWidgetController::parameterTabOrEnterPressed, + this, + sp::_1)); connectionParameterValueChanged = toolWidget->registerParameterValueChanged( std::bind(&DrawSketchDefaultWidgetController::parameterValueChanged, @@ -380,7 +388,8 @@ private: /// Resets the widget void resetDefaultWidget() { - boost::signals2::shared_connection_block parameter_focus_block(connectionParameterFocusOut); + boost::signals2::shared_connection_block parameter_focus_block( + connectionParameterTabOrEnterPressed); boost::signals2::shared_connection_block parameter_block(connectionParameterValueChanged); boost::signals2::shared_connection_block checkbox_block(connectionCheckboxCheckedChanged); boost::signals2::shared_connection_block combobox_block(connectionComboboxSelectionChanged); diff --git a/src/Mod/Sketcher/Gui/SketcherToolDefaultWidget.cpp b/src/Mod/Sketcher/Gui/SketcherToolDefaultWidget.cpp index 6f89a4867e..59b17a8958 100644 --- a/src/Mod/Sketcher/Gui/SketcherToolDefaultWidget.cpp +++ b/src/Mod/Sketcher/Gui/SketcherToolDefaultWidget.cpp @@ -157,13 +157,14 @@ bool SketcherToolDefaultWidget::eventFilter(QObject* object, QEvent* event) } } } - else if (event->type() == QEvent::FocusOut) { - for (int i = 0; i < nParameters; i++) { - auto parameterSpinBox = getParameterSpinBox(i); - - if (object == parameterSpinBox) { - signalParameterFocusOut(i); - break; + else if (event->type() == QEvent::KeyPress) { + QKeyEvent* ke = static_cast(event); + if (ke->key() == Qt::Key_Tab || ke->key() == Qt::Key_Return) { + for (int i = 0; i < nParameters; i++) { + if (object == getParameterSpinBox(i)) { + signalParameterTabOrEnterPressed(i); + return true; + } } } } diff --git a/src/Mod/Sketcher/Gui/SketcherToolDefaultWidget.h b/src/Mod/Sketcher/Gui/SketcherToolDefaultWidget.h index d73ea08383..4432f4f2c6 100644 --- a/src/Mod/Sketcher/Gui/SketcherToolDefaultWidget.h +++ b/src/Mod/Sketcher/Gui/SketcherToolDefaultWidget.h @@ -155,9 +155,9 @@ public: void restoreComboboxPref(int comboboxindex); template - boost::signals2::connection registerParameterFocusOut(F&& fn) + boost::signals2::connection registerParameterTabOrEnterPressed(F&& fn) { - return signalParameterFocusOut.connect(std::forward(fn)); + return signalParameterTabOrEnterPressed.connect(std::forward(fn)); } template @@ -217,7 +217,7 @@ private: private: std::unique_ptr ui; - boost::signals2::signal signalParameterFocusOut; + boost::signals2::signal signalParameterTabOrEnterPressed; boost::signals2::signal signalParameterValueChanged; boost::signals2::signal signalCheckboxCheckedChanged; boost::signals2::signal signalComboboxSelectionChanged;