From ed74ec4c40f1476c545bcaacb12fe3a607172035 Mon Sep 17 00:00:00 2001 From: Bea Lam Date: Mon, 5 Mar 2012 18:05:40 +1000 Subject: refilled items should be moved immediately refill() functionality should reposition items immediately, else removeNonVisibleItems() sees different positions from those added in addVisibleItems() if an item is animating. Change-Id: Ib9904e08bf92b18fd4b712270c0ab69e9a113e04 Reviewed-by: Martin Jones --- src/quick/items/qquickgridview.cpp | 8 ++++---- src/quick/items/qquickitemview.cpp | 4 ++-- src/quick/items/qquickitemview_p_p.h | 2 +- src/quick/items/qquickitemviewtransition.cpp | 13 +++++++++---- src/quick/items/qquickitemviewtransition_p.h | 2 +- src/quick/items/qquicklistview.cpp | 8 ++++---- 6 files changed, 21 insertions(+), 16 deletions(-) (limited to 'src/quick') diff --git a/src/quick/items/qquickgridview.cpp b/src/quick/items/qquickgridview.cpp index 7c4f95faed..78899b27e5 100644 --- a/src/quick/items/qquickgridview.cpp +++ b/src/quick/items/qquickgridview.cpp @@ -120,8 +120,8 @@ public: return itemX() + view->cellWidth(); } } - void setPosition(qreal col, qreal row) { - moveTo(pointForPosition(col, row)); + void setPosition(qreal col, qreal row, bool immediate = false) { + moveTo(pointForPosition(col, row), immediate); } bool contains(qreal x, qreal y) const { return (x >= itemX() && x < itemX() + view->cellWidth() && @@ -483,7 +483,7 @@ bool QQuickGridViewPrivate::addVisibleItems(qreal fillFrom, qreal fillTo, bool d if (!(item = static_cast(createItem(modelIndex, doBuffer)))) break; if (!transitioner || !transitioner->canTransition(QQuickItemViewTransitioner::PopulateTransition, true)) // pos will be set by layoutVisibleItems() - item->setPosition(colPos, rowPos); + item->setPosition(colPos, rowPos, true); item->item->setVisible(!doBuffer); visibleItems.append(item); if (++colNum >= columns) { @@ -521,7 +521,7 @@ bool QQuickGridViewPrivate::addVisibleItems(qreal fillFrom, qreal fillTo, bool d break; --visibleIndex; if (!transitioner || !transitioner->canTransition(QQuickItemViewTransitioner::PopulateTransition, true)) // pos will be set by layoutVisibleItems() - item->setPosition(colPos, rowPos); + item->setPosition(colPos, rowPos, true); item->item->setVisible(!doBuffer); visibleItems.prepend(item); if (--colNum < 0) { diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp index aafddb40c8..c6f45aaf0b 100644 --- a/src/quick/items/qquickitemview.cpp +++ b/src/quick/items/qquickitemview.cpp @@ -73,10 +73,10 @@ qreal FxViewItem::itemY() const return transitionableItem ? transitionableItem->itemY() : item->y(); } -void FxViewItem::moveTo(const QPointF &pos) +void FxViewItem::moveTo(const QPointF &pos, bool immediate) { if (transitionableItem) - transitionableItem->moveTo(pos); + transitionableItem->moveTo(pos, immediate); else item->setPos(pos); } diff --git a/src/quick/items/qquickitemview_p_p.h b/src/quick/items/qquickitemview_p_p.h index 216f10aa23..dfc0a8bc7e 100644 --- a/src/quick/items/qquickitemview_p_p.h +++ b/src/quick/items/qquickitemview_p_p.h @@ -66,7 +66,7 @@ public: qreal itemX() const; qreal itemY() const; - void moveTo(const QPointF &pos); + void moveTo(const QPointF &pos, bool immediate); void setVisible(bool visible); QQuickItemViewTransitioner::TransitionType scheduledTransitionType() const; diff --git a/src/quick/items/qquickitemviewtransition.cpp b/src/quick/items/qquickitemviewtransition.cpp index 7e804ae5bf..d9dce49349 100644 --- a/src/quick/items/qquickitemviewtransition.cpp +++ b/src/quick/items/qquickitemviewtransition.cpp @@ -365,13 +365,18 @@ qreal QQuickItemViewTransitionableItem::itemY() const return item->y(); } -void QQuickItemViewTransitionableItem::moveTo(const QPointF &pos) +void QQuickItemViewTransitionableItem::moveTo(const QPointF &pos, bool immediate) { - if (transitionScheduledOrRunning()) { + if (immediate || !transitionScheduledOrRunning()) { + if (immediate) { + if (transition) + transition->cancel(); + resetTransitionData(); + } + item->setPos(pos); + } else { nextTransitionTo = pos; nextTransitionToSet = true; - } else { - item->setPos(pos); } } diff --git a/src/quick/items/qquickitemviewtransition_p.h b/src/quick/items/qquickitemviewtransition_p.h index d50b056593..a4babdca05 100644 --- a/src/quick/items/qquickitemviewtransition_p.h +++ b/src/quick/items/qquickitemviewtransition_p.h @@ -132,7 +132,7 @@ public: qreal itemX() const; qreal itemY() const; - void moveTo(const QPointF &pos); + void moveTo(const QPointF &pos, bool immediate = false); bool transitionScheduledOrRunning() const; bool transitionRunning() const; diff --git a/src/quick/items/qquicklistview.cpp b/src/quick/items/qquicklistview.cpp index 0b9d1c2f7e..9db2060d89 100644 --- a/src/quick/items/qquicklistview.cpp +++ b/src/quick/items/qquicklistview.cpp @@ -292,7 +292,7 @@ public: : itemX() + item->width()); } } - void setPosition(qreal pos) { + void setPosition(qreal pos, bool immediate = false) { // position the section immediately even if there is a transition if (section()) { if (view->orientation() == QQuickListView::Vertical) { @@ -304,7 +304,7 @@ public: section()->setX(pos); } } - moveTo(pointForPosition(pos)); + moveTo(pointForPosition(pos), immediate); } void setSize(qreal size) { if (view->orientation() == QQuickListView::Vertical) @@ -638,7 +638,7 @@ bool QQuickListViewPrivate::addVisibleItems(qreal fillFrom, qreal fillTo, bool d if (!(item = static_cast(createItem(modelIndex, doBuffer)))) break; if (!transitioner || !transitioner->canTransition(QQuickItemViewTransitioner::PopulateTransition, true)) // pos will be set by layoutVisibleItems() - item->setPosition(pos); + item->setPosition(pos, true); item->item->setVisible(!doBuffer); pos += item->size() + spacing; visibleItems.append(item); @@ -658,7 +658,7 @@ bool QQuickListViewPrivate::addVisibleItems(qreal fillFrom, qreal fillTo, bool d --visibleIndex; visiblePos -= item->size() + spacing; if (!transitioner || !transitioner->canTransition(QQuickItemViewTransitioner::PopulateTransition, true)) // pos will be set by layoutVisibleItems() - item->setPosition(visiblePos); + item->setPosition(visiblePos, true); item->item->setVisible(!doBuffer); visibleItems.prepend(item); changed = true; -- cgit v1.2.3