diff options
author | Hugo Lima <hugo.lima@openbossa.org> | 2010-03-24 20:23:47 -0300 |
---|---|---|
committer | Hugo Lima <hugo.lima@openbossa.org> | 2010-03-31 11:23:45 -0300 |
commit | 718dd06ecd8443bc556f68bb17f7958e891ee48b (patch) | |
tree | 07dd358a71b64a046d3a7665a4397daebb335b8d /PySide | |
parent | 771c2be893567c8f6bd0deda87ff0e95322923a2 (diff) |
Fix QObject::findChildren and QObject::findChild methods.
QUiTools unit tests uses these functions and will fail without this patch.
Reviewer: Marcelo Lira <marcelo.lira@openbossa.org>
Reviewer: Anderson Lizardo <anderson.lizardo@openbossa.org>
Diffstat (limited to 'PySide')
-rw-r--r-- | PySide/QtCore/glue/qobject_findchild.cpp | 30 | ||||
-rw-r--r-- | PySide/QtCore/typesystem_core.xml | 30 |
2 files changed, 39 insertions, 21 deletions
diff --git a/PySide/QtCore/glue/qobject_findchild.cpp b/PySide/QtCore/glue/qobject_findchild.cpp new file mode 100644 index 000000000..351aa69ab --- /dev/null +++ b/PySide/QtCore/glue/qobject_findchild.cpp @@ -0,0 +1,30 @@ +static QObject* _findChildHelper(const QObject* parent, const QString& name, PyTypeObject* desiredType) +{ + foreach(QObject* child, parent->children()) { + Shiboken::AutoDecRef pyChild(%CONVERTTOPYTHON[QObject*](child)); + if (PyType_IsSubtype(pyChild->ob_type, desiredType) + && (name.isNull() || name == child->objectName())) { + return child; + } + } + + QObject* obj; + foreach(QObject* child, parent->children()) { + obj = _findChildHelper(child, name, desiredType); + if (obj) + return obj; + } + return 0; +} + +static void _findChildrenHelper(const QObject* parent, const QString& name, PyTypeObject* desiredType, PyObject* result) +{ + foreach(QObject* child, parent->children()) { + Shiboken::AutoDecRef pyChild(%CONVERTTOPYTHON[QObject*](child)); + if (PyType_IsSubtype(pyChild->ob_type, desiredType) + && (name.isNull() || name == child->objectName())) { + PyList_Append(result, pyChild); + } + _findChildrenHelper(child, name, desiredType, result); + } +}
\ No newline at end of file diff --git a/PySide/QtCore/typesystem_core.xml b/PySide/QtCore/typesystem_core.xml index df1a428b1..2a91dcbf4 100644 --- a/PySide/QtCore/typesystem_core.xml +++ b/PySide/QtCore/typesystem_core.xml @@ -1551,35 +1551,23 @@ <modify-function signature="findChildren(const QRegExp &) const" remove="all"/> <modify-function signature="findChildren(const QString &) const" remove="all"/> <modify-function signature="findChild(const QString &) const" remove="all" /> + <inject-code class="native" file="glue/qobject_findchild.cpp"/> <add-function signature="findChild(PyTypeObject*, const QString&)" return-type="PyObject*"> <inject-code class="target" position="beginning"> - const bool isEmpty = %2.isEmpty(); - foreach(QObject* o, %CPPSELF.children()) { - if (isEmpty || %2 == o->objectName()) { - PyObject* obj = %CONVERTTOPYTHON[QObject*](o); - Shiboken::setParent(self, obj); - if (PyType_IsSubtype(obj->ob_type, (PyTypeObject*)%PYARG_1)) - %PYARG_0 = obj; - else - Py_DECREF(obj); - } - } + %PYARG_0 = %CONVERTTOPYTHON[QObject*](_findChildHelper(%CPPSELF, %2, (PyTypeObject*)%PYARG_1)); </inject-code> + <modify-argument index="return"> + <parent index="this" action="add"/> + </modify-argument> </add-function> <add-function signature="findChildren(PyTypeObject*, const QString&)" return-type="PySequence*" > <inject-code class="target" position="beginning"> %PYARG_0 = PyList_New(0); - const bool isEmpty = %2.isEmpty(); - foreach(QObject* o, %CPPSELF.children()) { - if (isEmpty || %2 == o->objectName()) { - PyObject* obj = %CONVERTTOPYTHON[QObject*](o); - Shiboken::setParent(self, obj); - if (PyType_IsSubtype(obj->ob_type, (PyTypeObject*)%PYARG_1)) - PyList_Append(%PYARG_0, obj); - Py_DECREF(obj); - } - } + _findChildrenHelper(%CPPSELF, %2, (PyTypeObject*)%PYARG_1, %PYARG_0); </inject-code> + <modify-argument index="return"> + <parent index="this" action="add"/> + </modify-argument> </add-function> <add-function signature="tr(const char *, const char *, int)" return-type="QString"> |