Register Signal objects on MetaObject.

Reviewer: Hugo Parente Lima <hugo.lima@openbossa.org>,
          Luciano Wolf <luciano.wolf@openbossa.org>
This commit is contained in:
Renato Filho 2010-05-17 17:37:52 -03:00
commit f976c831fd
5 changed files with 32 additions and 20 deletions

View file

@ -61,7 +61,7 @@ static int registerString(const QByteArray& s, QList<QByteArray>* strings)
return idx; return idx;
} }
MethodData::MethodData(const char *signature, const char *type) MethodData::MethodData(const char* signature, const char* type)
: m_signature(signature), m_type(type) : m_signature(signature), m_type(type)
{ {
} }
@ -72,11 +72,16 @@ void MethodData::clear()
m_type.clear(); m_type.clear();
} }
bool MethodData::operator==(const MethodData &other) const bool MethodData::operator==(const MethodData& other) const
{ {
return m_signature == other.signature(); return m_signature == other.signature();
} }
bool MethodData::operator==(const char* other) const
{
return m_signature == other;
}
QByteArray MethodData::signature() const QByteArray MethodData::signature() const
{ {
return m_signature; return m_signature;
@ -107,9 +112,13 @@ DynamicQMetaObject::~DynamicQMetaObject()
void DynamicQMetaObject::addSignal(const char* signal, const char* type) 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 //search for a empty space
MethodData blank; 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()) { if (i != m_signals.end()) {
*i = MethodData(signal, type); *i = MethodData(signal, type);
updateMetaObject(); updateMetaObject();
@ -127,9 +136,13 @@ void DynamicQMetaObject::addSignal(const char* signal, const char* type)
void DynamicQMetaObject::addSlot(const char* slot, 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 //search for a empty space
MethodData blank; 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()) { if (i != m_slots.end()) {
*i = MethodData(slot, type); *i = MethodData(slot, type);
} else { } else {
@ -162,18 +175,15 @@ DynamicQMetaObject* DynamicQMetaObject::createBasedOn(PyObject* pyObj, PyTypeObj
while (PyDict_Next(type->tp_dict, &pos, &key, &value)) { while (PyDict_Next(type->tp_dict, &pos, &key, &value)) {
#if 0
//Register signals //Register signals
if (value->ob_type == &PySideSignal_Type) { if (value->ob_type == &Signal_Type) {
SignalData *data = reinterpret_cast<SignalData*>(value); PyObject *attr = PyObject_GetAttr(pyObj, key);
SignalInstanceData *data = reinterpret_cast<SignalInstanceData*>(attr);
for(int i=0, i_max=data->signatures_size; i < i_max; i++) { while(data) {
mo->addSignal(data->signatures[i]); mo->addSignal(data->signature);
printf("QObject with signal:[%s][%s]\n", data = reinterpret_cast<SignalInstanceData*>(data->next);
PyString_AS_STRING(PyObject_Str(key)), data->signatures[i]);
} }
} }
#endif
if (!PyFunction_Check(value)) if (!PyFunction_Check(value))
continue; continue;

View file

@ -52,11 +52,12 @@ class MethodData
{ {
public: public:
MethodData(){} MethodData(){}
MethodData(const char *signature, const char *type); MethodData(const char* signature, const char* type);
void clear(); void clear();
QByteArray signature() const; QByteArray signature() const;
QByteArray type() const; QByteArray type() const;
bool operator==(const MethodData &other) const; bool operator==(const MethodData& other) const;
bool operator==(const char* other) const;
private: private:
QByteArray m_signature; QByteArray m_signature;

View file

@ -41,7 +41,7 @@
namespace PySide namespace PySide
{ {
PYSIDE_API void init(PyObject *module); PYSIDE_API void init(PyObject *module);
} //namespace PySide } //namespace PySide

View file

@ -190,7 +190,7 @@ PyObject* signal_instance_get_item(PyObject* self, PyObject* key)
return 0; return 0;
} }
void signal_update_source(PyObject* source) void signalUpdateSource(PyObject* source)
{ {
PyObject* attrs = PyObject_Dir(source); PyObject* attrs = PyObject_Dir(source);
for(int i = 0, i_max = PyList_Size(attrs); i < i_max; i++) { 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) void signal_instance_initialize(PyObject* instance, PyObject* name, SignalData* data, PyObject* source, int index)
{ {
SignalInstanceData *self = reinterpret_cast<SignalInstanceData*>(instance); SignalInstanceData *self = reinterpret_cast<SignalInstanceData*>(instance);
self->next = 0;
if (data->signalName) if (data->signalName)
self->signalName = strdup(data->signalName); self->signalName = strdup(data->signalName);
else else
@ -452,7 +453,7 @@ PyObject* signal_instance_emit(PyObject* self, PyObject* args)
return PyObject_CallObject(pyMethod, tupleArgs); return PyObject_CallObject(pyMethod, tupleArgs);
} }
PyObject* signal_new(const char* name, ...) PyObject* signalNew(const char* name, ...)
{ {
va_list listSignatures; va_list listSignatures;
char* sig; char* sig;

View file

@ -21,10 +21,10 @@ extern "C"
{ {
PyAPI_DATA(PyTypeObject) Signal_Type; PyAPI_DATA(PyTypeObject) Signal_Type;
PyAPI_DATA(PyTypeObject) SignalInstance_Type; PyAPI_DATA(PyTypeObject) SignalInstance_Type;
PYSIDE_API PyAPI_FUNC(PyObject*) signal_new(const char* name, ...);
}; //extern "C" }; //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 } //namespace PySide