diff options
author | Aaron Kennedy <aaron.kennedy@nokia.com> | 2009-09-22 07:26:45 (GMT) |
---|---|---|
committer | Aaron Kennedy <aaron.kennedy@nokia.com> | 2009-09-22 07:26:45 (GMT) |
commit | 6b2e0b4c5851a156c1f5fa0f73e9b1266ddc6930 (patch) | |
tree | 31616634bec2095cf16e82df9109cd6beda59460 /src/declarative/qml/qmlengine.cpp | |
parent | c4c12f947b0480fd0695e1885ebec9ab496f6bf4 (diff) | |
download | Qt-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.cpp | 73 |
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 |