diff --git a/src/Gui/ViewProviderFeaturePython.cpp b/src/Gui/ViewProviderFeaturePython.cpp index 6e84997913..8996bfe23c 100644 --- a/src/Gui/ViewProviderFeaturePython.cpp +++ b/src/Gui/ViewProviderFeaturePython.cpp @@ -638,6 +638,38 @@ void ViewProviderFeaturePythonImp::onChanged(const App::Property* prop) } } +void ViewProviderFeaturePythonImp::onBeforeChange(const App::Property* prop) +{ + if(py_onBeforeChange.isNone()) + return; + + // Run the onChanged method of the proxy object. + Base::PyGILStateLocker lock; + try { + if (has__object__) { + Py::Tuple args(1); + const char* prop_name = object->getPropertyName(prop); + if (prop_name) { + args.setItem(0, Py::String(prop_name)); + Base::pyCall(py_onBeforeChange.ptr(),args.ptr()); + } + } + else { + Py::Tuple args(2); + args.setItem(0, Py::Object(object->getPyObject(), true)); + const char* prop_name = object->getPropertyName(prop); + if (prop_name) { + args.setItem(1, Py::String(prop_name)); + Base::pyCall(py_onBeforeChange.ptr(),args.ptr()); + } + } + } + catch (Py::Exception&) { + Base::PyException e; // extract the Python error text + e.ReportException(); + } +} + void ViewProviderFeaturePythonImp::startRestoring() { } diff --git a/src/Gui/ViewProviderFeaturePython.h b/src/Gui/ViewProviderFeaturePython.h index 4133022050..023247019e 100644 --- a/src/Gui/ViewProviderFeaturePython.h +++ b/src/Gui/ViewProviderFeaturePython.h @@ -72,6 +72,7 @@ public: void attach(App::DocumentObject *pcObject); void updateData(const App::Property*); void onChanged(const App::Property* prop); + void onBeforeChange(const App::Property* prop); void startRestoring(); void finishRestoring(); ValueT onDelete(const std::vector & sub); @@ -149,6 +150,7 @@ private: FC_PY_ELEMENT(attach) \ FC_PY_ELEMENT(updateData) \ FC_PY_ELEMENT(onChanged) \ + FC_PY_ELEMENT(onBeforeChange) \ FC_PY_ELEMENT(startRestoring) \ FC_PY_ELEMENT(finishRestoring) \ FC_PY_ELEMENT(onDelete) \ @@ -518,6 +520,11 @@ protected: imp->onChanged(prop); ViewProviderT::onChanged(prop); } + void onBeforeChange(const App::Property* prop) override + { + imp->onBeforeChange(prop); + ViewProviderT::onBeforeChange(prop); + } /// is called by the document when the provider goes in edit mode bool setEdit(int ModNum) override {