diff options
author | Renato Filho <renato.filho@openbossa.org> | 2010-05-14 17:14:49 -0300 |
---|---|---|
committer | Renato Filho <renato.filho@openbossa.org> | 2010-05-17 19:53:54 -0300 |
commit | d8593de73a7f8fdb71012d253f91de3878d29d5e (patch) | |
tree | c9a9e3bb27b9a30a2989cb69ab789fbbf7bafe14 | |
parent | c5fd4d4830cb49c9f8087d7e54335f4c248f76bf (diff) |
Implemented signal name discovery if not setted on constructor.
Reviewer: Hugo Parente Lima <hugo.lima@openbossa.org>,
Luciano Wolf <luciano.wolf@openbossa.org>
-rw-r--r-- | libpyside/dynamicqmetaobject.cpp | 2 | ||||
-rw-r--r-- | libpyside/qsignal.cpp | 51 | ||||
-rw-r--r-- | tests/signals/signal_object_test.py | 11 |
3 files changed, 39 insertions, 25 deletions
diff --git a/libpyside/dynamicqmetaobject.cpp b/libpyside/dynamicqmetaobject.cpp index 5cf1b9dbe..0315946ca 100644 --- a/libpyside/dynamicqmetaobject.cpp +++ b/libpyside/dynamicqmetaobject.cpp @@ -161,6 +161,7 @@ DynamicQMetaObject* DynamicQMetaObject::createBasedOn(PyObject *pyObj, PyTypeObj while (PyDict_Next(type->tp_dict, &pos, &key, &value)) { +#if 0 //Register signals if (value->ob_type == &PySideSignal_Type) { SignalData *data = reinterpret_cast<SignalData*>(value); @@ -171,6 +172,7 @@ DynamicQMetaObject* DynamicQMetaObject::createBasedOn(PyObject *pyObj, PyTypeObj PyString_AS_STRING(PyObject_Str(key)), data->signatures[i]); } } +#endif if (!PyFunction_Check(value)) continue; diff --git a/libpyside/qsignal.cpp b/libpyside/qsignal.cpp index 8fe79ee1e..57876bad4 100644 --- a/libpyside/qsignal.cpp +++ b/libpyside/qsignal.cpp @@ -28,7 +28,7 @@ static PyObject* qsignal_instance_emit(PyObject *self, PyObject *args); static char* qsignal_build_signature(const char *name, const char *signature); static const char* qsignal_get_type_name(PyObject *type); static void qsignal_append_signature(SignalData *self, PyObject *args); -static void qsignal_instance_initialize(PyObject *instance, SignalData *data, PyObject *source); +static void qsignal_instance_initialize(PyObject *instance, PyObject *name, SignalData *data, PyObject *source); PyTypeObject PySideSignal_Type = { PyObject_HEAD_INIT(0) @@ -166,7 +166,7 @@ void signal_update_source(PyObject *source) if (value->ob_type == &PySideSignal_Type) { PyObject *signal_instance = (PyObject*)PyObject_New(SignalData, &PySideSignalInstance_Type); - qsignal_instance_initialize(signal_instance, reinterpret_cast<SignalData*>(value), source); + qsignal_instance_initialize(signal_instance, key, reinterpret_cast<SignalData*>(value), source); PyObject_SetAttr(source, key, signal_instance); Py_DECREF(signal_instance); @@ -198,6 +198,7 @@ char* qsignal_build_signature(const char *name, const char *signature) void qsignal_append_signature(SignalData *self, PyObject *args) { char *signature = 0; + for(Py_ssize_t i=0, i_max=PySequence_Size(args); i < i_max; i++) { Shiboken::AutoDecRef arg(PySequence_ITEM(args, i)); const char *type_name = qsignal_get_type_name(arg); @@ -212,14 +213,13 @@ void qsignal_append_signature(SignalData *self, PyObject *args) } self->signatures_size++; + if (self->signatures_size > 1) { self->signatures = (char**) realloc(self->signatures, sizeof(char**) * self->signatures_size); } else { self->signatures = (char**) malloc(sizeof(char**)); } - self->signatures[self->signatures_size -1] = qsignal_build_signature(self->signal_name, signature); - printf("registred signature:[%d][%s]\n", self->signatures_size -1, self->signatures[self->signatures_size -1]); - free(signature); + self->signatures[self->signatures_size-1] = signature; } int qsignal_init(PyObject *self, PyObject *args, PyObject *kwds) @@ -237,8 +237,9 @@ int qsignal_init(PyObject *self, PyObject *args, PyObject *kwds) bool tupled_args = false; SignalData *data = reinterpret_cast<SignalData*>(self); - if (arg_name) + if (arg_name) { data->signal_name = strdup(arg_name); + } for(Py_ssize_t i=0, i_max=PyTuple_Size(args); i < i_max; i++) { PyObject *arg = PyTuple_GET_ITEM(args, i); @@ -260,9 +261,15 @@ void qsignal_free(void *self) PyObject *pySelf = reinterpret_cast<PyObject*>(self); SignalData *data = reinterpret_cast<SignalData*>(self); - //keep the data to instance - if (!data->initialized) - qsignal_instance_free(self); + for(int i=0, i_max=data->signatures_size; i < i_max; i++) { + if (data->signatures[i]) + free(data->signatures[i]); + } + + free(data->signatures); + free(data->signal_name); + data->initialized = false; + data->signatures_size = 0; pySelf->ob_type->tp_free (self); } @@ -270,27 +277,27 @@ void qsignal_free(void *self) void qsignal_instance_free(void *self) { PyObject *pySelf = reinterpret_cast<PyObject*>(self); - SignalData *data = reinterpret_cast<SignalData*>(self); - free(data->signatures[0]); - for(int i=1, i_max=data->signatures_size; i < i_max; i++) { - free(data->signatures[i]); - } - free(data->signatures); - free(data->signal_name); - data->initialized = false; - - pySelf->ob_type->tp_free (self); + qsignal_free(self); + pySelf->ob_type->tp_free(self); } -void qsignal_instance_initialize(PyObject *instance, SignalData *data, PyObject *source) +void qsignal_instance_initialize(PyObject *instance, PyObject *name, SignalData *data, PyObject *source) { SignalData *self = reinterpret_cast<SignalData*>(instance); - self->signal_name = data->signal_name; + if (data->signal_name) + self->signal_name = strdup(data->signal_name); + else + self->signal_name = strdup(PyString_AsString(name)); + self->signatures_size = data->signatures_size; - self->signatures = data->signatures; self->initialized = true; self->source = source; data->initialized = true; + + self->signatures = (char**) malloc(sizeof(char**) * self->signatures_size); + ///build signature + for(int i=0, i_max=self->signatures_size; i < i_max; i++) + self->signatures[i] = qsignal_build_signature(self->signal_name, data->signatures[i]); } PyObject* qsignal_instance_connect(PyObject *self, PyObject *args, PyObject *kwds) diff --git a/tests/signals/signal_object_test.py b/tests/signals/signal_object_test.py index 89e114d67..a3dee57d1 100644 --- a/tests/signals/signal_object_test.py +++ b/tests/signals/signal_object_test.py @@ -9,31 +9,36 @@ from PySide.QtCore import * class MyObject(QObject): sig1 = Signal() sig2 = Signal(int, name='rangeChanged') + sig3 = Signal(int) @Slot(int) def myRange(self, r): print "Range changed:", r + self._range = r def slot1(self): self._called = True - class SignalObjectTest(unittest.TestCase): - def testsingleConnect(self): o = MyObject() o.sig1.connect(o.slot1) o.sig1.emit() self.assert_(o._called) + def testSignalWithArgs(self): + o = MyObject() + o.sig3.connect(o.myRange) + o.sig3.emit(10) + self.assertEqual(o._range, 10) + def testSignatureParse(self): o = MyObject() o.sig2.connect(o.myRange) o.sig2.emit(10) - if __name__ == '__main__': unittest.main() |