From d290cb3a499a0c3a71ab1f63cbd2fc45b0f5835f Mon Sep 17 00:00:00 2001 From: Bea Lam Date: Mon, 27 Feb 2012 16:26:05 +1000 Subject: Fix when animating items that are already moving The view must transition displaced/moved items that are currently transitioning to another position; check against the current transition-to position, not just the current item position. Task-number: QTBUG-24522 Change-Id: Icf1c290f76ceb8c93716f1562ae0bc5a75445b78 Reviewed-by: Martin Jones --- src/quick/items/qquickitemviewtransition.cpp | 20 +++++++++++++++----- src/quick/items/qquickitemviewtransition_p.h | 1 + 2 files changed, 16 insertions(+), 5 deletions(-) (limited to 'src/quick') diff --git a/src/quick/items/qquickitemviewtransition.cpp b/src/quick/items/qquickitemviewtransition.cpp index abff768ad3..3febc9b113 100644 --- a/src/quick/items/qquickitemviewtransition.cpp +++ b/src/quick/items/qquickitemviewtransition.cpp @@ -383,6 +383,9 @@ bool QQuickViewItem::prepareTransition(const QRectF &viewBounds) if (nextTransitionType != QQuickItemViewTransitioner::NoTransition && !nextTransitionToSet) moveTo(item->pos()); + // For move transitions (both target and displaced) and displaced transitions of other + // types, only run the transition if the item is actually moving to another position. + switch (nextTransitionType) { case QQuickItemViewTransitioner::NoTransition: { @@ -394,14 +397,14 @@ bool QQuickViewItem::prepareTransition(const QRectF &viewBounds) } case QQuickItemViewTransitioner::AddTransition: case QQuickItemViewTransitioner::RemoveTransition: - // For Add targets, do transition if item is moving into visible area - // For Remove targets, do transition if item is currently in visible area if (viewBounds.isNull()) { if (isTransitionTarget) doTransition = true; else - doTransition = (nextTransitionTo != item->pos()); + doTransition = transitionWillChangePosition(); } else if (isTransitionTarget) { + // For Add targets, do transition if item is moving into visible area + // For Remove targets, do transition if item is currently in visible area doTransition = (nextTransitionType == QQuickItemViewTransitioner::AddTransition) ? viewBounds.intersects(QRectF(nextTransitionTo.x(), nextTransitionTo.y(), item->width(), item->height())) : viewBounds.intersects(QRectF(item->x(), item->y(), item->width(), item->height())); @@ -410,7 +413,7 @@ bool QQuickViewItem::prepareTransition(const QRectF &viewBounds) } else { if (viewBounds.intersects(QRectF(item->x(), item->y(), item->width(), item->height())) || viewBounds.intersects(QRectF(nextTransitionTo.x(), nextTransitionTo.y(), item->width(), item->height()))) { - doTransition = (nextTransitionTo != item->pos()); + doTransition = transitionWillChangePosition(); } else { item->setPos(nextTransitionTo); } @@ -418,7 +421,7 @@ bool QQuickViewItem::prepareTransition(const QRectF &viewBounds) break; case QQuickItemViewTransitioner::MoveTransition: // do transition if moving from or into visible area - if (nextTransitionTo != item->pos()) { + if (transitionWillChangePosition()) { doTransition = viewBounds.isNull() || viewBounds.intersects(QRectF(item->x(), item->y(), item->width(), item->height())) || viewBounds.intersects(QRectF(nextTransitionTo.x(), nextTransitionTo.y(), item->width(), item->height())); @@ -472,6 +475,13 @@ void QQuickViewItem::setNextTransition(QQuickItemViewTransitioner::TransitionTyp isTransitionTarget = isTargetItem; } +bool QQuickViewItem::transitionWillChangePosition() const +{ + if (transitionRunning() && transition->m_toPos != nextTransitionTo) + return true; + return nextTransitionTo != item->pos(); +} + void QQuickViewItem::finishedTransition() { nextTransitionToSet = false; diff --git a/src/quick/items/qquickitemviewtransition_p.h b/src/quick/items/qquickitemviewtransition_p.h index 1ebc52c185..57ea85bae6 100644 --- a/src/quick/items/qquickitemviewtransition_p.h +++ b/src/quick/items/qquickitemviewtransition_p.h @@ -152,6 +152,7 @@ private: friend class QQuickItemViewTransitioner; friend class QQuickItemViewTransitionJob; void setNextTransition(QQuickItemViewTransitioner::TransitionType, bool isTargetItem); + bool transitionWillChangePosition() const; void finishedTransition(); void resetTransitionData(); }; -- cgit v1.2.3