diff --git a/src/Gui/DocumentObserverPython.cpp b/src/Gui/DocumentObserverPython.cpp index 255331a1a2..917c1ecd3b 100644 --- a/src/Gui/DocumentObserverPython.cpp +++ b/src/Gui/DocumentObserverPython.cpp @@ -60,27 +60,36 @@ void DocumentObserverPython::removeObserver(const Py::Object& obj) DocumentObserverPython::DocumentObserverPython(const Py::Object& obj) : inst(obj) { -#define signalCreatedDocument signalNewDocument -#define signalCreatedObject signalNewObject -#define signalDeletedDocument signalDeleteDocument -#define signalActivateDocument signalActiveDocument +#define FC_PY_ELEMENT_ARG1(_name1, _name2) do {\ + FC_PY_GetCallable(obj.ptr(), "slot" #_name1, py##_name1.py);\ + if (!py##_name1.py.isNone())\ + py##_name1.slot = Application::Instance->signal##_name2.connect(\ + boost::bind(&DocumentObserverPython::slot##_name1, this, _1));\ + }\ + while(0); -#undef FC_PY_ELEMENT -#define FC_PY_ELEMENT(_name,...) \ - FC_PY_GetCallable(obj.ptr(),"slot" #_name, py##_name);\ - if(!py##_name.isNone())\ - connect##_name = Application::Instance->signal##_name.connect(\ - boost::bind(&DocumentObserverPython::slot##_name, this, ## __VA_ARGS__)); +#define FC_PY_ELEMENT_ARG2(_name1, _name2) do {\ + FC_PY_GetCallable(obj.ptr(), "slot" #_name1, py##_name1.py);\ + if (!py##_name1.py.isNone())\ + py##_name1.slot = Application::Instance->signal##_name2.connect(\ + boost::bind(&DocumentObserverPython::slot##_name1, this, _1, _2));\ + }\ + while(0); - FC_PY_GDOC_OBSERVER + FC_PY_ELEMENT_ARG1(CreatedDocument, NewDocument) + FC_PY_ELEMENT_ARG1(DeletedDocument, DeleteDocument) + FC_PY_ELEMENT_ARG1(RelabelDocument, RelabelDocument) + FC_PY_ELEMENT_ARG1(RenameDocument, RenameDocument) + FC_PY_ELEMENT_ARG1(ActivateDocument, ActiveDocument) + FC_PY_ELEMENT_ARG1(CreatedObject, NewObject) + FC_PY_ELEMENT_ARG1(DeletedObject, DeletedObject) + FC_PY_ELEMENT_ARG2(ChangedObject, ChangedObject) + FC_PY_ELEMENT_ARG1(InEdit, InEdit) + FC_PY_ELEMENT_ARG1(ResetEdit, ResetEdit) } DocumentObserverPython::~DocumentObserverPython() { -#undef FC_PY_ELEMENT -#define FC_PY_ELEMENT(_name,...) connect##_name.disconnect(); - - FC_PY_GDOC_OBSERVER } void DocumentObserverPython::slotCreatedDocument(const Gui::Document& Doc) diff --git a/src/Gui/DocumentObserverPython.h b/src/Gui/DocumentObserverPython.h index bfe553704a..c57591c38e 100644 --- a/src/Gui/DocumentObserverPython.h +++ b/src/Gui/DocumentObserverPython.h @@ -75,26 +75,24 @@ private: Py::Object inst; static std::vector _instances; - typedef boost::signals2::connection Connection; + typedef struct { + boost::signals2::scoped_connection slot; + Py::Object py; + PyObject* ptr() { + return py.ptr(); + } + } Connection; -#define FC_PY_GDOC_OBSERVER \ - FC_PY_ELEMENT(CreatedDocument,_1) \ - FC_PY_ELEMENT(DeletedDocument,_1) \ - FC_PY_ELEMENT(RelabelDocument,_1) \ - FC_PY_ELEMENT(RenameDocument,_1) \ - FC_PY_ELEMENT(ActivateDocument,_1) \ - FC_PY_ELEMENT(CreatedObject,_1) \ - FC_PY_ELEMENT(DeletedObject,_1) \ - FC_PY_ELEMENT(ChangedObject,_1,_2) \ - FC_PY_ELEMENT(InEdit,_1) \ - FC_PY_ELEMENT(ResetEdit,_1) - -#undef FC_PY_ELEMENT -#define FC_PY_ELEMENT(_name,...) \ - Connection connect##_name;\ - Py::Object py##_name; - - FC_PY_GDOC_OBSERVER + Connection pyCreatedDocument; + Connection pyDeletedDocument; + Connection pyRelabelDocument; + Connection pyRenameDocument; + Connection pyActivateDocument; + Connection pyCreatedObject; + Connection pyDeletedObject; + Connection pyChangedObject; + Connection pyInEdit; + Connection pyResetEdit; }; } //namespace Gui