diff options
author | Andrew den Exter <andrew.den-exter@nokia.com> | 2012-05-21 13:04:06 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-05-30 06:01:46 +0200 |
commit | 486ec88d2b88378768487a12dcbf6493c33d5699 (patch) | |
tree | cdbe03a466cf9cd64233582c830e597b984e390d /src/quick/items/qquickvisualadaptormodel.cpp | |
parent | 47eb68ab0b8d9ffd357cbad2f74b63ee2cf00dad (diff) |
Use a shared meta-object for VisualDataModel list context objects.
The objectDestroyed() function on QAbstractDynamicMetaObject makes it
possible to reference count dynamic meta objects so there is no longer
a need to construct an instance per item.
Change-Id: I6f32b803b97db015212284718239dc3062dcefe7
Reviewed-by: Martin Jones <martin.jones@nokia.com>
Diffstat (limited to 'src/quick/items/qquickvisualadaptormodel.cpp')
-rw-r--r-- | src/quick/items/qquickvisualadaptormodel.cpp | 48 |
1 files changed, 19 insertions, 29 deletions
diff --git a/src/quick/items/qquickvisualadaptormodel.cpp b/src/quick/items/qquickvisualadaptormodel.cpp index 99c44e329c..fa88932faa 100644 --- a/src/quick/items/qquickvisualadaptormodel.cpp +++ b/src/quick/items/qquickvisualadaptormodel.cpp @@ -90,7 +90,6 @@ public: QQuickVisualDataModelItemMetaType *metaType, VDMModelDelegateDataType *dataType, int index); - ~QQuickVDMCachedModelData(); int metaCall(QMetaObject::Call call, int id, void **arguments); @@ -108,7 +107,10 @@ public: QVector<QVariant> cachedData; }; -class VDMModelDelegateDataType : public QQmlRefCount, public QQuickVisualAdaptorModel::Accessors +class VDMModelDelegateDataType + : public QQmlRefCount + , public QQuickVisualAdaptorModel::Accessors + , public QAbstractDynamicMetaObject { public: VDMModelDelegateDataType(QQuickVisualAdaptorModel *model) @@ -204,6 +206,18 @@ public: } } + // QAbstractDynamicMetaObject + + void objectDestroyed(QObject *) + { + release(); + } + + int metaCall(QObject *object, QMetaObject::Call call, int id, void **arguments) + { + return static_cast<QQuickVDMCachedModelData *>(object)->metaCall(call, id, arguments); + } + v8::Persistent<v8::ObjectTemplate> constructor; QList<int> propertyRoles; QList<int> watchedRoleIds; @@ -217,23 +231,6 @@ public: bool hasModelData; }; - -class QQuickVDMCachedModelDataMetaObject : public QAbstractDynamicMetaObject -{ -public: - QQuickVDMCachedModelDataMetaObject(QQuickVDMCachedModelData *data) - : m_data(data) - { - } - - int metaCall(QMetaObject::Call call, int id, void **arguments) - { - return m_data->metaCall(call, id, arguments); - } - - QQuickVDMCachedModelData *m_data; -}; - QQuickVDMCachedModelData::QQuickVDMCachedModelData( QQuickVisualDataModelItemMetaType *metaType, VDMModelDelegateDataType *dataType, int index) : QQuickVisualDataModelItem(metaType, index) @@ -242,11 +239,7 @@ QQuickVDMCachedModelData::QQuickVDMCachedModelData( if (index == -1) cachedData.resize(type->hasModelData ? 1 : type->propertyRoles.count()); - QQuickVDMCachedModelDataMetaObject *metaObject = new QQuickVDMCachedModelDataMetaObject(this); - - QObjectPrivate *op = QObjectPrivate::get(this); - *static_cast<QMetaObject *>(metaObject) = *type->metaObject; - op->metaObject = metaObject; + QObjectPrivate::get(this)->metaObject = type; type->addref(); @@ -255,11 +248,6 @@ QQuickVDMCachedModelData::QQuickVDMCachedModelData( qmldata->propertyCache->addref(); } -QQuickVDMCachedModelData::~QQuickVDMCachedModelData() -{ - type->release(); -} - int QQuickVDMCachedModelData::metaCall(QMetaObject::Call call, int id, void **arguments) { if (call == QMetaObject::ReadProperty && id >= type->propertyOffset) { @@ -542,6 +530,7 @@ public: } metaObject = builder.toMetaObject(); + *static_cast<QMetaObject *>(this) = *metaObject; propertyCache = new QQmlPropertyCache(engine, metaObject); } }; @@ -657,6 +646,7 @@ public: } metaObject = builder.toMetaObject(); + *static_cast<QMetaObject *>(this) = *metaObject; propertyCache = new QQmlPropertyCache(engine, metaObject); } }; |