diff options
author | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2020-01-14 01:00:50 +0100 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2020-01-14 09:33:22 +0100 |
commit | 51311db1b33cc7aabaf5027fa0c82a5921aba888 (patch) | |
tree | 43be7e39e15510607680a5d9e5c06f21a9188256 /src/quick/items/qquickitemview.cpp | |
parent | 3dc5b937c4e9acf83ee54e870390c22f341c29c8 (diff) | |
parent | 96cf8a33c3c2fa8a3e010e33c37462e3a703fe3d (diff) |
Merge remote-tracking branch 'origin/5.14' into 5.15
Conflicts:
src/quick/items/qquickitemsmodule.cpp
src/quick/items/qquickitemview.cpp
Change-Id: I02191959a5023c4320f5487a7fb3a71f8711195f
Diffstat (limited to 'src/quick/items/qquickitemview.cpp')
-rw-r--r-- | src/quick/items/qquickitemview.cpp | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp index 2ac5e60912..031ac6337a 100644 --- a/src/quick/items/qquickitemview.cpp +++ b/src/quick/items/qquickitemview.cpp @@ -1934,21 +1934,25 @@ void QQuickItemViewPrivate::layout() prepareVisibleItemTransitions(); - for (auto it = releasePendingTransition.begin(); it != releasePendingTransition.end(); ) { - auto old_count = releasePendingTransition.count(); - auto success = prepareNonVisibleItemTransition(*it, viewBounds); - // prepareNonVisibleItemTransition() may invalidate iterators while in fast flicking - // invisible animating items are kicked in or out the viewPort - // use old_count to test if the abrupt erasure occurs - if (old_count > releasePendingTransition.count()) { + // We cannot use iterators here as erasing from a container invalidates them. + for (int i = 0, count = releasePendingTransition.count(); i < count;) { + auto success = prepareNonVisibleItemTransition(releasePendingTransition[i], viewBounds); + // prepareNonVisibleItemTransition() may remove items while in fast flicking. + // Invisible animating items are kicked in or out the viewPort. + // Recheck count to test if the item got removed. In that case the same index points + // to a different item now. + const int old_count = count; + count = releasePendingTransition.count(); + if (old_count > count) continue; - } + if (!success) { - releaseItem(*it, reusableFlag); - it = releasePendingTransition.erase(it); - continue; + releaseItem(releasePendingTransition[i], reusableFlag); + releasePendingTransition.remove(i); + --count; + } else { + ++i; } - ++it; } for (int i=0; i<visibleItems.count(); i++) |