From 4b067eb7cf7bc20864c2e37e75f527bbbf0308b9 Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Fri, 18 Dec 2009 13:44:37 +1000 Subject: Section property access perf. --- .../graphicsitems/qmlgraphicslistview.cpp | 6 +-- .../graphicsitems/qmlgraphicsvisualitemmodel.cpp | 48 ++++++++++++++++------ .../graphicsitems/qmlgraphicsvisualitemmodel_p.h | 6 +-- 3 files changed, 41 insertions(+), 19 deletions(-) diff --git a/src/declarative/graphicsitems/qmlgraphicslistview.cpp b/src/declarative/graphicsitems/qmlgraphicslistview.cpp index 5db3b26..51d88ed 100644 --- a/src/declarative/graphicsitems/qmlgraphicslistview.cpp +++ b/src/declarative/graphicsitems/qmlgraphicslistview.cpp @@ -80,7 +80,7 @@ void QmlGraphicsViewSection::setDelegate(QmlComponent *delegate) QString QmlGraphicsViewSection::sectionString(const QString &value) { if (m_criteria == FirstCharacter) - return value.at(0); + return value.isEmpty() ? QString() : value.at(0); else return value; } @@ -349,7 +349,7 @@ public: QString section; if (sectionCriteria) { - QString propValue = model->value(modelIndex, sectionCriteria->property()).toString(); + QString propValue = model->stringValue(modelIndex, sectionCriteria->property()); section = sectionCriteria->sectionString(propValue); } @@ -593,7 +593,7 @@ FxListItem *QmlGraphicsListViewPrivate::createItem(int modelIndex) listItem->index = modelIndex; // initialise attached properties if (sectionCriteria) { - QString propValue = model->value(modelIndex, sectionCriteria->property()).toString(); + QString propValue = model->stringValue(modelIndex, sectionCriteria->property()); listItem->attached->m_section = sectionCriteria->sectionString(propValue); if (modelIndex > 0) { if (FxListItem *item = visibleItem(modelIndex-1)) diff --git a/src/declarative/graphicsitems/qmlgraphicsvisualitemmodel.cpp b/src/declarative/graphicsitems/qmlgraphicsvisualitemmodel.cpp index 8131b4c..017a60c 100644 --- a/src/declarative/graphicsitems/qmlgraphicsvisualitemmodel.cpp +++ b/src/declarative/graphicsitems/qmlgraphicsvisualitemmodel.cpp @@ -50,6 +50,8 @@ #include #include #include +#include +#include #include #include @@ -209,12 +211,12 @@ void QmlGraphicsVisualItemModel::completeItem() // Nothing to do } -QVariant QmlGraphicsVisualItemModel::value(int index, const QString &name) +QString QmlGraphicsVisualItemModel::stringValue(int index, const QString &name) { Q_D(QmlGraphicsVisualItemModel); if (index < 0 || index >= d->children.count()) - return QVariant(); - return QmlEngine::contextForObject(d->children.at(index))->contextProperty(name); + return QString(); + return QmlEngine::contextForObject(d->children.at(index))->contextProperty(name).toString(); } QVariant QmlGraphicsVisualItemModel::evaluate(int index, const QString &expression, QObject *objectContext) @@ -883,25 +885,45 @@ void QmlGraphicsVisualDataModel::completeItem() d->m_delegate->completeCreate(); } -QVariant QmlGraphicsVisualDataModel::value(int index, const QString &name) +QString QmlGraphicsVisualDataModel::stringValue(int index, const QString &name) { Q_D(QmlGraphicsVisualDataModel); if (d->m_visualItemModel) - return d->m_visualItemModel->value(index, name); + return d->m_visualItemModel->stringValue(index, name); if ((!d->m_listModelInterface && !d->m_abstractItemModel) || !d->m_delegate) - return QVariant(); + return QString(); - QVariant val; - QObject *nobj = d->m_cache.item(index); - if (nobj) { - val = d->data(nobj)->property(name.toUtf8()); + QString val; + QObject *data = 0; + bool tempData = false; + + if (QObject *nobj = d->m_cache.item(index)) + data = d->data(nobj); + if (!data) { + data = new QmlGraphicsVisualDataModelData(index, this); + tempData = true; + } + + QmlDeclarativeData *ddata = QmlDeclarativeData::get(data); + if (ddata && ddata->propertyCache) { + QmlPropertyCache::Data *prop = ddata->propertyCache->property(name); + if (prop->propType == QVariant::String) { + void *args[] = { &val, 0 }; + QMetaObject::metacall(data, QMetaObject::ReadProperty, prop->coreIndex, args); + } else if (prop->propType == qMetaTypeId()) { + QVariant v; + void *args[] = { &v, 0 }; + QMetaObject::metacall(data, QMetaObject::ReadProperty, prop->coreIndex, args); + val = v.toString(); + } } else { - QmlGraphicsVisualDataModelData *data = new QmlGraphicsVisualDataModelData(index, this); - val = data->property(name.toUtf8()); - delete data; + val = data->property(name.toUtf8()).toString(); } + if (tempData) + delete data; + return val; } diff --git a/src/declarative/graphicsitems/qmlgraphicsvisualitemmodel_p.h b/src/declarative/graphicsitems/qmlgraphicsvisualitemmodel_p.h index bd9202b..ef849b0 100644 --- a/src/declarative/graphicsitems/qmlgraphicsvisualitemmodel_p.h +++ b/src/declarative/graphicsitems/qmlgraphicsvisualitemmodel_p.h @@ -82,7 +82,7 @@ public: virtual ReleaseFlags release(QmlGraphicsItem *item) = 0; virtual void completeItem() = 0; virtual QVariant evaluate(int index, const QString &expression, QObject *objectContext) = 0; - virtual QVariant value(int, const QString &) { return QVariant(); } + virtual QString stringValue(int, const QString &) { return QString(); } virtual int indexOf(QmlGraphicsItem *item, QObject *objectContext) const = 0; @@ -121,7 +121,7 @@ public: virtual QmlGraphicsItem *item(int index, bool complete=true); virtual ReleaseFlags release(QmlGraphicsItem *item); virtual void completeItem(); - virtual QVariant value(int index, const QString &role); + virtual QString stringValue(int index, const QString &role); virtual QVariant evaluate(int index, const QString &expression, QObject *objectContext); virtual int indexOf(QmlGraphicsItem *item, QObject *objectContext) const; @@ -168,7 +168,7 @@ public: QmlGraphicsItem *item(int index, const QByteArray &, bool complete=true); ReleaseFlags release(QmlGraphicsItem *item); void completeItem(); - virtual QVariant value(int index, const QString &role); + virtual QString stringValue(int index, const QString &role); QVariant evaluate(int index, const QString &expression, QObject *objectContext); int indexOf(QmlGraphicsItem *item, QObject *objectContext) const; -- cgit v0.12