aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/items/qquickitemviewtransition.cpp
diff options
context:
space:
mode:
authorBea Lam <bea.lam@nokia.com>2012-02-27 16:26:05 +1000
committerQt by Nokia <qt-info@nokia.com>2012-03-02 08:26:52 +0100
commitd290cb3a499a0c3a71ab1f63cbd2fc45b0f5835f (patch)
tree5c4a51342e06642e14665c4e8e651dd245a7c21a /src/quick/items/qquickitemviewtransition.cpp
parentcc462d6a161b453e57523e71cd5d11deb4840f21 (diff)
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 <martin.jones@nokia.com>
Diffstat (limited to 'src/quick/items/qquickitemviewtransition.cpp')
-rw-r--r--src/quick/items/qquickitemviewtransition.cpp20
1 files changed, 15 insertions, 5 deletions
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;