aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHugo Lima <hugo.lima@openbossa.org>2009-12-28 10:55:54 -0200
committerHugo Lima <hugo.lima@openbossa.org>2009-12-28 11:00:51 -0200
commite489074ccb5bf5b98564d9752907a5657506f4e4 (patch)
tree4845fb33b597b2fb2a5d32af355727169dfcfd52
parent2fc991d0239cfa0111c5fa9629e183add4076bbf (diff)
Wrapper classes of QObjects store a pointer to their own meta object, a dynamic one.
Reviewed by Marcelo Lira <marcelo.lira@openbossa.org>
-rw-r--r--cppgenerator.cpp26
-rw-r--r--headergenerator.cpp15
2 files changed, 31 insertions, 10 deletions
diff --git a/cppgenerator.cpp b/cppgenerator.cpp
index ced585e9d..84dcdee70 100644
--- a/cppgenerator.cpp
+++ b/cppgenerator.cpp
@@ -92,8 +92,10 @@ void CppGenerator::generateClass(QTextStream &s, const AbstractMetaClass *metaCl
s << "#include <shiboken.h>" << endl;
if (usePySideExtensions()) {
s << "#include <typeresolver.h>\n";
- if (metaClass->isQObject())
+ if (metaClass->isQObject()) {
s << "#include <signalmanager.h>\n";
+ s << "#include <dynamicqmetaobject.h>\n";
+ }
}
// The multiple inheritance initialization function
@@ -294,6 +296,8 @@ void CppGenerator::writeConstructorNative(QTextStream& s, const AbstractMetaFunc
OriginalTypeDescription | SkipDefaultValues);
s << " : ";
writeFunctionCall(s, func);
+ if (usePySideExtensions() && func->ownerClass()->isQObject())
+ s << ", m_metaObject(0)";
s << " {" << endl;
writeCodeSnips(s, func->injectedCodeSnips(), CodeSnip::Beginning, TypeSystem::NativeCode, func);
s << INDENT << "// ... middle" << endl;
@@ -306,6 +310,8 @@ void CppGenerator::writeDestructorNative(QTextStream &s, const AbstractMetaClass
Indentation indentation(INDENT);
s << wrapperName(metaClass) << "::~" << wrapperName(metaClass) << "()" << endl << '{' << endl;
s << INDENT << "BindingManager::instance().invalidateWrapper(this);" << endl;
+ if (usePySideExtensions() && metaClass->isQObject())
+ s << INDENT << "delete m_metaObject;\n";
s << '}' << endl;
}
@@ -439,15 +445,21 @@ void CppGenerator::writeVirtualMethodNative(QTextStream &s, const AbstractMetaFu
void CppGenerator::writeMetaObjectMethod(QTextStream& s, const AbstractMetaClass* metaClass)
{
Indentation indentation(INDENT);
- QString prefix = wrapperName(metaClass) + "::";
- s << "const QMetaObject* " << wrapperName(metaClass) << "::metaObject() const\n{\n";
- s << INDENT << "const QMetaObject* qmetaObject = PySide::SignalManager::instance().getMetaObject(this);\n";
- s << INDENT << "if (!qmetaObject)\n";
+ QString wrapperClassName = wrapperName(metaClass);
+ QString prefix = wrapperClassName + "::";
+ s << "const QMetaObject* " << wrapperClassName << "::metaObject() const\n{\n";
+ s << INDENT << "if (!m_metaObject)\n";
{
Indentation indentation(INDENT);
- s << INDENT << "qmetaObject = &" << metaClass->qualifiedCppName() << "::staticMetaObject;\n";
+ s << INDENT << "m_metaObject = new PySide::DynamicQMetaObject(&" << metaClass->qualifiedCppName() << "::staticMetaObject);\n";
}
- s << INDENT << "return qmetaObject;\n";
+ s << INDENT << "return m_metaObject;\n";
+ s << "}\n\n";
+
+ s << "int " << wrapperClassName << "::qt_metacall(QMetaObject::Call call, int id, void** args)\n";
+ s << "{\n";
+ s << INDENT << "id = " << metaClass->qualifiedCppName() << "::qt_metacall(call, id, args);\n";
+ s << INDENT << "return id < 0 ? id : PySide::SignalManager::qt_metacall(this, call, id, args);\n";
s << "}\n\n";
}
diff --git a/headergenerator.cpp b/headergenerator.cpp
index fd47a3bf4..a3391039d 100644
--- a/headergenerator.cpp
+++ b/headergenerator.cpp
@@ -71,6 +71,10 @@ void HeaderGenerator::generateClass(QTextStream& s, const AbstractMetaClass* met
s << metaClass->typeEntry()->include().toString() << endl << endl;
if (shouldGenerateCppWrapper(metaClass)) {
+
+ if (usePySideExtensions() && metaClass->isQObject())
+ s << "namespace PySide { class DynamicQMetaObject; }\n\n";
+
// Class
s << "class " << wrapperName;
s << " : public " << metaClass->qualifiedCppName();
@@ -83,14 +87,19 @@ void HeaderGenerator::generateClass(QTextStream& s, const AbstractMetaClass* met
foreach (AbstractMetaFunction *func, filterFunctions(metaClass))
writeFunction(s, func);
- if (usePySideExtensions() && metaClass->isQObject())
- s << INDENT << "virtual const QMetaObject* metaObject() const;\n";;
-
//destructor
s << INDENT << (metaClass->hasVirtualDestructor() ? "virtual " : "") << "~" << wrapperName << "();" << endl;
writeCodeSnips(s, metaClass->typeEntry()->codeSnips(), CodeSnip::Declaration, TypeSystem::NativeCode);
+ if (usePySideExtensions() && metaClass->isQObject()) {
+ s << "public:\n";
+ s << INDENT << "virtual const QMetaObject* metaObject() const;\n";;
+ s << INDENT << "virtual int qt_metacall(QMetaObject::Call call, int id, void** args);\n";;
+ s << "private:\n";
+ s << INDENT << "mutable PySide::DynamicQMetaObject* m_metaObject;\n";
+ }
+
s << "};" << endl << endl;
}