diff options
Diffstat (limited to 'tests/auto/quick/qquicklayouts/data/tst_stacklayout.qml')
-rw-r--r-- | tests/auto/quick/qquicklayouts/data/tst_stacklayout.qml | 142 |
1 files changed, 141 insertions, 1 deletions
diff --git a/tests/auto/quick/qquicklayouts/data/tst_stacklayout.qml b/tests/auto/quick/qquicklayouts/data/tst_stacklayout.qml index e8d311183e..f627a90dfd 100644 --- a/tests/auto/quick/qquicklayouts/data/tst_stacklayout.qml +++ b/tests/auto/quick/qquicklayouts/data/tst_stacklayout.qml @@ -1,5 +1,5 @@ // Copyright (C) 2020 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only import QtQuick 2.15 import QtTest 1.15 @@ -724,6 +724,146 @@ Item { compare(layout.num_onCountChanged, 1) } + // QTBUG-111902 + Component { + id: stackComponent + Loader { + id: loader + asynchronous: true + sourceComponent: StackLayout { + id: stackLayout + Repeater { + model: 3 + Item { + required property int index + } + } + } + } + } + + function test_loadStackLayoutAsynchronously() { + var loaderObj = stackComponent.createObject(container) + // Check for loader status to be ready + tryCompare(loaderObj, 'status', 1) + // Get stack layout object + var stackLayoutObj = loaderObj.item + // Check repeater index of child object + compare(stackLayoutObj.children[0].index, 0) + compare(stackLayoutObj.children[1].index, 1) + compare(stackLayoutObj.children[2].index, 2) + // Check stack layout attached property index + compare(stackLayoutObj.children[0].StackLayout.index, 0) + compare(stackLayoutObj.children[1].StackLayout.index, 1) + compare(stackLayoutObj.children[2].StackLayout.index, 2) + } + + Component { + id: test_repeater_Component + + Item { + property alias stackLayout : stackLayout + property var model : ListModel { + /* + * We cannot programmatically reorder siblings (QQuickItem::stackBefore() + * and QQuickItem::stackAfter() are not not available to QML, and we cannot + * alter the Item::children property to reorder siblings) + * Therefore, we have to go through the hoops with a ListModel and Repeater in + * order to trigger sibling reordering, just as reported in QTBUG-112691. + * Adding an item to a specific index (with model.insert()), will be done in + * two steps: + * 1. Append an Item to be the last of the siblings + * 2. Reorder that Rectangle to be at the correct child index that corresponds + * to the index given to model.insert() + * + * Adding an item to a specific index will therefore test sibling reordering + */ + id: listModel + } + StackLayout { + id: stackLayout + anchors.fill: parent + Layout.fillHeight: true + Layout.fillWidth: true + Repeater { + id: repeater + model:listModel + delegate: Rectangle { + implicitWidth: 100 + implicitHeight: 100 + objectName: model.color + color: model.color + } + } + } + } + } + + function test_repeater() { + let item = createTemporaryObject(test_repeater_Component, container) + let layout = item.stackLayout + let model = item.model + function verifyVisibilityOfItems() { + for (let i = 0; i < layout.count; ++i) { + compare(layout.children[i].visible, layout.currentIndex === i) + } + } + + compare(layout.currentIndex, -1) + compare(layout.count, 0) + model.append({ "color": "red" }) + compare(layout.currentIndex, 0) + compare(layout.count, 1) + verifyVisibilityOfItems() + + model.append({ "color": "green" }) + compare(layout.currentIndex, 0) + compare(layout.count, 2) + verifyVisibilityOfItems() + + model.append({ "color": "blue" }) + compare(layout.currentIndex, 0) + compare(layout.count, 3) + verifyVisibilityOfItems() + + model.insert(0, { "color": "black" }) + compare(layout.currentIndex, 1) + compare(layout.count, 4) + verifyVisibilityOfItems() + + // An implicit currentIndex will reset back to -1 if + // the StackLayout is empty + model.clear() + compare(layout.currentIndex, -1) + compare(layout.count, 0) + + // set explicit index to out of bounds + layout.currentIndex = 1 + compare(layout.currentIndex, 1) + compare(layout.count, 0) + verifyVisibilityOfItems() + + model.append({ "color": "red" }) + compare(layout.currentIndex, 1) + compare(layout.count, 1) + verifyVisibilityOfItems() + + model.append({ "color": "green" }) + compare(layout.currentIndex, 1) + compare(layout.count, 2) + verifyVisibilityOfItems() + + model.insert(1, { "color": "brown" }) + compare(layout.currentIndex, 2) + compare(layout.count, 3) + verifyVisibilityOfItems() + + // remove red, currentIndex should decrease + model.remove(0, 1) + compare(layout.currentIndex, 1) + compare(layout.count, 2) + verifyVisibilityOfItems() + } } } |