From 9165afd37c0a5092709ebf04d1cdf242b0eec634 Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Thu, 17 Dec 2009 13:19:25 +1000 Subject: Benchmarks --- .../qmltime/tests/item_creation/children.qml | 34 ++++++++++++++++++++++ .../qmltime/tests/item_creation/data.qml | 34 ++++++++++++++++++++++ .../qmltime/tests/item_creation/no_creation.qml | 12 ++++++++ .../qmltime/tests/item_creation/resources.qml | 34 ++++++++++++++++++++++ 4 files changed, 114 insertions(+) create mode 100644 tests/benchmarks/declarative/qmltime/tests/item_creation/children.qml create mode 100644 tests/benchmarks/declarative/qmltime/tests/item_creation/data.qml create mode 100644 tests/benchmarks/declarative/qmltime/tests/item_creation/no_creation.qml create mode 100644 tests/benchmarks/declarative/qmltime/tests/item_creation/resources.qml diff --git a/tests/benchmarks/declarative/qmltime/tests/item_creation/children.qml b/tests/benchmarks/declarative/qmltime/tests/item_creation/children.qml new file mode 100644 index 0000000..210c515 --- /dev/null +++ b/tests/benchmarks/declarative/qmltime/tests/item_creation/children.qml @@ -0,0 +1,34 @@ +import Qt 4.6 +import QmlTime 1.0 as QmlTime + +Item { + + QmlTime.Timer { + component: Component { + Item { + children: [ + Rectangle { }, + Rectangle { }, + Item { }, + Image { }, + Text { }, + Item { }, + Item { }, + Image { }, + Image { }, + Row { }, + Image { }, + Image { }, + Column { }, + Row { }, + Text { }, + Text { }, + Text { }, + MouseRegion { } + ] + + } + } + } + +} diff --git a/tests/benchmarks/declarative/qmltime/tests/item_creation/data.qml b/tests/benchmarks/declarative/qmltime/tests/item_creation/data.qml new file mode 100644 index 0000000..943634f --- /dev/null +++ b/tests/benchmarks/declarative/qmltime/tests/item_creation/data.qml @@ -0,0 +1,34 @@ +import Qt 4.6 +import QmlTime 1.0 as QmlTime + +Item { + + QmlTime.Timer { + component: Component { + Item { + data: [ + Rectangle { }, + Rectangle { }, + Item { }, + Image { }, + Text { }, + Item { }, + Item { }, + Image { }, + Image { }, + Row { }, + Image { }, + Image { }, + Column { }, + Row { }, + Text { }, + Text { }, + Text { }, + MouseRegion { } + ] + + } + } + } + +} diff --git a/tests/benchmarks/declarative/qmltime/tests/item_creation/no_creation.qml b/tests/benchmarks/declarative/qmltime/tests/item_creation/no_creation.qml new file mode 100644 index 0000000..f228c2a --- /dev/null +++ b/tests/benchmarks/declarative/qmltime/tests/item_creation/no_creation.qml @@ -0,0 +1,12 @@ +import Qt 4.6 +import QmlTime 1.0 as QmlTime + +Item { + + QmlTime.Timer { + component: Component { + Item { + } + } + } +} diff --git a/tests/benchmarks/declarative/qmltime/tests/item_creation/resources.qml b/tests/benchmarks/declarative/qmltime/tests/item_creation/resources.qml new file mode 100644 index 0000000..ce986b5 --- /dev/null +++ b/tests/benchmarks/declarative/qmltime/tests/item_creation/resources.qml @@ -0,0 +1,34 @@ +import Qt 4.6 +import QmlTime 1.0 as QmlTime + +Item { + + QmlTime.Timer { + component: Component { + Item { + resources: [ + Rectangle { }, + Rectangle { }, + Item { }, + Image { }, + Text { }, + Item { }, + Item { }, + Image { }, + Image { }, + Row { }, + Image { }, + Image { }, + Column { }, + Row { }, + Text { }, + Text { }, + Text { }, + MouseRegion { } + ] + + } + } + } + +} -- cgit v0.12 From 4d6001bd1d75b80c53fcc716b5a51043713ff6f9 Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Thu, 17 Dec 2009 13:29:03 +1000 Subject: Benchmarks --- .../tests/positioner_creation/no_positioner.qml | 37 ++++++++++++++++++++++ .../tests/positioner_creation/null_positioner.qml | 34 ++++++++++++++++++++ .../tests/positioner_creation/positioner.qml | 37 ++++++++++++++++++++++ 3 files changed, 108 insertions(+) create mode 100644 tests/benchmarks/declarative/qmltime/tests/positioner_creation/no_positioner.qml create mode 100644 tests/benchmarks/declarative/qmltime/tests/positioner_creation/null_positioner.qml create mode 100644 tests/benchmarks/declarative/qmltime/tests/positioner_creation/positioner.qml diff --git a/tests/benchmarks/declarative/qmltime/tests/positioner_creation/no_positioner.qml b/tests/benchmarks/declarative/qmltime/tests/positioner_creation/no_positioner.qml new file mode 100644 index 0000000..25e9c62 --- /dev/null +++ b/tests/benchmarks/declarative/qmltime/tests/positioner_creation/no_positioner.qml @@ -0,0 +1,37 @@ +import Qt 4.6 +import QmlTime 1.0 as QmlTime + +Item { + QmlTime.Timer { + component: Component { + Item { + Rectangle { } + Rectangle { } + Item { + Image { } + Text { } + } + + Item { + Item { + Image { } + Image { } + Item { + Image { } + Image { } + } + } + + Item { + Item { + Text { } + Text { } + } + Text { } + } + } + MouseRegion { } + } + } + } +} diff --git a/tests/benchmarks/declarative/qmltime/tests/positioner_creation/null_positioner.qml b/tests/benchmarks/declarative/qmltime/tests/positioner_creation/null_positioner.qml new file mode 100644 index 0000000..ee3f9d1 --- /dev/null +++ b/tests/benchmarks/declarative/qmltime/tests/positioner_creation/null_positioner.qml @@ -0,0 +1,34 @@ +import Qt 4.6 +import QmlTime 1.0 as QmlTime + +Item { + QmlTime.Timer { + component: Component { + Item { + Rectangle { } + Rectangle { } + Item { + Image { } + Text { } + } + + Item { + Item { + Image { } + Image { } + Row { } + Image { } + Image { } + } + + Column { } + Row { } + Text { } + Text { } + Text { } + } + MouseRegion { } + } + } + } +} diff --git a/tests/benchmarks/declarative/qmltime/tests/positioner_creation/positioner.qml b/tests/benchmarks/declarative/qmltime/tests/positioner_creation/positioner.qml new file mode 100644 index 0000000..4c46ec1 --- /dev/null +++ b/tests/benchmarks/declarative/qmltime/tests/positioner_creation/positioner.qml @@ -0,0 +1,37 @@ +import Qt 4.6 +import QmlTime 1.0 as QmlTime + +Item { + QmlTime.Timer { + component: Component { + Item { + Rectangle { } + Rectangle { } + Item { + Image { } + Text { } + } + + Item { + Item { + Image { } + Image { } + Row { + Image { } + Image { } + } + } + + Column { + Row { + Text { } + Text { } + } + Text { } + } + } + MouseRegion { } + } + } + } +} -- cgit v0.12 From dc77d8217ab7f727a4360ebe953901ec4bade3b0 Mon Sep 17 00:00:00 2001 From: Michael Brasser Date: Thu, 17 Dec 2009 13:48:16 +1000 Subject: Support aliasing of composite types. Composite types haven't been registered with the metatype system, so we use the base type as the property type instead. --- src/declarative/qml/qmlcompiler.cpp | 15 ++++++++++++++ tests/auto/declarative/qmllanguage/data/Alias3.qml | 12 +++++++++++ tests/auto/declarative/qmllanguage/data/Alias4.qml | 5 +++++ .../auto/declarative/qmllanguage/data/alias.8.qml | 9 ++++++++ .../auto/declarative/qmllanguage/data/alias.9.qml | 9 ++++++++ .../declarative/qmllanguage/tst_qmllanguage.cpp | 24 ++++++++++++++++++++++ 6 files changed, 74 insertions(+) create mode 100644 tests/auto/declarative/qmllanguage/data/Alias3.qml create mode 100644 tests/auto/declarative/qmllanguage/data/Alias4.qml create mode 100644 tests/auto/declarative/qmllanguage/data/alias.8.qml create mode 100644 tests/auto/declarative/qmllanguage/data/alias.9.qml diff --git a/src/declarative/qml/qmlcompiler.cpp b/src/declarative/qml/qmlcompiler.cpp index bd46bbe..9147c4a 100644 --- a/src/declarative/qml/qmlcompiler.cpp +++ b/src/declarative/qml/qmlcompiler.cpp @@ -2440,6 +2440,21 @@ bool QmlCompiler::compileAlias(QMetaObjectBuilder &builder, typeName = aliasProperty.typeName(); } else { typeName = idObject->metaObject()->className(); + + //use the base type since it has been registered with metatype system + int index = typeName.indexOf("_QML_"); + if (index != -1) { + typeName = typeName.left(index); + } else { + index = typeName.indexOf("_QMLTYPE_"); + const QMetaObject *mo = idObject->metaObject(); + while (index != -1 && mo) { + typeName = mo->superClass()->className(); + index = typeName.indexOf("_QMLTYPE_"); + mo = mo->superClass(); + } + } + typeName += '*'; } diff --git a/tests/auto/declarative/qmllanguage/data/Alias3.qml b/tests/auto/declarative/qmllanguage/data/Alias3.qml new file mode 100644 index 0000000..d1e78f8 --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/Alias3.qml @@ -0,0 +1,12 @@ +import Test 1.0 +import Qt 4.6 + +QtObject { + property alias obj : otherObj + property var child + child: QtObject { + id: otherObj + property int myValue: 10 + } +} + diff --git a/tests/auto/declarative/qmllanguage/data/Alias4.qml b/tests/auto/declarative/qmllanguage/data/Alias4.qml new file mode 100644 index 0000000..573674c --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/Alias4.qml @@ -0,0 +1,5 @@ +import Test 1.0 +import Qt 4.6 + +Alias3 {} + diff --git a/tests/auto/declarative/qmllanguage/data/alias.8.qml b/tests/auto/declarative/qmllanguage/data/alias.8.qml new file mode 100644 index 0000000..38dc10f --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/alias.8.qml @@ -0,0 +1,9 @@ +import Qt 4.6 + +QtObject { + property var other + other: Alias3 { id: MyAliasObject } + + property int value: MyAliasObject.obj.myValue +} + diff --git a/tests/auto/declarative/qmllanguage/data/alias.9.qml b/tests/auto/declarative/qmllanguage/data/alias.9.qml new file mode 100644 index 0000000..8061f99 --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/alias.9.qml @@ -0,0 +1,9 @@ +import Qt 4.6 + +QtObject { + property var other + other: Alias4 { id: MyAliasObject } + + property int value: MyAliasObject.obj.myValue +} + diff --git a/tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp b/tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp index 160998f..56c500c 100644 --- a/tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp +++ b/tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp @@ -889,6 +889,30 @@ void tst_qmllanguage::aliasProperties() object->metaObject()->indexOfProperty("aliasedObject"), a); QVERIFY(alias2 == 0); } + + // Simple composite type + { + QmlComponent component(&engine, TEST_FILE("alias.8.qml")); + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("value").toInt(), 10); + + delete object; + } + + // Complex composite type + { + QmlComponent component(&engine, TEST_FILE("alias.9.qml")); + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("value").toInt(), 10); + + delete object; + } } // Test that the root element in a composite type can be a Component -- cgit v0.12 From e65add386385365f3ee5d3161198101afe2459a3 Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Thu, 17 Dec 2009 14:06:42 +1000 Subject: Add -parent option --- tests/benchmarks/declarative/qmltime/qmltime.cpp | 40 ++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/tests/benchmarks/declarative/qmltime/qmltime.cpp b/tests/benchmarks/declarative/qmltime/qmltime.cpp index f065444..8da0f17 100644 --- a/tests/benchmarks/declarative/qmltime/qmltime.cpp +++ b/tests/benchmarks/declarative/qmltime/qmltime.cpp @@ -4,6 +4,8 @@ #include #include #include +#include +#include class Timer : public QObject { @@ -20,11 +22,18 @@ public: void run(uint); + bool willParent() const; + void setWillParent(bool p); + private: void runTest(QmlContext *, uint); QmlComponent *m_component; static Timer *m_timer; + + bool m_willparent; + QGraphicsScene m_scene; + QGraphicsRectItem m_item; }; QML_DECLARE_TYPE(Timer); QML_DEFINE_TYPE(QmlTime, 1, 0, Timer, Timer); @@ -32,11 +41,13 @@ QML_DEFINE_TYPE(QmlTime, 1, 0, Timer, Timer); Timer *Timer::m_timer = 0; Timer::Timer() -: m_component(0) +: m_component(0), m_willparent(false) { if (m_timer) qWarning("Timer: Timer already registered"); m_timer = this; + + m_scene.addItem(&m_item); } QmlComponent *Timer::component() const @@ -59,18 +70,33 @@ void Timer::run(uint iterations) QmlContext context(qmlContext(this)); QObject *o = m_component->create(&context); + QGraphicsObject *go = qobject_cast(o); + if (m_willparent && go) + go->setParentItem(&m_item); delete o; - runTest(&context, iterations); } +bool Timer::willParent() const +{ + return m_willparent; +} + +void Timer::setWillParent(bool p) +{ + m_willparent = p; +} + void Timer::runTest(QmlContext *context, uint iterations) { QTime t; t.start(); for (uint ii = 0; ii < iterations; ++ii) { QObject *o = m_component->create(context); + QGraphicsObject *go = qobject_cast(o); + if (m_willparent && go) + go->setParentItem(&m_item); delete o; } @@ -82,7 +108,7 @@ void Timer::runTest(QmlContext *context, uint iterations) void usage(const char *name) { - qWarning("Usage: %s [-iterations ] ", name); + qWarning("Usage: %s [-iterations ] [-parent] ", name); exit(-1); } @@ -92,6 +118,7 @@ int main(int argc, char ** argv) uint iterations = 1024; QString filename; + bool willParent = false; for (int ii = 1; ii < argc; ++ii) { QByteArray arg(argv[ii]); @@ -107,11 +134,16 @@ int main(int argc, char ** argv) } else { usage(argv[0]); } + } else if (arg == "-parent") { + willParent = true; } else { filename = QLatin1String(argv[ii]); } } + if (filename.isEmpty()) + usage(argv[0]); + QmlEngine engine; QmlComponent component(&engine, filename); if (component.isError()) { @@ -131,6 +163,8 @@ int main(int argc, char ** argv) return -1; } + timer->setWillParent(willParent); + if (!timer->component()) { qWarning() << "The timer has no component"; return -1; -- cgit v0.12 From d169873541ca6f6725e9ce5bfbbf9941f1823a1f Mon Sep 17 00:00:00 2001 From: Michael Brasser Date: Thu, 17 Dec 2009 16:18:56 +1000 Subject: Set correct property flags for custom property types. If a property type was a composite object pointer (e.g. property MyObject obj), it was not being correctly identified as an object type. Task-number: QTBUG-6335 Reviewed-by: Aaron Kennedy --- src/declarative/qml/qmlengine.cpp | 10 ++++++++++ src/declarative/qml/qmlengine_p.h | 1 + src/declarative/qml/qmlpropertycache.cpp | 7 ++++--- src/declarative/qml/qmlpropertycache_p.h | 2 +- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/declarative/qml/qmlengine.cpp b/src/declarative/qml/qmlengine.cpp index 6b66095..f541631 100644 --- a/src/declarative/qml/qmlengine.cpp +++ b/src/declarative/qml/qmlengine.cpp @@ -1527,6 +1527,16 @@ int QmlEnginePrivate::qmlListType(int t) const return QmlMetaType::qmlListType(t); } +QmlMetaType::TypeCategory QmlEnginePrivate::typeCategory(int t) const +{ + if (m_compositeTypes.contains(t)) + return QmlMetaType::Object; + else if (m_qmlLists.contains(t)) + return QmlMetaType::QmlList; + else + return QmlMetaType::typeCategory(t); +} + const QMetaObject *QmlEnginePrivate::rawMetaObjectForType(int t) const { QHash::ConstIterator iter = m_compositeTypes.find(t); diff --git a/src/declarative/qml/qmlengine_p.h b/src/declarative/qml/qmlengine_p.h index c3db6cf..96297ea 100644 --- a/src/declarative/qml/qmlengine_p.h +++ b/src/declarative/qml/qmlengine_p.h @@ -263,6 +263,7 @@ public: bool isQmlList(int) const; bool isObject(int); int qmlListType(int) const; + QmlMetaType::TypeCategory typeCategory(int) const; const QMetaObject *rawMetaObjectForType(int) const; const QMetaObject *metaObjectForType(int) const; QHash m_qmlLists; diff --git a/src/declarative/qml/qmlpropertycache.cpp b/src/declarative/qml/qmlpropertycache.cpp index 6ba6028..bc7d7de 100644 --- a/src/declarative/qml/qmlpropertycache.cpp +++ b/src/declarative/qml/qmlpropertycache.cpp @@ -49,7 +49,7 @@ QT_BEGIN_NAMESPACE Q_DECLARE_METATYPE(QScriptValue); -void QmlPropertyCache::Data::load(const QMetaProperty &p) +void QmlPropertyCache::Data::load(const QMetaProperty &p, QmlEngine *engine) { propType = p.userType(); if (QVariant::Type(propType) == QVariant::LastType) @@ -69,7 +69,8 @@ void QmlPropertyCache::Data::load(const QMetaProperty &p) } else if (p.isEnumType()) { flags |= Data::IsEnumType; } else { - QmlMetaType::TypeCategory cat = QmlMetaType::typeCategory(propType); + QmlMetaType::TypeCategory cat = engine ? QmlEnginePrivate::get(engine)->typeCategory(propType) + : QmlMetaType::typeCategory(propType); if (cat == QmlMetaType::Object) flags |= Data::IsQObjectDerived; else if (cat == QmlMetaType::List) @@ -174,7 +175,7 @@ void QmlPropertyCache::update(QmlEngine *engine, const QMetaObject *metaObject) RData *data = new RData; data->identifier = enginePriv->objectClass->createPersistentIdentifier(propName); - data->load(p); + data->load(p, engine); indexCache[ii] = data; diff --git a/src/declarative/qml/qmlpropertycache_p.h b/src/declarative/qml/qmlpropertycache_p.h index 613f4dd..50b4cf2 100644 --- a/src/declarative/qml/qmlpropertycache_p.h +++ b/src/declarative/qml/qmlpropertycache_p.h @@ -97,7 +97,7 @@ public: int coreIndex; int notifyIndex; - void load(const QMetaProperty &); + void load(const QMetaProperty &, QmlEngine *engine = 0); void load(const QMetaMethod &); QString name(QObject *); QString name(const QMetaObject *); -- cgit v0.12 From 21aa1d1c5341edf2b2d50998f5cedc16094b75e1 Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Thu, 17 Dec 2009 17:31:57 +1000 Subject: Disable indexing --- tests/benchmarks/declarative/qmltime/qmltime.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/benchmarks/declarative/qmltime/qmltime.cpp b/tests/benchmarks/declarative/qmltime/qmltime.cpp index 8da0f17..7f41c07 100644 --- a/tests/benchmarks/declarative/qmltime/qmltime.cpp +++ b/tests/benchmarks/declarative/qmltime/qmltime.cpp @@ -47,6 +47,7 @@ Timer::Timer() qWarning("Timer: Timer already registered"); m_timer = this; + m_scene.setItemIndexMethod(QGraphicsScene::NoIndex); m_scene.addItem(&m_item); } -- cgit v0.12 From f79e0e89ea9061bbe93f43405a1ec954a41da1cc Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Thu, 17 Dec 2009 18:13:04 +1000 Subject: Make positioners fast. --- src/declarative/graphicsitems/graphicsitems.pri | 2 +- .../graphicsitems/qmlgraphicsanchors.cpp | 4 +- .../graphicsitems/qmlgraphicsanchors_p_p.h | 4 +- src/declarative/graphicsitems/qmlgraphicsitem.cpp | 78 ++++++--- src/declarative/graphicsitems/qmlgraphicsitem_p.h | 69 ++++---- .../qmlgraphicsitemchangelistener_p.h | 76 +++++++++ .../qmlgraphicsitemgeometrylistener_p.h | 70 -------- .../graphicsitems/qmlgraphicslistview.cpp | 6 +- .../graphicsitems/qmlgraphicspositioners.cpp | 181 +++++++++++---------- .../graphicsitems/qmlgraphicspositioners_p.h | 16 +- .../graphicsitems/qmlgraphicspositioners_p_p.h | 40 +++-- .../graphicsitems/qmlgraphicsvisualitemmodel_p.h | 2 +- src/declarative/qml/qpodvector_p.h | 48 ++++-- 13 files changed, 332 insertions(+), 264 deletions(-) create mode 100644 src/declarative/graphicsitems/qmlgraphicsitemchangelistener_p.h delete mode 100644 src/declarative/graphicsitems/qmlgraphicsitemgeometrylistener_p.h diff --git a/src/declarative/graphicsitems/graphicsitems.pri b/src/declarative/graphicsitems/graphicsitems.pri index 5199c5d..eb6e0ad 100644 --- a/src/declarative/graphicsitems/graphicsitems.pri +++ b/src/declarative/graphicsitems/graphicsitems.pri @@ -48,7 +48,7 @@ HEADERS += \ $$PWD/qmlgraphicsgraphicsobjectcontainer_p.h \ $$PWD/qmlgraphicsparticles_p.h \ $$PWD/qmlgraphicslayoutitem_p.h \ - $$PWD/qmlgraphicsitemgeometrylistener_p.h \ + $$PWD/qmlgraphicsitemchangelistener_p.h \ $$PWD/qmlgraphicseffects.cpp SOURCES += \ diff --git a/src/declarative/graphicsitems/qmlgraphicsanchors.cpp b/src/declarative/graphicsitems/qmlgraphicsanchors.cpp index 0febf08..c2e1fa2 100644 --- a/src/declarative/graphicsitems/qmlgraphicsanchors.cpp +++ b/src/declarative/graphicsitems/qmlgraphicsanchors.cpp @@ -245,7 +245,7 @@ void QmlGraphicsAnchorsPrivate::addDepend(QmlGraphicsItem *item) return; QmlGraphicsItemPrivate *p = static_cast(QGraphicsItemPrivate::get(item)); - p->addGeometryListener(this); + p->addItemChangeListener(this, QmlGraphicsItemPrivate::Geometry); } void QmlGraphicsAnchorsPrivate::remDepend(QmlGraphicsItem *item) @@ -254,7 +254,7 @@ void QmlGraphicsAnchorsPrivate::remDepend(QmlGraphicsItem *item) return; QmlGraphicsItemPrivate *p = static_cast(QGraphicsItemPrivate::get(item)); - p->removeGeometryListener(this); + p->removeItemChangeListener(this, QmlGraphicsItemPrivate::Geometry); } bool QmlGraphicsAnchorsPrivate::isItemComplete() const diff --git a/src/declarative/graphicsitems/qmlgraphicsanchors_p_p.h b/src/declarative/graphicsitems/qmlgraphicsanchors_p_p.h index 91c8ff1..45c983f 100644 --- a/src/declarative/graphicsitems/qmlgraphicsanchors_p_p.h +++ b/src/declarative/graphicsitems/qmlgraphicsanchors_p_p.h @@ -54,7 +54,7 @@ // #include "qmlgraphicsanchors_p.h" -#include "qmlgraphicsitemgeometrylistener_p.h" +#include "qmlgraphicsitemchangelistener_p.h" #include QT_BEGIN_NAMESPACE @@ -91,7 +91,7 @@ Q_DECLARE_METATYPE(QmlGraphicsAnchorLine) -class QmlGraphicsAnchorsPrivate : public QObjectPrivate, public QmlGraphicsItemGeometryListener +class QmlGraphicsAnchorsPrivate : public QObjectPrivate, public QmlGraphicsItemChangeListener { Q_DECLARE_PUBLIC(QmlGraphicsAnchors) public: diff --git a/src/declarative/graphicsitems/qmlgraphicsitem.cpp b/src/declarative/graphicsitems/qmlgraphicsitem.cpp index 4d587e4d..aa73444 100644 --- a/src/declarative/graphicsitems/qmlgraphicsitem.cpp +++ b/src/declarative/graphicsitems/qmlgraphicsitem.cpp @@ -1478,18 +1478,24 @@ QmlGraphicsItem::QmlGraphicsItem(QmlGraphicsItemPrivate &dd, QmlGraphicsItem *pa QmlGraphicsItem::~QmlGraphicsItem() { Q_D(QmlGraphicsItem); - for (int ii = 0; ii < d->geometryListeners.count(); ++ii) { - QmlGraphicsAnchorsPrivate *anchor = d->geometryListeners.at(ii)->anchorPrivate(); + for (int ii = 0; ii < d->changeListeners.count(); ++ii) { + QmlGraphicsAnchorsPrivate *anchor = d->changeListeners.at(ii).listener->anchorPrivate(); if (anchor) anchor->clearItem(this); } - if (!d->parent || (parentItem() && !parentItem()->QGraphicsItem::d_ptr->inDestructor)) - for (int ii = 0; ii < d->geometryListeners.count(); ++ii) { - QmlGraphicsAnchorsPrivate *anchor = d->geometryListeners.at(ii)->anchorPrivate(); + if (!d->parent || (parentItem() && !parentItem()->QGraphicsItem::d_ptr->inDestructor)) { + for (int ii = 0; ii < d->changeListeners.count(); ++ii) { + QmlGraphicsAnchorsPrivate *anchor = d->changeListeners.at(ii).listener->anchorPrivate(); if (anchor && anchor->item && anchor->item->parentItem() != this) //child will be deleted anyway anchor->updateOnComplete(); } - d->geometryListeners.clear(); + } + for(int ii = 0; ii < d->changeListeners.count(); ++ii) { + const QmlGraphicsItemPrivate::ChangeListener &change = d->changeListeners.at(ii); + if (change.types & QmlGraphicsItemPrivate::Destroyed) + change.listener->itemDestroyed(this); + } + d->changeListeners.clear(); delete d->_anchorLines; d->_anchorLines = 0; delete d->_anchors; d->_anchors = 0; delete d->_stateGroup; d->_stateGroup = 0; @@ -1975,20 +1981,17 @@ void QmlGraphicsItem::geometryChanged(const QRectF &newGeometry, if (newGeometry.height() != oldGeometry.height()) emit heightChanged(); - for(int ii = 0; ii < d->geometryListeners.count(); ++ii) { - QmlGraphicsItemGeometryListener *listener = d->geometryListeners.at(ii); - listener->itemGeometryChanged(this, newGeometry, oldGeometry); + for(int ii = 0; ii < d->changeListeners.count(); ++ii) { + const QmlGraphicsItemPrivate::ChangeListener &change = d->changeListeners.at(ii); + if (change.types & QmlGraphicsItemPrivate::Geometry) + change.listener->itemGeometryChanged(this, newGeometry, oldGeometry); } } -void QmlGraphicsItemPrivate::addGeometryListener(QmlGraphicsItemGeometryListener *listener) -{ - geometryListeners.append(listener); -} - -void QmlGraphicsItemPrivate::removeGeometryListener(QmlGraphicsItemGeometryListener *listener) +void QmlGraphicsItemPrivate::removeItemChangeListener(QmlGraphicsItemChangeListener *listener, ChangeTypes types) { - geometryListeners.removeOne(listener); + ChangeListener change(listener, types); + changeListeners.removeOne(change); } /*! \internal */ @@ -2238,10 +2241,13 @@ void QmlGraphicsItem::setBaselineOffset(qreal offset) d->_baselineOffset = offset; emit baselineOffsetChanged(); - for(int ii = 0; ii < d->geometryListeners.count(); ++ii) { - QmlGraphicsAnchorsPrivate *anchor = d->geometryListeners.at(ii)->anchorPrivate(); - if (anchor) - anchor->updateVerticalAnchors(); + for(int ii = 0; ii < d->changeListeners.count(); ++ii) { + const QmlGraphicsItemPrivate::ChangeListener &change = d->changeListeners.at(ii); + if (change.types & QmlGraphicsItemPrivate::Geometry) { + QmlGraphicsAnchorsPrivate *anchor = change.listener->anchorPrivate(); + if (anchor) + anchor->updateVerticalAnchors(); + } } } @@ -2707,10 +2713,35 @@ bool QmlGraphicsItem::sceneEvent(QEvent *event) QVariant QmlGraphicsItem::itemChange(GraphicsItemChange change, const QVariant &value) { - if (change == ItemParentHasChanged) { + Q_D(const QmlGraphicsItem); + switch (change) { + case ItemParentHasChanged: emit parentChanged(); - } else if (change == ItemChildAddedChange || change == ItemChildRemovedChange) { + break; + case ItemChildAddedChange: + case ItemChildRemovedChange: emit childrenChanged(); + break; + case ItemVisibleHasChanged: { + for(int ii = 0; ii < d->changeListeners.count(); ++ii) { + const QmlGraphicsItemPrivate::ChangeListener &change = d->changeListeners.at(ii); + if (change.types & QmlGraphicsItemPrivate::Visibility) { + change.listener->itemVisibilityChanged(this); + } + } + } + break; + case ItemOpacityHasChanged: { + for(int ii = 0; ii < d->changeListeners.count(); ++ii) { + const QmlGraphicsItemPrivate::ChangeListener &change = d->changeListeners.at(ii); + if (change.types & QmlGraphicsItemPrivate::Opacity) { + change.listener->itemOpacityChanged(this); + } + } + } + break; + default: + break; } return QGraphicsItem::itemChange(change, value); @@ -3006,9 +3037,6 @@ QDebug operator<<(QDebug debug, QmlGraphicsItem *item) return debug; } -int QmlGraphicsItemPrivate::heightIdx = -1; -int QmlGraphicsItemPrivate::widthIdx = -1; - int QmlGraphicsItemPrivate::consistentTime = -1; void QmlGraphicsItemPrivate::setConsistentTime(int t) { diff --git a/src/declarative/graphicsitems/qmlgraphicsitem_p.h b/src/declarative/graphicsitems/qmlgraphicsitem_p.h index 9496590..07c821e 100644 --- a/src/declarative/graphicsitems/qmlgraphicsitem_p.h +++ b/src/declarative/graphicsitems/qmlgraphicsitem_p.h @@ -57,7 +57,8 @@ #include "qmlgraphicsanchors_p.h" #include "qmlgraphicsanchors_p_p.h" -#include "qmlgraphicsitemgeometrylistener_p.h" +#include "qmlgraphicsitemchangelistener_p.h" +#include "qpodvector_p.h" #include "../util/qmlstate_p.h" #include "../util/qmlnullablevalue_p_p.h" @@ -115,10 +116,6 @@ public: smooth(false), keyHandler(0), width(0), height(0), implicitWidth(0), implicitHeight(0) { - if (widthIdx == -1) { - widthIdx = QmlGraphicsItem::staticMetaObject.indexOfSignal("widthChanged()"); - heightIdx = QmlGraphicsItem::staticMetaObject.indexOfSignal("heightChanged()"); - } } void init(QmlGraphicsItem *parent) @@ -206,9 +203,28 @@ public: return _anchorLines; } - void addGeometryListener(QmlGraphicsItemGeometryListener *); - void removeGeometryListener(QmlGraphicsItemGeometryListener *); - QList geometryListeners; + enum ChangeType { + Geometry = 0x01, + SiblingOrder = 0x02, + Visibility = 0x04, + Opacity = 0x08, + Destroyed = 0x10 + }; + + Q_DECLARE_FLAGS(ChangeTypes, ChangeType) + + struct ChangeListener { + ChangeListener(QmlGraphicsItemChangeListener *l, QmlGraphicsItemPrivate::ChangeTypes t) : listener(l), types(t) {} + QmlGraphicsItemChangeListener *listener; + QmlGraphicsItemPrivate::ChangeTypes types; + bool operator==(const ChangeListener &other) const { return listener == other.listener && types == other.types; } + }; + + void addItemChangeListener(QmlGraphicsItemChangeListener *listener, ChangeTypes types) { + changeListeners.append(ChangeListener(listener, types)); + } + void removeItemChangeListener(QmlGraphicsItemChangeListener *, ChangeTypes types); + QPODVector changeListeners; QmlStateGroup *states(); QmlStateGroup *_stateGroup; @@ -246,32 +262,13 @@ public: // Reimplemented from QGraphicsItemPrivate virtual void siblingOrderChange() { - foreach(QmlGraphicsItemPrivate* other, siblingOrderNotifiees) - other->otherSiblingOrderChange(this); - } - QList siblingOrderNotifiees; - void registerSiblingOrderNotification(QmlGraphicsItemPrivate* other) - { - siblingOrderNotifiees << other; - } - void unregisterSiblingOrderNotification(QmlGraphicsItemPrivate* other) - { - siblingOrderNotifiees.removeAll(other); - } - virtual void otherSiblingOrderChange(QmlGraphicsItemPrivate* other) {Q_UNUSED(other)} - - bool connectToWidthChanged(QObject *object, int index) { - return QMetaObject::connect(q_func(), widthIdx, object, index); - } - bool disconnectFromWidthChanged(QObject *object, int index) { - return QMetaObject::disconnect(q_func(), widthIdx, object, index); - } - - bool connectToHeightChanged(QObject *object, int index) { - return QMetaObject::connect(q_func(), heightIdx, object, index); - } - bool disconnectFromHeightChanged(QObject *object, int index) { - return QMetaObject::disconnect(q_func(), heightIdx, object, index); + Q_Q(QmlGraphicsItem); + for(int ii = 0; ii < changeListeners.count(); ++ii) { + const QmlGraphicsItemPrivate::ChangeListener &change = changeListeners.at(ii); + if (change.types & QmlGraphicsItemPrivate::SiblingOrder) { + change.listener->itemSiblingOrderChanged(q); + } + } } static int consistentTime; @@ -280,10 +277,10 @@ public: static void start(QTime &); static int elapsed(QTime &); static int restart(QTime &); - static int widthIdx; - static int heightIdx; }; +Q_DECLARE_OPERATORS_FOR_FLAGS(QmlGraphicsItemPrivate::ChangeTypes); + QT_END_NAMESPACE #endif // QMLGRAPHICSITEM_P_H diff --git a/src/declarative/graphicsitems/qmlgraphicsitemchangelistener_p.h b/src/declarative/graphicsitems/qmlgraphicsitemchangelistener_p.h new file mode 100644 index 0000000..f430df0 --- /dev/null +++ b/src/declarative/graphicsitems/qmlgraphicsitemchangelistener_p.h @@ -0,0 +1,76 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtDeclarative module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QMLGRAPHICSITEMCHANGELISTENER +#define QMLGRAPHICSITEMCHANGELISTENER + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include + +QT_BEGIN_NAMESPACE + +class QRectF; +class QmlGraphicsItem; +class QmlGraphicsAnchorsPrivate; +class QmlGraphicsItemChangeListener +{ +public: + virtual void itemGeometryChanged(QmlGraphicsItem *, const QRectF &, const QRectF &) {} + virtual void itemSiblingOrderChanged(QmlGraphicsItem *) {} + virtual void itemVisibilityChanged(QmlGraphicsItem *) {} + virtual void itemOpacityChanged(QmlGraphicsItem *) {} + virtual void itemDestroyed(QmlGraphicsItem *) {} + virtual QmlGraphicsAnchorsPrivate *anchorPrivate() { return 0; } +}; + +QT_END_NAMESPACE + +#endif // QMLGRAPHICSITEMCHANGELISTENER diff --git a/src/declarative/graphicsitems/qmlgraphicsitemgeometrylistener_p.h b/src/declarative/graphicsitems/qmlgraphicsitemgeometrylistener_p.h deleted file mode 100644 index 6230e93..0000000 --- a/src/declarative/graphicsitems/qmlgraphicsitemgeometrylistener_p.h +++ /dev/null @@ -1,70 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QMLGRAPHICSITEMGEOMETRYLISTENER -#define QMLGRAPHICSITEMGEOMETRYLISTENER - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -QT_BEGIN_NAMESPACE - -class QRectF; -class QmlGraphicsItem; -class QmlGraphicsAnchorsPrivate; -class QmlGraphicsItemGeometryListener -{ -public: - virtual void itemGeometryChanged(QmlGraphicsItem *, const QRectF &newGeometry, const QRectF &oldGeometry) = 0; - virtual QmlGraphicsAnchorsPrivate *anchorPrivate() { return 0; } -}; - -QT_END_NAMESPACE - -#endif // QMLGRAPHICSITEMGEOMETRYLISTENER diff --git a/src/declarative/graphicsitems/qmlgraphicslistview.cpp b/src/declarative/graphicsitems/qmlgraphicslistview.cpp index d4d201a..5db3b26 100644 --- a/src/declarative/graphicsitems/qmlgraphicslistview.cpp +++ b/src/declarative/graphicsitems/qmlgraphicslistview.cpp @@ -218,7 +218,7 @@ public: //---------------------------------------------------------------------------- -class QmlGraphicsListViewPrivate : public QmlGraphicsFlickablePrivate, private QmlGraphicsItemGeometryListener +class QmlGraphicsListViewPrivate : public QmlGraphicsFlickablePrivate, private QmlGraphicsItemChangeListener { Q_DECLARE_PUBLIC(QmlGraphicsListView) @@ -607,7 +607,7 @@ FxListItem *QmlGraphicsListViewPrivate::createItem(int modelIndex) listItem->item->setZValue(1); listItem->item->setParent(q->viewport()); QmlGraphicsItemPrivate *itemPrivate = static_cast(QGraphicsItemPrivate::get(item)); - itemPrivate->addGeometryListener(this); + itemPrivate->addItemChangeListener(this, QmlGraphicsItemPrivate::Geometry); if (sectionCriteria && sectionCriteria->delegate()) { if (listItem->attached->m_prevSection != listItem->attached->m_section) createSection(listItem); @@ -631,7 +631,7 @@ void QmlGraphicsListViewPrivate::releaseItem(FxListItem *item) trackedItem = 0; } QmlGraphicsItemPrivate *itemPrivate = static_cast(QGraphicsItemPrivate::get(item->item)); - itemPrivate->removeGeometryListener(this); + itemPrivate->removeItemChangeListener(this, QmlGraphicsItemPrivate::Geometry); if (model->release(item->item) == 0) { // item was not destroyed, and we no longer reference it. unrequestedItems.insert(item->item, model->indexOf(item->item, q)); diff --git a/src/declarative/graphicsitems/qmlgraphicspositioners.cpp b/src/declarative/graphicsitems/qmlgraphicspositioners.cpp index 17fe59f..aa724a3 100644 --- a/src/declarative/graphicsitems/qmlgraphicspositioners.cpp +++ b/src/declarative/graphicsitems/qmlgraphicspositioners.cpp @@ -54,38 +54,23 @@ QT_BEGIN_NAMESPACE -int QmlGraphicsBasePositionerPrivate::prePosIdx = -1; -int QmlGraphicsBasePositionerPrivate::visibleIdx = -1; -int QmlGraphicsBasePositionerPrivate::opacityIdx = -1; - +static const QmlGraphicsItemPrivate::ChangeTypes watchedChanges + = QmlGraphicsItemPrivate::Geometry + | QmlGraphicsItemPrivate::SiblingOrder + | QmlGraphicsItemPrivate::Visibility + | QmlGraphicsItemPrivate::Opacity + | QmlGraphicsItemPrivate::Destroyed; void QmlGraphicsBasePositionerPrivate::watchChanges(QmlGraphicsItem *other) { - Q_Q(QmlGraphicsBasePositioner); - QMetaObject::connect(other, visibleIdx, q, prePosIdx); - QMetaObject::connect(other, opacityIdx, q, prePosIdx); - QmlGraphicsItemPrivate *otherPrivate = static_cast(QGraphicsItemPrivate::get(other)); - - otherPrivate->addGeometryListener(this); - - otherPrivate->registerSiblingOrderNotification(this); - watched << other; + otherPrivate->addItemChangeListener(this, watchedChanges); } void QmlGraphicsBasePositionerPrivate::unwatchChanges(QmlGraphicsItem* other) { - Q_Q(QmlGraphicsBasePositioner); QmlGraphicsItemPrivate *otherPrivate = static_cast(QGraphicsItemPrivate::get(other)); - bool stillAlive = false; //Use the returns from disconnect to see if it was deleted or just reparented - stillAlive |= QMetaObject::disconnect(other, visibleIdx, q, prePosIdx); - stillAlive |= QMetaObject::disconnect(other, opacityIdx, q, prePosIdx); - - otherPrivate->removeGeometryListener(this); - - if(stillAlive) - otherPrivate->unregisterSiblingOrderNotification(this); - watched.removeAll(other); + otherPrivate->removeItemChangeListener(this, watchedChanges); } /*! @@ -120,6 +105,14 @@ QmlGraphicsBasePositioner::QmlGraphicsBasePositioner(QmlGraphicsBasePositionerPr d->init(at); } +QmlGraphicsBasePositioner::~QmlGraphicsBasePositioner() +{ + Q_D(QmlGraphicsBasePositioner); + for (int i = 0; i < positionedItems.count(); ++i) + d->unwatchChanges(positionedItems.at(i).item); + positionedItems.clear(); +} + int QmlGraphicsBasePositioner::spacing() const { Q_D(const QmlGraphicsBasePositioner); @@ -162,10 +155,12 @@ void QmlGraphicsBasePositioner::setAdd(QmlTransition *add) void QmlGraphicsBasePositioner::componentComplete() { + Q_D(QmlGraphicsBasePositioner); QmlGraphicsItem::componentComplete(); #ifdef Q_ENABLE_PERFORMANCE_LOG QmlPerfTimer cc; #endif + positionedItems.reserve(d->QGraphicsItemPrivate::children.count()); prePositioning(); } @@ -175,18 +170,19 @@ QVariant QmlGraphicsBasePositioner::itemChange(GraphicsItemChange change, Q_D(QmlGraphicsBasePositioner); if (change == ItemChildAddedChange){ QmlGraphicsItem* child = value.value(); - if(!child) - return QVariant(); - if(!d->watched.contains(child)) - d->watchChanges(child); - prePositioning(); - }else if (change == ItemChildRemovedChange) { + if (child) + prePositioning(); + } else if (change == ItemChildRemovedChange) { QmlGraphicsItem* child = value.value(); - if(!child) - return QVariant(); - if(d->watched.contains(child)) - d->unwatchChanges(child); - prePositioning(); + if (child) { + QmlGraphicsBasePositioner::PositionedItem posItem(child); + int idx = positionedItems.find(posItem); + if (idx >= 0) { + d->unwatchChanges(child); + positionedItems.remove(idx); + } + prePositioning(); + } } return QmlGraphicsItem::itemChange(change, value); @@ -202,29 +198,31 @@ void QmlGraphicsBasePositioner::prePositioning() //Need to order children by creation order modified by stacking order QList children = childItems(); qSort(children.begin(), children.end(), d->insertionOrder); - positionedItems.clear(); - d->newItems.clear(); for (int ii = 0; ii < children.count(); ++ii) { QmlGraphicsItem *child = qobject_cast(children.at(ii)); if (!child) continue; - if(!d->watched.contains(child)) + PositionedItem *item = 0; + PositionedItem posItem(child); + int wIdx = positionedItems.find(posItem); + if (wIdx < 0) { d->watchChanges(child); - if(child->opacity() <= 0.0 || !child->isVisible()) + positionedItems.append(posItem); + item = &positionedItems[positionedItems.count()-1]; + } else { + item = &positionedItems[wIdx]; + } + if (child->opacity() <= 0.0 || !child->isVisible()) { + item->isVisible = false; continue; - if (!d->items.contains(child)){ - d->items += child; - d->newItems += child; } - positionedItems << child; - } - if(d->items.count() > positionedItems.count()){ - //Assumed that (aside from init) every add/remove triggers this check - //thus the above check will be triggered every time an item is removed - QSet deletedItems = d->items - positionedItems.toSet(); - foreach(QmlGraphicsItem *child, deletedItems) - d->items -= child; + if (!item->isVisible) { + item->isVisible = true; + item->isNew = true; + } else { + item->isNew = false; + } } doPositioning(); if(d->addTransition || d->moveTransition) @@ -232,42 +230,43 @@ void QmlGraphicsBasePositioner::prePositioning() //Set implicit size to the size of its children qreal h = 0.0f; qreal w = 0.0f; - foreach(QmlGraphicsItem *child, d->items){ - if(!child->isVisible() || child->opacity() <= 0) - continue; - h = qMax(h, child->y() + child->height()); - w = qMax(w, child->x() + child->width()); + for (int i = 0; i < positionedItems.count(); ++i) { + const PositionedItem &posItem = positionedItems.at(i); + if (posItem.isVisible) { + h = qMax(h, posItem.item->y() + posItem.item->height()); + w = qMax(w, posItem.item->x() + posItem.item->width()); + } } setImplicitHeight(h); setImplicitWidth(w); } -void QmlGraphicsBasePositioner::positionX(int x, QmlGraphicsItem* target) +void QmlGraphicsBasePositioner::positionX(int x, const PositionedItem &target) { Q_D(QmlGraphicsBasePositioner); if(d->type == Horizontal || d->type == Both){ if(!d->addTransition && !d->moveTransition){ - target->setX(x); + target.item->setX(x); }else{ - if(d->newItems.contains(target)) - d->addActions << Action(target, QLatin1String("x"), QVariant(x)); + if(target.isNew) + d->addActions << Action(target.item, QLatin1String("x"), QVariant(x)); else - d->moveActions << Action(target, QLatin1String("x"), QVariant(x)); + d->moveActions << Action(target.item, QLatin1String("x"), QVariant(x)); } } } -void QmlGraphicsBasePositioner::positionY(int y, QmlGraphicsItem* target) +void QmlGraphicsBasePositioner::positionY(int y, const PositionedItem &target) { Q_D(QmlGraphicsBasePositioner); if(d->type == Vertical || d->type == Both){ if(!d->addTransition && !d->moveTransition){ - target->setY(y); + target.item->setY(y); }else{ - if(d->newItems.contains(target)) - d->addActions << Action(target, QLatin1String("y"), QVariant(y)); + if(target.isNew) + d->addActions << Action(target.item, QLatin1String("y"), QVariant(y)); else - d->moveActions << Action(target, QLatin1String("y"), QVariant(y)); + d->moveActions << Action(target.item, QLatin1String("y"), QVariant(y)); } } } @@ -401,14 +400,14 @@ void QmlGraphicsColumn::doPositioning() int voffset = 0; for (int ii = 0; ii < positionedItems.count(); ++ii) { - QmlGraphicsItem *child = positionedItems.at(ii); - if (!child || isInvisible(child)) + const PositionedItem &child = positionedItems.at(ii); + if (!child.item || isInvisible(child.item)) continue; - if(child->y() != voffset) + if(child.item->y() != voffset) positionY(voffset, child); - voffset += child->height(); + voffset += child.item->height(); voffset += spacing(); } } @@ -506,14 +505,14 @@ void QmlGraphicsRow::doPositioning() int hoffset = 0; for (int ii = 0; ii < positionedItems.count(); ++ii) { - QmlGraphicsItem *child = positionedItems.at(ii); - if (!child || isInvisible(child)) + const PositionedItem &child = positionedItems.at(ii); + if (!child.item || isInvisible(child.item)) continue; - if(child->x() != hoffset) + if(child.item->x() != hoffset) positionX(hoffset, child); - hoffset += child->width(); + hoffset += child.item->width(); hoffset += spacing(); } } @@ -670,13 +669,13 @@ void QmlGraphicsGrid::doPositioning() if (childIndex == positionedItems.count()) continue; - QmlGraphicsItem *child = positionedItems.at(childIndex++); - if (!child || isInvisible(child)) + const PositionedItem &child = positionedItems.at(childIndex++); + if (!child.item || isInvisible(child.item)) continue; - if (child->width() > maxColWidth[j]) - maxColWidth[j] = child->width(); - if (child->height() > maxRowHeight[i]) - maxRowHeight[i] = child->height(); + if (child.item->width() > maxColWidth[j]) + maxColWidth[j] = child.item->width(); + if (child.item->height() > maxRowHeight[i]) + maxRowHeight[i] = child.item->height(); } } @@ -684,10 +683,11 @@ void QmlGraphicsGrid::doPositioning() int yoffset=0; int curRow =0; int curCol =0; - foreach(QmlGraphicsItem* child, positionedItems){ - if (!child || isInvisible(child)) + for (int i = 0; i < positionedItems.count(); ++i) { + const PositionedItem &child = positionedItems.at(i); + if (!child.item || isInvisible(child.item)) continue; - if((child->x()!=xoffset)||(child->y()!=yoffset)){ + if((child.item->x()!=xoffset)||(child.item->y()!=yoffset)){ positionX(xoffset, child); positionY(yoffset, child); } @@ -805,37 +805,38 @@ void QmlGraphicsFlow::doPositioning() int voffset = 0; int linemax = 0; - foreach(QmlGraphicsItem* child, positionedItems){ - if (!child || isInvisible(child)) + for (int i = 0; i < positionedItems.count(); ++i) { + const PositionedItem &child = positionedItems.at(i); + if (!child.item || isInvisible(child.item)) continue; if (d->flow == LeftToRight) { - if (hoffset && hoffset + child->width() > width()) { + if (hoffset && hoffset + child.item->width() > width()) { hoffset = 0; voffset += linemax + spacing(); linemax = 0; } } else { - if (voffset && voffset + child->height() > height()) { + if (voffset && voffset + child.item->height() > height()) { voffset = 0; hoffset += linemax + spacing(); linemax = 0; } } - if(child->x() != hoffset || child->y() != voffset){ + if(child.item->x() != hoffset || child.item->y() != voffset){ positionX(hoffset, child); positionY(voffset, child); } if (d->flow == LeftToRight) { - hoffset += child->width(); + hoffset += child.item->width(); hoffset += spacing(); - linemax = qMax(linemax, qCeil(child->height())); + linemax = qMax(linemax, qCeil(child.item->height())); } else { - voffset += child->height(); + voffset += child.item->height(); voffset += spacing(); - linemax = qMax(linemax, qCeil(child->width())); + linemax = qMax(linemax, qCeil(child.item->width())); } } } diff --git a/src/declarative/graphicsitems/qmlgraphicspositioners_p.h b/src/declarative/graphicsitems/qmlgraphicspositioners_p.h index c8f846a..0e6d134 100644 --- a/src/declarative/graphicsitems/qmlgraphicspositioners_p.h +++ b/src/declarative/graphicsitems/qmlgraphicspositioners_p.h @@ -45,6 +45,7 @@ #include "qmlgraphicsitem.h" #include "../util/qmlstate_p.h" +#include "qpodvector_p.h" #include #include @@ -66,6 +67,7 @@ class Q_DECLARATIVE_EXPORT QmlGraphicsBasePositioner : public QmlGraphicsItem public: enum PositionerType { None = 0x0, Horizontal = 0x1, Vertical = 0x2, Both = 0x3 }; QmlGraphicsBasePositioner(PositionerType, QmlGraphicsItem *parent); + ~QmlGraphicsBasePositioner(); int spacing() const; void setSpacing(int); @@ -90,9 +92,17 @@ protected Q_SLOTS: void prePositioning(); protected: - QList positionedItems; - void positionX(int,QmlGraphicsItem* target); - void positionY(int,QmlGraphicsItem* target); + struct PositionedItem { + PositionedItem(QmlGraphicsItem *i) : item(i), isNew(false), isVisible(true) {} + bool operator==(const PositionedItem &other) const { return other.item == item; } + QmlGraphicsItem *item; + bool isNew; + bool isVisible; + }; + + QPODVector positionedItems; + void positionX(int,const PositionedItem &target); + void positionY(int,const PositionedItem &target); private: Q_DISABLE_COPY(QmlGraphicsBasePositioner) diff --git a/src/declarative/graphicsitems/qmlgraphicspositioners_p_p.h b/src/declarative/graphicsitems/qmlgraphicspositioners_p_p.h index 63c1c83..55a31c7 100644 --- a/src/declarative/graphicsitems/qmlgraphicspositioners_p_p.h +++ b/src/declarative/graphicsitems/qmlgraphicspositioners_p_p.h @@ -64,9 +64,10 @@ #include #include #include +#include QT_BEGIN_NAMESPACE -class QmlGraphicsBasePositionerPrivate : public QmlGraphicsItemPrivate, public QmlGraphicsItemGeometryListener +class QmlGraphicsBasePositionerPrivate : public QmlGraphicsItemPrivate, public QmlGraphicsItemChangeListener { Q_DECLARE_PUBLIC(QmlGraphicsBasePositioner) @@ -77,29 +78,15 @@ public: { } - ~QmlGraphicsBasePositionerPrivate() - { - watched.removeAll(0); - foreach(QmlGraphicsItem* other, watched) - unwatchChanges(other);//Need to deregister from a list in QmlGI Private - } - void init(QmlGraphicsBasePositioner::PositionerType at) { type = at; - if (prePosIdx == -1) { - prePosIdx = QmlGraphicsBasePositioner::staticMetaObject.indexOfSlot("prePositioning()"); - visibleIdx = QmlGraphicsItem::staticMetaObject.indexOfSignal("visibleChanged()"); - opacityIdx = QmlGraphicsItem::staticMetaObject.indexOfSignal("opacityChanged()"); - } } int spacing; QmlGraphicsBasePositioner::PositionerType type; QmlTransition *moveTransition; QmlTransition *addTransition; - QSet items; - QSet newItems; QmlStateOperation::ActionList addActions; QmlStateOperation::ActionList moveActions; QmlTransitionManager addTransitionManager; @@ -107,14 +94,9 @@ public: void watchChanges(QmlGraphicsItem *other); void unwatchChanges(QmlGraphicsItem* other); - QList > watched;//Can't have QSet and QGuard at the same time? bool queuedPositioning; - static int prePosIdx; - static int visibleIdx; - static int opacityIdx; - - virtual void otherSiblingOrderChange(QmlGraphicsItemPrivate* other) + virtual void itemSiblingOrderChanged(QmlGraphicsItem* other) { Q_Q(QmlGraphicsBasePositioner); Q_UNUSED(other); @@ -132,6 +114,22 @@ public: if (newGeometry.size() != oldGeometry.size()) q->prePositioning(); } + virtual void itemVisibilityChanged(QmlGraphicsItem *) + { + Q_Q(QmlGraphicsBasePositioner); + q->prePositioning(); + } + virtual void itemOpacityChanged(QmlGraphicsItem *) + { + Q_Q(QmlGraphicsBasePositioner); + q->prePositioning(); + } + + void itemDestroyed(QmlGraphicsItem *item) + { + Q_Q(QmlGraphicsBasePositioner); + q->positionedItems.removeOne(QmlGraphicsBasePositioner::PositionedItem(item)); + } }; QT_END_NAMESPACE diff --git a/src/declarative/graphicsitems/qmlgraphicsvisualitemmodel_p.h b/src/declarative/graphicsitems/qmlgraphicsvisualitemmodel_p.h index 4e8a19b..bd9202b 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 index, const QString &role) { return QVariant(); } + virtual QVariant value(int, const QString &) { return QVariant(); } virtual int indexOf(QmlGraphicsItem *item, QObject *objectContext) const = 0; diff --git a/src/declarative/qml/qpodvector_p.h b/src/declarative/qml/qpodvector_p.h index 3fe2e65..add6e98 100644 --- a/src/declarative/qml/qpodvector_p.h +++ b/src/declarative/qml/qpodvector_p.h @@ -54,10 +54,11 @@ // #include +#include QT_BEGIN_NAMESPACE -template +template class QPODVector { public: @@ -87,23 +88,28 @@ public: void insert(int idx, const T &v) { if (m_count == m_capacity) { - m_capacity += 1024; + m_capacity += Increment; m_data = (T *)realloc(m_data, m_capacity * sizeof(T)); } int moveCount = m_count - idx; - if (moveCount) + if (moveCount) { + qDebug() << "insert" << m_count << idx; ::memmove(m_data + idx + 1, m_data + idx, moveCount * sizeof(T)); + } m_count++; m_data[idx] = v; } - void insertBlank(int idx, int count) { - int newSize = m_count + count; - if (newSize >= m_capacity) { - m_capacity = (newSize + 1023) & 0xFFFFFC00; + void reserve(int count) { + if (count >= m_capacity) { + m_capacity = (count + (Increment-1)) & (0xFFFFFFFF - Increment + 1); m_data = (T *)realloc(m_data, m_capacity * sizeof(T)); } + } + void insertBlank(int idx, int count) { + int newSize = m_count + count; + reserve(newSize); int moveCount = m_count - idx; if (moveCount) ::memmove(m_data + idx + count, m_data + idx, @@ -118,12 +124,34 @@ public: moveCount * sizeof(T)); m_count -= count; } - + + void removeOne(const T &v) { + int idx = 0; + while (idx < m_count) { + if (m_data[idx] == v) { + remove(idx); + return; + } + ++idx; + } + } + + int find(const T &v) { + for (int idx = 0; idx < m_count; ++idx) + if (m_data[idx] == v) + return idx; + return -1; + } + + bool contains(const T &v) { + return find(v) != -1; + } + int count() const { return m_count; } - void copyAndClear(QPODVector &other) { + void copyAndClear(QPODVector &other) { if (other.m_data) ::free(other.m_data); other.m_count = m_count; other.m_capacity = m_capacity; @@ -133,7 +161,7 @@ public: m_data = 0; } - QPODVector &operator<<(const T &v) { append(v); return *this; } + QPODVector &operator<<(const T &v) { append(v); return *this; } private: QPODVector(const QPODVector &); QPODVector &operator=(const QPODVector &); -- cgit v0.12 From efa04f4357ef23a63dbb6e0cd3f8cdb1880e7886 Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Thu, 17 Dec 2009 18:21:47 +1000 Subject: Small optimization. --- src/declarative/graphicsitems/qmlgraphicspositioners.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/declarative/graphicsitems/qmlgraphicspositioners.cpp b/src/declarative/graphicsitems/qmlgraphicspositioners.cpp index aa724a3..f2164ab 100644 --- a/src/declarative/graphicsitems/qmlgraphicspositioners.cpp +++ b/src/declarative/graphicsitems/qmlgraphicspositioners.cpp @@ -196,7 +196,7 @@ void QmlGraphicsBasePositioner::prePositioning() d->queuedPositioning = false; //Need to order children by creation order modified by stacking order - QList children = childItems(); + QList children = d->QGraphicsItemPrivate::children; qSort(children.begin(), children.end(), d->insertionOrder); for (int ii = 0; ii < children.count(); ++ii) { -- cgit v0.12 From ff8d23d5754ca7160ec1be6e5e8d573eca018713 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Thu, 17 Dec 2009 14:21:36 +0100 Subject: Add context argument to QmlMetaProperty::createProperty Without a context the properties with a QUrl type are not resolved. Reviewed-by: Kai Koehne --- src/declarative/qml/qmlmetaproperty.cpp | 9 +++++---- src/declarative/qml/qmlmetaproperty.h | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/declarative/qml/qmlmetaproperty.cpp b/src/declarative/qml/qmlmetaproperty.cpp index a315141..6738370 100644 --- a/src/declarative/qml/qmlmetaproperty.cpp +++ b/src/declarative/qml/qmlmetaproperty.cpp @@ -1121,11 +1121,12 @@ QmlMetaPropertyPrivate::restore(const QByteArray &data, QObject *object, QmlCont \internal Creates a QmlMetaProperty for the property \a name of \a obj. Unlike - the QmlMetaProperty(QObject*, QString) constructor, this static function + the QmlMetaProperty(QObject*, QString, QmlContext*) constructor, this static function will correctly handle dot properties. */ QmlMetaProperty QmlMetaProperty::createProperty(QObject *obj, - const QString &name) + const QString &name, + QmlContext *context) { QStringList path = name.split(QLatin1Char('.')); @@ -1133,7 +1134,7 @@ QmlMetaProperty QmlMetaProperty::createProperty(QObject *obj, for (int jj = 0; jj < path.count() - 1; ++jj) { const QString &pathName = path.at(jj); - QmlMetaProperty prop(object, pathName); + QmlMetaProperty prop(object, pathName, context); if (jj == path.count() - 2 && prop.propertyType() < (int)QVariant::UserType && @@ -1159,7 +1160,7 @@ QmlMetaProperty QmlMetaProperty::createProperty(QObject *obj, } const QString &propName = path.last(); - QmlMetaProperty prop(object, propName); + QmlMetaProperty prop(object, propName, context); if (!prop.isValid()) return QmlMetaProperty(); else diff --git a/src/declarative/qml/qmlmetaproperty.h b/src/declarative/qml/qmlmetaproperty.h index 4b343f0..dcb5905 100644 --- a/src/declarative/qml/qmlmetaproperty.h +++ b/src/declarative/qml/qmlmetaproperty.h @@ -127,7 +127,7 @@ public: QmlExpression *signalExpression() const; QmlExpression *setSignalExpression(QmlExpression *) const; - static QmlMetaProperty createProperty(QObject *, const QString &); + static QmlMetaProperty createProperty(QObject *, const QString &, QmlContext *context=0); int coreIndex() const; int valueTypeCoreIndex() const; -- cgit v0.12 From 60320b4331a81873c12330264a26690d1150e99f Mon Sep 17 00:00:00 2001 From: Alan Alpert Date: Thu, 17 Dec 2009 17:15:05 +0100 Subject: Get the value out of the QVariant properly --- src/declarative/graphicsitems/qmlgraphicspositioners.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/declarative/graphicsitems/qmlgraphicspositioners.cpp b/src/declarative/graphicsitems/qmlgraphicspositioners.cpp index f2164ab..e7fa7b8 100644 --- a/src/declarative/graphicsitems/qmlgraphicspositioners.cpp +++ b/src/declarative/graphicsitems/qmlgraphicspositioners.cpp @@ -169,11 +169,17 @@ QVariant QmlGraphicsBasePositioner::itemChange(GraphicsItemChange change, { Q_D(QmlGraphicsBasePositioner); if (change == ItemChildAddedChange){ - QmlGraphicsItem* child = value.value(); + QGraphicsItem* item = value.value(); + QmlGraphicsItem* child = 0; + if(item) + child = qobject_cast(item->toGraphicsObject()); if (child) prePositioning(); } else if (change == ItemChildRemovedChange) { - QmlGraphicsItem* child = value.value(); + QGraphicsItem* item = value.value(); + QmlGraphicsItem* child = 0; + if(item) + child = qobject_cast(item->toGraphicsObject()); if (child) { QmlGraphicsBasePositioner::PositionedItem posItem(child); int idx = positionedItems.find(posItem); -- cgit v0.12 From 3eebfe923d8a59bac274f441dbdf5b4fb793b563 Mon Sep 17 00:00:00 2001 From: Jens Bache-Wiig Date: Thu, 17 Dec 2009 17:15:22 +0100 Subject: Compile fix for qmlviewer Reviewed-by: aalpert --- src/declarative/graphicsitems/qmlgraphicsitem_p.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/declarative/graphicsitems/qmlgraphicsitem_p.h b/src/declarative/graphicsitems/qmlgraphicsitem_p.h index 07c821e..d5dbe1d 100644 --- a/src/declarative/graphicsitems/qmlgraphicsitem_p.h +++ b/src/declarative/graphicsitems/qmlgraphicsitem_p.h @@ -58,7 +58,7 @@ #include "qmlgraphicsanchors_p.h" #include "qmlgraphicsanchors_p_p.h" #include "qmlgraphicsitemchangelistener_p.h" -#include "qpodvector_p.h" +#include #include "../util/qmlstate_p.h" #include "../util/qmlnullablevalue_p_p.h" -- cgit v0.12 From 1b183c42b5ce74797f12a155c6675e195fe96352 Mon Sep 17 00:00:00 2001 From: Michael Brasser Date: Fri, 18 Dec 2009 08:19:01 +1000 Subject: Use destroy() to destroy binding. --- src/declarative/qml/qmlobjectscriptclass.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/declarative/qml/qmlobjectscriptclass.cpp b/src/declarative/qml/qmlobjectscriptclass.cpp index 30d4422..4488ba1 100644 --- a/src/declarative/qml/qmlobjectscriptclass.cpp +++ b/src/declarative/qml/qmlobjectscriptclass.cpp @@ -302,7 +302,9 @@ void QmlObjectScriptClass::setProperty(QObject *obj, // ### Can well known types be optimized? QVariant v = QmlScriptClass::toVariant(engine, value); - delete QmlMetaPropertyPrivate::setBinding(obj, *lastData, 0); + QmlAbstractBinding *delBinding = QmlMetaPropertyPrivate::setBinding(obj, *lastData, 0); + if (delBinding) + delBinding->destroy(); QmlMetaPropertyPrivate::write(obj, *lastData, v, evalContext); } -- cgit v0.12 From 412920402f488c2cf6eb81e7582f9b5aa7b06680 Mon Sep 17 00:00:00 2001 From: Michael Brasser Date: Fri, 18 Dec 2009 08:34:53 +1000 Subject: Add autotest for d169873541ca6f6725e9ce5bfbbf9941f1823a1f. --- tests/auto/declarative/qmlecmascript/data/CustomObject.qml | 5 +++++ .../declarative/qmlecmascript/data/compositePropertyType.qml | 8 ++++++++ tests/auto/declarative/qmlecmascript/tst_qmlecmascript.cpp | 9 +++++++++ 3 files changed, 22 insertions(+) create mode 100644 tests/auto/declarative/qmlecmascript/data/CustomObject.qml create mode 100644 tests/auto/declarative/qmlecmascript/data/compositePropertyType.qml diff --git a/tests/auto/declarative/qmlecmascript/data/CustomObject.qml b/tests/auto/declarative/qmlecmascript/data/CustomObject.qml new file mode 100644 index 0000000..691d9ec --- /dev/null +++ b/tests/auto/declarative/qmlecmascript/data/CustomObject.qml @@ -0,0 +1,5 @@ +import Qt 4.6 + +QtObject { + property string greeting: "hello world" +} diff --git a/tests/auto/declarative/qmlecmascript/data/compositePropertyType.qml b/tests/auto/declarative/qmlecmascript/data/compositePropertyType.qml new file mode 100644 index 0000000..80a2814 --- /dev/null +++ b/tests/auto/declarative/qmlecmascript/data/compositePropertyType.qml @@ -0,0 +1,8 @@ +import Qt 4.6 + +QtObject { + property CustomObject myObject + myObject: CustomObject { } + + Component.onCompleted: console.log(myObject.greeting) +} diff --git a/tests/auto/declarative/qmlecmascript/tst_qmlecmascript.cpp b/tests/auto/declarative/qmlecmascript/tst_qmlecmascript.cpp index b9a2241..f0e54ef 100644 --- a/tests/auto/declarative/qmlecmascript/tst_qmlecmascript.cpp +++ b/tests/auto/declarative/qmlecmascript/tst_qmlecmascript.cpp @@ -110,6 +110,7 @@ private slots: void transientErrors(); void shutdownErrors(); void externalScript(); + void compositePropertyType(); void bug1(); @@ -1017,6 +1018,14 @@ void tst_qmlecmascript::externalScript() } } +void tst_qmlecmascript::compositePropertyType() +{ + QmlComponent component(&engine, TEST_FILE("compositePropertyType.qml")); + QTest::ignoreMessage(QtDebugMsg, "hello world"); + QObject *object = qobject_cast(component.create()); + delete object; +} + void tst_qmlecmascript::bug1() { QmlComponent component(&engine, TEST_FILE("bug.1.qml")); -- cgit v0.12 From 67b89083b2d8667a89276488968873585790b868 Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Fri, 18 Dec 2009 09:11:52 +1000 Subject: Section properties can only be model data. --- src/declarative/graphicsitems/qmlgraphicsvisualitemmodel.cpp | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/declarative/graphicsitems/qmlgraphicsvisualitemmodel.cpp b/src/declarative/graphicsitems/qmlgraphicsvisualitemmodel.cpp index d4d07cc..8131b4c 100644 --- a/src/declarative/graphicsitems/qmlgraphicsvisualitemmodel.cpp +++ b/src/declarative/graphicsitems/qmlgraphicsvisualitemmodel.cpp @@ -895,16 +895,11 @@ QVariant QmlGraphicsVisualDataModel::value(int index, const QString &name) QVariant val; QObject *nobj = d->m_cache.item(index); if (nobj) { - val = QmlEngine::contextForObject(nobj)->contextProperty(name); + val = d->data(nobj)->property(name.toUtf8()); } else { - QmlContext *ccontext = d->m_context; - if (!ccontext) ccontext = qmlContext(this); - QmlContext *ctxt = new QmlContext(ccontext); QmlGraphicsVisualDataModelData *data = new QmlGraphicsVisualDataModelData(index, this); - ctxt->addDefaultObject(data); - val = ctxt->contextProperty(name); + val = data->property(name.toUtf8()); delete data; - delete ctxt; } return val; -- cgit v0.12