diff --git a/src/Gui/EditableDatumLabel.cpp b/src/Gui/EditableDatumLabel.cpp index cfc8d3902b..8608704d53 100644 --- a/src/Gui/EditableDatumLabel.cpp +++ b/src/Gui/EditableDatumLabel.cpp @@ -31,6 +31,9 @@ # include #endif // _PreComp_ +#include +#include + #include #include #include @@ -52,6 +55,7 @@ EditableDatumLabel::EditableDatumLabel(View3DInventorViewer* view, bool autoDistance, bool avoidMouseCursor) : isSet(false) + , hasFinishedEditing(false) , autoDistance(autoDistance) , autoDistanceReverse(false) , avoidMouseCursor(avoidMouseCursor) @@ -158,7 +162,8 @@ void EditableDatumLabel::startEdit(double val, QObject* eventFilteringObj, bool spinBox->setButtonSymbols(QAbstractSpinBox::NoButtons); spinBox->setFocusPolicy(Qt::ClickFocus); // prevent passing focus with tab. spinBox->setAutoNormalize(false); - spinBox->setKeyboardTracking(false); + spinBox->setKeyboardTracking(true); + spinBox->installEventFilter(this); if (eventFilteringObj) { spinBox->installEventFilter(eventFilteringObj); @@ -190,6 +195,23 @@ void EditableDatumLabel::startEdit(double val, QObject* eventFilteringObj, bool connect(spinBox, qOverload(&QuantitySpinBox::valueChanged), this, validateAndFinish); } +bool EditableDatumLabel::eventFilter(QObject* watched, QEvent* event) +{ + if (event->type() == QEvent::KeyPress) { + auto* keyEvent = static_cast(event); + if (keyEvent->key() == Qt::Key_Return || keyEvent->key() == Qt::Key_Enter) { + + if (auto* spinBox = qobject_cast(watched)) { + this->hasFinishedEditing = true; + Q_EMIT this->valueChanged(this->value); + return false; + } + } + } + + return QObject::eventFilter(watched, event); +} + void EditableDatumLabel::stopEdit() { if (spinBox) { diff --git a/src/Gui/EditableDatumLabel.h b/src/Gui/EditableDatumLabel.h index ea224ff31a..320f391a0e 100644 --- a/src/Gui/EditableDatumLabel.h +++ b/src/Gui/EditableDatumLabel.h @@ -84,7 +84,8 @@ public: // NOLINTBEGIN SoDatumLabel* label; - bool isSet; + bool isSet; ///< used to differentiate when user has started typing inside the label + bool hasFinishedEditing; ///< flag to know when user has finished editing, i.e. pressed enter bool autoDistance; bool autoDistanceReverse; bool avoidMouseCursor; @@ -94,6 +95,9 @@ public: Q_SIGNALS: void valueChanged(double val); +protected: + bool eventFilter(QObject* watched, QEvent* event) override; + private: void positionSpinbox(); SbVec3f getTextCenterPoint() const; diff --git a/src/Mod/Sketcher/Gui/DrawSketchController.h b/src/Mod/Sketcher/Gui/DrawSketchController.h index 9c53f56f5a..3642f9eca5 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchController.h +++ b/src/Mod/Sketcher/Gui/DrawSketchController.h @@ -367,11 +367,6 @@ public: void tryViewValueChanged(int onviewparameterindex, double value) { - int nextindex = onviewparameterindex + 1; - if (isOnViewParameterOfCurrentMode(nextindex)) { - setFocusToOnViewParameter(nextindex); - } - /* That is not supported with on-view parameters. // -> A machine does not forward to a next state when adapting the parameter (though it // may forward to @@ -630,6 +625,7 @@ protected: void unsetOnViewParameter(Gui::EditableDatumLabel* onViewParameter) { onViewParameter->isSet = false; + onViewParameter->hasFinishedEditing = false; onViewParameter->setColor(colorManager.dimConstrDeactivatedColor); } diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandlerArc.h b/src/Mod/Sketcher/Gui/DrawSketchHandlerArc.h index 4e72ddebd3..7e6d235b4d 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandlerArc.h +++ b/src/Mod/Sketcher/Gui/DrawSketchHandlerArc.h @@ -716,22 +716,22 @@ void DSHArcController::doChangeDrawSketchHandlerMode() } } break; case SelectMode::SeekSecond: { - if (onViewParameters[OnViewParameter::Third]->isSet - && onViewParameters[OnViewParameter::Fourth]->isSet) { + if (onViewParameters[OnViewParameter::Third]->hasFinishedEditing + || onViewParameters[OnViewParameter::Fourth]->hasFinishedEditing) { handler->setState(SelectMode::SeekThird); } } break; case SelectMode::SeekThird: { if (handler->constructionMethod() == DrawSketchHandlerArc::ConstructionMethod::Center) { - if (onViewParameters[OnViewParameter::Fifth]->isSet) { + if (onViewParameters[OnViewParameter::Fifth]->hasFinishedEditing) { handler->setState(SelectMode::End); } } else { - if (onViewParameters[OnViewParameter::Fifth]->isSet - && onViewParameters[OnViewParameter::Sixth]->isSet) { + if (onViewParameters[OnViewParameter::Fifth]->hasFinishedEditing + || onViewParameters[OnViewParameter::Sixth]->hasFinishedEditing) { handler->setState(SelectMode::End); } diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandlerArcSlot.h b/src/Mod/Sketcher/Gui/DrawSketchHandlerArcSlot.h index e9de9cc68c..d02d736384 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandlerArcSlot.h +++ b/src/Mod/Sketcher/Gui/DrawSketchHandlerArcSlot.h @@ -772,20 +772,20 @@ void DSHArcSlotController::doChangeDrawSketchHandlerMode() } } break; case SelectMode::SeekSecond: { - if (onViewParameters[OnViewParameter::Third]->isSet - && onViewParameters[OnViewParameter::Fourth]->isSet) { + if (onViewParameters[OnViewParameter::Third]->hasFinishedEditing + || onViewParameters[OnViewParameter::Fourth]->hasFinishedEditing) { handler->setState(SelectMode::SeekThird); } } break; case SelectMode::SeekThird: { - if (onViewParameters[OnViewParameter::Fifth]->isSet) { + if (onViewParameters[OnViewParameter::Fifth]->hasFinishedEditing) { handler->setState(SelectMode::SeekFourth); } } break; case SelectMode::SeekFourth: { - if (onViewParameters[OnViewParameter::Sixth]->isSet) { + if (onViewParameters[OnViewParameter::Sixth]->hasFinishedEditing) { handler->setState(SelectMode::End); } diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandlerBSpline.h b/src/Mod/Sketcher/Gui/DrawSketchHandlerBSpline.h index 05830bd4bb..f0bd34d5c7 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandlerBSpline.h +++ b/src/Mod/Sketcher/Gui/DrawSketchHandlerBSpline.h @@ -1083,8 +1083,8 @@ void DSHBSplineController::doChangeDrawSketchHandlerMode() } } break; case SelectMode::SeekSecond: { - if (onViewParameters[OnViewParameter::Third]->isSet - && onViewParameters[OnViewParameter::Fourth]->isSet) { + if (onViewParameters[OnViewParameter::Third]->hasFinishedEditing + || onViewParameters[OnViewParameter::Fourth]->hasFinishedEditing) { handler->canGoToNextMode(); // its not going to next mode unsetOnViewParameter(onViewParameters[OnViewParameter::Third].get()); diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandlerCircle.h b/src/Mod/Sketcher/Gui/DrawSketchHandlerCircle.h index ef165ee0f7..536bb2fdb0 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandlerCircle.h +++ b/src/Mod/Sketcher/Gui/DrawSketchHandlerCircle.h @@ -598,13 +598,13 @@ void DSHCircleController::doChangeDrawSketchHandlerMode() } } break; case SelectMode::SeekSecond: { - if (onViewParameters[OnViewParameter::Third]->isSet + if (onViewParameters[OnViewParameter::Third]->hasFinishedEditing && handler->constructionMethod() == DrawSketchHandlerCircle::ConstructionMethod::Center) { handler->setState(SelectMode::End); } - else if (onViewParameters[OnViewParameter::Third]->isSet + else if (onViewParameters.size() > 3 && onViewParameters[OnViewParameter::Third]->isSet && onViewParameters[OnViewParameter::Fourth]->isSet && handler->constructionMethod() == DrawSketchHandlerCircle::ConstructionMethod::ThreeRim) { @@ -613,8 +613,8 @@ void DSHCircleController::doChangeDrawSketchHandlerMode() } } break; case SelectMode::SeekThird: { - if (onViewParameters[OnViewParameter::Fifth]->isSet - && onViewParameters[OnViewParameter::Sixth]->isSet) { + if (onViewParameters[OnViewParameter::Fifth]->hasFinishedEditing + || onViewParameters[OnViewParameter::Sixth]->hasFinishedEditing) { handler->setState(SelectMode::End); } diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandlerEllipse.h b/src/Mod/Sketcher/Gui/DrawSketchHandlerEllipse.h index 1907e5c492..4dc40c089a 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandlerEllipse.h +++ b/src/Mod/Sketcher/Gui/DrawSketchHandlerEllipse.h @@ -694,8 +694,8 @@ void DSHEllipseController::doChangeDrawSketchHandlerMode() } } break; case SelectMode::SeekSecond: { - if (onViewParameters[OnViewParameter::Third]->isSet - && onViewParameters[OnViewParameter::Fourth]->isSet) { + if (onViewParameters[OnViewParameter::Third]->hasFinishedEditing + || onViewParameters[OnViewParameter::Fourth]->hasFinishedEditing) { handler->setState(SelectMode::SeekThird); } @@ -703,14 +703,14 @@ void DSHEllipseController::doChangeDrawSketchHandlerMode() case SelectMode::SeekThird: { if (handler->constructionMethod() == DrawSketchHandlerEllipse::ConstructionMethod::Center) { - if (onViewParameters[OnViewParameter::Fifth]->isSet) { + if (onViewParameters[OnViewParameter::Fifth]->hasFinishedEditing) { handler->setState(SelectMode::End); } } else { - if (onViewParameters[OnViewParameter::Fifth]->isSet - && onViewParameters[OnViewParameter::Sixth]->isSet) { + if (onViewParameters[OnViewParameter::Fifth]->hasFinishedEditing + || onViewParameters[OnViewParameter::Sixth]->hasFinishedEditing) { handler->setState(SelectMode::End); } diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandlerLine.h b/src/Mod/Sketcher/Gui/DrawSketchHandlerLine.h index aec0f2abfc..0ffffba6d0 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandlerLine.h +++ b/src/Mod/Sketcher/Gui/DrawSketchHandlerLine.h @@ -564,8 +564,8 @@ void DSHLineController::doChangeDrawSketchHandlerMode() } } break; case SelectMode::SeekSecond: { - if (onViewParameters[OnViewParameter::Third]->isSet - && onViewParameters[OnViewParameter::Fourth]->isSet) { + if (onViewParameters[OnViewParameter::Third]->hasFinishedEditing + || onViewParameters[OnViewParameter::Fourth]->hasFinishedEditing) { handler->setState(SelectMode::End); } diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandlerOffset.h b/src/Mod/Sketcher/Gui/DrawSketchHandlerOffset.h index 81a13412d3..c45e5eef51 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandlerOffset.h +++ b/src/Mod/Sketcher/Gui/DrawSketchHandlerOffset.h @@ -1198,7 +1198,7 @@ void DSHOffsetController::doChangeDrawSketchHandlerMode() { switch (handler->state()) { case SelectMode::SeekFirst: { - if (onViewParameters[OnViewParameter::First]->isSet) { + if (onViewParameters[OnViewParameter::First]->hasFinishedEditing) { handler->setState(SelectMode::End); } } break; diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandlerPoint.h b/src/Mod/Sketcher/Gui/DrawSketchHandlerPoint.h index b4d3b44fea..3c9fe5ad71 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandlerPoint.h +++ b/src/Mod/Sketcher/Gui/DrawSketchHandlerPoint.h @@ -237,8 +237,8 @@ void DSHPointController::doChangeDrawSketchHandlerMode() { switch (handler->state()) { case SelectMode::SeekFirst: { - if (onViewParameters[OnViewParameter::First]->isSet - && onViewParameters[OnViewParameter::Second]->isSet) { + if (onViewParameters[OnViewParameter::First]->hasFinishedEditing + || onViewParameters[OnViewParameter::Second]->hasFinishedEditing) { handler->setState(SelectMode::End); // handler->finish(); // Called by the change of mode diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandlerPolygon.h b/src/Mod/Sketcher/Gui/DrawSketchHandlerPolygon.h index 10ea925ed0..0e73caa3e4 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandlerPolygon.h +++ b/src/Mod/Sketcher/Gui/DrawSketchHandlerPolygon.h @@ -450,8 +450,8 @@ void DSHPolygonController::doChangeDrawSketchHandlerMode() } } break; case SelectMode::SeekSecond: { - if (onViewParameters[OnViewParameter::Third]->isSet - && onViewParameters[OnViewParameter::Fourth]->isSet) { + if (onViewParameters[OnViewParameter::Third]->hasFinishedEditing + || onViewParameters[OnViewParameter::Fourth]->hasFinishedEditing) { handler->setState(SelectMode::End); } diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandlerRectangle.h b/src/Mod/Sketcher/Gui/DrawSketchHandlerRectangle.h index 62689a760e..984fe7323f 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandlerRectangle.h +++ b/src/Mod/Sketcher/Gui/DrawSketchHandlerRectangle.h @@ -2346,8 +2346,8 @@ void DSHRectangleController::doChangeDrawSketchHandlerMode() } } break; case SelectMode::SeekSecond: { - if (onViewParameters[OnViewParameter::Third]->isSet - && onViewParameters[OnViewParameter::Fourth]->isSet) { + if (onViewParameters[OnViewParameter::Third]->hasFinishedEditing + || onViewParameters[OnViewParameter::Fourth]->hasFinishedEditing) { if (handler->roundCorners || handler->makeFrame || handler->constructionMethod() == ConstructionMethod::ThreePoints @@ -2363,7 +2363,8 @@ void DSHRectangleController::doChangeDrawSketchHandlerMode() case SelectMode::SeekThird: { if (handler->constructionMethod() == ConstructionMethod::Diagonal || handler->constructionMethod() == ConstructionMethod::CenterAndCorner) { - if (handler->roundCorners && onViewParameters[OnViewParameter::Fifth]->isSet) { + if (handler->roundCorners + && onViewParameters[OnViewParameter::Fifth]->hasFinishedEditing) { if (handler->makeFrame) { handler->setState(SelectMode::SeekFourth); @@ -2372,14 +2373,15 @@ void DSHRectangleController::doChangeDrawSketchHandlerMode() handler->setState(SelectMode::End); } } - else if (handler->makeFrame && onViewParameters[OnViewParameter::Sixth]->isSet) { + else if (handler->makeFrame + && onViewParameters[OnViewParameter::Sixth]->hasFinishedEditing) { handler->setState(SelectMode::End); } } else { - if (onViewParameters[OnViewParameter::Fifth]->isSet - && onViewParameters[OnViewParameter::Sixth]->isSet) { + if (onViewParameters[OnViewParameter::Fifth]->hasFinishedEditing + || onViewParameters[OnViewParameter::Sixth]->hasFinishedEditing) { if (handler->roundCorners || handler->makeFrame) { handler->setState(SelectMode::SeekFourth); } @@ -2392,12 +2394,13 @@ void DSHRectangleController::doChangeDrawSketchHandlerMode() case SelectMode::SeekFourth: { if (handler->constructionMethod() == ConstructionMethod::Diagonal || handler->constructionMethod() == ConstructionMethod::CenterAndCorner) { - if (onViewParameters[OnViewParameter::Sixth]->isSet) { + if (onViewParameters[OnViewParameter::Sixth]->hasFinishedEditing) { handler->setState(SelectMode::End); } } else { - if (handler->roundCorners && onViewParameters[OnViewParameter::Seventh]->isSet) { + if (handler->roundCorners + && onViewParameters[OnViewParameter::Seventh]->hasFinishedEditing) { if (handler->makeFrame) { handler->setState(SelectMode::SeekFifth); @@ -2406,13 +2409,15 @@ void DSHRectangleController::doChangeDrawSketchHandlerMode() handler->setState(SelectMode::End); } } - else if (handler->makeFrame && onViewParameters[OnViewParameter::Eighth]->isSet) { + else if (handler->makeFrame + && onViewParameters[OnViewParameter::Eighth]->hasFinishedEditing) { handler->setState(SelectMode::End); } } } break; case SelectMode::SeekFifth: { - if (handler->makeFrame && onViewParameters[OnViewParameter::Eighth]->isSet) { + if (handler->makeFrame + && onViewParameters[OnViewParameter::Eighth]->hasFinishedEditing) { handler->setState(SelectMode::End); } } break; diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandlerRotate.h b/src/Mod/Sketcher/Gui/DrawSketchHandlerRotate.h index 118c4c7d2e..5bc581e923 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandlerRotate.h +++ b/src/Mod/Sketcher/Gui/DrawSketchHandlerRotate.h @@ -657,7 +657,7 @@ void DSHRotateController::doChangeDrawSketchHandlerMode() } } break; case SelectMode::SeekSecond: { - if (onViewParameters[OnViewParameter::Third]->isSet) { + if (onViewParameters[OnViewParameter::Third]->hasFinishedEditing) { handler->totalAngle = Base::toRadians(onViewParameters[OnViewParameter::Third]->getValue()); @@ -665,7 +665,7 @@ void DSHRotateController::doChangeDrawSketchHandlerMode() } } break; case SelectMode::SeekThird: { - if (onViewParameters[OnViewParameter::Fourth]->isSet) { + if (onViewParameters[OnViewParameter::Fourth]->hasFinishedEditing) { handler->setState(SelectMode::End); } diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandlerScale.h b/src/Mod/Sketcher/Gui/DrawSketchHandlerScale.h index de9d80901f..4cf17fce04 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandlerScale.h +++ b/src/Mod/Sketcher/Gui/DrawSketchHandlerScale.h @@ -497,7 +497,7 @@ void DSHScaleController::doChangeDrawSketchHandlerMode() } } break; case SelectMode::SeekThird: { - if (onViewParameters[OnViewParameter::Third]->isSet) { + if (onViewParameters[OnViewParameter::Third]->hasFinishedEditing) { handler->setState(SelectMode::End); } diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandlerSlot.h b/src/Mod/Sketcher/Gui/DrawSketchHandlerSlot.h index cd65a7b965..25dd9d8543 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandlerSlot.h +++ b/src/Mod/Sketcher/Gui/DrawSketchHandlerSlot.h @@ -535,14 +535,14 @@ void DSHSlotController::doChangeDrawSketchHandlerMode() } } break; case SelectMode::SeekSecond: { - if (onViewParameters[OnViewParameter::Third]->isSet - && onViewParameters[OnViewParameter::Fourth]->isSet) { + if (onViewParameters[OnViewParameter::Third]->hasFinishedEditing + || onViewParameters[OnViewParameter::Fourth]->hasFinishedEditing) { handler->setState(SelectMode::SeekThird); } } break; case SelectMode::SeekThird: { - if (onViewParameters[OnViewParameter::Fifth]->isSet) { + if (onViewParameters[OnViewParameter::Fifth]->hasFinishedEditing) { handler->setState(SelectMode::End); } diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandlerTranslate.h b/src/Mod/Sketcher/Gui/DrawSketchHandlerTranslate.h index 403269c5a9..dcfab37a8a 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandlerTranslate.h +++ b/src/Mod/Sketcher/Gui/DrawSketchHandlerTranslate.h @@ -703,8 +703,8 @@ void DSHTranslateController::doChangeDrawSketchHandlerMode() } } break; case SelectMode::SeekSecond: { - if (onViewParameters[OnViewParameter::Third]->isSet - && onViewParameters[OnViewParameter::Fourth]->isSet) { + if (onViewParameters[OnViewParameter::Third]->hasFinishedEditing + || onViewParameters[OnViewParameter::Fourth]->hasFinishedEditing) { if (handler->secondNumberOfCopies == 1) { handler->setState(SelectMode::End); @@ -715,8 +715,8 @@ void DSHTranslateController::doChangeDrawSketchHandlerMode() } } break; case SelectMode::SeekThird: { - if (onViewParameters[OnViewParameter::Fifth]->isSet - && onViewParameters[OnViewParameter::Sixth]->isSet) { + if (onViewParameters[OnViewParameter::Fifth]->hasFinishedEditing + || onViewParameters[OnViewParameter::Sixth]->hasFinishedEditing) { handler->setState(SelectMode::End); }