diff options
author | J-P Nurmi <jpnurmi@gmail.com> | 2013-06-22 15:49:26 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-07-04 08:26:59 +0200 |
commit | feaf7ca8f5f1b8508310e4046aada8833cc0f5cf (patch) | |
tree | fc842926b0f64b626fe0f8cc62c1a17d5e490f09 /src/quick/items/qquickitemview.cpp | |
parent | 672354676d8e968e2523d1aeb450213a46b8b27c (diff) |
Item views: do not track the geometry of items being removed
Task-number: QTBUG-31873
Change-Id: I4230893ccb2925ed9c2429d26b411264bf7c1c65
Reviewed-by: Andrew den Exter <andrew.den.exter@qinetic.com.au>
Diffstat (limited to 'src/quick/items/qquickitemview.cpp')
-rw-r--r-- | src/quick/items/qquickitemview.cpp | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp index a6dabee7ba..f8f622a1b9 100644 --- a/src/quick/items/qquickitemview.cpp +++ b/src/quick/items/qquickitemview.cpp @@ -51,13 +51,14 @@ QT_BEGIN_NAMESPACE #define QML_VIEW_DEFAULTCACHEBUFFER 320 #endif -FxViewItem::FxViewItem(QQuickItem *i, bool own, bool trackGeometry) +FxViewItem::FxViewItem(QQuickItem *i, QQuickItemView *v, bool own) : item(i) + , view(v) , transitionableItem(0) , attached(0) , ownItem(own) , releaseAfterTransition(false) - , trackGeom(trackGeometry) + , trackGeom(false) { } @@ -96,6 +97,23 @@ void FxViewItem::setVisible(bool visible) QQuickItemPrivate::get(item)->setCulled(!visible); } +void FxViewItem::trackGeometry(bool track) +{ + if (track) { + if (!trackGeom) { + QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(item); + itemPrivate->addItemChangeListener(QQuickItemViewPrivate::get(view), QQuickItemPrivate::Geometry); + trackGeom = true; + } + } else { + if (trackGeom) { + QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(item); + itemPrivate->removeItemChangeListener(QQuickItemViewPrivate::get(view), QQuickItemPrivate::Geometry); + trackGeom = false; + } + } +} + QQuickItemViewTransitioner::TransitionType FxViewItem::scheduledTransitionType() const { return transitionableItem ? transitionableItem->nextTransitionType : QQuickItemViewTransitioner::NoTransition; @@ -2131,6 +2149,7 @@ void QQuickItemViewPrivate::prepareRemoveTransitions(QHash<QQmlChangeSet::MoveKe bool isRemove = it.key().moveId < 0; if (isRemove) { FxViewItem *item = *it; + item->trackGeometry(false); item->releaseAfterTransition = true; releasePendingTransition.append(item); item->transitionNextReposition(transitioner, QQuickItemViewTransitioner::RemoveTransition, true); @@ -2272,8 +2291,8 @@ bool QQuickItemViewPrivate::releaseItem(FxViewItem *item) return true; if (trackedItem == item) trackedItem = 0; - QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(item->item); - itemPrivate->removeItemChangeListener(this, QQuickItemPrivate::Geometry); + item->trackGeometry(false); + QQmlInstanceModel::ReleaseFlags flags = model->release(item->item); if (flags == 0) { // item was not destroyed, and we no longer reference it. |