diff options
Diffstat (limited to 'tests/auto/quick/qquickpositioners')
5 files changed, 211 insertions, 20 deletions
diff --git a/tests/auto/quick/qquickpositioners/data/grid-animated.qml b/tests/auto/quick/qquickpositioners/data/grid-animated.qml index b8ee8f9a52..8a5e43834e 100644 --- a/tests/auto/quick/qquickpositioners/data/grid-animated.qml +++ b/tests/auto/quick/qquickpositioners/data/grid-animated.qml @@ -9,6 +9,11 @@ Item { objectName: "grid" columns: 3 layoutDirection: testRightToLeft ? Qt.RightToLeft : Qt.LeftToRight + populate: Transition { + NumberAnimation { + properties: "x,y"; + } + } add: Transition { NumberAnimation { properties: "x,y"; diff --git a/tests/auto/quick/qquickpositioners/data/horizontal-animated.qml b/tests/auto/quick/qquickpositioners/data/horizontal-animated.qml index a88c26b66c..b68367022c 100644 --- a/tests/auto/quick/qquickpositioners/data/horizontal-animated.qml +++ b/tests/auto/quick/qquickpositioners/data/horizontal-animated.qml @@ -9,6 +9,12 @@ Item { Row { objectName: "row" layoutDirection: testRightToLeft ? Qt.RightToLeft : Qt.LeftToRight + populate: Transition { + enabled: testEnabled ? false : true + NumberAnimation { + properties: "x"; + } + } add: Transition { enabled: testEnabled ? false : true NumberAnimation { diff --git a/tests/auto/quick/qquickpositioners/data/transitions.qml b/tests/auto/quick/qquickpositioners/data/transitions.qml index e7570de70c..a1f27bb06e 100644 --- a/tests/auto/quick/qquickpositioners/data/transitions.qml +++ b/tests/auto/quick/qquickpositioners/data/transitions.qml @@ -9,7 +9,8 @@ Rectangle { property real incrementalSize: 5 - property int targetTransitionsDone + property int populateTransitionsDone + property int addTransitionsDone property int displaceTransitionsDone property var targetTrans_items: new Object() @@ -35,16 +36,44 @@ Rectangle { model_displacedItems_transitionVia.addItem(name, "") } + Component.onCompleted: { + if (dynamicallyPopulate) { + for (var i=0; i<30; i++) + testModel.addItem("item " + i, "") + } + } + + Transition { + id: populateTransition + enabled: usePopulateTransition + + SequentialAnimation { + ScriptAction { + script: { + root.targetTrans_items[populateTransition.ViewTransition.item.nameData] = populateTransition.ViewTransition.index + root.targetTrans_targetIndexes.push(populateTransition.ViewTransition.targetIndexes) + root.targetTrans_targetItems.push(root.copyList(populateTransition.ViewTransition.targetItems)) + } + } + ParallelAnimation { + NumberAnimation { properties: "x"; from: targetItems_transitionFrom.x; duration: root.duration } + NumberAnimation { properties: "y"; from: targetItems_transitionFrom.y; duration: root.duration } + } + + ScriptAction { script: root.populateTransitionsDone += 1 } + } + } + Transition { - id: targetTransition + id: addTransition enabled: enableAddTransition SequentialAnimation { ScriptAction { script: { - root.targetTrans_items[targetTransition.ViewTransition.item.nameData] = targetTransition.ViewTransition.index - root.targetTrans_targetIndexes.push(targetTransition.ViewTransition.targetIndexes) - root.targetTrans_targetItems.push(root.copyList(targetTransition.ViewTransition.targetItems)) + root.targetTrans_items[addTransition.ViewTransition.item.nameData] = addTransition.ViewTransition.index + root.targetTrans_targetIndexes.push(addTransition.ViewTransition.targetIndexes) + root.targetTrans_targetItems.push(root.copyList(addTransition.ViewTransition.targetItems)) } } ParallelAnimation { @@ -52,7 +81,7 @@ Rectangle { NumberAnimation { properties: "y"; from: targetItems_transitionFrom.y; duration: root.duration } } - ScriptAction { script: root.targetTransitionsDone += 1 } + ScriptAction { script: root.addTransitionsDone += 1 } } } @@ -87,6 +116,7 @@ Rectangle { width: 400; height: 400 Repeater { objectName: "repeater" + model: testedPositioner == "row" ? testModel : undefined Rectangle { property string nameData: name objectName: "wrapper" @@ -103,7 +133,8 @@ Rectangle { } } - add: targetTransition + populate: populateTransition + add: addTransition move: displaced } @@ -116,6 +147,7 @@ Rectangle { width: 400; height: 400 Repeater { objectName: "repeater" + model: testedPositioner == "column" ? testModel : undefined Rectangle { property string nameData: name objectName: "wrapper" @@ -132,7 +164,8 @@ Rectangle { } } - add: targetTransition + populate: populateTransition + add: addTransition move: displaced } @@ -145,6 +178,7 @@ Rectangle { width: 400; height: 400 Repeater { objectName: "repeater" + model: testedPositioner == "grid" ? testModel : undefined Rectangle { property string nameData: name objectName: "wrapper" @@ -162,7 +196,8 @@ Rectangle { } } - add: targetTransition + populate: populateTransition + add: addTransition move: displaced } @@ -175,6 +210,7 @@ Rectangle { width: 400; height: 400 Repeater { objectName: "repeater" + model: testedPositioner == "flow" ? testModel : undefined Rectangle { property string nameData: name objectName: "wrapper" @@ -191,7 +227,8 @@ Rectangle { } } - add: targetTransition + populate: populateTransition + add: addTransition move: displaced } } diff --git a/tests/auto/quick/qquickpositioners/data/vertical-animated.qml b/tests/auto/quick/qquickpositioners/data/vertical-animated.qml index ecf593cd70..1ea359e26c 100644 --- a/tests/auto/quick/qquickpositioners/data/vertical-animated.qml +++ b/tests/auto/quick/qquickpositioners/data/vertical-animated.qml @@ -5,6 +5,11 @@ Item { height: 480 Column { objectName: "column" + populate: Transition { + NumberAnimation { + properties: "y"; + } + } add: Transition { NumberAnimation { properties: "y"; diff --git a/tests/auto/quick/qquickpositioners/tst_qquickpositioners.cpp b/tests/auto/quick/qquickpositioners/tst_qquickpositioners.cpp index 12b9d661d4..ee0988f107 100644 --- a/tests/auto/quick/qquickpositioners/tst_qquickpositioners.cpp +++ b/tests/auto/quick/qquickpositioners/tst_qquickpositioners.cpp @@ -93,6 +93,15 @@ private slots: void test_attachedproperties(); void test_attachedproperties_data(); void test_attachedproperties_dynamic(); + + void populateTransitions_row(); + void populateTransitions_row_data(); + void populateTransitions_column(); + void populateTransitions_column_data(); + void populateTransitions_grid(); + void populateTransitions_grid_data(); + void populateTransitions_flow(); + void populateTransitions_flow_data(); void addTransitions_row(); void addTransitions_row_data(); void addTransitions_column(); @@ -113,6 +122,8 @@ private slots: private: QQuickView *createView(const QString &filename, bool wait=true); + void populateTransitions(const QString &positionerObjectName); + void populateTransitions_data(); void addTransitions(const QString &positionerObjectName); void addTransitions_data(); void moveTransitions(const QString &positionerObjectName); @@ -123,6 +134,46 @@ private: void checkItemPositions(QQuickItem *positioner, QaimModel *model, qreal incrementalSize); }; +void tst_qquickpositioners::populateTransitions_row() +{ + populateTransitions("row"); +} + +void tst_qquickpositioners::populateTransitions_row_data() +{ + populateTransitions_data(); +} + +void tst_qquickpositioners::populateTransitions_column() +{ + populateTransitions("column"); +} + +void tst_qquickpositioners::populateTransitions_column_data() +{ + populateTransitions_data(); +} + +void tst_qquickpositioners::populateTransitions_grid() +{ + populateTransitions("grid"); +} + +void tst_qquickpositioners::populateTransitions_grid_data() +{ + populateTransitions_data(); +} + +void tst_qquickpositioners::populateTransitions_flow() +{ + populateTransitions("flow"); +} + +void tst_qquickpositioners::populateTransitions_flow_data() +{ + populateTransitions_data(); +} + void tst_qquickpositioners::addTransitions_row() { addTransitions("row"); @@ -509,6 +560,90 @@ void tst_qquickpositioners::test_horizontal_animated_disabled() delete canvas; } +void tst_qquickpositioners::populateTransitions(const QString &positionerObjectName) +{ + QFETCH(bool, dynamicallyPopulate); + QFETCH(bool, usePopulateTransition); + + QPointF targetItems_transitionFrom(-50, -50); + QPointF displacedItems_transitionVia(100, 100); + + QaimModel model; + if (!dynamicallyPopulate) { + for (int i = 0; i < 30; i++) + model.addItem("Original item" + QString::number(i), ""); + } + + QaimModel model_targetItems_transitionFrom; + QaimModel model_displacedItems_transitionVia; + + QQuickView *canvas = QQuickViewTestUtil::createView(); + QQmlContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("usePopulateTransition", usePopulateTransition); + ctxt->setContextProperty("enableAddTransition", true); + ctxt->setContextProperty("dynamicallyPopulate", dynamicallyPopulate); + ctxt->setContextProperty("testModel", &model); + ctxt->setContextProperty("model_targetItems_transitionFrom", &model_targetItems_transitionFrom); + ctxt->setContextProperty("model_displacedItems_transitionVia", &model_displacedItems_transitionVia); + ctxt->setContextProperty("targetItems_transitionFrom", targetItems_transitionFrom); + ctxt->setContextProperty("displacedItems_transitionVia", displacedItems_transitionVia); + ctxt->setContextProperty("testedPositioner", positionerObjectName); + canvas->setSource(testFileUrl("transitions.qml")); + + QQuickItem *positioner = canvas->rootObject()->findChild<QQuickItem*>(positionerObjectName); + QVERIFY(positioner); + canvas->show(); + qApp->processEvents(); + + if (!dynamicallyPopulate && usePopulateTransition) { + QTRY_COMPARE(canvas->rootObject()->property("populateTransitionsDone").toInt(), model.count()); + QTRY_COMPARE(canvas->rootObject()->property("addTransitionsDone").toInt(), 0); + + QList<QPair<QString, QString> > targetData; + QList<int> targetIndexes; + for (int i=0; i<model.count(); i++) { + targetData << qMakePair(model.name(i), model.number(i)); + targetIndexes << i; + } + QList<QQuickItem *> targetItems = findItems<QQuickItem>(positioner, "wrapper", targetIndexes); + model_targetItems_transitionFrom.matchAgainst(targetData, "wasn't animated from target 'from' pos", "shouldn't have been animated from target 'from' pos"); + matchItemsAndIndexes(canvas->rootObject()->property("targetTrans_items").toMap(), model, targetIndexes); + matchIndexLists(canvas->rootObject()->property("targetTrans_targetIndexes").toList(), targetIndexes); + matchItemLists(canvas->rootObject()->property("targetTrans_targetItems").toList(), targetItems); + + } else if (dynamicallyPopulate) { + QTRY_COMPARE(canvas->rootObject()->property("populateTransitionsDone").toInt(), 0); + QTRY_COMPARE(canvas->rootObject()->property("addTransitionsDone").toInt(), model.count()); + } else { + QTRY_COMPARE(QQuickItemPrivate::get(positioner)->polishScheduled, false); + QTRY_COMPARE(canvas->rootObject()->property("populateTransitionsDone").toInt(), 0); + QTRY_COMPARE(canvas->rootObject()->property("addTransitionsDone").toInt(), 0); + } + + checkItemPositions(positioner, &model, canvas->rootObject()->property("incrementalSize").toInt()); + + // add an item and check this is done with add transition, not populate + canvas->rootObject()->setProperty("populateTransitionsDone", 0); + canvas->rootObject()->setProperty("addTransitionsDone", 0); + model.insertItem(0, "new item", ""); + QTRY_COMPARE(canvas->rootObject()->property("addTransitionsDone").toInt(), 1); + QTRY_COMPARE(canvas->rootObject()->property("populateTransitionsDone").toInt(), 0); + + delete canvas; +} + +void tst_qquickpositioners::populateTransitions_data() +{ + QTest::addColumn<bool>("dynamicallyPopulate"); + QTest::addColumn<bool>("usePopulateTransition"); + + QTest::newRow("statically populate") << false << true; + QTest::newRow("statically populate, no populate transition") << false << false; + + QTest::newRow("dynamically populate") << true << true; + QTest::newRow("dynamically populate, no populate transition") << true << false; +} + void tst_qquickpositioners::addTransitions(const QString &positionerObjectName) { QFETCH(int, initialItemCount); @@ -520,13 +655,12 @@ void tst_qquickpositioners::addTransitions(const QString &positionerObjectName) QPointF displacedItems_transitionVia(100, 100); QaimModel model; - for (int i = 0; i < initialItemCount; i++) - model.addItem("Original item" + QString::number(i), ""); QaimModel model_targetItems_transitionFrom; QaimModel model_displacedItems_transitionVia; QQuickView *canvas = QQuickViewTestUtil::createView(); QQmlContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("usePopulateTransition", false); ctxt->setContextProperty("enableAddTransition", true); ctxt->setContextProperty("model_targetItems_transitionFrom", &model_targetItems_transitionFrom); ctxt->setContextProperty("model_displacedItems_transitionVia", &model_displacedItems_transitionVia); @@ -536,12 +670,15 @@ void tst_qquickpositioners::addTransitions(const QString &positionerObjectName) canvas->show(); qApp->processEvents(); - QList<QPair<QString,QString> > expectedDisplacedValues = expectedDisplacedIndexes.getModelDataValues(model); - QQuickItem *positioner = canvas->rootObject()->findChild<QQuickItem*>(positionerObjectName); QVERIFY(positioner); positioner->findChild<QQuickItem*>("repeater")->setProperty("model", QVariant::fromValue(&model)); + QTRY_COMPARE(QQuickItemPrivate::get(positioner)->polishScheduled, false); + for (int i = 0; i < initialItemCount; i++) + model.addItem("Original item" + QString::number(i), ""); + + QList<QPair<QString,QString> > expectedDisplacedValues = expectedDisplacedIndexes.getModelDataValues(model); QList<QPair<QString, QString> > targetData; QList<int> targetIndexes; for (int i=0; i<model.count(); i++) { @@ -550,9 +687,9 @@ void tst_qquickpositioners::addTransitions(const QString &positionerObjectName) } QList<QQuickItem *> targetItems = findItems<QQuickItem>(positioner, "wrapper", targetIndexes); - // check initial add transition - // (positioners run the add transition on all items that are initially created for the view) - QTRY_COMPARE(canvas->rootObject()->property("targetTransitionsDone").toInt(), initialItemCount); + // check add transition was run for first lot of added items + QTRY_COMPARE(canvas->rootObject()->property("populateTransitionsDone").toInt(), 0); + QTRY_COMPARE(canvas->rootObject()->property("addTransitionsDone").toInt(), initialItemCount); QTRY_COMPARE(canvas->rootObject()->property("displaceTransitionsDone").toInt(), 0); model_targetItems_transitionFrom.matchAgainst(targetData, "wasn't animated from target 'from' pos", "shouldn't have been animated from target 'from' pos"); matchItemsAndIndexes(canvas->rootObject()->property("targetTrans_items").toMap(), model, targetIndexes); @@ -560,7 +697,7 @@ void tst_qquickpositioners::addTransitions(const QString &positionerObjectName) matchItemLists(canvas->rootObject()->property("targetTrans_targetItems").toList(), targetItems); model_targetItems_transitionFrom.clear(); - canvas->rootObject()->setProperty("targetTransitionsDone", 0); + canvas->rootObject()->setProperty("addTransitionsDone", 0); canvas->rootObject()->setProperty("targetTrans_items", QVariantMap()); canvas->rootObject()->setProperty("targetTrans_targetIndexes", QVariantList()); canvas->rootObject()->setProperty("targetTrans_targetItems", QVariantList()); @@ -577,7 +714,7 @@ void tst_qquickpositioners::addTransitions(const QString &positionerObjectName) targetItems = findItems<QQuickItem>(positioner, "wrapper", targetIndexes); - QTRY_COMPARE(canvas->rootObject()->property("targetTransitionsDone").toInt(), targetData.count()); + QTRY_COMPARE(canvas->rootObject()->property("addTransitionsDone").toInt(), targetData.count()); QTRY_COMPARE(canvas->rootObject()->property("displaceTransitionsDone").toInt(), expectedDisplacedIndexes.count()); // check the target and displaced items were animated @@ -636,6 +773,7 @@ void tst_qquickpositioners::moveTransitions(const QString &positionerObjectName) QQuickView *canvas = QQuickViewTestUtil::createView(); QQmlContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("usePopulateTransition", false); ctxt->setContextProperty("enableAddTransition", QVariant(false)); ctxt->setContextProperty("model_targetItems_transitionFrom", &model_targetItems_transitionFrom); ctxt->setContextProperty("model_displacedItems_transitionVia", &model_displacedItems_transitionVia); @@ -669,7 +807,7 @@ void tst_qquickpositioners::moveTransitions(const QString &positionerObjectName) } QTRY_COMPARE(canvas->rootObject()->property("displaceTransitionsDone").toInt(), expectedDisplacedIndexes.count()); - QCOMPARE(canvas->rootObject()->property("targetTransitionsDone").toInt(), 0); + QCOMPARE(canvas->rootObject()->property("addTransitionsDone").toInt(), 0); // check the target and displaced items were animated QCOMPARE(model_targetItems_transitionFrom.count(), 0); |