aboutsummaryrefslogtreecommitdiffstats
path: root/PySide
diff options
context:
space:
mode:
authorHugo Lima <hugo.lima@openbossa.org>2010-03-24 20:23:47 -0300
committerHugo Lima <hugo.lima@openbossa.org>2010-03-31 11:23:45 -0300
commit718dd06ecd8443bc556f68bb17f7958e891ee48b (patch)
tree07dd358a71b64a046d3a7665a4397daebb335b8d /PySide
parent771c2be893567c8f6bd0deda87ff0e95322923a2 (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.cpp30
-rw-r--r--PySide/QtCore/typesystem_core.xml30
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 &amp;) const" remove="all"/>
<modify-function signature="findChildren(const QString &amp;) const" remove="all"/>
<modify-function signature="findChild(const QString &amp;) const" remove="all" />
+ <inject-code class="native" file="glue/qobject_findchild.cpp"/>
<add-function signature="findChild(PyTypeObject*, const QString&amp;)" 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&amp;)" 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">