From 78356f6038065227acb2dc898994765f49f07b42 Mon Sep 17 00:00:00 2001 From: Bea Lam Date: Wed, 7 Mar 2012 13:29:20 +1000 Subject: [PATCH] Avoid using QQuickViewItem as base class This patch renames it to QQuickItemViewTransitionableItem, and FxViewItem and PositionedItem now create instances of this instead of subclassing it, to reduce the memory used when transitions are not required. Change-Id: Ie050cda5a121bff9542c7ba7356f6eacf37d241a Reviewed-by: Alan Alpert --- src/quick/items/qquickgridview.cpp | 18 ++--- src/quick/items/qquickitemview.cpp | 105 +++++++++++++++++++++----- src/quick/items/qquickitemview_p_p.h | 22 +++++- src/quick/items/qquickitemviewtransition.cpp | 52 ++++++------- src/quick/items/qquickitemviewtransition_p.h | 24 +++--- src/quick/items/qquicklistview.cpp | 15 ++-- src/quick/items/qquickpositioners.cpp | 64 ++++++++++++++-- src/quick/items/qquickpositioners_p.h | 17 ++++- 8 files changed, 225 insertions(+), 92 deletions(-) diff --git a/src/quick/items/qquickgridview.cpp b/src/quick/items/qquickgridview.cpp index a78ab4c..7c4f95f 100644 --- a/src/quick/items/qquickgridview.cpp +++ b/src/quick/items/qquickgridview.cpp @@ -2165,12 +2165,10 @@ bool QQuickGridViewPrivate::applyInsertionChange(const QQuickChangeSet::Insert & FxViewItem *item = visibleItems.at(i); if (item->index != -1 && item->index >= modelIndex) { item->index += count; - if (transitioner) { - if (change.isMove()) - transitioner->transitionNextReposition(item, QQuickItemViewTransitioner::MoveTransition, false); - else - transitioner->transitionNextReposition(item, QQuickItemViewTransitioner::AddTransition, false); - } + if (change.isMove()) + item->transitionNextReposition(transitioner, QQuickItemViewTransitioner::MoveTransition, false); + else + item->transitionNextReposition(transitioner, QQuickItemViewTransitioner::AddTransition, false); } } @@ -2201,8 +2199,7 @@ bool QQuickGridViewPrivate::applyInsertionChange(const QQuickChangeSet::Insert & insertResult->changedFirstItem = true; if (!change.isMove()) { addedItems->append(item); - if (transitioner) - transitioner->transitionNextReposition(item, QQuickItemViewTransitioner::AddTransition, true); + item->transitionNextReposition(transitioner, QQuickItemViewTransitioner::AddTransition, true); } insertResult->sizeChangesBeforeVisiblePos += rowSize(); } @@ -2239,8 +2236,7 @@ bool QQuickGridViewPrivate::applyInsertionChange(const QQuickChangeSet::Insert & movingIntoView->append(MovedItem(item, change.moveKey(item->index))); } else { addedItems->append(item); - if (transitioner) - transitioner->transitionNextReposition(item, QQuickItemViewTransitioner::AddTransition, true); + item->transitionNextReposition(transitioner, QQuickItemViewTransitioner::AddTransition, true); } insertResult->sizeChangesAfterVisiblePos += rowSize(); @@ -2291,7 +2287,7 @@ void QQuickGridViewPrivate::translateAndTransitionItemsAfter(int afterModelIndex qreal origColPos = gridItem->rowPos(); int indexDiff = gridItem->index - countItemsRemoved; gridItem->setPosition((indexDiff % columns) * colSize(), (indexDiff / columns) * rowSize()); - transitioner->transitionNextReposition(gridItem, QQuickItemViewTransitioner::RemoveTransition, false); + gridItem->transitionNextReposition(transitioner, QQuickItemViewTransitioner::RemoveTransition, false); gridItem->setPosition(origRowPos, origColPos); } } diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp index e368d1a..aafddb4 100644 --- a/src/quick/items/qquickitemview.cpp +++ b/src/quick/items/qquickitemview.cpp @@ -46,12 +46,16 @@ QT_BEGIN_NAMESPACE FxViewItem::FxViewItem(QQuickItem *i, bool own) - : QQuickViewItem(i), ownItem(own), releaseAfterTransition(false) + : item(i) + , transitionableItem(0) + , ownItem(own) + , releaseAfterTransition(false) { } FxViewItem::~FxViewItem() { + delete transitionableItem; if (ownItem && item) { item->setParentItem(0); item->deleteLater(); @@ -59,6 +63,71 @@ FxViewItem::~FxViewItem() } } +qreal FxViewItem::itemX() const +{ + return transitionableItem ? transitionableItem->itemX() : item->x(); +} + +qreal FxViewItem::itemY() const +{ + return transitionableItem ? transitionableItem->itemY() : item->y(); +} + +void FxViewItem::moveTo(const QPointF &pos) +{ + if (transitionableItem) + transitionableItem->moveTo(pos); + else + item->setPos(pos); +} + +void FxViewItem::setVisible(bool visible) +{ + if (!visible && transitionableItem && transitionableItem->transitionScheduledOrRunning()) + return; + item->setVisible(visible); +} + +QQuickItemViewTransitioner::TransitionType FxViewItem::scheduledTransitionType() const +{ + return transitionableItem ? transitionableItem->nextTransitionType : QQuickItemViewTransitioner::NoTransition; +} + +bool FxViewItem::transitionScheduledOrRunning() const +{ + return transitionableItem ? transitionableItem->transitionScheduledOrRunning() : false; +} + +bool FxViewItem::transitionRunning() const +{ + return transitionableItem ? transitionableItem->transitionRunning() : false; +} + +bool FxViewItem::isPendingRemoval() const +{ + return transitionableItem ? transitionableItem->isPendingRemoval() : false; +} + +void FxViewItem::transitionNextReposition(QQuickItemViewTransitioner *transitioner, QQuickItemViewTransitioner::TransitionType type, bool asTarget) +{ + if (!transitioner) + return; + if (!transitionableItem) + transitionableItem = new QQuickItemViewTransitionableItem(item); + transitioner->transitionNextReposition(transitionableItem, type, asTarget); +} + +bool FxViewItem::prepareTransition(QQuickItemViewTransitioner *transitioner, const QRectF &viewBounds) +{ + return transitionableItem ? transitionableItem->prepareTransition(transitioner, index, viewBounds) : false; +} + +void FxViewItem::startTransition(QQuickItemViewTransitioner *transitioner) +{ + if (transitionableItem) + transitionableItem->startTransition(transitioner, index); +} + QQuickItemViewChangeSet::QQuickItemViewChangeSet() : active(false) @@ -1615,7 +1684,7 @@ void QQuickItemViewPrivate::layout() // assume that any items moving now are moving due to the remove - if they schedule // a different transition, that will override this one anyway for (int i=0; itransitionNextReposition(visibleItems[i], QQuickItemViewTransitioner::RemoveTransition, false); + visibleItems[i]->transitionNextReposition(transitioner, QQuickItemViewTransitioner::RemoveTransition, false); } ChangeResult insertionPosChanges; @@ -1631,7 +1700,7 @@ void QQuickItemViewPrivate::layout() if (transitioner && transitioner->canTransition(QQuickItemViewTransitioner::PopulateTransition, true)) { for (int i=0; itransitionNextReposition(visibleItems.at(i), QQuickItemViewTransitioner::PopulateTransition, true); + visibleItems.at(i)->transitionNextReposition(transitioner, QQuickItemViewTransitioner::PopulateTransition, true); } layoutVisibleItems(); @@ -1791,7 +1860,7 @@ bool QQuickItemViewPrivate::applyModelChanges(ChangeResult *totalInsertionResult repositionItemAt(movingIntoView[i].item, fromIndex, -totalInsertionResult->sizeChangesAfterVisiblePos); else repositionItemAt(movingIntoView[i].item, fromIndex, totalInsertionResult->sizeChangesAfterVisiblePos); - transitioner->transitionNextReposition(movingIntoView[i].item, QQuickItemViewTransitioner::MoveTransition, true); + movingIntoView[i].item->transitionNextReposition(transitioner, QQuickItemViewTransitioner::MoveTransition, true); } } } @@ -1855,12 +1924,10 @@ bool QQuickItemViewPrivate::applyRemovalChange(const QQuickChangeSet::Remove &re } else if (item->index >= removal.index + removal.count) { // after removed items item->index -= removal.count; - if (transitioner) { - if (removal.isMove()) - transitioner->transitionNextReposition(item, QQuickItemViewTransitioner::MoveTransition, false); - else - transitioner->transitionNextReposition(item, QQuickItemViewTransitioner::RemoveTransition, false); - } + if (removal.isMove()) + item->transitionNextReposition(transitioner, QQuickItemViewTransitioner::MoveTransition, false); + else + item->transitionNextReposition(transitioner, QQuickItemViewTransitioner::RemoveTransition, false); ++it; } else { // removed item @@ -1894,8 +1961,7 @@ void QQuickItemViewPrivate::removeItem(FxViewItem *item, const QQuickChangeSet:: } if (removal.isMove()) { currentChanges.removedItems.insert(removal.moveKey(item->index), item); - if (transitioner) - transitioner->transitionNextReposition(item, QQuickItemViewTransitioner::MoveTransition, true); + item->transitionNextReposition(transitioner, QQuickItemViewTransitioner::MoveTransition, true); } else { // track item so it is released later currentChanges.removedItems.insertMulti(QQuickChangeSet::MoveKey(), item); @@ -1977,7 +2043,7 @@ void QQuickItemViewPrivate::prepareRemoveTransitions(QHashreleaseAfterTransition = true; releasePendingTransition.append(item); - transitioner->transitionNextReposition(item, QQuickItemViewTransitioner::RemoveTransition, true); + item->transitionNextReposition(transitioner, QQuickItemViewTransitioner::RemoveTransition, true); it = removedItems->erase(it); } else { ++it; @@ -1996,7 +2062,7 @@ bool QQuickItemViewPrivate::prepareNonVisibleItemTransition(FxViewItem *item, co if (!transitioner) return false; - if (item->nextTransitionType == QQuickItemViewTransitioner::MoveTransition) + if (item->scheduledTransitionType() == QQuickItemViewTransitioner::MoveTransition) repositionItemAt(item, item->index, 0); if (item->prepareTransition(transitioner, viewBounds)) { @@ -2006,12 +2072,13 @@ bool QQuickItemViewPrivate::prepareNonVisibleItemTransition(FxViewItem *item, co return false; } -void QQuickItemViewPrivate::viewItemTransitionFinished(QQuickViewItem *i) +void QQuickItemViewPrivate::viewItemTransitionFinished(QQuickItemViewTransitionableItem *item) { - FxViewItem *item = static_cast(i); - if (item->releaseAfterTransition) { - releasePendingTransition.removeOne(item); - releaseItem(item); + for (int i=0; itransitionableItem == item) { + releaseItem(releasePendingTransition.takeAt(i)); + return; + } } } diff --git a/src/quick/items/qquickitemview_p_p.h b/src/quick/items/qquickitemview_p_p.h index 80dacc0..216f10a 100644 --- a/src/quick/items/qquickitemview_p_p.h +++ b/src/quick/items/qquickitemview_p_p.h @@ -57,12 +57,27 @@ QT_BEGIN_NAMESPACE QT_MODULE(Quick) -class FxViewItem : public QQuickViewItem +class FxViewItem { public: FxViewItem(QQuickItem *, bool own); virtual ~FxViewItem(); + qreal itemX() const; + qreal itemY() const; + + void moveTo(const QPointF &pos); + void setVisible(bool visible); + + QQuickItemViewTransitioner::TransitionType scheduledTransitionType() const; + bool transitionScheduledOrRunning() const; + bool transitionRunning() const; + bool isPendingRemoval() const; + + void transitionNextReposition(QQuickItemViewTransitioner *transitioner, QQuickItemViewTransitioner::TransitionType type, bool asTarget); + bool prepareTransition(QQuickItemViewTransitioner *transitioner, const QRectF &viewBounds); + void startTransition(QQuickItemViewTransitioner *transitioner); + // these are positions and sizes along the current direction of scrolling/flicking virtual qreal position() const = 0; virtual qreal endPosition() const = 0; @@ -71,7 +86,10 @@ public: virtual bool contains(qreal x, qreal y) const = 0; + QQuickItem *item; + QQuickItemViewTransitionableItem *transitionableItem; QQuickItemViewAttached *attached; + int index; bool ownItem; bool releaseAfterTransition; }; @@ -192,7 +210,7 @@ public: void prepareVisibleItemTransitions(); void prepareRemoveTransitions(QHash *removedItems); bool prepareNonVisibleItemTransition(FxViewItem *item, const QRectF &viewBounds); - virtual void viewItemTransitionFinished(QQuickViewItem *item); + virtual void viewItemTransitionFinished(QQuickItemViewTransitionableItem *item); int findMoveKeyIndex(QQuickChangeSet::MoveKey key, const QVector &changes) const; diff --git a/src/quick/items/qquickitemviewtransition.cpp b/src/quick/items/qquickitemviewtransition.cpp index 2134c8e..7e804ae 100644 --- a/src/quick/items/qquickitemviewtransition.cpp +++ b/src/quick/items/qquickitemviewtransition.cpp @@ -55,10 +55,10 @@ public: QQuickItemViewTransitionJob(); ~QQuickItemViewTransitionJob(); - void startTransition(QQuickViewItem *item, QQuickItemViewTransitioner *transitioner, QQuickItemViewTransitioner::TransitionType type, const QPointF &to, bool isTargetItem); + void startTransition(QQuickItemViewTransitionableItem *item, int index, QQuickItemViewTransitioner *transitioner, QQuickItemViewTransitioner::TransitionType type, const QPointF &to, bool isTargetItem); QQuickItemViewTransitioner *m_transitioner; - QQuickViewItem *m_item; + QQuickItemViewTransitionableItem *m_item; QPointF m_toPos; QQuickItemViewTransitioner::TransitionType m_type; bool m_isTarget; @@ -86,7 +86,7 @@ QQuickItemViewTransitionJob::~QQuickItemViewTransitionJob() m_transitioner->runningJobs.remove(this); } -void QQuickItemViewTransitionJob::startTransition(QQuickViewItem *item, QQuickItemViewTransitioner *transitioner, QQuickItemViewTransitioner::TransitionType type, const QPointF &to, bool isTargetItem) +void QQuickItemViewTransitionJob::startTransition(QQuickItemViewTransitionableItem *item, int index, QQuickItemViewTransitioner *transitioner, QQuickItemViewTransitioner::TransitionType type, const QPointF &to, bool isTargetItem) { if (type == QQuickItemViewTransitioner::NoTransition) return; @@ -114,7 +114,7 @@ void QQuickItemViewTransitionJob::startTransition(QQuickViewItem *item, QQuickIt QQuickViewTransitionAttached *attached = static_cast(qmlAttachedPropertiesObject(trans)); if (attached) { - attached->m_index = item->index; + attached->m_index = index; attached->m_item = item->item; attached->m_destination = to; attached->m_targetIndexes = m_transitioner->targetIndexes(type); @@ -209,12 +209,12 @@ bool QQuickItemViewTransitioner::canTransition(QQuickItemViewTransitioner::Trans return false; } -void QQuickItemViewTransitioner::transitionNextReposition(QQuickViewItem *item, QQuickItemViewTransitioner::TransitionType type, bool isTarget) +void QQuickItemViewTransitioner::transitionNextReposition(QQuickItemViewTransitionableItem *item, QQuickItemViewTransitioner::TransitionType type, bool isTarget) { item->setNextTransition(type, isTarget); } -void QQuickItemViewTransitioner::addToTargetLists(QQuickItemViewTransitioner::TransitionType type, QQuickViewItem *item, int index) +void QQuickItemViewTransitioner::addToTargetLists(QQuickItemViewTransitioner::TransitionType type, QQuickItemViewTransitionableItem *item, int index) { switch (type) { case NoTransition: @@ -314,7 +314,7 @@ const QList &QQuickItemViewTransitioner::targetItems(QQuickItemViewTr return qquickitemviewtransition_emptyTargets; } -void QQuickItemViewTransitioner::finishedTransition(QQuickItemViewTransitionJob *job, QQuickViewItem *item) +void QQuickItemViewTransitioner::finishedTransition(QQuickItemViewTransitionJob *job, QQuickItemViewTransitionableItem *item) { if (!runningJobs.contains(job)) return; @@ -327,23 +327,22 @@ void QQuickItemViewTransitioner::finishedTransition(QQuickItemViewTransitionJob } -QQuickViewItem::QQuickViewItem(QQuickItem *i) +QQuickItemViewTransitionableItem::QQuickItemViewTransitionableItem(QQuickItem *i) : item(i) , transition(0) , nextTransitionType(QQuickItemViewTransitioner::NoTransition) - , index(-1) , isTransitionTarget(false) , nextTransitionToSet(false) , prepared(false) { } -QQuickViewItem::~QQuickViewItem() +QQuickItemViewTransitionableItem::~QQuickItemViewTransitionableItem() { delete transition; } -qreal QQuickViewItem::itemX() const +qreal QQuickItemViewTransitionableItem::itemX() const { if (nextTransitionType != QQuickItemViewTransitioner::NoTransition) return nextTransitionToSet ? nextTransitionTo.x() : item->x(); @@ -353,7 +352,7 @@ qreal QQuickViewItem::itemX() const return item->x(); } -qreal QQuickViewItem::itemY() const +qreal QQuickItemViewTransitionableItem::itemY() const { // If item is transitioning to some pos, return that dest pos. // If item was redirected to some new pos before the current transition finished, @@ -366,7 +365,7 @@ qreal QQuickViewItem::itemY() const return item->y(); } -void QQuickViewItem::moveTo(const QPointF &pos) +void QQuickItemViewTransitionableItem::moveTo(const QPointF &pos) { if (transitionScheduledOrRunning()) { nextTransitionTo = pos; @@ -376,25 +375,18 @@ void QQuickViewItem::moveTo(const QPointF &pos) } } -void QQuickViewItem::setVisible(bool visible) -{ - if (!visible && transitionScheduledOrRunning()) - return; - item->setVisible(visible); -} - -bool QQuickViewItem::transitionScheduledOrRunning() const +bool QQuickItemViewTransitionableItem::transitionScheduledOrRunning() const { return (transition && transition->isRunning()) || nextTransitionType != QQuickItemViewTransitioner::NoTransition; } -bool QQuickViewItem::transitionRunning() const +bool QQuickItemViewTransitionableItem::transitionRunning() const { return (transition && transition->isRunning()); } -bool QQuickViewItem::isPendingRemoval() const +bool QQuickItemViewTransitionableItem::isPendingRemoval() const { if (nextTransitionType == QQuickItemViewTransitioner::RemoveTransition) return isTransitionTarget; @@ -403,7 +395,7 @@ bool QQuickViewItem::isPendingRemoval() const return false; } -bool QQuickViewItem::prepareTransition(QQuickItemViewTransitioner *transitioner, const QRectF &viewBounds) +bool QQuickItemViewTransitionableItem::prepareTransition(QQuickItemViewTransitioner *transitioner, int index, const QRectF &viewBounds) { bool doTransition = false; @@ -478,7 +470,7 @@ bool QQuickViewItem::prepareTransition(QQuickItemViewTransitioner *transitioner, return doTransition; } -void QQuickViewItem::startTransition(QQuickItemViewTransitioner *transitioner) +void QQuickItemViewTransitionableItem::startTransition(QQuickItemViewTransitioner *transitioner, int index) { if (nextTransitionType == QQuickItemViewTransitioner::NoTransition) return; @@ -498,12 +490,12 @@ void QQuickViewItem::startTransition(QQuickItemViewTransitioner *transitioner) if (!nextTransitionToSet) moveTo(item->pos()); - transition->startTransition(this, transitioner, nextTransitionType, nextTransitionTo, isTransitionTarget); + transition->startTransition(this, index, transitioner, nextTransitionType, nextTransitionTo, isTransitionTarget); nextTransitionType = QQuickItemViewTransitioner::NoTransition; prepared = false; } -void QQuickViewItem::setNextTransition(QQuickItemViewTransitioner::TransitionType type, bool isTargetItem) +void QQuickItemViewTransitionableItem::setNextTransition(QQuickItemViewTransitioner::TransitionType type, bool isTargetItem) { // Don't reset nextTransitionToSet - once it is set, it cannot be changed // until the animation finishes since the itemX() and itemY() may be used @@ -512,20 +504,20 @@ void QQuickViewItem::setNextTransition(QQuickItemViewTransitioner::TransitionTyp isTransitionTarget = isTargetItem; } -bool QQuickViewItem::transitionWillChangePosition() const +bool QQuickItemViewTransitionableItem::transitionWillChangePosition() const { if (transitionRunning() && transition->m_toPos != nextTransitionTo) return true; return nextTransitionTo != item->pos(); } -void QQuickViewItem::finishedTransition() +void QQuickItemViewTransitionableItem::finishedTransition() { nextTransitionToSet = false; nextTransitionTo = QPointF(); } -void QQuickViewItem::resetTransitionData() +void QQuickItemViewTransitionableItem::resetTransitionData() { nextTransitionType = QQuickItemViewTransitioner::NoTransition; isTransitionTarget = false; diff --git a/src/quick/items/qquickitemviewtransition_p.h b/src/quick/items/qquickitemviewtransition_p.h index 73c238e..d50b056 100644 --- a/src/quick/items/qquickitemviewtransition_p.h +++ b/src/quick/items/qquickitemviewtransition_p.h @@ -51,7 +51,7 @@ QT_BEGIN_NAMESPACE QT_MODULE(Quick) class QQuickItem; -class QQuickViewItem; +class QQuickItemViewTransitionableItem; class QQuickItemViewTransitionJob; @@ -61,7 +61,7 @@ public: QQuickItemViewTransitionChangeListener() {} virtual ~QQuickItemViewTransitionChangeListener() {} - virtual void viewItemTransitionFinished(QQuickViewItem *item) = 0; + virtual void viewItemTransitionFinished(QQuickItemViewTransitionableItem *item) = 0; }; @@ -80,9 +80,9 @@ public: virtual ~QQuickItemViewTransitioner(); bool canTransition(QQuickItemViewTransitioner::TransitionType type, bool asTarget) const; - void transitionNextReposition(QQuickViewItem *item, QQuickItemViewTransitioner::TransitionType type, bool isTarget); + void transitionNextReposition(QQuickItemViewTransitionableItem *item, QQuickItemViewTransitioner::TransitionType type, bool isTarget); - void addToTargetLists(QQuickItemViewTransitioner::TransitionType type, QQuickViewItem *item, int index); + void addToTargetLists(QQuickItemViewTransitioner::TransitionType type, QQuickItemViewTransitionableItem *item, int index); void resetTargetLists(); QQuickTransition *transitionObject(QQuickItemViewTransitioner::TransitionType type, bool asTarget); @@ -116,37 +116,35 @@ private: QQuickItemViewTransitionChangeListener *changeListener; bool usePopulateTransition; - void finishedTransition(QQuickItemViewTransitionJob *job, QQuickViewItem *item); + void finishedTransition(QQuickItemViewTransitionJob *job, QQuickItemViewTransitionableItem *item); }; /* - An item in a view, that can be transitioned using QQuickViewTransitionJob. + An item that can be transitioned using QQuickViewTransitionJob. */ -class QQuickViewItem +class QQuickItemViewTransitionableItem { public: - QQuickViewItem(QQuickItem *i); - virtual ~QQuickViewItem(); + QQuickItemViewTransitionableItem(QQuickItem *i); + virtual ~QQuickItemViewTransitionableItem(); qreal itemX() const; qreal itemY() const; void moveTo(const QPointF &pos); - void setVisible(bool visible); bool transitionScheduledOrRunning() const; bool transitionRunning() const; bool isPendingRemoval() const; - bool prepareTransition(QQuickItemViewTransitioner *transitioner, const QRectF &viewBounds); - void startTransition(QQuickItemViewTransitioner *transitioner); + bool prepareTransition(QQuickItemViewTransitioner *transitioner, int index, const QRectF &viewBounds); + void startTransition(QQuickItemViewTransitioner *transitioner, int index); QPointF nextTransitionTo; QQuickItem *item; QQuickItemViewTransitionJob *transition; QQuickItemViewTransitioner::TransitionType nextTransitionType; - int index; bool isTransitionTarget; bool nextTransitionToSet; bool prepared; diff --git a/src/quick/items/qquicklistview.cpp b/src/quick/items/qquicklistview.cpp index a2f687c..0b9d1c2 100644 --- a/src/quick/items/qquicklistview.cpp +++ b/src/quick/items/qquicklistview.cpp @@ -2786,8 +2786,7 @@ bool QQuickListViewPrivate::applyInsertionChange(const QQuickChangeSet::Insert & insertResult->changedFirstItem = true; if (!change.isMove()) { addedItems->append(item); - if (transitioner) - transitioner->transitionNextReposition(item, QQuickItemViewTransitioner::AddTransition, true); + item->transitionNextReposition(transitioner, QQuickItemViewTransitioner::AddTransition, true); } insertResult->sizeChangesBeforeVisiblePos += item->size() + spacing; pos -= item->size() + spacing; @@ -2817,8 +2816,7 @@ bool QQuickListViewPrivate::applyInsertionChange(const QQuickChangeSet::Insert & movingIntoView->append(MovedItem(item, change.moveKey(item->index))); } else { addedItems->append(item); - if (transitioner) - transitioner->transitionNextReposition(item, QQuickItemViewTransitioner::AddTransition, true); + item->transitionNextReposition(transitioner, QQuickItemViewTransitioner::AddTransition, true); } insertResult->sizeChangesAfterVisiblePos += item->size() + spacing; pos += item->size() + spacing; @@ -2828,13 +2826,12 @@ bool QQuickListViewPrivate::applyInsertionChange(const QQuickChangeSet::Insert & for (; index < visibleItems.count(); ++index) { FxViewItem *item = visibleItems.at(index); - if (item->index != -1) + if (item->index != -1) { item->index += count; - if (transitioner) { if (change.isMove()) - transitioner->transitionNextReposition(item, QQuickItemViewTransitioner::MoveTransition, false); + item->transitionNextReposition(transitioner, QQuickItemViewTransitioner::MoveTransition, false); else - transitioner->transitionNextReposition(item, QQuickItemViewTransitioner::AddTransition, false); + item->transitionNextReposition(transitioner, QQuickItemViewTransitioner::AddTransition, false); } } @@ -2869,7 +2866,7 @@ void QQuickListViewPrivate::translateAndTransitionItemsAfter(int afterModelIndex if (!listItem->transitionScheduledOrRunning()) { qreal pos = listItem->position(); listItem->setPosition(pos - sizeRemoved); - transitioner->transitionNextReposition(listItem, QQuickItemViewTransitioner::RemoveTransition, false); + listItem->transitionNextReposition(transitioner, QQuickItemViewTransitioner::RemoveTransition, false); listItem->setPosition(pos); } } diff --git a/src/quick/items/qquickpositioners.cpp b/src/quick/items/qquickpositioners.cpp index e9a0c17..4a4e6fc 100644 --- a/src/quick/items/qquickpositioners.cpp +++ b/src/quick/items/qquickpositioners.cpp @@ -72,6 +72,60 @@ void QQuickBasePositionerPrivate::unwatchChanges(QQuickItem* other) otherPrivate->removeItemChangeListener(this, watchedChanges); } + +QQuickBasePositioner::PositionedItem::PositionedItem(QQuickItem *i) + : item(i) + , transitionableItem(0) + , index(-1) + , isNew(false) + , isVisible(true) +{ +} + +QQuickBasePositioner::PositionedItem::~PositionedItem() +{ + delete transitionableItem; +} + +qreal QQuickBasePositioner::PositionedItem::itemX() const +{ + return transitionableItem ? transitionableItem->itemX() : item->x(); +} + +qreal QQuickBasePositioner::PositionedItem::itemY() const +{ + return transitionableItem ? transitionableItem->itemY() : item->y(); +} + +void QQuickBasePositioner::PositionedItem::moveTo(const QPointF &pos) +{ + if (transitionableItem) + transitionableItem->moveTo(pos); + else + item->setPos(pos); +} + +void QQuickBasePositioner::PositionedItem::transitionNextReposition(QQuickItemViewTransitioner *transitioner, QQuickItemViewTransitioner::TransitionType type, bool asTarget) +{ + if (!transitioner) + return; + if (!transitionableItem) + transitionableItem = new QQuickItemViewTransitionableItem(item); + transitioner->transitionNextReposition(transitionableItem, type, asTarget); +} + +bool QQuickBasePositioner::PositionedItem::prepareTransition(QQuickItemViewTransitioner *transitioner, const QRectF &viewBounds) +{ + return transitionableItem ? transitionableItem->prepareTransition(transitioner, index, viewBounds) : false; +} + +void QQuickBasePositioner::PositionedItem::startTransition(QQuickItemViewTransitioner *transitioner) +{ + if (transitionableItem) + transitionableItem->startTransition(transitioner, index); +} + + QQuickBasePositioner::QQuickBasePositioner(PositionerType at, QQuickItem *parent) : QQuickImplicitSizeItem(*(new QQuickBasePositionerPrivate), parent) { @@ -246,8 +300,7 @@ void QQuickBasePositioner::prePositioning() if (addedIndex < 0) addedIndex = posItem.index; PositionedItem *theItem = &positionedItems[positionedItems.count()-1]; - d->transitioner->transitionNextReposition(theItem, - QQuickItemViewTransitioner::AddTransition, true); + theItem->transitionNextReposition(d->transitioner, QQuickItemViewTransitioner::AddTransition, true); } } } else { @@ -268,8 +321,7 @@ void QQuickBasePositioner::prePositioning() if (d->transitioner) { if (addedIndex < 0) addedIndex = item->index; - d->transitioner->transitionNextReposition(&positionedItems[positionedItems.count()-1], - QQuickItemViewTransitioner::AddTransition, true); + positionedItems[positionedItems.count()-1].transitionNextReposition(d->transitioner, QQuickItemViewTransitioner::AddTransition, true); } } else { item->isNew = false; @@ -283,11 +335,11 @@ void QQuickBasePositioner::prePositioning() for (int i=0; i= 0) { - d->transitioner->transitionNextReposition(&positionedItems[i], QQuickItemViewTransitioner::AddTransition, false); + positionedItems[i].transitionNextReposition(d->transitioner, QQuickItemViewTransitioner::AddTransition, false); } else { // just queue the item for a move-type displace - if the item hasn't // moved anywhere, it won't be transitioned anyway - d->transitioner->transitionNextReposition(&positionedItems[i], QQuickItemViewTransitioner::MoveTransition, false); + positionedItems[i].transitionNextReposition(d->transitioner, QQuickItemViewTransitioner::MoveTransition, false); } } } diff --git a/src/quick/items/qquickpositioners_p.h b/src/quick/items/qquickpositioners_p.h index 8921bfa..1e456a9 100644 --- a/src/quick/items/qquickpositioners_p.h +++ b/src/quick/items/qquickpositioners_p.h @@ -133,12 +133,25 @@ protected: virtual void doPositioning(QSizeF *contentSize)=0; virtual void reportConflictingAnchors()=0; - class PositionedItem : public QQuickViewItem + class PositionedItem { public : - PositionedItem(QQuickItem *i) : QQuickViewItem(i), isNew(false), isVisible(true) {} + PositionedItem(QQuickItem *i); + ~PositionedItem(); bool operator==(const PositionedItem &other) const { return other.item == item; } + qreal itemX() const; + qreal itemY() const; + + void moveTo(const QPointF &pos); + + void transitionNextReposition(QQuickItemViewTransitioner *transitioner, QQuickItemViewTransitioner::TransitionType type, bool asTarget); + bool prepareTransition(QQuickItemViewTransitioner *transitioner, const QRectF &viewBounds); + void startTransition(QQuickItemViewTransitioner *transitioner); + + QQuickItem *item; + QQuickItemViewTransitionableItem *transitionableItem; + int index; bool isNew; bool isVisible; }; -- 1.7.2.5