diff options
author | Renato Filho <renato.filho@openbossa.org> | 2010-05-17 17:37:52 -0300 |
---|---|---|
committer | Renato Filho <renato.filho@openbossa.org> | 2010-05-17 19:54:59 -0300 |
commit | f976c831fd89c09e116465538f0a3888bba543e2 (patch) | |
tree | 81a852cd34c390807e19ef8af3e2e1a7e41cb327 /libpyside | |
parent | 367536b2aad4c076141d6075b766c246a102d763 (diff) |
Register Signal objects on MetaObject.
Reviewer: Hugo Parente Lima <hugo.lima@openbossa.org>,
Luciano Wolf <luciano.wolf@openbossa.org>
Diffstat (limited to 'libpyside')
-rw-r--r-- | libpyside/dynamicqmetaobject.cpp | 36 | ||||
-rw-r--r-- | libpyside/dynamicqmetaobject.h | 5 | ||||
-rw-r--r-- | libpyside/pyside.h | 2 | ||||
-rw-r--r-- | libpyside/qsignal.cpp | 5 | ||||
-rw-r--r-- | libpyside/qsignal.h | 4 |
5 files changed, 32 insertions, 20 deletions
diff --git a/libpyside/dynamicqmetaobject.cpp b/libpyside/dynamicqmetaobject.cpp index cb4ec194b..facdc83e7 100644 --- a/libpyside/dynamicqmetaobject.cpp +++ b/libpyside/dynamicqmetaobject.cpp @@ -61,7 +61,7 @@ static int registerString(const QByteArray& s, QList<QByteArray>* strings) return idx; } -MethodData::MethodData(const char *signature, const char *type) +MethodData::MethodData(const char* signature, const char* type) : m_signature(signature), m_type(type) { } @@ -72,11 +72,16 @@ void MethodData::clear() m_type.clear(); } -bool MethodData::operator==(const MethodData &other) const +bool MethodData::operator==(const MethodData& other) const { return m_signature == other.signature(); } +bool MethodData::operator==(const char* other) const +{ + return m_signature == other; +} + QByteArray MethodData::signature() const { return m_signature; @@ -107,9 +112,13 @@ DynamicQMetaObject::~DynamicQMetaObject() void DynamicQMetaObject::addSignal(const char* signal, const char* type) { + QLinkedList<MethodData>::iterator i = qFind(m_signals.begin(), m_signals.end(), signal); + if (i != m_signals.end()) + return; + //search for a empty space MethodData blank; - QLinkedList<MethodData>::iterator i = qFind(m_signals.begin(), m_signals.end(), blank); + i = qFind(m_signals.begin(), m_signals.end(), blank); if (i != m_signals.end()) { *i = MethodData(signal, type); updateMetaObject(); @@ -127,9 +136,13 @@ void DynamicQMetaObject::addSignal(const char* signal, const char* type) void DynamicQMetaObject::addSlot(const char* slot, const char* type) { + QLinkedList<MethodData>::iterator i = qFind(m_slots.begin(), m_slots.end(), slot); + if (i != m_slots.end()) + return; + //search for a empty space MethodData blank; - QLinkedList<MethodData>::iterator i = qFind(m_slots.begin(), m_slots.end(), blank); + i = qFind(m_slots.begin(), m_slots.end(), blank); if (i != m_slots.end()) { *i = MethodData(slot, type); } else { @@ -162,18 +175,15 @@ 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); - - for(int i=0, i_max=data->signatures_size; i < i_max; i++) { - mo->addSignal(data->signatures[i]); - printf("QObject with signal:[%s][%s]\n", - PyString_AS_STRING(PyObject_Str(key)), data->signatures[i]); + if (value->ob_type == &Signal_Type) { + PyObject *attr = PyObject_GetAttr(pyObj, key); + SignalInstanceData *data = reinterpret_cast<SignalInstanceData*>(attr); + while(data) { + mo->addSignal(data->signature); + data = reinterpret_cast<SignalInstanceData*>(data->next); } } -#endif if (!PyFunction_Check(value)) continue; diff --git a/libpyside/dynamicqmetaobject.h b/libpyside/dynamicqmetaobject.h index 5da73a521..36981ec42 100644 --- a/libpyside/dynamicqmetaobject.h +++ b/libpyside/dynamicqmetaobject.h @@ -52,11 +52,12 @@ class MethodData { public: MethodData(){} - MethodData(const char *signature, const char *type); + MethodData(const char* signature, const char* type); void clear(); QByteArray signature() const; QByteArray type() const; - bool operator==(const MethodData &other) const; + bool operator==(const MethodData& other) const; + bool operator==(const char* other) const; private: QByteArray m_signature; diff --git a/libpyside/pyside.h b/libpyside/pyside.h index aaeeb43d2..3c1c0600c 100644 --- a/libpyside/pyside.h +++ b/libpyside/pyside.h @@ -41,7 +41,7 @@ namespace PySide { -PYSIDE_API void init(PyObject *module); +PYSIDE_API void init(PyObject *module); } //namespace PySide diff --git a/libpyside/qsignal.cpp b/libpyside/qsignal.cpp index 508d9e557..9274c483d 100644 --- a/libpyside/qsignal.cpp +++ b/libpyside/qsignal.cpp @@ -190,7 +190,7 @@ PyObject* signal_instance_get_item(PyObject* self, PyObject* key) return 0; } -void signal_update_source(PyObject* source) +void signalUpdateSource(PyObject* source) { PyObject* attrs = PyObject_Dir(source); for(int i = 0, i_max = PyList_Size(attrs); i < i_max; i++) { @@ -330,6 +330,7 @@ void signal_instance_free(void* self) void signal_instance_initialize(PyObject* instance, PyObject* name, SignalData* data, PyObject* source, int index) { SignalInstanceData *self = reinterpret_cast<SignalInstanceData*>(instance); + self->next = 0; if (data->signalName) self->signalName = strdup(data->signalName); else @@ -452,7 +453,7 @@ PyObject* signal_instance_emit(PyObject* self, PyObject* args) return PyObject_CallObject(pyMethod, tupleArgs); } -PyObject* signal_new(const char* name, ...) +PyObject* signalNew(const char* name, ...) { va_list listSignatures; char* sig; diff --git a/libpyside/qsignal.h b/libpyside/qsignal.h index 2ba5e984e..c6e07da01 100644 --- a/libpyside/qsignal.h +++ b/libpyside/qsignal.h @@ -21,10 +21,10 @@ extern "C" { PyAPI_DATA(PyTypeObject) Signal_Type; PyAPI_DATA(PyTypeObject) SignalInstance_Type; - PYSIDE_API PyAPI_FUNC(PyObject*) signal_new(const char* name, ...); }; //extern "C" -PYSIDE_API void signal_update_source(PyObject* source); +PYSIDE_API PyAPI_FUNC(PyObject*) signalNew(const char* name, ...); +PYSIDE_API void signalUpdateSource(PyObject* source); } //namespace PySide |