Removed init[slot,signal] from public api.
Use PyObject_dir to discovery signals methods. (this is very slow)
Reviewer: Hugo Parente Lima <hugo.lima@openbossa.org>,
Luciano Wolf <luciano.wolf@openbossa.org>
This commit is contained in:
parent
77d9398bde
commit
367536b2aa
4 changed files with 21 additions and 26 deletions
|
|
@ -35,8 +35,8 @@
|
||||||
|
|
||||||
#include "pyside.h"
|
#include "pyside.h"
|
||||||
|
|
||||||
extern "C" PyAPI_FUNC(void) init_signal(PyObject* module);
|
extern "C" void init_signal(PyObject* module);
|
||||||
extern "C" PyAPI_FUNC(void) init_slot(PyObject* module);
|
extern "C" void init_slot(PyObject* module);
|
||||||
|
|
||||||
namespace PySide
|
namespace PySide
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -152,7 +152,7 @@ PyTypeObject SignalInstance_Type = {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
PyAPI_FUNC(void) init_signal(PyObject* module)
|
void init_signal(PyObject* module)
|
||||||
{
|
{
|
||||||
if (PyType_Ready(&Signal_Type) < 0)
|
if (PyType_Ready(&Signal_Type) < 0)
|
||||||
return;
|
return;
|
||||||
|
|
@ -192,17 +192,16 @@ PyObject* signal_instance_get_item(PyObject* self, PyObject* key)
|
||||||
|
|
||||||
void signal_update_source(PyObject* source)
|
void signal_update_source(PyObject* source)
|
||||||
{
|
{
|
||||||
PyObject* key;
|
PyObject* attrs = PyObject_Dir(source);
|
||||||
PyObject* value;
|
for(int i = 0, i_max = PyList_Size(attrs); i < i_max; i++) {
|
||||||
Py_ssize_t pos = 0;
|
PyObject *attrName = PyList_GET_ITEM(attrs, i);
|
||||||
PyTypeObject* obType = source->ob_type;
|
PyObject *attr = PyObject_GetAttr(source, attrName);
|
||||||
|
if (attr->ob_type == &Signal_Type) {
|
||||||
while (PyDict_Next(obType->tp_dict, &pos, &key, &value)) {
|
|
||||||
if (value->ob_type == &Signal_Type) {
|
|
||||||
Shiboken::AutoDecRef signalInstance(reinterpret_cast<PyObject*>(PyObject_New(SignalInstanceData, &SignalInstance_Type)));
|
Shiboken::AutoDecRef signalInstance(reinterpret_cast<PyObject*>(PyObject_New(SignalInstanceData, &SignalInstance_Type)));
|
||||||
signal_instance_initialize(signalInstance, key, reinterpret_cast<SignalData*>(value), source, 0);
|
signal_instance_initialize(signalInstance, attrName, reinterpret_cast<SignalData*>(attr), source, 0);
|
||||||
PyObject_SetAttr(source, key, signalInstance);
|
PyObject_SetAttr(source, attrName, signalInstance);
|
||||||
}
|
}
|
||||||
|
Py_DECREF(attr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -307,7 +306,7 @@ void signal_free(void *self)
|
||||||
|
|
||||||
free(data->signatures);
|
free(data->signatures);
|
||||||
free(data->signalName);
|
free(data->signalName);
|
||||||
data->initialized = false;
|
data->initialized = 0;
|
||||||
data->signaturesSize = 0;
|
data->signaturesSize = 0;
|
||||||
|
|
||||||
pySelf->ob_type->tp_base->tp_free(self);
|
pySelf->ob_type->tp_base->tp_free(self);
|
||||||
|
|
@ -330,9 +329,6 @@ void signal_instance_free(void* self)
|
||||||
|
|
||||||
void signal_instance_initialize(PyObject* instance, PyObject* name, SignalData* data, PyObject* source, int index)
|
void signal_instance_initialize(PyObject* instance, PyObject* name, SignalData* data, PyObject* source, int index)
|
||||||
{
|
{
|
||||||
if (data->initialized)
|
|
||||||
return;
|
|
||||||
|
|
||||||
SignalInstanceData *self = reinterpret_cast<SignalInstanceData*>(instance);
|
SignalInstanceData *self = reinterpret_cast<SignalInstanceData*>(instance);
|
||||||
if (data->signalName)
|
if (data->signalName)
|
||||||
self->signalName = strdup(data->signalName);
|
self->signalName = strdup(data->signalName);
|
||||||
|
|
@ -347,9 +343,6 @@ void signal_instance_initialize(PyObject* instance, PyObject* name, SignalData*
|
||||||
self->next = reinterpret_cast<PyObject*>(PyObject_New(SignalInstanceData, &SignalInstance_Type));
|
self->next = reinterpret_cast<PyObject*>(PyObject_New(SignalInstanceData, &SignalInstance_Type));
|
||||||
signal_instance_initialize(self->next, name, data, source, index);
|
signal_instance_initialize(self->next, name, data, source, index);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (index == 0)
|
|
||||||
data->initialized = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PyObject* signal_instance_connect(PyObject* self, PyObject* args, PyObject* kwds)
|
PyObject* signal_instance_connect(PyObject* self, PyObject* args, PyObject* kwds)
|
||||||
|
|
|
||||||
|
|
@ -74,7 +74,7 @@ static PyTypeObject Slot_Type = {
|
||||||
0, /*tp_del */
|
0, /*tp_del */
|
||||||
};
|
};
|
||||||
|
|
||||||
PyAPI_FUNC(void) init_slot(PyObject *module)
|
void init_slot(PyObject *module)
|
||||||
{
|
{
|
||||||
if (PyType_Ready(&Slot_Type) < 0)
|
if (PyType_Ready(&Slot_Type) < 0)
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,9 @@ import unittest
|
||||||
import functools
|
import functools
|
||||||
|
|
||||||
from PySide.QtCore import *
|
from PySide.QtCore import *
|
||||||
|
from helper import UsesQCoreApplication
|
||||||
|
|
||||||
class MyObject(QObject):
|
class MyObject(QTimer):
|
||||||
sig1 = Signal()
|
sig1 = Signal()
|
||||||
sig2 = Signal(int, name='rangeChanged')
|
sig2 = Signal(int, name='rangeChanged')
|
||||||
sig3 = Signal(int)
|
sig3 = Signal(int)
|
||||||
|
|
@ -15,10 +16,8 @@ class MyObject(QObject):
|
||||||
|
|
||||||
@Slot(int)
|
@Slot(int)
|
||||||
def myRange(self, r):
|
def myRange(self, r):
|
||||||
print "Range changed:", r
|
|
||||||
self._range = r
|
self._range = r
|
||||||
|
|
||||||
|
|
||||||
def slot1(self):
|
def slot1(self):
|
||||||
self._called = True
|
self._called = True
|
||||||
|
|
||||||
|
|
@ -26,9 +25,10 @@ class MyObject(QObject):
|
||||||
self._s = s
|
self._s = s
|
||||||
|
|
||||||
|
|
||||||
class SignalObjectTest(unittest.TestCase):
|
class SignalObjectTest(UsesQCoreApplication):
|
||||||
def cb(self):
|
def cb(self):
|
||||||
self._cb_called = True
|
self._cb_called = True
|
||||||
|
self.app.exit()
|
||||||
|
|
||||||
def testsingleConnect(self):
|
def testsingleConnect(self):
|
||||||
o = MyObject()
|
o = MyObject()
|
||||||
|
|
@ -55,8 +55,10 @@ class SignalObjectTest(unittest.TestCase):
|
||||||
|
|
||||||
def testGeneretedSignal(self):
|
def testGeneretedSignal(self):
|
||||||
o = MyObject()
|
o = MyObject()
|
||||||
o.destroyed.connect(self.cb)
|
o.timeout.connect(self.cb)
|
||||||
self.assertEqual(self._cb_called)
|
o.start(100)
|
||||||
|
self.app.exec_()
|
||||||
|
self.assert_(self._cb_called)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue