Skip to content

Commit

Permalink
extend creation of preferences pages from Python
Browse files Browse the repository at this point in the history
  • Loading branch information
wwmayer committed Oct 22, 2016
1 parent 01996d8 commit 21260ae
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 20 deletions.
11 changes: 11 additions & 0 deletions src/Gui/ApplicationPy.cpp
Expand Up @@ -656,13 +656,24 @@ PyObject* Application::sAddPreferencePage(PyObject * /*self*/, PyObject *args,Py
PyErr_Clear();

PyObject* dlg;
// old style classes
if (PyArg_ParseTuple(args, "O!s", &PyClass_Type, &dlg, &grp)) {
// add to the preferences dialog
new PrefPagePyProducer(Py::Object(dlg), grp);

Py_INCREF(Py_None);
return Py_None;
}
PyErr_Clear();

// new style classes
if (PyArg_ParseTuple(args, "O!s", &PyType_Type, &dlg, &grp)) {
// add to the preferences dialog
new PrefPagePyProducer(Py::Object(dlg), grp);

Py_INCREF(Py_None);
return Py_None;
}

return 0;
}
Expand Down
56 changes: 36 additions & 20 deletions src/Gui/WidgetFactory.cpp
Expand Up @@ -361,9 +361,9 @@ Gui::Dialog::PreferencePage* WidgetFactoryInst::createPreferencePage (const char
// this widget class is not registered
if (!w) {
#ifdef FC_DEBUG
Base::Console().Warning("\"%s\" is not registered\n", sName);
Base::Console().Warning("Cannot create an instance of \"%s\"\n", sName);
#else
Base::Console().Log("\"%s\" is not registered\n", sName);
Base::Console().Log("Cannot create an instance of \"%s\"\n", sName);
#endif
return 0;
}
Expand Down Expand Up @@ -770,10 +770,21 @@ PrefPagePyProducer::~PrefPagePyProducer ()
void* PrefPagePyProducer::Produce () const
{
Base::PyGILStateLocker lock;
Py::Callable method(type);
Py::Tuple args;
Py::Object page = method.apply(args);
return new Gui::Dialog::PreferencePagePython(page);
try {
Py::Callable method(type);
Py::Tuple args;
Py::Object page = method.apply(args);
QWidget* widget = new Gui::Dialog::PreferencePagePython(page);
if (!widget->layout()) {
delete widget;
widget = 0;
}
return widget;
}
catch (Py::Exception& e) {
e.clear();
return 0;
}
}

// ----------------------------------------------------
Expand All @@ -784,20 +795,25 @@ PreferencePagePython::PreferencePagePython(const Py::Object& p, QWidget* parent)
: PreferencePage(parent), page(p)
{
Base::PyGILStateLocker lock;
if (page.hasAttr(std::string("form"))) {
Py::Object widget(page.getAttr(std::string("form")));

Gui::PythonWrapper wrap;
if (wrap.loadCoreModule()) {
QObject* object = wrap.toQObject(widget);
if (object) {
QWidget* form = qobject_cast<QWidget*>(object);
if (form) {
this->setWindowTitle(form->windowTitle());
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(form);
setLayout(layout);
}
Gui::PythonWrapper wrap;
if (wrap.loadCoreModule()) {

// old style class must have a form attribute while
// new style classes can be the widget itself
Py::Object widget;
if (page.hasAttr(std::string("form")))
widget = page.getAttr(std::string("form"));
else
widget = page;

QObject* object = wrap.toQObject(widget);
if (object) {
QWidget* form = qobject_cast<QWidget*>(object);
if (form) {
this->setWindowTitle(form->windowTitle());
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(form);
setLayout(layout);
}
}
}
Expand Down

0 comments on commit 21260ae

Please sign in to comment.