aboutsummaryrefslogtreecommitdiffstats
path: root/libpyside
diff options
context:
space:
mode:
authorRenato Filho <renato.filho@openbossa.org>2010-05-12 17:21:19 -0300
committerRenato Filho <renato.filho@openbossa.org>2010-05-17 19:53:26 -0300
commitfde014f5db8f35727585e4402849ef565987c63a (patch)
treeb1e01f16ab127948d8548a08993da9e2664374dd /libpyside
parentac217286e20644cd2519cde6c2588761b6a39cd6 (diff)
Implemented support to slot decoration.
Reviewer: Marcelo Lira <marcelo.lira@openbossa.org>, Luciano Wolf <luciano.wolf@openbossa.org>
Diffstat (limited to 'libpyside')
-rw-r--r--libpyside/dynamicqmetaobject.cpp24
-rw-r--r--libpyside/dynamicqmetaobject.h6
2 files changed, 30 insertions, 0 deletions
diff --git a/libpyside/dynamicqmetaobject.cpp b/libpyside/dynamicqmetaobject.cpp
index dbc51803c..a2e6bef0f 100644
--- a/libpyside/dynamicqmetaobject.cpp
+++ b/libpyside/dynamicqmetaobject.cpp
@@ -123,6 +123,30 @@ void DynamicQMetaObject::removeSlot(uint index)
}
}
+DynamicQMetaObject* DynamicQMetaObject::createBasedOn(PyTypeObject *type, const QMetaObject *base)
+{
+ PyObject *key, *value;
+ Py_ssize_t pos = 0;
+
+ QString className(type->tp_name);
+ className = className.mid(className.lastIndexOf(".")+1);
+ DynamicQMetaObject *mo = new PySide::DynamicQMetaObject(className.toAscii(), base);
+
+ while (PyDict_Next(type->tp_dict, &pos, &key, &value)) {
+ if (!PyFunction_Check(value))
+ continue;
+
+ if (PyObject_HasAttrString(value, PYSIDE_SLOT_LIST_ATTR)) {
+ PyObject *signature_list = PyObject_GetAttrString(value, PYSIDE_SLOT_LIST_ATTR);
+ for(Py_ssize_t i=0, i_max=PyList_Size(signature_list); i < i_max; i++) {
+ PyObject *signature = PyList_GET_ITEM(signature_list, i);
+ mo->addSlot(PyString_AsString(signature));
+ }
+ }
+ }
+ return mo;
+}
+
void DynamicQMetaObject::removeSignal(uint index)
{
//Current Qt implementation does not support runtime remove signal
diff --git a/libpyside/dynamicqmetaobject.h b/libpyside/dynamicqmetaobject.h
index d6f6e9be5..9336b63ac 100644
--- a/libpyside/dynamicqmetaobject.h
+++ b/libpyside/dynamicqmetaobject.h
@@ -36,10 +36,13 @@
#define DYNAMICQMETAOBJECT_H
#include "pysidemacros.h"
+#include <Python.h>
#include <QMetaObject>
#include <QLinkedList>
#include <QByteArray>
+#define PYSIDE_SLOT_LIST_ATTR "_slots"
+
class QObject;
namespace PySide
@@ -57,6 +60,9 @@ public:
void removeSignal(uint idex);
void removeSlot(uint index);
+ //Retrieve Python metadata to create QMetaObject (class name, signals, slot)
+ static DynamicQMetaObject *createBasedOn(PyTypeObject *obj, const QMetaObject* base);
+
private:
QLinkedList<QByteArray> m_signals;
QLinkedList<QByteArray> m_slots;