From 2db3d80e6cbb7d158ce5ab46e9793d28ed9e66dd Mon Sep 17 00:00:00 2001 From: Renato Filho Date: Tue, 20 Sep 2011 18:28:29 -0300 Subject: Fixed layout policy. Reviewer: Luciano Wolf Marcelo Lira --- PySide/QtGui/glue/qlayout_help_functions.h | 69 +++++++++++++++++++++++++++--- PySide/QtGui/typesystem_gui_common.xml | 11 +++++ 2 files changed, 74 insertions(+), 6 deletions(-) (limited to 'PySide/QtGui') diff --git a/PySide/QtGui/glue/qlayout_help_functions.h b/PySide/QtGui/glue/qlayout_help_functions.h index 6912fc8c6..e408dce06 100644 --- a/PySide/QtGui/glue/qlayout_help_functions.h +++ b/PySide/QtGui/glue/qlayout_help_functions.h @@ -2,6 +2,7 @@ #define QLAYOUT_HELP_FUNCTIONS void addLayoutOwnership(QLayout* layout, QLayoutItem* item); +void removeLayoutOwnership(QLayout* layout, QWidget* widget); inline QByteArray retrieveObjectName(PyObject* obj) { @@ -12,16 +13,24 @@ inline QByteArray retrieveObjectName(PyObject* obj) inline void addLayoutOwnership(QLayout* layout, QWidget* widget) { //transfer ownership to parent widget - QWidget* parent = layout->parentWidget(); + QWidget *lw = layout->parentWidget(); + QWidget *pw = widget->parentWidget(); - if (!parent) { + Shiboken::AutoDecRef pyChild(Shiboken::Converter::toPython(widget)); + + //Transfer parent to layout widget + if (pw && lw && pw != lw) + Shiboken::Object::setParent(0, pyChild); + + if (!lw && !pw) { //keep the reference while the layout is orphan Shiboken::AutoDecRef pyParent(Shiboken::Converter::toPython(layout)); - Shiboken::AutoDecRef pyChild(Shiboken::Converter::toPython(widget)); Shiboken::Object::keepReference(reinterpret_cast(pyParent.object()), retrieveObjectName(pyParent).data(), pyChild, true); } else { - Shiboken::AutoDecRef pyParent(Shiboken::Converter::toPython(parent)); - Shiboken::AutoDecRef pyChild(Shiboken::Converter::toPython(widget)); + if (!lw) + lw = pw; + + Shiboken::AutoDecRef pyParent(Shiboken::Converter::toPython(lw)); Shiboken::Object::setParent(pyParent, pyChild); } } @@ -63,8 +72,56 @@ inline void addLayoutOwnership(QLayout* layout, QLayoutItem* item) addLayoutOwnership(layout, l); } + Shiboken::AutoDecRef pyParent(Shiboken::Converter::toPython(layout)); Shiboken::AutoDecRef pyChild(Shiboken::Converter::toPython(item)); - Shiboken::Object::releaseOwnership(pyChild); + Shiboken::Object::setParent(pyParent, pyChild); +} + +static void removeWidgetFromLayout(QLayout* layout, QWidget* widget) +{ + QWidget* parent = widget->parentWidget(); + + if (!parent) { + //remove reference on layout + Shiboken::AutoDecRef pyParent(Shiboken::Converter::toPython(layout)); + Shiboken::AutoDecRef pyChild(Shiboken::Converter::toPython(widget)); + Shiboken::Object::removeReference(reinterpret_cast(pyParent.object()), retrieveObjectName(pyParent).data(), pyChild); + } else { + //give the ownership to parent + Shiboken::AutoDecRef pyParent(Shiboken::Converter::toPython(parent)); + Shiboken::AutoDecRef pyChild(Shiboken::Converter::toPython(widget)); + Shiboken::Object::setParent(pyParent, pyChild); + } +} + +inline void removeLayoutOwnership(QLayout* layout, QLayoutItem* item) +{ + QWidget* w = item->widget(); + if (w) + removeWidgetFromLayout(layout, w); + else { + QLayout* l = item->layout(); + if (l) + removeLayoutOwnership(layout, l); + } + + Shiboken::AutoDecRef pyChild(Shiboken::Converter::toPython(item)); + Shiboken::Object::invalidate(pyChild); + Shiboken::Object::setParent(0, pyChild); +} + +inline void removeLayoutOwnership(QLayout* layout, QWidget* widget) +{ + if (!widget) + return; + + for (int i=0, i_max=layout->count(); i < i_max; i++) { + QLayoutItem* item = layout->itemAt(i); + if (PyErr_Occurred() || !item) + return; + if (item->widget() == widget) + removeLayoutOwnership(layout, item); + } } #endif diff --git a/PySide/QtGui/typesystem_gui_common.xml b/PySide/QtGui/typesystem_gui_common.xml index c1628f362..06a2d9980 100644 --- a/PySide/QtGui/typesystem_gui_common.xml +++ b/PySide/QtGui/typesystem_gui_common.xml @@ -3100,6 +3100,17 @@ + + + removeLayoutOwnership(%CPPSELF, %1); + + + + + removeLayoutOwnership(%CPPSELF, %1); + + + -- cgit v1.2.3