aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRenato Filho <renato.filho@openbossa.org>2010-05-17 19:11:56 -0300
committerRenato Filho <renato.filho@openbossa.org>2010-05-17 19:55:14 -0300
commit40d67b2892039fabc41bf7a23c0ee7f95310367f (patch)
treef10e3747323c53af85658e1b0fbf586692461813
parent3f6c11762e55942f530737b6ed6528680fb675b5 (diff)
Implemented signal to signal connection.
Reviewer: Hugo Parente Lima <hugo.lima@openbossa.org>, Luciano Wolf <luciano.wolf@openbossa.org>
-rw-r--r--libpyside/qsignal.cpp32
-rw-r--r--tests/signals/signal_object_test.py10
2 files changed, 30 insertions, 12 deletions
diff --git a/libpyside/qsignal.cpp b/libpyside/qsignal.cpp
index 7cfa9f99d..0d24bec40 100644
--- a/libpyside/qsignal.cpp
+++ b/libpyside/qsignal.cpp
@@ -361,18 +361,26 @@ PyObject* signal_instance_connect(PyObject* self, PyObject* args, PyObject* kwds
bool match = false;
if (slot->ob_type == &SignalInstance_Type) {
- //TODO: find best match
- SignalInstanceData *target = reinterpret_cast<SignalInstanceData*>(slot);
-
- if (QMetaObject::checkConnectArgs(source->signature, target->signature)) {
- PyList_Append(pyArgs, source->source);
- Shiboken::AutoDecRef source_signature(PyString_FromString(source->signature));
- PyList_Append(pyArgs, source_signature);
-
- PyList_Append(pyArgs, target->source);
- Shiboken::AutoDecRef target_signature(PyString_FromString(target->signature));
- PyList_Append(pyArgs, target_signature);
- match = true;
+ SignalInstanceData *sourceWalk = source;
+ SignalInstanceData *targetWalk;
+
+ //find best match
+ while(sourceWalk && !match) {
+ targetWalk = reinterpret_cast<SignalInstanceData*>(slot);
+ while(targetWalk && !match) {
+ if (QMetaObject::checkConnectArgs(sourceWalk->signature, targetWalk->signature)) {
+ PyList_Append(pyArgs, sourceWalk->source);
+ Shiboken::AutoDecRef sourceSignature(PyString_FromString(sourceWalk->signature));
+ PyList_Append(pyArgs, sourceSignature);
+
+ PyList_Append(pyArgs, targetWalk->source);
+ Shiboken::AutoDecRef targetSignature(PyString_FromString(targetWalk->signature));
+ PyList_Append(pyArgs, targetSignature);
+ match = true;
+ }
+ targetWalk = reinterpret_cast<SignalInstanceData*>(targetWalk->next);
+ }
+ sourceWalk = reinterpret_cast<SignalInstanceData*>(sourceWalk->next);
}
} else {
//try the first signature
diff --git a/tests/signals/signal_object_test.py b/tests/signals/signal_object_test.py
index 29c6be018..614c0e602 100644
--- a/tests/signals/signal_object_test.py
+++ b/tests/signals/signal_object_test.py
@@ -12,6 +12,7 @@ class MyObject(QTimer):
sig2 = Signal(int, name='rangeChanged')
sig3 = Signal(int)
sig4 = Signal((int,), (QString,))
+ sig5 = Signal((QString,), (int,))
@Slot(int)
@@ -67,6 +68,15 @@ class SignalObjectTest(UsesQCoreApplication):
self.app.exec_()
self.assert_(self._cb_called)
+ def testSignalWithSignal(self):
+ o = MyObject()
+ o.sig2.connect(o.myRange)
+ print "sig->sig", o.sig5.connect(o.sig2)
+ o.sig5[int].emit(10)
+ self.assertEqual(o._range, 10)
+
+
+
if __name__ == '__main__':
unittest.main()