From 1808fd83ed78a6239e2c06fd8848d461b2f6e8a7 Mon Sep 17 00:00:00 2001 From: wmayer Date: Tue, 2 Jun 2015 16:21:56 +0200 Subject: [PATCH] Expose attribute to Python to access icon of view provider --- src/Gui/ViewProviderPy.xml | 6 ++++++ src/Gui/ViewProviderPyImp.cpp | 19 +++++++++++++++++++ src/Gui/WidgetFactory.cpp | 11 +++++++++++ src/Gui/WidgetFactory.h | 5 +++++ 4 files changed, 41 insertions(+) diff --git a/src/Gui/ViewProviderPy.xml b/src/Gui/ViewProviderPy.xml index 9b34564dee..e44d383d78 100644 --- a/src/Gui/ViewProviderPy.xml +++ b/src/Gui/ViewProviderPy.xml @@ -64,6 +64,12 @@ + + + The icon of this ViewProvider + + + A pivy Separator with the root of this ViewProvider diff --git a/src/Gui/ViewProviderPyImp.cpp b/src/Gui/ViewProviderPyImp.cpp index c01223ea22..0f00442dd0 100644 --- a/src/Gui/ViewProviderPyImp.cpp +++ b/src/Gui/ViewProviderPyImp.cpp @@ -24,6 +24,8 @@ #include "PreCompiled.h" #ifndef _PreComp_ # include +# include +# include #endif #include @@ -32,6 +34,7 @@ #include #include "ViewProvider.h" +#include "WidgetFactory.h" // inclusion of the generated files (generated out of ViewProviderPy2.xml) #include "ViewProviderPy.h" @@ -232,3 +235,19 @@ Py::String ViewProviderPy::getIV(void) const SbString buf = buffer_writeaction(getViewProviderPtr()->getRoot()); return Py::String(buf.getString()); } + +Py::Object ViewProviderPy::getIcon(void) const +{ +#if 0 + QByteArray ba; + QDataStream str(&ba, QIODevice::WriteOnly); + QIcon icon = getViewProviderPtr()->getIcon(); + str << icon; + return Py::String(ba.constData(), ba.size()); +#else + PythonWrapper wrap; + wrap.loadGuiModule(); + QIcon icon = getViewProviderPtr()->getIcon(); + return wrap.fromQIcon(new QIcon(icon)); +#endif +} diff --git a/src/Gui/WidgetFactory.cpp b/src/Gui/WidgetFactory.cpp index a82ab2eafb..cc5dfa7475 100644 --- a/src/Gui/WidgetFactory.cpp +++ b/src/Gui/WidgetFactory.cpp @@ -44,6 +44,7 @@ # undef _POSIX_C_SOURCE # undef _XOPEN_SOURCE # include +# include # include # include # include @@ -179,6 +180,16 @@ QObject* PythonWrapper::toQObject(const Py::Object& pyobject) return 0; } +Py::Object PythonWrapper::fromQIcon(const QIcon* icon) +{ +#if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE) + PyObject* pyobj = Shiboken::createWrapper(icon, true); + if (pyobj) + return Py::asObject(pyobj); +#endif + throw Py::RuntimeError("Failed to wrap icon"); +} + Py::Object PythonWrapper::fromQWidget(QWidget* widget, const char* className) { #if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE) diff --git a/src/Gui/WidgetFactory.h b/src/Gui/WidgetFactory.h index 9fda8dd653..50c8e11c28 100644 --- a/src/Gui/WidgetFactory.h +++ b/src/Gui/WidgetFactory.h @@ -49,6 +49,11 @@ public: bool toCString(const Py::Object&, std::string&); QObject* toQObject(const Py::Object&); Py::Object fromQWidget(QWidget*, const char* className=0); + /*! + Create a Python wrapper for the icon. The icon must be created on the heap + and the Python wrapper takes ownership of it. + */ + Py::Object fromQIcon(const QIcon*); static void createChildrenNameAttributes(PyObject* root, QObject* object); static void setParent(PyObject* pyWdg, QObject* parent); };