From 27c4136f58f5911f2048b7f70f62ec0430115d99 Mon Sep 17 00:00:00 2001 From: wmayer Date: Sun, 22 Jan 2017 19:07:07 +0100 Subject: [PATCH] TaskTransformedParameters derives from Gui::DocumentObserver to handle deletion of view provider when clicking Cancel button --- .../Gui/TaskLinearPatternParameters.cpp | 8 +++---- .../Gui/TaskTransformedParameters.cpp | 23 +++++++++++++++---- .../Gui/TaskTransformedParameters.h | 7 +++++- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.cpp b/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.cpp index 2677e54ac..058959780 100644 --- a/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.cpp @@ -370,18 +370,18 @@ unsigned TaskLinearPatternParameters::getOccurrences(void) const return ui->spinOccurrences->value(); } - TaskLinearPatternParameters::~TaskLinearPatternParameters() { //hide the parts coordinate system axis for selection - PartDesign::Body * body = PartDesign::Body::findBodyOf ( getObject() ); - if(body) { + PartDesign::Body * body = PartDesign::Body::findBodyOf(getObject()); + if (body) { try { App::Origin *origin = body->getOrigin(); ViewProviderOrigin* vpOrigin; vpOrigin = static_cast(Gui::Application::Instance->getViewProvider(origin)); vpOrigin->resetTemporaryVisibility(); - } catch (const Base::Exception &ex) { + } + catch (const Base::Exception &ex) { Base::Console().Error ("%s\n", ex.what () ); } } diff --git a/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp b/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp index 913926a2d..bf4750260 100644 --- a/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp @@ -72,6 +72,12 @@ TaskTransformedParameters::TaskTransformedParameters(ViewProviderTransformed *Tr blockUpdate(false) { selectionMode = none; + + if (TransformedView) { + Gui::Document* doc = TransformedView->getDocument(); + this->attachDocument(doc); + this->enableNotifications(DocumentObserver::Delete); + } } TaskTransformedParameters::TaskTransformedParameters(TaskMultiTransformParameters *parentTask) @@ -92,6 +98,12 @@ TaskTransformedParameters::~TaskTransformedParameters() Gui::Selection().rmvSelectionGate(); } +void TaskTransformedParameters::slotDeletedObject(const Gui::ViewProviderDocumentObject& Obj) +{ + if (TransformedView == &Obj) + TransformedView = nullptr; +} + bool TaskTransformedParameters::isViewUpdated() const { return (blockUpdate == false); @@ -264,17 +276,18 @@ PartDesignGui::ViewProviderTransformed *TaskTransformedParameters::getTopTransfo } PartDesign::Transformed *TaskTransformedParameters::getTopTransformedObject() const { - App::DocumentObject *transform = getTopTransformedView()->getObject(); - assert (transform->isDerivedFrom(PartDesign::Transformed::getClassTypeId())); - return static_cast(transform); + App::DocumentObject *transform = getTopTransformedView()->getObject(); + assert (transform->isDerivedFrom(PartDesign::Transformed::getClassTypeId())); + return static_cast(transform); } - PartDesign::Transformed *TaskTransformedParameters::getObject() const { if (insideMultiTransform) return parentTask->getSubFeature(); - else + else if (TransformedView) return static_cast(TransformedView->getObject()); + else + return nullptr; } Part::Feature *TaskTransformedParameters::getBaseObject() const { diff --git a/src/Mod/PartDesign/Gui/TaskTransformedParameters.h b/src/Mod/PartDesign/Gui/TaskTransformedParameters.h index e29c07ce8..f6ffdc5d4 100644 --- a/src/Mod/PartDesign/Gui/TaskTransformedParameters.h +++ b/src/Mod/PartDesign/Gui/TaskTransformedParameters.h @@ -30,6 +30,7 @@ #include #include +#include #include "TaskFeatureParameters.h" #include "TaskTransformedMessages.h" @@ -114,7 +115,9 @@ private: Because in the second case there is no ViewProvider, some special methods are required to access the underlying FeatureTransformed object in two different ways. **/ -class TaskTransformedParameters : public Gui::TaskView::TaskBox, public Gui::SelectionObserver +class TaskTransformedParameters : public Gui::TaskView::TaskBox, + public Gui::SelectionObserver, + public Gui::DocumentObserver { Q_OBJECT @@ -184,6 +187,8 @@ protected: int getUpdateViewTimeout() const; protected: + /** Notifies when the object is about to be removed. */ + virtual void slotDeletedObject(const Gui::ViewProviderDocumentObject& Obj); virtual void changeEvent(QEvent *e) = 0; virtual void onSelectionChanged(const Gui::SelectionChanges& msg) = 0; virtual void clearButtons()=0;