From 1d4de734152a638d317ef0bc2767df5e58fd7e19 Mon Sep 17 00:00:00 2001 From: wmayer Date: Tue, 31 Mar 2015 11:32:43 +0200 Subject: [PATCH] + support context-menu in Python view providers --- src/Gui/ViewProviderPythonFeature.cpp | 35 +++++++++++++++++++++++++++ src/Gui/ViewProviderPythonFeature.h | 9 +++++++ 2 files changed, 44 insertions(+) diff --git a/src/Gui/ViewProviderPythonFeature.cpp b/src/Gui/ViewProviderPythonFeature.cpp index 9e9c54174..10ba2f22c 100644 --- a/src/Gui/ViewProviderPythonFeature.cpp +++ b/src/Gui/ViewProviderPythonFeature.cpp @@ -59,6 +59,7 @@ #include "Application.h" #include "BitmapFactory.h" #include "Document.h" +#include "WidgetFactory.h" #include #include #include @@ -516,6 +517,40 @@ bool ViewProviderPythonFeatureImp::doubleClicked(void) return false; } +void ViewProviderPythonFeatureImp::setupContextMenu(QMenu* menu) +{ + // Run the attach method of the proxy object. + Base::PyGILStateLocker lock; + try { + App::Property* proxy = object->getPropertyByName("Proxy"); + if (proxy && proxy->getTypeId() == App::PropertyPythonObject::getClassTypeId()) { + Py::Object vp = static_cast(proxy)->getValue(); + if (vp.hasAttr(std::string("setupContextMenu"))) { + if (vp.hasAttr("__object__")) { + PythonWrapper wrap; + wrap.loadGuiModule(); + Py::Callable method(vp.getAttr(std::string("setupContextMenu"))); + Py::Tuple args(1); + args.setItem(0, wrap.fromQWidget(menu, "QMenu")); + method.apply(args); + } + else { + PythonWrapper wrap; + wrap.loadGuiModule(); + Py::Callable method(vp.getAttr(std::string("setupContextMenu"))); + Py::Tuple args(2); + args.setItem(0, Py::Object(object->getPyObject(), true)); + args.setItem(1, wrap.fromQWidget(menu, "QMenu")); + method.apply(args); + } + } + } + } + catch (Py::Exception&) { + Base::PyException e; // extract the Python error text + e.ReportException(); + } +} void ViewProviderPythonFeatureImp::attach(App::DocumentObject *pcObject) { diff --git a/src/Gui/ViewProviderPythonFeature.h b/src/Gui/ViewProviderPythonFeature.h index 1d8349c82..87f2b74a5 100644 --- a/src/Gui/ViewProviderPythonFeature.h +++ b/src/Gui/ViewProviderPythonFeature.h @@ -55,6 +55,7 @@ public: bool setEdit(int ModNum); bool unsetEdit(int ModNum); bool doubleClicked(void); + void setupContextMenu(QMenu* menu); /** @name Update data methods*/ //@{ @@ -319,6 +320,14 @@ protected: if (!ok) ViewProviderT::unsetEdit(ModNum); } +public: + virtual void setupContextMenu(QMenu* menu, QObject* recipient, const char* member) + { + ViewProviderT::setupContextMenu(menu, recipient, member); + imp->setupContextMenu(menu); + } + +protected: virtual bool doubleClicked(void) { bool ok = imp->doubleClicked();