aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto/quick/qquickpositioners
diff options
context:
space:
mode:
authorBea Lam <bea.lam@nokia.com>2012-04-17 11:35:14 +1000
committerQt by Nokia <qt-info@nokia.com>2012-05-01 02:53:21 +0200
commit0795351f7c252f1eed97253f64e2d5839ad8a975 (patch)
treea19a42df0c551bbbbc78bee4505a32107d5a6f32 /tests/auto/quick/qquickpositioners
parent6a7084fed1ba94ce135330f35677f71a985df9a3 (diff)
populate transition for positioners
Fix positioners to apply a "populate" transition for initially added items. This is consistent with ListView and GridView and also fixes the behaviour from QtQuick 1.x where the positioners were instead running the "move" transition for initially added items. Change-Id: Ib43f1141ce3e7379df085c178b684f89b8567403 Reviewed-by: Alan Alpert <alan.alpert@nokia.com>
Diffstat (limited to 'tests/auto/quick/qquickpositioners')
-rw-r--r--tests/auto/quick/qquickpositioners/data/grid-animated.qml5
-rw-r--r--tests/auto/quick/qquickpositioners/data/horizontal-animated.qml6
-rw-r--r--tests/auto/quick/qquickpositioners/data/transitions.qml57
-rw-r--r--tests/auto/quick/qquickpositioners/data/vertical-animated.qml5
-rw-r--r--tests/auto/quick/qquickpositioners/tst_qquickpositioners.cpp158
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);