diff options
author | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2019-07-01 01:00:48 +0200 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2019-07-01 10:29:06 +0200 |
commit | e6c6cc8fde26bd0b9d37a1812593f17df0b4159a (patch) | |
tree | 6aae6724e24a1e051d271e5f67baab5acc358313 /src/quick/items | |
parent | 16289f35eb08a9b9a6d56ea8dec549b1f17e4daf (diff) | |
parent | 3ecec55e534214aced70ccab7cc929cfb57738a2 (diff) |
Merge remote-tracking branch 'origin/5.13' into dev
Conflicts:
src/imports/imports.pro
src/qml/qml/qqmlmetatype.cpp
Change-Id: I308436caf55402cb2246cb591c6ac8f83e1febf8
Diffstat (limited to 'src/quick/items')
-rw-r--r-- | src/quick/items/qquickitemview.cpp | 28 | ||||
-rw-r--r-- | src/quick/items/qquickitemview_p_p.h | 2 |
2 files changed, 21 insertions, 9 deletions
diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp index c20f778a8f..95f1229b92 100644 --- a/src/quick/items/qquickitemview.cpp +++ b/src/quick/items/qquickitemview.cpp @@ -1724,8 +1724,14 @@ void QQuickItemViewPrivate::refill() void QQuickItemViewPrivate::refill(qreal from, qreal to) { Q_Q(QQuickItemView); - if (!isValid() || !q->isComponentComplete()) + if (!model || !model->isValid() || !q->isComponentComplete()) return; + if (!model->count()) { + updateHeader(); + updateFooter(); + updateViewport(); + return; + } do { bufferPause.stop(); @@ -1881,15 +1887,21 @@ void QQuickItemViewPrivate::layout() prepareVisibleItemTransitions(); - for (QList<FxViewItem*>::Iterator it = releasePendingTransition.begin(); - it != releasePendingTransition.end(); ) { - FxViewItem *item = *it; - if (prepareNonVisibleItemTransition(item, viewBounds)) { - ++it; - } else { - releaseItem(item); + 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()) { + continue; + } + if (!success) { + releaseItem(*it); it = releasePendingTransition.erase(it); + continue; } + ++it; } for (int i=0; i<visibleItems.count(); i++) diff --git a/src/quick/items/qquickitemview_p_p.h b/src/quick/items/qquickitemview_p_p.h index 860605991b..ef674f0fc7 100644 --- a/src/quick/items/qquickitemview_p_p.h +++ b/src/quick/items/qquickitemview_p_p.h @@ -287,7 +287,7 @@ public: : item(i), moveKey(k) {} }; QQuickItemViewTransitioner *transitioner; - QList<FxViewItem *> releasePendingTransition; + QVector<FxViewItem *> releasePendingTransition; mutable qreal minExtent; mutable qreal maxExtent; |