From ed361944159a99abe67df7a4a883d5ee6f4ec73f Mon Sep 17 00:00:00 2001 From: Andrew den Exter Date: Wed, 21 Dec 2011 14:23:41 +1000 Subject: VisualDataModel performance improvements. Avoid a linear scan of all cache items and associated accesses by getting the cache item from an objects vdm attached object instead. Make the model context property a property of the context object instead of a separate property on the context object. Parent the vdm attached object to the delegate object with QDeclarative_setParent_noEvent instead of passing it in the constructor. Change-Id: Ib77c5cdb963f3dfe8f2bdef039e010a6bb30140f Reviewed-by: Martin Jones --- src/quick/items/qquickvisualdatamodel.cpp | 29 +++++++---------------------- src/quick/items/qquickvisualdatamodel_p.h | 10 ++++++---- src/quick/items/qquickvisualdatamodel_p_p.h | 4 +++- 3 files changed, 16 insertions(+), 27 deletions(-) diff --git a/src/quick/items/qquickvisualdatamodel.cpp b/src/quick/items/qquickvisualdatamodel.cpp index b0294435b5..379a42c166 100644 --- a/src/quick/items/qquickvisualdatamodel.cpp +++ b/src/quick/items/qquickvisualdatamodel.cpp @@ -418,9 +418,8 @@ QQuickVisualDataModel::ReleaseFlags QQuickVisualDataModelPrivate::release(QObjec if (!object) return stat; - int cacheIndex = cacheIndexOf(object); - if (cacheIndex != -1) { - QQuickVisualDataModelItem *cacheItem = m_cache.at(cacheIndex); + if (QQuickVisualDataModelAttached *attached = QQuickVisualDataModelAttached::properties(object)) { + QQuickVisualDataModelItem *cacheItem = attached->m_cacheItem; if (cacheItem->releaseObject()) { destroy(object); if (QQuickItem *item = qobject_cast(object)) @@ -782,7 +781,6 @@ QObject *QQuickVisualDataModelPrivate::object(Compositor::Group group, int index } } - ctxt->setContextProperty(QLatin1String("model"), cacheItem); ctxt->setContextObject(cacheItem); incubator->incubating = cacheItem; @@ -844,22 +842,12 @@ QString QQuickVisualDataModel::stringValue(int index, const QString &name) return d->stringValue(d->m_compositorGroup, index, name); } -int QQuickVisualDataModelPrivate::cacheIndexOf(QObject *object) const -{ - for (int cacheIndex = 0; cacheIndex < m_cache.count(); ++cacheIndex) { - if (m_cache.at(cacheIndex)->object == object) - return cacheIndex; - } - return -1; -} - int QQuickVisualDataModel::indexOf(QQuickItem *item, QObject *) const { Q_D(const QQuickVisualDataModel); - const int cacheIndex = d->cacheIndexOf(item); - return cacheIndex != -1 - ? d->m_cache.at(cacheIndex)->index[d->m_compositorGroup] - : -1; + if (QQuickVisualDataModelAttached *attached = QQuickVisualDataModelAttached::properties(item)) + return attached->m_cacheItem->index[d->m_compositorGroup]; + return -1; } void QQuickVisualDataModel::setWatchedRoles(QList roles) @@ -2555,11 +2543,8 @@ int QQuickVisualPartsModel::indexOf(QQuickItem *item, QObject *) const { QHash::const_iterator it = m_packaged.find(item); if (it != m_packaged.end()) { - const QQuickVisualDataModelPrivate *model = QQuickVisualDataModelPrivate::get(m_model); - const int cacheIndex = model->cacheIndexOf(*it); - return cacheIndex != -1 - ? model->m_cache.at(cacheIndex)->index[m_compositorGroup] - : -1; + if (QQuickVisualDataModelAttached *attached = QQuickVisualDataModelAttached::properties(*it)) + return attached->m_cacheItem->index[m_compositorGroup]; } return -1; } diff --git a/src/quick/items/qquickvisualdatamodel_p.h b/src/quick/items/qquickvisualdatamodel_p.h index aecf5e3034..6cb028f329 100644 --- a/src/quick/items/qquickvisualdatamodel_p.h +++ b/src/quick/items/qquickvisualdatamodel_p.h @@ -46,11 +46,12 @@ #include #include - #include #include + #include +#include QT_BEGIN_HEADER @@ -190,11 +191,12 @@ class QQuickVisualDataModelAttached : public QObject Q_PROPERTY(bool isUnresolved READ isUnresolved NOTIFY unresolvedChanged) public: QQuickVisualDataModelAttached(QObject *parent) - : QObject(parent) - , m_cacheItem(0) + : m_cacheItem(0) , m_previousGroups(0) , m_modelChanged(false) - {} + { + QDeclarative_setParent_noEvent(this, parent); + } ~QQuickVisualDataModelAttached() { attachedProperties.remove(parent()); } void setCacheItem(QQuickVisualDataModelItem *item); diff --git a/src/quick/items/qquickvisualdatamodel_p_p.h b/src/quick/items/qquickvisualdatamodel_p_p.h index 03d9767661..7565192ad0 100644 --- a/src/quick/items/qquickvisualdatamodel_p_p.h +++ b/src/quick/items/qquickvisualdatamodel_p_p.h @@ -102,6 +102,7 @@ class QQuickVisualDataModelItem : public QObject, public QV8ObjectResource { Q_OBJECT Q_PROPERTY(int index READ modelIndex NOTIFY modelIndexChanged) + Q_PROPERTY(QObject *model READ modelObject CONSTANT) V8_RESOURCE_TYPE(VisualDataItemType) public: QQuickVisualDataModelItem( @@ -120,6 +121,8 @@ public: void Dispose(); + QObject *modelObject() { return this; } + int modelIndex() const { return index[0]; } void setModelIndex(int idx) { index[0] = idx; emit modelIndexChanged(); } @@ -231,7 +234,6 @@ public: void destroy(QObject *object); QQuickVisualDataModel::ReleaseFlags release(QObject *object); QString stringValue(Compositor::Group group, int index, const QString &name); - int cacheIndexOf(QObject *object) const; void emitCreatedPackage(QQuickVisualDataModelItem *cacheItem, QDeclarativePackage *package); void emitInitPackage(QQuickVisualDataModelItem *cacheItem, QDeclarativePackage *package); void emitCreatedItem(QQuickVisualDataModelItem *cacheItem, QQuickItem *item) { -- cgit v1.2.3