summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Jones <martin.jones@nokia.com>2009-12-18 03:44:37 (GMT)
committerMartin Jones <martin.jones@nokia.com>2009-12-18 03:44:37 (GMT)
commit4b067eb7cf7bc20864c2e37e75f527bbbf0308b9 (patch)
tree0ebbe9575b163af9205f89c0285aad451935913e
parent0ad9f711969ddbf5995ddf2b7fcd5087698b93d1 (diff)
downloadQt-4b067eb7cf7bc20864c2e37e75f527bbbf0308b9.zip
Qt-4b067eb7cf7bc20864c2e37e75f527bbbf0308b9.tar.gz
Qt-4b067eb7cf7bc20864c2e37e75f527bbbf0308b9.tar.bz2
Section property access perf.
-rw-r--r--src/declarative/graphicsitems/qmlgraphicslistview.cpp6
-rw-r--r--src/declarative/graphicsitems/qmlgraphicsvisualitemmodel.cpp48
-rw-r--r--src/declarative/graphicsitems/qmlgraphicsvisualitemmodel_p.h6
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 <qmlopenmetaobject_p.h>
#include <qmllistaccessor_p.h>
#include <qmlinfo.h>
+#include <qmldeclarativedata_p.h>
+#include <qmlpropertycache_p.h>
#include <qlistmodelinterface_p.h>
#include <qhash.h>
@@ -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>()) {
+ 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;