aboutsummaryrefslogtreecommitdiffstats
path: root/libpyside/signalmanager.cpp
diff options
context:
space:
mode:
authorRenato Filho <renato.filho@openbossa.org>2010-07-06 18:44:00 -0300
committerRenato Filho <renato.filho@openbossa.org>2010-07-08 11:27:38 -0300
commit1c4ee915c07daae9919e890072593b51e54c9aec (patch)
tree19424c508a942a202711fe65530894c10aaa7282 /libpyside/signalmanager.cpp
parent693ae6d6c4073a483524af48e7a1a0ad1fba1131 (diff)
Implemented support to properties on QMetaObject.
Reviewer: Hugo Parente Lima <hugo.lima@openbossa.org>, Luciano Wolf <luciano.wolf@openbossa.org>
Diffstat (limited to 'libpyside/signalmanager.cpp')
-rw-r--r--libpyside/signalmanager.cpp83
1 files changed, 79 insertions, 4 deletions
diff --git a/libpyside/signalmanager.cpp b/libpyside/signalmanager.cpp
index f1734001b..de0de7d86 100644
--- a/libpyside/signalmanager.cpp
+++ b/libpyside/signalmanager.cpp
@@ -33,6 +33,7 @@
*/
#include "signalmanager.h"
+#include "qproperty.h"
#include <QHash>
#include <QStringList>
@@ -351,14 +352,87 @@ bool SignalManager::emitSignal(QObject* source, const char* signal, PyObject* ar
return false;
}
-int PySide::SignalManager::qt_metacall(QObject* object, QMetaObject::Call call, int id, void** args)
+int SignalManager::qt_metacall(QObject* object, QMetaObject::Call call, int id, void** args)
{
const QMetaObject* metaObject = object->metaObject();
- // only meta method invocation is supported right now.
+ PyObject* pp = 0;
+ PyObject* pp_name = 0;
+ QMetaProperty mp;
+ Shiboken::TypeResolver* typeResolver = 0;
+ PyObject* pySelf = Shiboken::BindingManager::instance().retrieveWrapper(object);
+
if (call != QMetaObject::InvokeMetaMethod) {
- qWarning("Only meta method invocation is supported right now by PySide.");
- return id - metaObject->methodCount();
+ mp = metaObject->property(id);
+ if (!mp.isValid())
+ return id - metaObject->methodCount();
+
+ pp_name = PyString_FromString(mp.name());
+ pp = qproperty_get_object(pySelf, pp_name);
+ if (!pp) {
+ qWarning("Invalid property.");
+ Py_XDECREF(pp_name);
+ return id - metaObject->methodCount();
+ }
+ printf("access to property: %s-%s\n", mp.name(), mp.typeName());
+ typeResolver = Shiboken::TypeResolver::get(mp.typeName());
+ }
+
+ switch(call) {
+#ifndef QT_NO_PROPERTIES
+ case QMetaObject::ReadProperty:
+ {
+ PyObject* value = qproperty_get(pp, pySelf);
+ if (value) {
+ void *data = typeResolver->toCpp(value);
+ if (Shiboken::TypeResolver::getType(mp.typeName()) == Shiboken::TypeResolver::ObjectType)
+ args[0] = &data;
+ else
+ args[0] = data;
+
+ Py_DECREF(value);
+ }
+ break;
+ }
+
+ case QMetaObject::WriteProperty:
+ {
+ Shiboken::AutoDecRef value(typeResolver->toPython(args[0]));
+ qproperty_set(pp, pySelf, value);
+ break;
+ }
+
+ case QMetaObject::ResetProperty:
+ qproperty_reset(pp, pp_name);
+ break;
+
+ case QMetaObject::QueryPropertyDesignable:
+ case QMetaObject::QueryPropertyScriptable:
+ case QMetaObject::QueryPropertyStored:
+ case QMetaObject::QueryPropertyEditable:
+ case QMetaObject::QueryPropertyUser:
+ break;
+#endif
+ case QMetaObject::InvokeMetaMethod:
+ id = call_method(object, id, args);
+ break;
+
+ default:
+ qWarning("Unsupported meta invocation type.");
}
+
+ if (call == QMetaObject::InvokeMetaMethod)
+ id = id - metaObject->methodCount();
+ else
+ id = id - metaObject->propertyCount();
+
+ Py_XDECREF(pp);
+ Py_XDECREF(pp_name);
+ return id;
+}
+
+int SignalManager::call_method(QObject* object, int id, void** args)
+{
+ const QMetaObject* metaObject = object->metaObject();
QMetaMethod method = metaObject->method(id);
if (method.methodType() == QMetaMethod::Signal) {
@@ -403,6 +477,7 @@ int PySide::SignalManager::qt_metacall(QObject* object, QMetaObject::Call call,
bool SignalManager::registerMetaMethod(QObject* source, const char* signature, QMetaMethod::MethodType type)
{
+ Q_ASSERT(source);
const QMetaObject* metaObject = source->metaObject();
int methodIndex = metaObject->indexOfMethod(signature);
// Create the dynamic signal is needed