diff --git a/src/Mod/PartDesign/Gui/TaskShapeBinder.cpp b/src/Mod/PartDesign/Gui/TaskShapeBinder.cpp index b7618a7746..576d3cb2cd 100644 --- a/src/Mod/PartDesign/Gui/TaskShapeBinder.cpp +++ b/src/Mod/PartDesign/Gui/TaskShapeBinder.cpp @@ -59,6 +59,7 @@ TaskShapeBinder::TaskShapeBinder(ViewProviderShapeBinder* view, bool /*newObj*/, tr("Datum shape parameters"), true, parent) , SelectionObserver(view) , ui(new Ui_TaskShapeBinder) + , vp(view) { // we need a separate container widget to add all controls to proxy = new QWidget(this); @@ -75,7 +76,6 @@ TaskShapeBinder::TaskShapeBinder(ViewProviderShapeBinder* view, bool /*newObj*/, this->groupLayout()->addWidget(proxy); Gui::Document* doc = Gui::Application::Instance->activeDocument(); - vp = view; //add initial values App::GeoFeature* obj = nullptr; @@ -140,9 +140,13 @@ void TaskShapeBinder::onSelectionChanged(const Gui::SelectionChanges& msg) ui->listWidgetReferences->clear(); setObjectLabel(msg); } + clearButtons(); - static_cast(vp)->highlightReferences(false, false); - vp->getObject()->getDocument()->recomputeFeature(vp->getObject()); + + if (!vp.expired()) { + vp->highlightReferences(false, false); + vp->getObject()->getDocument()->recomputeFeature(vp->getObject()); + } } clearButtons(); exitSelectionMode(); @@ -150,21 +154,7 @@ void TaskShapeBinder::onSelectionChanged(const Gui::SelectionChanges& msg) } TaskShapeBinder::~TaskShapeBinder() -{/* - PartDesign::Pipe* pipe = static_cast(vp->getObject()); - Gui::Document* doc = Gui::Application::Instance->activeDocument(); - - //make sure the user sees all important things: the base feature to select edges and the - //spine/auxiliary spine they already selected - if(pipe->BaseFeature.getValue()) - doc->getViewProvider(pipe->BaseFeature.getValue())->hide(); - if(pipe->Spine.getValue()) { - auto* svp = doc->getViewProvider(pipe->Spine.getValue()); - svp->setVisible(supportShow); - supportShow = false; - } - static_cast(vp)->highlightReferences(false, false); - */ +{ } void TaskShapeBinder::changeEvent(QEvent*) @@ -189,7 +179,9 @@ void TaskShapeBinder::onButtonRefRemove(bool checked) { //hideObject(); Gui::Selection().clearSelection(); selectionMode = refRemove; - vp->highlightReferences(true, false); + + if (!vp.expired()) + vp->highlightReferences(true, false); } } @@ -215,7 +207,10 @@ void TaskShapeBinder::removeFromListWidget(QListWidget* widget, QString itemstr) } } -bool TaskShapeBinder::referenceSelected(const SelectionChanges& msg) const { +bool TaskShapeBinder::referenceSelected(const SelectionChanges& msg) const +{ + if (vp.expired()) + return false; if ((msg.Type == Gui::SelectionChanges::AddSelection) && ( (selectionMode == refAdd) || (selectionMode == refRemove) @@ -307,10 +302,10 @@ void TaskShapeBinder::exitSelectionMode() { TaskDlgShapeBinder::TaskDlgShapeBinder(ViewProviderShapeBinder* view, bool newObj) : Gui::TaskView::TaskDialog() + , vp(view) { assert(view); parameter = new TaskShapeBinder(view, newObj); - vp = view; Content.push_back(parameter); } @@ -325,8 +320,6 @@ TaskDlgShapeBinder::~TaskDlgShapeBinder() bool TaskDlgShapeBinder::accept() { - std::string name = vp->getObject()->getNameInDocument(); - try { Gui::Command::doCommand(Gui::Command::Doc, "App.ActiveDocument.recompute()"); if (!vp->getObject()->isValid()) diff --git a/src/Mod/PartDesign/Gui/TaskShapeBinder.h b/src/Mod/PartDesign/Gui/TaskShapeBinder.h index 0cef8c7ec9..0d5ba58119 100644 --- a/src/Mod/PartDesign/Gui/TaskShapeBinder.h +++ b/src/Mod/PartDesign/Gui/TaskShapeBinder.h @@ -26,6 +26,7 @@ #include #include +#include #include "ViewProviderShapeBinder.h" @@ -52,7 +53,6 @@ public: TaskShapeBinder(ViewProviderShapeBinder *view,bool newObj=false,QWidget *parent = nullptr); ~TaskShapeBinder(); - private Q_SLOTS: void onButtonRefAdd(bool checked); void onButtonRefRemove(bool checked); @@ -73,11 +73,11 @@ private: void exitSelectionMode(); bool supportShow = false; - + private: QWidget* proxy; std::unique_ptr ui; - ViewProviderShapeBinder* vp; + Gui::WeakPtrT vp; }; @@ -98,7 +98,7 @@ public: protected: TaskShapeBinder *parameter; - ViewProviderShapeBinder* vp; + Gui::WeakPtrT vp; }; } //namespace PartDesignGui