aboutsummaryrefslogtreecommitdiffstats
path: root/generator
diff options
context:
space:
mode:
authorrenatofilho <renato.filho@openbossa.org>2010-10-28 13:46:41 -0300
committerHugo Parente Lima <hugo.pl@gmail.com>2012-03-08 16:08:53 -0300
commit8a727dddc028c94807b85b9acd8c88dd276fd12a (patch)
tree01175ac3adad044e6f7c0fe4cee212b76f5d3a08 /generator
parent80c24e13a41f48440cecdb5cff20f250343515a9 (diff)
Implemented support to dynamic signals created on QML side.
Fixes bug #437. Reviewer: Marcelo Lira <marcelo.lira@openbossa.org> Luciano Wolf <luciano.wolf@openbossa.org>
Diffstat (limited to 'generator')
-rw-r--r--generator/cppgenerator.cpp34
1 files changed, 33 insertions, 1 deletions
diff --git a/generator/cppgenerator.cpp b/generator/cppgenerator.cpp
index 7f708d204..02ca2dda2 100644
--- a/generator/cppgenerator.cpp
+++ b/generator/cppgenerator.cpp
@@ -3556,7 +3556,7 @@ void CppGenerator::writeGetattroFunction(QTextStream& s, const AbstractMetaClass
s << INDENT << '}' << endl;
}
s << INDENT << "PyObject* attr = PyObject_GenericGetAttr(self, name);" << endl;
- if (usePySideExtensions() && metaClass->isQObject()) {
+ if (usePySideExtensions() && (metaClass->qualifiedCppName() == "QObject")) {
s << INDENT << "if (attr && PySide::isQPropertyType(attr)) {" << endl;
{
Indentation indent(INDENT);
@@ -3571,7 +3571,39 @@ void CppGenerator::writeGetattroFunction(QTextStream& s, const AbstractMetaClass
s << INDENT << "attr = value;" << endl;
}
s << INDENT << "}" << endl;
+
+ s << INDENT << "//search on metaobject (avoid internal attributes started with '__')" << endl
+ << INDENT << "if (!attr && !QString(PyString_AS_STRING(name)).startsWith(\"__\")) {" << endl;
+ {
+ Indentation indent(INDENT);
+ s << INDENT << "QObject* cppSelf = Converter<QObject*>::toCpp(self);" << endl
+ << INDENT << "const QMetaObject* metaObject = cppSelf->metaObject();" << endl
+ << INDENT << "QByteArray cname(PyString_AS_STRING(name));" << endl
+ << INDENT << "cname += '(';" << endl
+ << INDENT << "//signal" << endl
+ << INDENT << "QList<QMetaMethod> signalList;" << endl
+ << INDENT << "for(int i=0, i_max = metaObject->methodCount(); i < i_max; i++) {" << endl;
+ {
+ Indentation indent(INDENT);
+ s << INDENT << "QMetaMethod method = metaObject->method(i);" << endl
+ << INDENT << "if ((method.methodType() == QMetaMethod::Signal) &&" << endl
+ << INDENT << "QString(method.signature()).startsWith(cname))" << endl
+ << INDENT << "signalList.append(method);" << endl;
+ }
+ s << INDENT << "}" << endl
+ << INDENT << "if (signalList.size() > 0) {" << endl;
+ {
+ Indentation indent(INDENT);
+ s << INDENT << "PyObject* pySignal = PySide::signalNewFromMethod(self, signalList);" << endl
+ << INDENT << "PyObject_SetAttr(self, name, pySignal);" << endl
+ << INDENT << "PyObject_GenericSetAttr(self, name, pySignal);" << endl
+ << INDENT << "return pySignal;" << endl;
+ }
+ s << INDENT << "}" << endl;
+ }
+ s << INDENT << "}" << endl;
}
+
s << INDENT << "return attr;" << endl;
s << '}' << endl;
}