summaryrefslogtreecommitdiffstats
path: root/src/declarative/qml/qmlengine.cpp
diff options
context:
space:
mode:
authorAaron Kennedy <aaron.kennedy@nokia.com>2009-09-22 07:26:45 (GMT)
committerAaron Kennedy <aaron.kennedy@nokia.com>2009-09-22 07:26:45 (GMT)
commit6b2e0b4c5851a156c1f5fa0f73e9b1266ddc6930 (patch)
tree31616634bec2095cf16e82df9109cd6beda59460 /src/declarative/qml/qmlengine.cpp
parentc4c12f947b0480fd0695e1885ebec9ab496f6bf4 (diff)
downloadQt-6b2e0b4c5851a156c1f5fa0f73e9b1266ddc6930.zip
Qt-6b2e0b4c5851a156c1f5fa0f73e9b1266ddc6930.tar.gz
Qt-6b2e0b4c5851a156c1f5fa0f73e9b1266ddc6930.tar.bz2
Preliminary support for object and list synthesized property types
Diffstat (limited to 'src/declarative/qml/qmlengine.cpp')
-rw-r--r--src/declarative/qml/qmlengine.cpp73
1 files changed, 73 insertions, 0 deletions
diff --git a/src/declarative/qml/qmlengine.cpp b/src/declarative/qml/qmlengine.cpp
index dd6b5a4..23c0639 100644
--- a/src/declarative/qml/qmlengine.cpp
+++ b/src/declarative/qml/qmlengine.cpp
@@ -209,6 +209,8 @@ QmlEnginePrivate::~QmlEnginePrivate()
clear(bindValues[ii]);
for(int ii = 0; ii < parserStatus.count(); ++ii)
clear(parserStatus[ii]);
+ for(QHash<int, QmlCompiledData*>::ConstIterator iter = m_compositeTypes.begin(); iter != m_compositeTypes.end(); ++iter)
+ (*iter)->release();
}
void QmlEnginePrivate::clear(SimpleList<QmlAbstractBinding> &bvs)
@@ -1748,4 +1750,75 @@ void QmlEnginePrivate::resolveTypeInNamespace(ImportedNamespace* ns, const QByte
ns->find(type,vmaj,vmin,type_return,url_return);
}
+static void voidptr_destructor(void *v)
+{
+ void **ptr = (void **)v;
+ delete ptr;
+}
+
+static void *voidptr_constructor(const void *v)
+{
+ if (!v) {
+ return new void*;
+ } else {
+ return new void*(*(void **)v);
+ }
+}
+
+void QmlEnginePrivate::registerCompositeType(QmlCompiledData *data)
+{
+ QByteArray name = data->root.className();
+
+ QByteArray ptr = name + "*";
+ QByteArray lst = "QmlList<" + ptr + ">*";
+
+ int ptr_type = QMetaType::registerType(ptr.constData(), voidptr_destructor,
+ voidptr_constructor);
+ int lst_type = QMetaType::registerType(lst.constData(), voidptr_destructor,
+ voidptr_constructor);
+
+ m_qmlLists.insert(lst_type, ptr_type);
+ m_compositeTypes.insert(ptr_type, data);
+ data->addref();
+}
+
+bool QmlEnginePrivate::isQmlList(int t) const
+{
+ return m_qmlLists.contains(t) || QmlMetaType::isQmlList(t);
+}
+
+bool QmlEnginePrivate::isObject(int t)
+{
+ return m_compositeTypes.contains(t) || QmlMetaType::isObject(t);
+}
+
+int QmlEnginePrivate::qmlListType(int t) const
+{
+ QHash<int, int>::ConstIterator iter = m_qmlLists.find(t);
+ if (iter != m_qmlLists.end())
+ return *iter;
+ else
+ return QmlMetaType::qmlListType(t);
+}
+
+const QMetaObject *QmlEnginePrivate::rawMetaObjectForType(int t) const
+{
+ QHash<int, QmlCompiledData*>::ConstIterator iter = m_compositeTypes.find(t);
+ if (iter != m_compositeTypes.end()) {
+ return &(*iter)->root;
+ } else {
+ return QmlMetaType::rawMetaObjectForType(t);
+ }
+}
+
+const QMetaObject *QmlEnginePrivate::metaObjectForType(int t) const
+{
+ QHash<int, QmlCompiledData*>::ConstIterator iter = m_compositeTypes.find(t);
+ if (iter != m_compositeTypes.end()) {
+ return &(*iter)->root;
+ } else {
+ return QmlMetaType::metaObjectForType(t);
+ }
+}
+
QT_END_NAMESPACE