/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of Qt for Python. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 3 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL3 included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 3 requirements ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 2.0 or (at your option) the GNU General ** Public license version 3 or any later version approved by the KDE Free ** Qt Foundation. The licenses are as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-2.0.html and ** https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ void addLayoutOwnership(QLayout* layout, QLayoutItem* item); void removeLayoutOwnership(QLayout* layout, QWidget* widget); inline QByteArray retrieveObjectName(PyObject* obj) { Shiboken::AutoDecRef objName(PyObject_Str(obj)); return Shiboken::String::toCString(objName); } inline void addLayoutOwnership(QLayout* layout, QWidget* widget) { //transfer ownership to parent widget QWidget *lw = layout->parentWidget(); QWidget *pw = widget->parentWidget(); Shiboken::AutoDecRef pyChild(%CONVERTTOPYTHON[QWidget*](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(%CONVERTTOPYTHON[QWidget*](layout)); Shiboken::Object::keepReference(reinterpret_cast(pyParent.object()), retrieveObjectName(pyParent).data(), pyChild, true); } else { if (!lw) lw = pw; Shiboken::AutoDecRef pyParent(%CONVERTTOPYTHON[QWidget*](lw)); Shiboken::Object::setParent(pyParent, pyChild); } } inline void addLayoutOwnership(QLayout* layout, QLayout* other) { //transfer all children widgets from other to layout parent widget QWidget* parent = layout->parentWidget(); if (!parent) { //keep the reference while the layout is orphan Shiboken::AutoDecRef pyParent(%CONVERTTOPYTHON[QLayout*](layout)); Shiboken::AutoDecRef pyChild(%CONVERTTOPYTHON[QLayout*](other)); Shiboken::Object::keepReference(reinterpret_cast(pyParent.object()), retrieveObjectName(pyParent).data(), pyChild, true); return; } for (int i=0, i_max=other->count(); i < i_max; i++) { QLayoutItem* item = other->itemAt(i); if (PyErr_Occurred() || !item) return; addLayoutOwnership(layout, item); } Shiboken::AutoDecRef pyParent(%CONVERTTOPYTHON[QLayout*](layout)); Shiboken::AutoDecRef pyChild(%CONVERTTOPYTHON[QLayout*](other)); Shiboken::Object::setParent(pyParent, pyChild); } inline void addLayoutOwnership(QLayout* layout, QLayoutItem* item) { if (!item) return; QWidget* w = item->widget(); if (w) addLayoutOwnership(layout, w); else { QLayout* l = item->layout(); if (l) addLayoutOwnership(layout, l); } Shiboken::AutoDecRef pyParent(%CONVERTTOPYTHON[QLayout*](layout)); Shiboken::AutoDecRef pyChild(%CONVERTTOPYTHON[QLayoutItem*](item)); 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(%CONVERTTOPYTHON[QWidget*](layout)); Shiboken::AutoDecRef pyChild(%CONVERTTOPYTHON[QWidget*](widget)); Shiboken::Object::removeReference(reinterpret_cast(pyParent.object()), retrieveObjectName(pyParent).data(), pyChild); } else { //give the ownership to parent Shiboken::AutoDecRef pyParent(%CONVERTTOPYTHON[QWidget*](parent)); Shiboken::AutoDecRef pyChild(%CONVERTTOPYTHON[QWidget*](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 && item != l) removeLayoutOwnership(layout, l); } Shiboken::AutoDecRef pyChild(%CONVERTTOPYTHON[QLayoutItem*](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); } }