diff options
author | Renato Filho <renato.filho@openbossa.org> | 2011-09-20 18:28:29 -0300 |
---|---|---|
committer | Hugo Parente Lima <hugo.pl@gmail.com> | 2012-03-08 16:54:51 -0300 |
commit | 2db3d80e6cbb7d158ce5ab46e9793d28ed9e66dd (patch) | |
tree | dfebb83115ef54d8c2492a0c5f84238acefc6bf0 | |
parent | f367f0ada3ba2ff8a43470a3972173cf15b40f44 (diff) |
Fixed layout policy.
Reviewer: Luciano Wolf <luciano.wolf@openbossa.org>
Marcelo Lira <marcelo.lira@openbossa.org>
-rw-r--r-- | PySide/QtGui/glue/qlayout_help_functions.h | 69 | ||||
-rw-r--r-- | PySide/QtGui/typesystem_gui_common.xml | 11 |
2 files changed, 74 insertions, 6 deletions
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<QWidget*>::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<QWidget*>::toPython(layout)); - Shiboken::AutoDecRef pyChild(Shiboken::Converter<QWidget*>::toPython(widget)); Shiboken::Object::keepReference(reinterpret_cast<SbkObject*>(pyParent.object()), retrieveObjectName(pyParent).data(), pyChild, true); } else { - Shiboken::AutoDecRef pyParent(Shiboken::Converter<QWidget*>::toPython(parent)); - Shiboken::AutoDecRef pyChild(Shiboken::Converter<QWidget*>::toPython(widget)); + if (!lw) + lw = pw; + + Shiboken::AutoDecRef pyParent(Shiboken::Converter<QWidget*>::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<QLayout*>::toPython(layout)); Shiboken::AutoDecRef pyChild(Shiboken::Converter<QLayoutItem*>::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<QWidget*>::toPython(layout)); + Shiboken::AutoDecRef pyChild(Shiboken::Converter<QWidget*>::toPython(widget)); + Shiboken::Object::removeReference(reinterpret_cast<SbkObject*>(pyParent.object()), retrieveObjectName(pyParent).data(), pyChild); + } else { + //give the ownership to parent + Shiboken::AutoDecRef pyParent(Shiboken::Converter<QWidget*>::toPython(parent)); + Shiboken::AutoDecRef pyChild(Shiboken::Converter<QWidget*>::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<QLayoutItem*>::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 @@ </inject-code> </modify-function> + <modify-function signature="removeWidget(QWidget*)"> + <inject-code class="target" position="beginning"> + removeLayoutOwnership(%CPPSELF, %1); + </inject-code> + </modify-function> + <modify-function signature="removeItem(QLayoutItem*)"> + <inject-code class="target" position="beginning"> + removeLayoutOwnership(%CPPSELF, %1); + </inject-code> + </modify-function> + <modify-function signature="parentWidget()const"> <modify-argument index="this"> <parent index="return" action="add"/> |