From 9b40afea7a8164a9d05acfccd0e99b44e307e352 Mon Sep 17 00:00:00 2001 From: tetektoza Date: Mon, 2 Jun 2025 22:18:42 +0200 Subject: [PATCH] Sketcher: Do not allow mouse interruption while entering dimension (#20925) * Sketcher: Do not allow mouse interruption while entering dimensions So, currently user has an option to enter dimensions to different Sketcher elements like circle, line, or hexagon, whatever else. But, if they move mouse during entering of those parameters, they are gone. This is because we are currently allowing for constant `QAbstractSpinBox` value change during mouse move, it stops changing ONLY AFTER value is being set (user enters number and presses ENTER or TAB). So, this patch introduces one more state for `EditableDatumLabel` which is `hasFinishedEditing` which is being triggered by ENTER or TAB key, and still keeping old `isSet` state, which disallows mouse movement disruption and dynamically updates the edited element on viewport. This means, that all objects now wait for `hasFinishedEditing` state to actually finish editing. * Sketcher: Avoid out of boundary access by checking onViewParameters size * Sketcher: Add missing Qt headers for CI * Sketcher: Allow using TAB to switch between labels without accepting * Sketcher: Change to or statement, so enter will accept both labels * Sketcher: Apply review comments * used casting directly in if statement and auto to keep linter happy * added comments for flags used for describing EditableDatumLabel states --- src/Gui/EditableDatumLabel.cpp | 24 +++++++++++++++++- src/Gui/EditableDatumLabel.h | 6 ++++- src/Mod/Sketcher/Gui/DrawSketchController.h | 6 +---- src/Mod/Sketcher/Gui/DrawSketchHandlerArc.h | 10 ++++---- .../Sketcher/Gui/DrawSketchHandlerArcSlot.h | 8 +++--- .../Sketcher/Gui/DrawSketchHandlerBSpline.h | 4 +-- .../Sketcher/Gui/DrawSketchHandlerCircle.h | 8 +++--- .../Sketcher/Gui/DrawSketchHandlerEllipse.h | 10 ++++---- src/Mod/Sketcher/Gui/DrawSketchHandlerLine.h | 4 +-- .../Sketcher/Gui/DrawSketchHandlerOffset.h | 2 +- src/Mod/Sketcher/Gui/DrawSketchHandlerPoint.h | 4 +-- .../Sketcher/Gui/DrawSketchHandlerPolygon.h | 4 +-- .../Sketcher/Gui/DrawSketchHandlerRectangle.h | 25 +++++++++++-------- .../Sketcher/Gui/DrawSketchHandlerRotate.h | 4 +-- src/Mod/Sketcher/Gui/DrawSketchHandlerScale.h | 2 +- src/Mod/Sketcher/Gui/DrawSketchHandlerSlot.h | 6 ++--- .../Sketcher/Gui/DrawSketchHandlerTranslate.h | 8 +++--- 17 files changed, 81 insertions(+), 54 deletions(-) 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); }