diff options
author | Jan Arve Sæther <jan-arve.saether@qt.io> | 2023-04-19 16:39:20 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2023-04-25 17:39:13 +0000 |
commit | 8d08d0d4e9af8e0603050a68334276ac791f32b4 (patch) | |
tree | 92ba85cf3035357fa528f2c6f499017712d4174d /tests | |
parent | ef8b5344e754f1c0f13d17f4f274e9a2a8c01bb3 (diff) |
Fix StackLayout to react to reordering siblings
When siblings in a StackLayout are reordered, we need to react, since
the sibling order corresponds to the "stack order"
Fixes: QTBUG-112691
Change-Id: Ie768af34bf5ee9d15ca67d61a64115f3df31990f
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
(cherry picked from commit a0fb254915ba9d4507c2f17bdbe79ebeaabb3cdf)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/quick/qquicklayouts/data/tst_stacklayout.qml | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/tests/auto/quick/qquicklayouts/data/tst_stacklayout.qml b/tests/auto/quick/qquicklayouts/data/tst_stacklayout.qml index 99713991bd..e6200a3e23 100644 --- a/tests/auto/quick/qquicklayouts/data/tst_stacklayout.qml +++ b/tests/auto/quick/qquicklayouts/data/tst_stacklayout.qml @@ -757,5 +757,112 @@ Item { 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, 0) + 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, 1) + compare(layout.count, 3) + verifyVisibilityOfItems() + + model.remove(0, 1) + compare(layout.currentIndex, 1) + compare(layout.count, 2) + verifyVisibilityOfItems() + } } } |