diff --git a/src/Gui/ExpressionBinding.cpp b/src/Gui/ExpressionBinding.cpp index 0be9f992c6..0927244407 100644 --- a/src/Gui/ExpressionBinding.cpp +++ b/src/Gui/ExpressionBinding.cpp @@ -59,6 +59,13 @@ bool ExpressionBinding::isBound() const return path.getDocumentObject() != 0; } +void ExpressionBinding::unbind() +{ + expressionchanged.disconnect(); + objectdeleted.disconnect(); + path = App::ObjectIdentifier(); +} + void Gui::ExpressionBinding::setExpression(boost::shared_ptr expr) { DocumentObject * docObj = path.getDocumentObject(); @@ -100,7 +107,11 @@ void ExpressionBinding::bind(const App::ObjectIdentifier &_path) //connect to be informed about changes DocumentObject * docObj = path.getDocumentObject(); - connection = docObj->ExpressionEngine.expressionChanged.connect(boost::bind(&ExpressionBinding::expressionChange, this, bp::_1)); + if (docObj) { + expressionchanged = docObj->ExpressionEngine.expressionChanged.connect(boost::bind(&ExpressionBinding::expressionChange, this, bp::_1)); + App::Document* doc = docObj->getDocument(); + objectdeleted = doc->signalDeletedObject.connect(boost::bind(&ExpressionBinding::objectDeleted, this, bp::_1)); + } } void ExpressionBinding::bind(const Property &prop) @@ -247,3 +258,11 @@ void ExpressionBinding::expressionChange(const ObjectIdentifier& id) { if(id==path) onChange(); } + +void ExpressionBinding::objectDeleted(const App::DocumentObject& obj) +{ + DocumentObject * docObj = path.getDocumentObject(); + if (docObj == &obj) { + unbind(); + } +} diff --git a/src/Gui/ExpressionBinding.h b/src/Gui/ExpressionBinding.h index db486bb993..f3e4e3ff21 100644 --- a/src/Gui/ExpressionBinding.h +++ b/src/Gui/ExpressionBinding.h @@ -44,6 +44,7 @@ public: virtual void bind(const App::ObjectIdentifier & _path); virtual void bind(const App::Property & prop); bool isBound() const; + void unbind(); virtual bool apply(const std::string &propName); virtual bool apply(); bool hasExpression() const; @@ -52,8 +53,8 @@ public: //auto apply means that the python code is issued not only on apply() but //also on setExpression - bool autoApply() const {return m_autoApply;}; - void setAutoApply(bool value) {m_autoApply = value;}; + bool autoApply() const {return m_autoApply;} + void setAutoApply(bool value) {m_autoApply = value;} protected: const App::ObjectIdentifier & getPath() const { return path; } @@ -63,7 +64,7 @@ protected: virtual void setExpression(boost::shared_ptr expr); //gets called when the bound expression is changed, either by this binding or any external action - virtual void onChange() {}; + virtual void onChange() {} private: App::ObjectIdentifier path; @@ -75,7 +76,9 @@ protected: int iconHeight; void expressionChange(const App::ObjectIdentifier& id); - boost::signals2::scoped_connection connection; + void objectDeleted(const App::DocumentObject&); + boost::signals2::scoped_connection expressionchanged; + boost::signals2::scoped_connection objectdeleted; bool m_autoApply; };