summaryrefslogtreecommitdiffstats
path: root/libpyside
diff options
context:
space:
mode:
authorRenato Araujo Oliveira Filho <renato.filho@openbossa.org>2010-12-15 17:52:29 -0300
committerRenato Araujo Oliveira Filho <renato.filho@openbossa.org>2010-12-15 19:06:45 -0300
commit539b906eb241b3874d015695bffd072632783960 (patch)
treea905f1edc939cb557e77f35af3034c9ba49c06ed /libpyside
parentfd9c8c8d7684a2ae9b6bee7521a1b28e2cdefa45 (diff)
downloadpyside-539b906eb241b3874d015695bffd072632783960.tar.gz
pyside-539b906eb241b3874d015695bffd072632783960.tar.xz
pyside-539b906eb241b3874d015695bffd072632783960.zip
Created function used in PyObject getAttro.
Moved the code generated to a function in libpyside. Create unit test for bug #525. Reviewer: Hugo Parente Lima <hugo.pl@gmail.com> Marcelo Lira <marcelo.lira@openbossa.org>
Diffstat (limited to 'libpyside')
-rw-r--r--libpyside/pyside.cpp50
-rw-r--r--libpyside/pyside.h9
2 files changed, 59 insertions, 0 deletions
diff --git a/libpyside/pyside.cpp b/libpyside/pyside.cpp
index 7442cfc..da896ce 100644
--- a/libpyside/pyside.cpp
+++ b/libpyside/pyside.cpp
@@ -28,6 +28,7 @@
#include "pysidesignal_p.h"
#include "pysideslot_p.h"
#include "pysidemetafunction_p.h"
+#include "pysidemetafunction.h"
#include "dynamicqmetaobject.h"
#include <basewrapper.h>
@@ -225,5 +226,54 @@ void initQObjectSubType(SbkObjectType* type, PyObject* args, PyObject* kwds)
mo->addProperty(propPair.first, propPair.second);
}
+PyObject* getMetaDataFromQObject(QObject* cppSelf, PyObject* self, PyObject* name)
+{
+ PyObject* attr = PyObject_GenericGetAttr(self, name);
+ if (attr && Property::isPropertyType(attr)) {
+ PyObject *value = Property::getValue(reinterpret_cast<PySideProperty*>(attr), self);
+ if (!value)
+ return 0;
+ Py_DECREF(attr);
+ Py_INCREF(value);
+ attr = value;
+ }
+
+ //mutate native signals to signal instance type
+ if (attr && PyObject_TypeCheck(attr, &PySideSignalType)) {
+ PyObject* signal = reinterpret_cast<PyObject*>(Signal::initialize(reinterpret_cast<PySideSignal*>(attr), name, self));
+ PyObject_SetAttr(self, name, reinterpret_cast<PyObject*>(signal));
+ return signal;
+ }
+
+ //search on metaobject (avoid internal attributes started with '__')
+ if (!attr && !QString(PyString_AS_STRING(name)).startsWith("__")) {
+ const QMetaObject* metaObject = cppSelf->metaObject();
+ QByteArray cname(PyString_AS_STRING(name));
+ cname += '(';
+ //signal
+ QList<QMetaMethod> signalList;
+ for(int i=0, i_max = metaObject->methodCount(); i < i_max; i++) {
+ QMetaMethod method = metaObject->method(i);
+ if (QString(method.signature()).startsWith(cname)) {
+ if (method.methodType() == QMetaMethod::Signal) {
+ signalList.append(method);
+ } else {
+ PySideMetaFunction* func = MetaFunction::newObject(cppSelf, i);
+ if (func) {
+ PyObject_SetAttr(self, name, (PyObject*)func);
+ return (PyObject*)func;
+ }
+ }
+ }
+ }
+ if (signalList.size() > 0) {
+ PyObject* pySignal = reinterpret_cast<PyObject*>(Signal::newObjectFromMethod(self, signalList));
+ PyObject_SetAttr(self, name, pySignal);
+ return pySignal;
+ }
+ }
+ return attr;
+}
+
} //namespace PySide
diff --git a/libpyside/pyside.h b/libpyside/pyside.h
index d84040d..fae1b42 100644
--- a/libpyside/pyside.h
+++ b/libpyside/pyside.h
@@ -93,6 +93,15 @@ PYSIDE_API void runCleanupFunctions();
*/
PYSIDE_API void destroyQCoreApplication();
+/**
+ * Check for properties and signals registered on MetaObject and return these
+ * \param cppSelf Is the QObject which contains the metaobject
+ * \param self Python object of cppSelf
+ * \param name Name of the argument which the function will try retrieve from MetaData
+ * \return The Python object which contains the Data obtained in metaObject or the Python attribute related with name
+ */
+PYSIDE_API PyObject* getMetaDataFromQObject(QObject* cppSelf, PyObject* self, PyObject* name);
+
} //namespace PySide