From 12a2de626a8716f8c95c368cc5b8bde4eb24df08 Mon Sep 17 00:00:00 2001 From: Abdullah Tahiri Date: Mon, 16 May 2022 16:10:18 +0200 Subject: [PATCH] DrawSketchHandler: Cursor rework and preselect at point functionalities --- src/Mod/Sketcher/Gui/CommandCreateGeo.cpp | 95 +++++++++++-------- .../Sketcher/Gui/CommandSketcherBSpline.cpp | 6 +- src/Mod/Sketcher/Gui/DrawSketchHandler.cpp | 46 +++++++-- src/Mod/Sketcher/Gui/DrawSketchHandler.h | 46 +++++++-- src/Mod/Sketcher/Gui/ViewProviderSketch.cpp | 4 - 5 files changed, 132 insertions(+), 65 deletions(-) diff --git a/src/Mod/Sketcher/Gui/CommandCreateGeo.cpp b/src/Mod/Sketcher/Gui/CommandCreateGeo.cpp index 9fc3cf38d3..acabaef01e 100644 --- a/src/Mod/Sketcher/Gui/CommandCreateGeo.cpp +++ b/src/Mod/Sketcher/Gui/CommandCreateGeo.cpp @@ -195,9 +195,9 @@ public: private: - virtual void activated() override + virtual QString getCrosshairCursorSVGName() const override { - setCrosshairCursor("Sketcher_Pointer_Create_Line"); + return QString::fromLatin1("Sketcher_Pointer_Create_Line"); } protected: @@ -503,9 +503,9 @@ public: private: - virtual void activated() override + virtual QString getCrosshairCursorSVGName() const override { - setCrosshairCursor("Sketcher_Pointer_Create_Box"); + return QString::fromLatin1("Sketcher_Pointer_Create_Box"); } protected: BoxMode Mode; @@ -870,9 +870,9 @@ public: } private: - virtual void activated() override + virtual QString getCrosshairCursorSVGName() const override { - setCrosshairCursor("Sketcher_Pointer_Oblong"); + return QString::fromLatin1("Sketcher_Pointer_Oblong"); } protected: @@ -1627,9 +1627,9 @@ public: } private: - virtual void activated() override + virtual QString getCrosshairCursorSVGName() const override { - setCrosshairCursor("Sketcher_Pointer_Create_Lineset"); + return QString::fromLatin1("Sketcher_Pointer_Create_Lineset"); } protected: @@ -1917,9 +1917,9 @@ public: } private: - virtual void activated() override + virtual QString getCrosshairCursorSVGName() const override { - setCrosshairCursor("Sketcher_Pointer_Create_Arc"); + return QString::fromLatin1("Sketcher_Pointer_Create_Arc"); } protected: SelectMode Mode; @@ -2187,9 +2187,9 @@ public: } private: - virtual void activated() override + virtual QString getCrosshairCursorSVGName() const override { - setCrosshairCursor("Sketcher_Pointer_Create_3PointArc"); + return QString::fromLatin1("Sketcher_Pointer_Create_3PointArc"); } protected: @@ -2453,9 +2453,9 @@ public: } private: - virtual void activated() override + virtual QString getCrosshairCursorSVGName() const override { - setCrosshairCursor("Sketcher_Pointer_Create_Circle"); + return QString::fromLatin1("Sketcher_Pointer_Create_Circle"); } protected: @@ -2719,7 +2719,6 @@ private: */ virtual void activated() override { - setCrosshairCursor("Sketcher_Pointer_Create_Ellipse"); if (constrMethod == 0) { method = CENTER_PERIAPSIS_B; mode = STATUS_SEEK_CENTROID; @@ -2728,6 +2727,10 @@ private: mode = STATUS_SEEK_PERIAPSIS; } } + virtual QString getCrosshairCursorSVGName() const override + { + return QString::fromLatin1("Sketcher_Pointer_Create_Ellipse"); + } protected: std::vector sugConstr1, sugConstr2, sugConstr3; @@ -3610,9 +3613,9 @@ public: } private: - virtual void activated() override + virtual QString getCrosshairCursorSVGName() const override { - setCrosshairCursor("Sketcher_Pointer_Create_ArcOfEllipse"); + return QString::fromLatin1("Sketcher_Pointer_Create_ArcOfEllipse"); } protected: @@ -3955,9 +3958,9 @@ public: } private: - virtual void activated() override + virtual QString getCrosshairCursorSVGName() const override { - setCrosshairCursor("Sketcher_Pointer_Create_ArcOfHyperbola"); + return QString::fromLatin1("Sketcher_Pointer_Create_ArcOfHyperbola"); } protected: @@ -4256,9 +4259,9 @@ public: } private: - virtual void activated() override + virtual QString getCrosshairCursorSVGName() const override { - setCrosshairCursor("Sketcher_Pointer_Create_ArcOfParabola"); + return QString::fromLatin1("Sketcher_Pointer_Create_ArcOfParabola"); } protected: @@ -4745,9 +4748,9 @@ private: IsClosed = false; } - virtual void activated() override + virtual QString getCrosshairCursorSVGName() const override { - setCrosshairCursor("Sketcher_Pointer_Create_BSpline"); + return QString::fromLatin1("Sketcher_Pointer_Create_BSpline"); } void addSugConstraint() { @@ -5261,9 +5264,9 @@ public: } private: - virtual void activated() override + virtual QString getCrosshairCursorSVGName() const override { - setCrosshairCursor("Sketcher_Pointer_Create_3PointCircle"); + return QString::fromLatin1("Sketcher_Pointer_Create_3PointCircle"); } protected: @@ -5472,9 +5475,9 @@ public: } private: - virtual void activated() override + virtual QString getCrosshairCursorSVGName() const override { - setCrosshairCursor("Sketcher_Pointer_Create_Point"); + return QString::fromLatin1("Sketcher_Pointer_Create_Point"); } protected: @@ -5752,11 +5755,11 @@ public: } private: - virtual void activated() override + virtual QString getCrosshairCursorSVGName() const override { Gui::Selection().rmvSelectionGate(); Gui::Selection().addSelectionGate(new FilletSelection(sketchgui->getObject())); - setCrosshairCursor("Sketcher_Pointer_Create_Fillet"); + return QString::fromLatin1("Sketcher_Pointer_Create_Fillet"); } protected: @@ -6046,12 +6049,12 @@ public: } private: - virtual void activated() override + virtual QString getCrosshairCursorSVGName() const override { Gui::Selection().clearSelection(); Gui::Selection().rmvSelectionGate(); Gui::Selection().addSelectionGate(new TrimmingSelection(sketchgui->getObject())); - setCrosshairCursor("Sketcher_Pointer_Trimming"); + return QString::fromLatin1("Sketcher_Pointer_Trimming"); } private: @@ -6353,7 +6356,11 @@ private: Gui::Selection().rmvSelectionGate(); filterGate = new ExtendSelection(sketchgui->getObject()); Gui::Selection().addSelectionGate(filterGate); - setCrosshairCursor("Sketcher_Pointer_Extension"); + } + + virtual QString getCrosshairCursorSVGName() const override + { + return QString::fromLatin1("Sketcher_Pointer_Extension"); } protected: @@ -6483,12 +6490,12 @@ public: } private: - virtual void activated() override + virtual QString getCrosshairCursorSVGName() const override { Gui::Selection().clearSelection(); Gui::Selection().rmvSelectionGate(); Gui::Selection().addSelectionGate(new SplittingSelection(sketchgui->getObject())); - setCrosshairCursor("Sketcher_Pointer_Splitting"); + return QString::fromLatin1("Sketcher_Pointer_Splitting"); } }; @@ -6669,7 +6676,11 @@ private: Gui::Selection().clearSelection(); Gui::Selection().rmvSelectionGate(); Gui::Selection().addSelectionGate(new ExternalSelection(sketchgui->getObject())); - setCrosshairCursor("Sketcher_Pointer_External"); + } + + virtual QString getCrosshairCursorSVGName() const override + { + return QString::fromLatin1("Sketcher_Pointer_External"); } virtual void deactivated() override @@ -6847,7 +6858,11 @@ private: Gui::Selection().clearSelection(); Gui::Selection().rmvSelectionGate(); Gui::Selection().addSelectionGate(new CarbonCopySelection(sketchgui->getObject())); - setCrosshairCursor("Sketcher_Pointer_CarbonCopy"); + } + + virtual QString getCrosshairCursorSVGName() const override + { + return QString::fromLatin1("Sketcher_Pointer_CarbonCopy"); } virtual void deactivated() override @@ -7154,9 +7169,9 @@ public: return true; } private: - virtual void activated() override + virtual QString getCrosshairCursorSVGName() const override { - setCrosshairCursor("Sketcher_Pointer_Slot"); + return QString::fromLatin1("Sketcher_Pointer_Slot"); } protected: @@ -7348,9 +7363,9 @@ public: } private: - virtual void activated() override + virtual QString getCrosshairCursorSVGName() const override { - setCrosshairCursor("Sketcher_Pointer_Regular_Polygon"); + return QString::fromLatin1("Sketcher_Pointer_Regular_Polygon"); } protected: const size_t Corners; diff --git a/src/Mod/Sketcher/Gui/CommandSketcherBSpline.cpp b/src/Mod/Sketcher/Gui/CommandSketcherBSpline.cpp index 78193fefb9..7374d4075c 100644 --- a/src/Mod/Sketcher/Gui/CommandSketcherBSpline.cpp +++ b/src/Mod/Sketcher/Gui/CommandSketcherBSpline.cpp @@ -1124,12 +1124,10 @@ public: } private: - virtual void activated() override - { - setCrosshairCursor("Sketcher_Pointer_InsertKnot"); + virtual QString getCrosshairCursorSVGName() const override { + return QString::fromLatin1("Sketcher_Pointer_InsertKnot"); } - protected: Sketcher::SketchObject* Obj; int GeoId; diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandler.cpp b/src/Mod/Sketcher/Gui/DrawSketchHandler.cpp index 6101114aef..9723b199a1 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandler.cpp +++ b/src/Mod/Sketcher/Gui/DrawSketchHandler.cpp @@ -100,6 +100,16 @@ inline void ViewProviderSketchDrawSketchHandlerAttorney::setAxisPickStyle(ViewPr vp.setAxisPickStyle(on); } +inline void ViewProviderSketchDrawSketchHandlerAttorney::moveCursorToSketchPoint(ViewProviderSketch &vp, Base::Vector2d point) +{ + vp.moveCursorToSketchPoint(point); +} + +inline void ViewProviderSketchDrawSketchHandlerAttorney::preselectAtPoint(ViewProviderSketch &vp, Base::Vector2d point) +{ + vp.preselectAtPoint(point); +} + inline int ViewProviderSketchDrawSketchHandlerAttorney::getPreselectPoint(const ViewProviderSketch &vp) { return vp.getPreselectPoint(); @@ -220,7 +230,7 @@ DrawSketchHandler::DrawSketchHandler() : sketchgui(nullptr) {} DrawSketchHandler::~DrawSketchHandler() {} -QString DrawSketchHandler::getCrosshairCursorString() const +QString DrawSketchHandler::getCrosshairCursorSVGName() const { return QString::fromLatin1("None"); } @@ -229,6 +239,11 @@ void DrawSketchHandler::activate(ViewProviderSketch * vp) { sketchgui = vp; + // save the cursor at the time the DSH is activated + Gui::MDIView* view = Gui::getMainWindow()->activeWindow(); + Gui::View3DInventorViewer* viewer = static_cast(view)->getViewer(); + oldCursor = viewer->getWidget()->cursor(); + updateCursor(); this->preActivated(); @@ -240,6 +255,11 @@ void DrawSketchHandler::deactivate() this->deactivated(); this->postDeactivated(); ViewProviderSketchDrawSketchHandlerAttorney::setConstraintSelectability(*sketchgui, true); + + // clear temporary Curve and Markers from the scenograph + drawEdit(std::vector()); + drawEditMarkers(std::vector()); + resetPositionText(); unsetCursor(); } @@ -251,14 +271,10 @@ void DrawSketchHandler::preActivated() void DrawSketchHandler::quit(void) { assert(sketchgui); - drawEdit(std::vector()); - drawEditMarkers(std::vector()); - resetPositionText(); Gui::Selection().rmvSelectionGate(); Gui::Selection().rmvPreselect(); - unsetCursor(); sketchgui->purgeHandler(); } @@ -335,8 +351,6 @@ void DrawSketchHandler::setCursor(const QPixmap &p,int x,int y, bool autoScale) if (view && view->isDerivedFrom(Gui::View3DInventor::getClassTypeId())) { Gui::View3DInventorViewer* viewer = static_cast(view)->getViewer(); - oldCursor = viewer->getWidget()->cursor(); - QCursor cursor; QPixmap p1(p); // TODO remove autoScale after all cursors are SVG-based @@ -424,7 +438,7 @@ void DrawSketchHandler::addCursorTail( std::vector &pixmaps ) { void DrawSketchHandler::updateCursor() { - auto cursorstring = getCrosshairCursorString(); + auto cursorstring = getCrosshairCursorSVGName(); if(cursorstring != QString::fromLatin1("None")) setCrosshairCursor(cursorstring); @@ -958,6 +972,16 @@ void DrawSketchHandler::setAxisPickStyle(bool on) ViewProviderSketchDrawSketchHandlerAttorney::setAxisPickStyle(*sketchgui, on); } +void DrawSketchHandler::moveCursorToSketchPoint(Base::Vector2d point) +{ + ViewProviderSketchDrawSketchHandlerAttorney::moveCursorToSketchPoint(*sketchgui, point); +} + +void DrawSketchHandler::preselectAtPoint(Base::Vector2d point) +{ + ViewProviderSketchDrawSketchHandlerAttorney::preselectAtPoint(*sketchgui, point); +} + int DrawSketchHandler::getPreselectPoint(void) const { return ViewProviderSketchDrawSketchHandlerAttorney::getPreselectPoint(*sketchgui); @@ -972,3 +996,9 @@ int DrawSketchHandler::getPreselectCross(void) const { return ViewProviderSketchDrawSketchHandlerAttorney::getPreselectCross(*sketchgui); } + +Sketcher::SketchObject * DrawSketchHandler::getSketchObject() +{ + return sketchgui->getSketchObject(); +} + diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandler.h b/src/Mod/Sketcher/Gui/DrawSketchHandler.h index 5a2ee3c695..fbd82d908d 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandler.h +++ b/src/Mod/Sketcher/Gui/DrawSketchHandler.h @@ -83,6 +83,8 @@ private: static inline void drawEdit(ViewProviderSketch &vp, const std::list> &list); static inline void drawEditMarkers(ViewProviderSketch &vp, const std::vector &EditMarkers, unsigned int augmentationlevel = 0); static inline void setAxisPickStyle(ViewProviderSketch &vp, bool on); + static inline void moveCursorToSketchPoint(ViewProviderSketch &vp, Base::Vector2d point); + static inline void preselectAtPoint(ViewProviderSketch &vp, Base::Vector2d point); static inline int getPreselectPoint(const ViewProviderSketch &vp); static inline int getPreselectCurve(const ViewProviderSketch &vp); @@ -143,12 +145,14 @@ public: void resetPositionText(void); void renderSuggestConstraintsCursor(std::vector &suggestedConstraints); -private: +private: // NVI virtual void preActivated(); virtual void activated(){} virtual void deactivated(){} virtual void postDeactivated(){} - virtual void onWidgetChanged(){} + +protected: // NVI requiring base implementation + virtual QString getCrosshairCursorSVGName() const; protected: // helpers @@ -158,24 +162,36 @@ protected: * * \param autoScale - set this to false if pixmap already scaled for HiDPI **/ + + /** @name Icon helpers */ + //@{ void setCursor(const QPixmap &pixmap, int x,int y, bool autoScale=true); - void setSvgCursor(const QString &svgName, int x, int y, - const std::map& colorMapping = std::map()); - void addCursorTail(std::vector &pixmaps); + + /// updates the actCursor with the icon by calling getCrosshairCursorSVGName(), + /// enabling to set data member dependent icons (i.e. for different construction methods) void updateCursor(); + + /// restitutes the cursor that was in use at the moment of starting the DrawSketchHandler (i.e. oldCursor) void unsetCursor(void); + + /// restitutes the DSH cached cursor (e.g. without any tail due to autoconstraints, ...) void applyCursor(void); - void applyCursor(QCursor &newCursor); + + /// returns the color to be used for the crosshair (configurable as a parameter) unsigned long getCrosshairColor(); + + /// functions to set the cursor to a given svgName (to be migrated to NVI style) + qreal devicePixelRatio(); - void setCrosshairCursor(const QString & svgName); - void setCrosshairCursor(const char* svgName); + //@} void drawEdit(const std::vector &EditCurve); void drawEdit(const std::list> &list); void drawEdit(const std::vector &geometries); void drawEditMarkers(const std::vector &EditMarkers, unsigned int augmentationlevel = 0); void setAxisPickStyle(bool on); + void moveCursorToSketchPoint(Base::Vector2d point); + void preselectAtPoint(Base::Vector2d point); void drawPositionAtCursor(const Base::Vector2d & position); void drawDirectionAtCursor(const Base::Vector2d & position, const Base::Vector2d & origin); @@ -184,8 +200,20 @@ protected: int getPreselectCurve(void) const; int getPreselectCross(void) const; - virtual QString getCrosshairCursorString() const; + Sketcher::SketchObject * getSketchObject(); +private: + void setSvgCursor(const QString &svgName, int x, int y, + const std::map& colorMapping = std::map()); + + void addCursorTail(std::vector &pixmaps); + + void applyCursor(QCursor &newCursor); + + void setCrosshairCursor(const QString & svgName); + void setCrosshairCursor(const char* svgName); + +protected: /** * Returns constraints icons scaled to width. **/ diff --git a/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp b/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp index 9105ddc439..63c10ae603 100644 --- a/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp +++ b/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp @@ -369,10 +369,6 @@ void ViewProviderSketch::deactivateHandler() { assert(isInEditMode()); if(sketchHandler){ - std::vector editCurve; - editCurve.clear(); - drawEdit(editCurve); // erase any line - resetPositionText(); sketchHandler->deactivate(); sketchHandler = nullptr; }