diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandler.cpp b/src/Mod/Sketcher/Gui/DrawSketchHandler.cpp index 5a27a206ca..55c3a7a177 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandler.cpp +++ b/src/Mod/Sketcher/Gui/DrawSketchHandler.cpp @@ -61,6 +61,11 @@ using namespace Sketcher; /************************************ Attorney *******************************************/ +inline void ViewProviderSketchDrawSketchHandlerAttorney::setConstraintSelectability(ViewProviderSketch &vp, bool enabled /*= true*/) +{ + vp.setConstraintSelectability(enabled); +} + inline void ViewProviderSketchDrawSketchHandlerAttorney::setPositionText(ViewProviderSketch &vp, const Base::Vector2d &Pos, const SbString &txt) { vp.setPositionText(Pos,txt); @@ -116,6 +121,16 @@ DrawSketchHandler::DrawSketchHandler() : sketchgui(0) {} DrawSketchHandler::~DrawSketchHandler() {} +void DrawSketchHandler::preActivated(ViewProviderSketch* vp) +{ + ViewProviderSketchDrawSketchHandlerAttorney::setConstraintSelectability(*vp, false); +} + +void DrawSketchHandler::postDeactivatedAlwaysRun(ViewProviderSketch* vp) +{ + ViewProviderSketchDrawSketchHandlerAttorney::setConstraintSelectability(*vp, true); +} + void DrawSketchHandler::quit(void) { assert(sketchgui); diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandler.h b/src/Mod/Sketcher/Gui/DrawSketchHandler.h index 679c81f113..aad1a11a8a 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandler.h +++ b/src/Mod/Sketcher/Gui/DrawSketchHandler.h @@ -46,6 +46,7 @@ class ViewProviderSketch; */ class ViewProviderSketchDrawSketchHandlerAttorney { private: + static inline void setConstraintSelectability(ViewProviderSketch &vp, bool enabled = true); static inline void setPositionText(ViewProviderSketch &vp, const Base::Vector2d &Pos, const SbString &txt); static inline void setPositionText(ViewProviderSketch &vp, const Base::Vector2d &Pos); static inline void resetPositionText(ViewProviderSketch &vp); @@ -96,8 +97,11 @@ public: DrawSketchHandler(); virtual ~DrawSketchHandler(); + virtual void preActivated(ViewProviderSketch *); virtual void activated(ViewProviderSketch *){} virtual void deactivated(ViewProviderSketch *){} + virtual void postDeactivated(ViewProviderSketch *){} + static void postDeactivatedAlwaysRun(ViewProviderSketch *); virtual void mouseMove(Base::Vector2d onSketchPos)=0; virtual bool pressButton(Base::Vector2d onSketchPos)=0; virtual bool releaseButton(Base::Vector2d onSketchPos)=0; diff --git a/src/Mod/Sketcher/Gui/EditModeCoinManager.cpp b/src/Mod/Sketcher/Gui/EditModeCoinManager.cpp index ddcd5a2d9b..2faa389b0b 100644 --- a/src/Mod/Sketcher/Gui/EditModeCoinManager.cpp +++ b/src/Mod/Sketcher/Gui/EditModeCoinManager.cpp @@ -627,6 +627,11 @@ void EditModeCoinManager::updateColor(const GeoListFacade & geolistfacade) pEditModeConstraintCoinManager->updateConstraintColor(constraints); } +void EditModeCoinManager::setConstraintSelectability(bool enabled /* = true */) +{ + pEditModeConstraintCoinManager->setConstraintSelectability(enabled); +} + void EditModeCoinManager::createEditModeInventorNodes() { // 1 - Create the edit root node diff --git a/src/Mod/Sketcher/Gui/EditModeCoinManager.h b/src/Mod/Sketcher/Gui/EditModeCoinManager.h index 1ca50989bc..416b6561c9 100644 --- a/src/Mod/Sketcher/Gui/EditModeCoinManager.h +++ b/src/Mod/Sketcher/Gui/EditModeCoinManager.h @@ -233,6 +233,11 @@ public: void updateGridExtent(); //@} + /** @name change constraints selectability*/ + //@{ + void setConstraintSelectability(bool enabled = true); + //@} + private: // This function populates the coin nodes with the information of the current geometry void processGeometry(const GeoListFacade & geolistfacade); diff --git a/src/Mod/Sketcher/Gui/EditModeCoinManagerParameters.h b/src/Mod/Sketcher/Gui/EditModeCoinManagerParameters.h index 1be27a1811..2edb9e0f63 100644 --- a/src/Mod/Sketcher/Gui/EditModeCoinManagerParameters.h +++ b/src/Mod/Sketcher/Gui/EditModeCoinManagerParameters.h @@ -345,6 +345,7 @@ struct EditModeScenegraphNodes { /** @name Constraint nodes*/ //@{ SmSwitchboard *constrGroup; + SoPickStyle *constrGrpSelect; SoDrawStyle *ConstraintDrawStyle; //@} diff --git a/src/Mod/Sketcher/Gui/EditModeConstraintCoinManager.cpp b/src/Mod/Sketcher/Gui/EditModeConstraintCoinManager.cpp index 2eb0ba4164..a5f78101d8 100644 --- a/src/Mod/Sketcher/Gui/EditModeConstraintCoinManager.cpp +++ b/src/Mod/Sketcher/Gui/EditModeConstraintCoinManager.cpp @@ -1401,6 +1401,16 @@ void EditModeConstraintCoinManager::rebuildConstraintNodes(void) rebuildConstraintNodes(geolistfacade); } +void EditModeConstraintCoinManager::setConstraintSelectability(bool enabled /* = true */) +{ + if (enabled) { + editModeScenegraphNodes.constrGrpSelect->style.setValue(SoPickStyle::SHAPE); + } + else { + editModeScenegraphNodes.constrGrpSelect->style.setValue(SoPickStyle::UNPICKABLE); + } +} + void EditModeConstraintCoinManager::rebuildConstraintNodes(const GeoListFacade & geolistfacade) { const std::vector &constrlist = ViewProviderSketchCoinAttorney::getConstraints(viewProvider); @@ -2399,7 +2409,16 @@ void EditModeConstraintCoinManager::createEditModeInventorNodes() editModeScenegraphNodes.EditRoot->addChild(editModeScenegraphNodes.ConstraintDrawStyle); // add the group where all the constraints has its SoSeparator + editModeScenegraphNodes.constrGrpSelect = new SoPickStyle(); // used to toggle constraints selectability + editModeScenegraphNodes.constrGrpSelect->style.setValue(SoPickStyle::SHAPE); + editModeScenegraphNodes.EditRoot->addChild(editModeScenegraphNodes.constrGrpSelect); + setConstraintSelectability(); // Ensure default value; + editModeScenegraphNodes.constrGroup = new SmSwitchboard(); editModeScenegraphNodes.constrGroup->setName("ConstraintGroup"); editModeScenegraphNodes.EditRoot->addChild(editModeScenegraphNodes.constrGroup); + + SoPickStyle *ps = new SoPickStyle(); // used to following nodes aren't impacted + ps->style.setValue(SoPickStyle::SHAPE); + editModeScenegraphNodes.EditRoot->addChild(ps); } diff --git a/src/Mod/Sketcher/Gui/EditModeConstraintCoinManager.h b/src/Mod/Sketcher/Gui/EditModeConstraintCoinManager.h index e638aa70af..fbcb2c546d 100644 --- a/src/Mod/Sketcher/Gui/EditModeConstraintCoinManager.h +++ b/src/Mod/Sketcher/Gui/EditModeConstraintCoinManager.h @@ -115,6 +115,11 @@ public: void rebuildConstraintNodes(void); //@} + /** @name change constraints selectability*/ + //@{ + void setConstraintSelectability(bool enabled = true); + //@} + std::set detectPreselectionConstr( const SoPickedPoint *Point, const SbVec2s &cursorPos); diff --git a/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp b/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp index 742050993b..4e5b398251 100644 --- a/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp +++ b/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp @@ -364,6 +364,7 @@ void ViewProviderSketch::activateHandler(DrawSketchHandler *newHandler) sketchHandler = std::unique_ptr(newHandler); Mode = STATUS_SKETCH_UseHandler; sketchHandler->sketchgui = this; + sketchHandler->preActivated(this); sketchHandler->activated(this); // make sure receiver has focus so immediately pressing Escape will be handled by @@ -382,10 +383,11 @@ void ViewProviderSketch::deactivateHandler() drawEdit(editCurve); // erase any line resetPositionText(); sketchHandler->deactivated(this); + sketchHandler->postDeactivated(this); sketchHandler->unsetCursor(); sketchHandler = nullptr; } - + DrawSketchHandler::postDeactivatedAlwaysRun(this); Mode = STATUS_NONE; } @@ -3289,6 +3291,11 @@ QIcon ViewProviderSketch::mergeColorfulOverlayIcons (const QIcon & orig) const /*************************** functions ViewProviderSketch offers to friends such as DrawHandlerSketch ************************/ +void ViewProviderSketch::setConstraintSelectability(bool enabled /*= true*/) +{ + editCoinManager->setConstraintSelectability(enabled); +} + void ViewProviderSketch::setPositionText(const Base::Vector2d &Pos, const SbString &text) { editCoinManager->setPositionText(Pos,text); diff --git a/src/Mod/Sketcher/Gui/ViewProviderSketch.h b/src/Mod/Sketcher/Gui/ViewProviderSketch.h index ee903b71c1..5e086a8a97 100644 --- a/src/Mod/Sketcher/Gui/ViewProviderSketch.h +++ b/src/Mod/Sketcher/Gui/ViewProviderSketch.h @@ -698,6 +698,7 @@ private: void deleteSelected(); //********* ViewProviderSketchDrawSketchHandlerAttorney **********// + void setConstraintSelectability(bool enabled = true); void setPositionText(const Base::Vector2d &Pos, const SbString &txt); void setPositionText(const Base::Vector2d &Pos); void resetPositionText(void);