From 6282b7c08d8bb71b3c63aa66936fc10016ce5186 Mon Sep 17 00:00:00 2001 From: captain0xff Date: Tue, 16 Sep 2025 03:01:34 +0530 Subject: [PATCH] Gui: refactor gizmo attachment code --- src/Gui/Inventor/Draggers/Gizmo.cpp | 19 +++++++++++++++++++ src/Gui/Inventor/Draggers/Gizmo.h | 15 ++++++--------- src/Gui/ViewProviderDragger.cpp | 19 ++++++++++++++++++- src/Gui/ViewProviderDragger.h | 5 +++++ src/Mod/Part/Gui/TaskThickness.cpp | 2 +- src/Mod/Part/Gui/ViewProvider.cpp | 19 ------------------- src/Mod/Part/Gui/ViewProvider.h | 7 ------- .../PartDesign/Gui/TaskChamferParameters.cpp | 2 +- .../PartDesign/Gui/TaskExtrudeParameters.cpp | 2 +- .../PartDesign/Gui/TaskFilletParameters.cpp | 2 +- .../PartDesign/Gui/TaskHelixParameters.cpp | 2 +- src/Mod/PartDesign/Gui/TaskHoleParameters.cpp | 2 +- .../Gui/TaskRevolutionParameters.cpp | 2 +- .../Gui/TaskThicknessParameters.cpp | 2 +- 14 files changed, 56 insertions(+), 44 deletions(-) diff --git a/src/Gui/Inventor/Draggers/Gizmo.cpp b/src/Gui/Inventor/Draggers/Gizmo.cpp index c4ad5a9b01..67187c2ea4 100644 --- a/src/Gui/Inventor/Draggers/Gizmo.cpp +++ b/src/Gui/Inventor/Draggers/Gizmo.cpp @@ -40,6 +40,7 @@ #include #include #include +#include #include #include #include @@ -653,6 +654,8 @@ GizmoContainer::~GizmoContainer() cameraPositionSensor.detach(); uninitGizmos(); + + viewProvider->setGizmoContainer(nullptr); } void GizmoContainer::initGizmos() @@ -694,6 +697,8 @@ void GizmoContainer::attachViewer(Gui::View3DInventorViewer* viewer, Base::Place return; } + setUpAutoScale(viewer->getSoRenderManager()->getCamera()); + auto mat = origin.toMatrix(); viewer->getDocument()->setEditingTransform(mat); @@ -766,3 +771,17 @@ bool GizmoContainer::isEnabled() return hGrp->GetBool("EnableGizmos", true); } + +std::unique_ptr GizmoContainer::create( + std::initializer_list gizmos, + ViewProviderDragger* vp +) +{ + auto gizmoContainer = std::make_unique(); + gizmoContainer->addGizmos(gizmos); + gizmoContainer->viewProvider = vp; + + vp->setGizmoContainer(gizmoContainer.get()); + + return gizmoContainer; +} diff --git a/src/Gui/Inventor/Draggers/Gizmo.h b/src/Gui/Inventor/Draggers/Gizmo.h index 67f6cedc35..b97f6f7475 100644 --- a/src/Gui/Inventor/Draggers/Gizmo.h +++ b/src/Gui/Inventor/Draggers/Gizmo.h @@ -50,6 +50,7 @@ class SoLinearDraggerContainer; class SoRotationDragger; class SoRotationDraggerContainer; class View3DInventorViewer; +class ViewProviderDragger; struct GizmoPlacement { @@ -235,20 +236,16 @@ public: // Checks if the gizmos are enabled in the preferences static bool isEnabled(); - template - static inline std::unique_ptr createGizmo(std::initializer_list gizmos, T vp) - { - auto ptr = std::make_unique(); - ptr->addGizmos(gizmos); - vp->setGizmoContainer(ptr.get()); - - return ptr; - } + static std::unique_ptr create( + std::initializer_list gizmos, + ViewProviderDragger* vp + ); private: std::vector gizmos; SoFieldSensor cameraSensor; SoFieldSensor cameraPositionSensor; + ViewProviderDragger* viewProvider = nullptr; void addGizmo(Gizmo* gizmo); diff --git a/src/Gui/ViewProviderDragger.cpp b/src/Gui/ViewProviderDragger.cpp index 2c02ec1354..ddff8f4eca 100644 --- a/src/Gui/ViewProviderDragger.cpp +++ b/src/Gui/ViewProviderDragger.cpp @@ -39,6 +39,7 @@ #include "Control.h" #include "Document.h" #include "Inventor/Draggers/SoTransformDragger.h" +#include "Inventor/Draggers/Gizmo.h" #include "Inventor/SoFCPlacementIndicatorKit.h" #include "SoFCUnifiedSelection.h" #include "TaskTransform.h" @@ -94,6 +95,12 @@ void ViewProviderDragger::resetTransformOrigin() setTransformOrigin({}); } + +void ViewProviderDragger::setGizmoContainer(Gui::GizmoContainer* gizmoContainer) +{ + this->gizmoContainer = gizmoContainer; +} + void ViewProviderDragger::onChanged(const App::Property* property) { if (property == &TransformOrigin) { @@ -221,7 +228,11 @@ void ViewProviderDragger::setEditViewer(Gui::View3DInventorViewer* viewer, int M { Q_UNUSED(ModNum); - if (transformDragger && viewer) { + if (!viewer) { + return; + } + + if (transformDragger) { transformDragger->setUpAutoScale(viewer->getSoRenderManager()->getCamera()); auto originPlacement = App::GeoFeature::getGlobalPlacement(getObject()) * getObjectPlacement().inverse(); @@ -230,6 +241,12 @@ void ViewProviderDragger::setEditViewer(Gui::View3DInventorViewer* viewer, int M viewer->getDocument()->setEditingTransform(mat); viewer->setupEditingRoot(transformDragger, &mat); } + + if (gizmoContainer) { + auto originPlacement = App::GeoFeature::getGlobalPlacement(getObject()) + * getObjectPlacement().inverse(); + gizmoContainer->attachViewer(viewer, originPlacement); + } } void ViewProviderDragger::unsetEditViewer([[maybe_unused]] Gui::View3DInventorViewer* viewer) diff --git a/src/Gui/ViewProviderDragger.h b/src/Gui/ViewProviderDragger.h index 6937dec79f..3f0ced5cb9 100644 --- a/src/Gui/ViewProviderDragger.h +++ b/src/Gui/ViewProviderDragger.h @@ -40,6 +40,7 @@ namespace TaskView { class SoTransformDragger; class View3DInventorViewer; +class GizmoContainer; /** * The base class for all view providers modifying the placement @@ -71,6 +72,8 @@ public: /// Resets transform origin to the object origin void resetTransformOrigin(); + void setGizmoContainer(Gui::GizmoContainer* gizmoContainer); + public: /** @name Edit methods */ //@{ @@ -147,6 +150,8 @@ private: Base::Vector3d y, Base::Vector3d z, ViewProviderDragger::DraggerComponents components = DraggerComponent::All); + + GizmoContainer* gizmoContainer = nullptr; }; } // namespace Gui diff --git a/src/Mod/Part/Gui/TaskThickness.cpp b/src/Mod/Part/Gui/TaskThickness.cpp index b44fb33965..eaf278f568 100644 --- a/src/Mod/Part/Gui/TaskThickness.cpp +++ b/src/Mod/Part/Gui/TaskThickness.cpp @@ -326,7 +326,7 @@ void ThicknessWidget::setupGizmos() delete linearGizmo; return; } - gizmoContainer = Gui::GizmoContainer::createGizmo({linearGizmo}, vp); + gizmoContainer = Gui::GizmoContainer::create({linearGizmo}, vp); setGizmoPositions(); } diff --git a/src/Mod/Part/Gui/ViewProvider.cpp b/src/Mod/Part/Gui/ViewProvider.cpp index 9069388700..a8c515519b 100644 --- a/src/Mod/Part/Gui/ViewProvider.cpp +++ b/src/Mod/Part/Gui/ViewProvider.cpp @@ -111,25 +111,6 @@ void ViewProviderPart::applyTransparency(float transparency, std::vectorsetUpAutoScale(viewer->getSoRenderManager()->getCamera()); - - auto originPlacement = App::GeoFeature::getGlobalPlacement(getObject()) - * getObjectPlacement().inverse(); - gizmoContainer->attachViewer(viewer, originPlacement); - } -} - -void ViewProviderPart::setGizmoContainer(Gui::GizmoContainer* gizmoContainer) -{ - assert(gizmoContainer); - this->gizmoContainer = gizmoContainer; -} - // ---------------------------------------------------------------------------- void ViewProviderShapeBuilder::buildNodes(const App::Property* prop, std::vector& nodes) const diff --git a/src/Mod/Part/Gui/ViewProvider.h b/src/Mod/Part/Gui/ViewProvider.h index f38a0a87b2..14b1a72230 100644 --- a/src/Mod/Part/Gui/ViewProvider.h +++ b/src/Mod/Part/Gui/ViewProvider.h @@ -60,8 +60,6 @@ public: ~ViewProviderPart() override; bool doubleClicked() override; - void setGizmoContainer(Gui::GizmoContainer* gizmoContainer); - protected: void applyColor(const Part::ShapeHistory& hist, const std::vector& colBase, @@ -71,11 +69,6 @@ protected: std::vector& colBool); void applyTransparency(float transparency, std::vector& colors); void applyTransparency(float transparency, std::vector& colors); - - void setEditViewer(Gui::View3DInventorViewer* viewer, int ModNum) override; - -private: - Gui::GizmoContainer* gizmoContainer = nullptr; }; } // namespace PartGui diff --git a/src/Mod/PartDesign/Gui/TaskChamferParameters.cpp b/src/Mod/PartDesign/Gui/TaskChamferParameters.cpp index d991a08380..5b5842102b 100644 --- a/src/Mod/PartDesign/Gui/TaskChamferParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskChamferParameters.cpp @@ -383,7 +383,7 @@ void TaskChamferParameters::setupGizmos(ViewProviderDressUp* vp) } }); - gizmoContainer = GizmoContainer::createGizmo({ + gizmoContainer = GizmoContainer::create({ distanceGizmo, secondDistanceGizmo, angleGizmo }, vp); diff --git a/src/Mod/PartDesign/Gui/TaskExtrudeParameters.cpp b/src/Mod/PartDesign/Gui/TaskExtrudeParameters.cpp index 00a407a201..6b50b0b4f7 100644 --- a/src/Mod/PartDesign/Gui/TaskExtrudeParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskExtrudeParameters.cpp @@ -1375,7 +1375,7 @@ void TaskExtrudeParameters::setupGizmos() setGizmoPositions(); }); - gizmoContainer = GizmoContainer::createGizmo({ + gizmoContainer = GizmoContainer::create({ lengthGizmo1, lengthGizmo2, taperAngleGizmo1, taperAngleGizmo2 }, vp); diff --git a/src/Mod/PartDesign/Gui/TaskFilletParameters.cpp b/src/Mod/PartDesign/Gui/TaskFilletParameters.cpp index ef647cc52e..d5f316e388 100644 --- a/src/Mod/PartDesign/Gui/TaskFilletParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskFilletParameters.cpp @@ -216,7 +216,7 @@ void TaskFilletParameters::setupGizmos(ViewProviderDressUp* vp) radiusGizmo = new Gui::LinearGizmo(ui->filletRadius); radiusGizmo2 = new Gui::LinearGizmo(ui->filletRadius); - gizmoContainer = GizmoContainer::createGizmo({radiusGizmo, radiusGizmo2}, vp); + gizmoContainer = GizmoContainer::create({radiusGizmo, radiusGizmo2}, vp); setGizmoPositions(); } diff --git a/src/Mod/PartDesign/Gui/TaskHelixParameters.cpp b/src/Mod/PartDesign/Gui/TaskHelixParameters.cpp index 9414087d7e..a37ad10da8 100644 --- a/src/Mod/PartDesign/Gui/TaskHelixParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskHelixParameters.cpp @@ -726,7 +726,7 @@ void TaskHelixParameters::setupGizmos(ViewProviderHelix* vp) heightGizmo->setVisibility(!isPitchTurnsAngle); }); - gizmoContainer = GizmoContainer::createGizmo({heightGizmo}, vp); + gizmoContainer = GizmoContainer::create({heightGizmo}, vp); setGizmoPositions(); diff --git a/src/Mod/PartDesign/Gui/TaskHoleParameters.cpp b/src/Mod/PartDesign/Gui/TaskHoleParameters.cpp index 04bd12acad..a585833ef0 100644 --- a/src/Mod/PartDesign/Gui/TaskHoleParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskHoleParameters.cpp @@ -1172,7 +1172,7 @@ void TaskHoleParameters::setupGizmos(ViewProviderHole* vp) holeDepthGizmo = new LinearGizmo(ui->Depth); - gizmoContainer = GizmoContainer::createGizmo({holeDepthGizmo}, vp); + gizmoContainer = GizmoContainer::create({holeDepthGizmo}, vp); setGizmoPositions(); } diff --git a/src/Mod/PartDesign/Gui/TaskRevolutionParameters.cpp b/src/Mod/PartDesign/Gui/TaskRevolutionParameters.cpp index bc451a1f8b..1e6955ba08 100644 --- a/src/Mod/PartDesign/Gui/TaskRevolutionParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskRevolutionParameters.cpp @@ -739,7 +739,7 @@ void TaskRevolutionParameters::setupGizmos(ViewProvider* vp) rotationGizmo = new Gui::RadialGizmo(ui->revolveAngle); rotationGizmo2 = new Gui::RadialGizmo(ui->revolveAngle2); - gizmoContainer = GizmoContainer::createGizmo({rotationGizmo, rotationGizmo2}, vp); + gizmoContainer = GizmoContainer::create({rotationGizmo, rotationGizmo2}, vp); rotationGizmo->flipArrow(); rotationGizmo2->flipArrow(); diff --git a/src/Mod/PartDesign/Gui/TaskThicknessParameters.cpp b/src/Mod/PartDesign/Gui/TaskThicknessParameters.cpp index fb70901b01..71cd9f35bd 100644 --- a/src/Mod/PartDesign/Gui/TaskThicknessParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskThicknessParameters.cpp @@ -278,7 +278,7 @@ void TaskThicknessParameters::setupGizmos(ViewProviderDressUp* vp) linearGizmo = new Gui::LinearGizmo(ui->Value); - gizmoContainer = GizmoContainer::createGizmo({linearGizmo}, vp); + gizmoContainer = GizmoContainer::create({linearGizmo}, vp); setGizmoPositions(); }