From b1029bc6822132b7141e2d3ebac1d7373ae483e5 Mon Sep 17 00:00:00 2001 From: wmayer Date: Thu, 18 Jul 2024 00:02:07 +0200 Subject: [PATCH] PD: Replace helper functions in subclasses of TaskDlgFeatureParameters with a template function --- .../PartDesign/Gui/TaskChamferParameters.cpp | 14 ++---- .../PartDesign/Gui/TaskDraftParameters.cpp | 5 +- .../PartDesign/Gui/TaskDressUpParameters.cpp | 6 +-- .../PartDesign/Gui/TaskDressUpParameters.h | 3 -- .../PartDesign/Gui/TaskFeatureParameters.h | 50 +++++++++++++++++-- .../PartDesign/Gui/TaskFilletParameters.cpp | 14 ++---- src/Mod/PartDesign/Gui/TaskHelixParameters.h | 3 -- src/Mod/PartDesign/Gui/TaskHoleParameters.cpp | 2 +- src/Mod/PartDesign/Gui/TaskHoleParameters.h | 2 - src/Mod/PartDesign/Gui/TaskLoftParameters.cpp | 19 +++---- src/Mod/PartDesign/Gui/TaskLoftParameters.h | 3 -- src/Mod/PartDesign/Gui/TaskPadParameters.h | 7 +-- src/Mod/PartDesign/Gui/TaskPipeParameters.cpp | 8 +-- src/Mod/PartDesign/Gui/TaskPocketParameters.h | 8 +-- .../PartDesign/Gui/TaskRevolutionParameters.h | 5 -- .../Gui/TaskSketchBasedParameters.cpp | 34 +++++++------ .../Gui/TaskThicknessParameters.cpp | 2 +- .../Gui/TaskTransformedParameters.cpp | 10 ++-- .../Gui/TaskTransformedParameters.h | 5 -- src/Mod/PartDesign/Gui/ViewProvider.cpp | 2 +- src/Mod/PartDesign/Gui/ViewProviderHole.cpp | 2 +- 21 files changed, 107 insertions(+), 97 deletions(-) diff --git a/src/Mod/PartDesign/Gui/TaskChamferParameters.cpp b/src/Mod/PartDesign/Gui/TaskChamferParameters.cpp index 64227912fe..b860b160ee 100644 --- a/src/Mod/PartDesign/Gui/TaskChamferParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskChamferParameters.cpp @@ -340,20 +340,12 @@ TaskDlgChamferParameters::~TaskDlgChamferParameters() = default; //==== calls from the TaskView =============================================================== - -//void TaskDlgChamferParameters::open() -//{ -// // a transaction is already open at creation time of the chamfer -// if (!Gui::Command::hasPendingCommand()) { -// QString msg = tr("Edit chamfer"); -// Gui::Command::openCommand((const char*)msg.toUtf8()); -// } -//} bool TaskDlgChamferParameters::accept() { - auto obj = vp->getObject(); - if (!obj->isError()) + auto obj = getObject(); + if (!obj->isError()) { parameter->showObject(); + } parameter->apply(); diff --git a/src/Mod/PartDesign/Gui/TaskDraftParameters.cpp b/src/Mod/PartDesign/Gui/TaskDraftParameters.cpp index 8cb78b84bc..ef5eac6fa9 100644 --- a/src/Mod/PartDesign/Gui/TaskDraftParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskDraftParameters.cpp @@ -302,9 +302,10 @@ TaskDlgDraftParameters::~TaskDlgDraftParameters() = default; bool TaskDlgDraftParameters::accept() { - auto tobj = vp->getObject(); - if (!tobj->isError()) + auto tobj = getObject(); + if (!tobj->isError()) { parameter->showObject(); + } parameter->apply(); diff --git a/src/Mod/PartDesign/Gui/TaskDressUpParameters.cpp b/src/Mod/PartDesign/Gui/TaskDressUpParameters.cpp index a5471a6cb9..02bb857985 100644 --- a/src/Mod/PartDesign/Gui/TaskDressUpParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskDressUpParameters.cpp @@ -456,10 +456,10 @@ TaskDlgDressUpParameters::~TaskDlgDressUpParameters() = default; bool TaskDlgDressUpParameters::accept() { - getDressUpView()->highlightReferences(false); + getViewObject()->highlightReferences(false); std::vector refs = parameter->getReferences(); std::stringstream str; - str << Gui::Command::getObjectCmd(vp->getObject()) << ".Base = (" + str << Gui::Command::getObjectCmd(getObject()) << ".Base = (" << Gui::Command::getObjectCmd(parameter->getBase()) << ",["; for (const auto & ref : refs) str << "\"" << ref << "\","; @@ -470,7 +470,7 @@ bool TaskDlgDressUpParameters::accept() bool TaskDlgDressUpParameters::reject() { - getDressUpView()->highlightReferences(false); + getViewObject()->highlightReferences(false); return TaskDlgFeatureParameters::reject(); } diff --git a/src/Mod/PartDesign/Gui/TaskDressUpParameters.h b/src/Mod/PartDesign/Gui/TaskDressUpParameters.h index 06ec92173f..4036f72be2 100644 --- a/src/Mod/PartDesign/Gui/TaskDressUpParameters.h +++ b/src/Mod/PartDesign/Gui/TaskDressUpParameters.h @@ -113,9 +113,6 @@ public: explicit TaskDlgDressUpParameters(ViewProviderDressUp *DressUpView); ~TaskDlgDressUpParameters() override; - ViewProviderDressUp* getDressUpView() const - { return static_cast(vp); } - public: /// is called by the framework if the dialog is accepted (Ok) bool accept() override; diff --git a/src/Mod/PartDesign/Gui/TaskFeatureParameters.h b/src/Mod/PartDesign/Gui/TaskFeatureParameters.h index b3fb38b2e6..b9f6c2dbfa 100644 --- a/src/Mod/PartDesign/Gui/TaskFeatureParameters.h +++ b/src/Mod/PartDesign/Gui/TaskFeatureParameters.h @@ -59,6 +59,34 @@ private: void slotDeletedObject(const Gui::ViewProviderDocumentObject& Obj) override; protected: + template T* getViewObject() const + { + static_assert(std::is_base_of::value, + "Wrong template argument"); + return dynamic_cast(vp); + } + + template T* getObject() const + { + static_assert(std::is_base_of::value, "Wrong template argument"); + if (vp) { + return dynamic_cast(vp->getObject()); + } + + return nullptr; + } + + Gui::Document* getGuiDocument() const + { + return vp ? vp->getDocument() : nullptr; + } + + App::Document* getAppDocument() const + { + auto obj = getObject(); + return obj ? obj->getDocument() : nullptr; + } + bool isUpdateBlocked() const { return blockUpdate; @@ -98,11 +126,25 @@ public: /// is called by the framework if the dialog is rejected (Cancel) bool reject() override; - /// Returns the view provider dialog is runed for - PartDesignGui::ViewProvider *viewProvider() const { return vp; } + template T* getViewObject() const + { + static_assert(std::is_base_of::value, + "Wrong template argument"); + return dynamic_cast(vp); + } -protected: - PartDesignGui::ViewProvider *vp; + template T* getObject() const + { + static_assert(std::is_base_of::value, "Wrong template argument"); + if (vp) { + return dynamic_cast(vp->getObject()); + } + + return nullptr; + } + +private: + PartDesignGui::ViewProvider* vp; }; } //namespace PartDesignGui diff --git a/src/Mod/PartDesign/Gui/TaskFilletParameters.cpp b/src/Mod/PartDesign/Gui/TaskFilletParameters.cpp index 83436d4da7..8e81ae18d3 100644 --- a/src/Mod/PartDesign/Gui/TaskFilletParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskFilletParameters.cpp @@ -209,20 +209,12 @@ TaskDlgFilletParameters::~TaskDlgFilletParameters() = default; //==== calls from the TaskView =============================================================== - -//void TaskDlgFilletParameters::open() -//{ -// // a transaction is already open at creation time of the fillet -// if (!Gui::Command::hasPendingCommand()) { -// QString msg = tr("Edit fillet"); -// Gui::Command::openCommand((const char*)msg.toUtf8()); -// } -//} bool TaskDlgFilletParameters::accept() { - auto obj = vp->getObject(); - if (!obj->isError()) + auto obj = getObject(); + if (!obj->isError()) { parameter->showObject(); + } parameter->apply(); diff --git a/src/Mod/PartDesign/Gui/TaskHelixParameters.h b/src/Mod/PartDesign/Gui/TaskHelixParameters.h index 76dbb194bc..8da0b1fdab 100644 --- a/src/Mod/PartDesign/Gui/TaskHelixParameters.h +++ b/src/Mod/PartDesign/Gui/TaskHelixParameters.h @@ -134,9 +134,6 @@ class TaskDlgHelixParameters : public TaskDlgSketchBasedParameters public: explicit TaskDlgHelixParameters(ViewProviderHelix* HelixView); - - ViewProviderHelix* getHelixView() const - { return static_cast(vp); } }; } //namespace PartDesignGui diff --git a/src/Mod/PartDesign/Gui/TaskHoleParameters.cpp b/src/Mod/PartDesign/Gui/TaskHoleParameters.cpp index 5746eb32fb..850f92fedf 100644 --- a/src/Mod/PartDesign/Gui/TaskHoleParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskHoleParameters.cpp @@ -1185,7 +1185,7 @@ TaskDlgHoleParameters::TaskDlgHoleParameters(ViewProviderHole* HoleView) : TaskDlgSketchBasedParameters(HoleView) { assert(HoleView); - parameter = new TaskHoleParameters(static_cast(vp)); + parameter = new TaskHoleParameters(HoleView); Content.push_back(parameter); } diff --git a/src/Mod/PartDesign/Gui/TaskHoleParameters.h b/src/Mod/PartDesign/Gui/TaskHoleParameters.h index 96e9596377..fd2862d9c2 100644 --- a/src/Mod/PartDesign/Gui/TaskHoleParameters.h +++ b/src/Mod/PartDesign/Gui/TaskHoleParameters.h @@ -146,8 +146,6 @@ public: explicit TaskDlgHoleParameters(ViewProviderHole *HoleView); ~TaskDlgHoleParameters() override; - ViewProviderHole* getHoleView() const { return static_cast(vp); } - protected: TaskHoleParameters *parameter; }; diff --git a/src/Mod/PartDesign/Gui/TaskLoftParameters.cpp b/src/Mod/PartDesign/Gui/TaskLoftParameters.cpp index 7820c124c0..6137ef7225 100644 --- a/src/Mod/PartDesign/Gui/TaskLoftParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskLoftParameters.cpp @@ -375,17 +375,18 @@ TaskDlgLoftParameters::~TaskDlgLoftParameters() = default; bool TaskDlgLoftParameters::accept() { - PartDesign::Loft* pcLoft = static_cast(vp->getObject()); - static_cast(vp)->highlightReferences(ViewProviderLoft::Both, false); + if (auto loft = getObject()) { + getViewObject()->highlightReferences(ViewProviderLoft::Both, false); - // First verify that the loft can be built and then hide the sections as otherwise - // they will remain hidden if the loft's recompute fails - if (TaskDlgSketchBasedParameters::accept()) { - for (App::DocumentObject* obj : pcLoft->Sections.getValues()) { - Gui::cmdAppObjectHide(obj); + // First verify that the loft can be built and then hide the sections as otherwise + // they will remain hidden if the loft's recompute fails + if (TaskDlgSketchBasedParameters::accept()) { + for (App::DocumentObject* obj : loft->Sections.getValues()) { + Gui::cmdAppObjectHide(obj); + } + + return true; } - - return true; } return false; diff --git a/src/Mod/PartDesign/Gui/TaskLoftParameters.h b/src/Mod/PartDesign/Gui/TaskLoftParameters.h index 3bd852f063..ba4fb17682 100644 --- a/src/Mod/PartDesign/Gui/TaskLoftParameters.h +++ b/src/Mod/PartDesign/Gui/TaskLoftParameters.h @@ -87,9 +87,6 @@ public: explicit TaskDlgLoftParameters(ViewProviderLoft *LoftView,bool newObj=false); ~TaskDlgLoftParameters() override; - ViewProviderLoft* getLoftView() const - { return static_cast(vp); } - /// is called by the framework if the dialog is accepted (Ok) bool accept() override; diff --git a/src/Mod/PartDesign/Gui/TaskPadParameters.h b/src/Mod/PartDesign/Gui/TaskPadParameters.h index a36a8fa0cd..070ec23476 100644 --- a/src/Mod/PartDesign/Gui/TaskPadParameters.h +++ b/src/Mod/PartDesign/Gui/TaskPadParameters.h @@ -62,10 +62,11 @@ class TaskDlgPadParameters : public TaskDlgExtrudeParameters public: explicit TaskDlgPadParameters(ViewProviderPad *PadView, bool newObj=false); - ViewProviderPad* getPadView() const { return static_cast(vp); } - protected: - TaskExtrudeParameters* getTaskParameters() override { return parameters; }; + TaskExtrudeParameters* getTaskParameters() override + { + return parameters; + } private: TaskPadParameters* parameters; diff --git a/src/Mod/PartDesign/Gui/TaskPipeParameters.cpp b/src/Mod/PartDesign/Gui/TaskPipeParameters.cpp index f550aaae6c..b257b46720 100644 --- a/src/Mod/PartDesign/Gui/TaskPipeParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskPipeParameters.cpp @@ -1097,21 +1097,21 @@ void TaskDlgPipeParameters::onButtonToggled(QAbstractButton *button, bool checke switch (id) { case StateHandlerTaskPipe::SelectionModes::refProfile: - static_cast(vp)->highlightReferences(ViewProviderPipe::Profile, checked); + getViewObject()->highlightReferences(ViewProviderPipe::Profile, checked); break; case StateHandlerTaskPipe::SelectionModes::refSpine: case StateHandlerTaskPipe::SelectionModes::refSpineEdgeAdd: case StateHandlerTaskPipe::SelectionModes::refSpineEdgeRemove: - static_cast(vp)->highlightReferences(ViewProviderPipe::Spine, checked); + getViewObject()->highlightReferences(ViewProviderPipe::Spine, checked); break; case StateHandlerTaskPipe::SelectionModes::refAuxSpine: case StateHandlerTaskPipe::SelectionModes::refAuxSpineEdgeAdd: case StateHandlerTaskPipe::SelectionModes::refAuxSpineEdgeRemove: - static_cast(vp)->highlightReferences(ViewProviderPipe::AuxiliarySpine, checked); + getViewObject()->highlightReferences(ViewProviderPipe::AuxiliarySpine, checked); break; case StateHandlerTaskPipe::SelectionModes::refSectionAdd: case StateHandlerTaskPipe::SelectionModes::refSectionRemove: - static_cast(vp)->highlightReferences(ViewProviderPipe::Section, checked); + getViewObject()->highlightReferences(ViewProviderPipe::Section, checked); break; default: break; diff --git a/src/Mod/PartDesign/Gui/TaskPocketParameters.h b/src/Mod/PartDesign/Gui/TaskPocketParameters.h index 6de89f7b58..2934c06dc1 100644 --- a/src/Mod/PartDesign/Gui/TaskPocketParameters.h +++ b/src/Mod/PartDesign/Gui/TaskPocketParameters.h @@ -65,11 +65,11 @@ class TaskDlgPocketParameters : public TaskDlgExtrudeParameters public: explicit TaskDlgPocketParameters(ViewProviderPocket *PocketView); - ViewProviderPocket* getPocketView() const - { return static_cast(vp); } - protected: - TaskExtrudeParameters* getTaskParameters() override { return parameters; } + TaskExtrudeParameters* getTaskParameters() override + { + return parameters; + } private: TaskPocketParameters* parameters; diff --git a/src/Mod/PartDesign/Gui/TaskRevolutionParameters.h b/src/Mod/PartDesign/Gui/TaskRevolutionParameters.h index 8f5ccc87f1..48cf3ef190 100644 --- a/src/Mod/PartDesign/Gui/TaskRevolutionParameters.h +++ b/src/Mod/PartDesign/Gui/TaskRevolutionParameters.h @@ -122,11 +122,6 @@ class TaskDlgRevolutionParameters : public TaskDlgSketchBasedParameters public: explicit TaskDlgRevolutionParameters(PartDesignGui::ViewProvider *RevolutionView); - - ViewProvider* getRevolutionView() const - { - return vp; - } }; } //namespace PartDesignGui diff --git a/src/Mod/PartDesign/Gui/TaskSketchBasedParameters.cpp b/src/Mod/PartDesign/Gui/TaskSketchBasedParameters.cpp index 14fb0dce70..72ebf8e8e5 100644 --- a/src/Mod/PartDesign/Gui/TaskSketchBasedParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskSketchBasedParameters.cpp @@ -250,19 +250,20 @@ TaskDlgSketchBasedParameters::~TaskDlgSketchBasedParameters() = default; //==== calls from the TaskView =============================================================== -bool TaskDlgSketchBasedParameters::accept() { - App::DocumentObject* feature = vp->getObject(); +bool TaskDlgSketchBasedParameters::accept() +{ + auto feature = getObject(); // Make sure the feature is what we are expecting // Should be fine but you never know... - if (!feature->isDerivedFrom()) { + if (!feature) { throw Base::TypeError("Bad object processed in the sketch based dialog."); } // First verify that the feature can be built and then hide the profile as otherwise // it will remain hidden if the feature's recompute fails if (TaskDlgFeatureParameters::accept()) { - App::DocumentObject* sketch = static_cast(feature)->Profile.getValue(); + App::DocumentObject* sketch = feature->Profile.getValue(); Gui::cmdAppObjectHide(sketch); return true; } @@ -272,24 +273,29 @@ bool TaskDlgSketchBasedParameters::accept() { bool TaskDlgSketchBasedParameters::reject() { - PartDesign::ProfileBased* pcSketchBased = static_cast(vp->getObject()); - App::DocumentObjectWeakPtrT weakptr(pcSketchBased); - // get the Sketch - Sketcher::SketchObject *pcSketch = static_cast(pcSketchBased->Profile.getValue()); - bool rv; + auto feature = getObject(); - // rv should be true anyway but to be on the safe side due to further changes better respect it. - rv = TaskDlgFeatureParameters::reject(); + // Make sure the feature is what we are expecting + // Should be fine but you never know... + if (!feature) { + throw Base::TypeError("Bad object processed in the sketch based dialog."); + } + + App::DocumentObjectWeakPtrT weakptr(feature); + auto sketch = dynamic_cast(feature->Profile.getValue()); + + bool value = TaskDlgFeatureParameters::reject(); // if abort command deleted the object the sketch is visible again. // The previous one feature already should be made visible if (weakptr.expired()) { // Make the sketch visible - if (pcSketch && Gui::Application::Instance->getViewProvider(pcSketch)) - Gui::Application::Instance->getViewProvider(pcSketch)->show(); + if (sketch && Gui::Application::Instance->getViewProvider(sketch)) { + Gui::Application::Instance->getViewProvider(sketch)->show(); + } } - return rv; + return value; } #include "moc_TaskSketchBasedParameters.cpp" diff --git a/src/Mod/PartDesign/Gui/TaskThicknessParameters.cpp b/src/Mod/PartDesign/Gui/TaskThicknessParameters.cpp index 05624eb89e..05b974c5c3 100644 --- a/src/Mod/PartDesign/Gui/TaskThicknessParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskThicknessParameters.cpp @@ -280,7 +280,7 @@ TaskDlgThicknessParameters::~TaskDlgThicknessParameters() = default; bool TaskDlgThicknessParameters::accept() { - auto obj = vp->getObject(); + auto obj = getObject(); if (!obj->isError()) { parameter->showObject(); } diff --git a/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp b/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp index e014e5d614..0e11ca2596 100644 --- a/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp @@ -615,13 +615,10 @@ void TaskTransformedParameters::indexesMoved() // TaskDialog //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -TaskDlgTransformedParameters::TaskDlgTransformedParameters( - ViewProviderTransformed* TransformedView_) - : TaskDlgFeatureParameters(TransformedView_) +TaskDlgTransformedParameters::TaskDlgTransformedParameters(ViewProviderTransformed* viewProvider) + : TaskDlgFeatureParameters(viewProvider) { - assert(vp); - message = new TaskTransformedMessages(getTransformedView()); - + message = new TaskTransformedMessages(viewProvider); Content.push_back(message); } @@ -639,7 +636,6 @@ bool TaskDlgTransformedParameters::reject() { // ensure that we are not in selection mode parameter->exitSelectionMode(); - return TaskDlgFeatureParameters::reject(); } diff --git a/src/Mod/PartDesign/Gui/TaskTransformedParameters.h b/src/Mod/PartDesign/Gui/TaskTransformedParameters.h index 0198e8a9a8..0cd72f2eb6 100644 --- a/src/Mod/PartDesign/Gui/TaskTransformedParameters.h +++ b/src/Mod/PartDesign/Gui/TaskTransformedParameters.h @@ -295,11 +295,6 @@ class TaskDlgTransformedParameters: public PartDesignGui::TaskDlgFeatureParamete public: explicit TaskDlgTransformedParameters(ViewProviderTransformed* TransformedView); - ViewProviderTransformed* getTransformedView() const - { - return static_cast(vp); - } - /// is called by the framework if the dialog is accepted (Ok) bool accept() override; /// is called by the framework if the dialog is rejected (Cancel) diff --git a/src/Mod/PartDesign/Gui/ViewProvider.cpp b/src/Mod/PartDesign/Gui/ViewProvider.cpp index f96fa45cd1..f50818d0e7 100644 --- a/src/Mod/PartDesign/Gui/ViewProvider.cpp +++ b/src/Mod/PartDesign/Gui/ViewProvider.cpp @@ -88,7 +88,7 @@ bool ViewProvider::setEdit(int ModNum) Gui::TaskView::TaskDialog *dlg = Gui::Control().activeDialog(); TaskDlgFeatureParameters *featureDlg = qobject_cast(dlg); // NOTE: if the dialog is not partDesigan dialog the featureDlg will be NULL - if (featureDlg && featureDlg->viewProvider() != this) { + if (featureDlg && featureDlg->getViewObject() != this) { featureDlg = nullptr; // another feature left open its task panel } if (dlg && !featureDlg) { diff --git a/src/Mod/PartDesign/Gui/ViewProviderHole.cpp b/src/Mod/PartDesign/Gui/ViewProviderHole.cpp index 65e448c5cc..09e83a191e 100644 --- a/src/Mod/PartDesign/Gui/ViewProviderHole.cpp +++ b/src/Mod/PartDesign/Gui/ViewProviderHole.cpp @@ -70,7 +70,7 @@ bool ViewProviderHole::setEdit(int ModNum) // the task panel Gui::TaskView::TaskDialog *dlg = Gui::Control().activeDialog(); TaskDlgHoleParameters *holeDlg = qobject_cast(dlg); - if (holeDlg && holeDlg->getHoleView() != this) + if (holeDlg && holeDlg->getViewObject() != this) holeDlg = nullptr; // another hole left open its task panel if (dlg && !holeDlg) { QMessageBox msgBox;