diff options
author | Matthew Vogt <matthew.vogt@nokia.com> | 2012-03-12 08:18:01 +1000 |
---|---|---|
committer | Matthew Vogt <matthew.vogt@nokia.com> | 2012-03-12 08:35:40 +1000 |
commit | 1f52c5430144eb7ba6baa7e3954675ca0707b947 (patch) | |
tree | 22106095d5cc61c7b5625c8ff2639e1530d2c3b0 /src/quick/items/qquickitemviewtransition.cpp | |
parent | 616bbd1988f3b92f7d980b6c9a1278f11b712573 (diff) | |
parent | ed74ec4c40f1476c545bcaacb12fe3a607172035 (diff) |
Merge branch 'master' of git://gitorious.org/qt/qtdeclarative into api_changes
Change-Id: I578b1e2f1bb374da6194e6ba04a0fd459b2632fe
Diffstat (limited to 'src/quick/items/qquickitemviewtransition.cpp')
-rw-r--r-- | src/quick/items/qquickitemviewtransition.cpp | 77 |
1 files changed, 43 insertions, 34 deletions
diff --git a/src/quick/items/qquickitemviewtransition.cpp b/src/quick/items/qquickitemviewtransition.cpp index 5669ef927e..d9dce49349 100644 --- a/src/quick/items/qquickitemviewtransition.cpp +++ b/src/quick/items/qquickitemviewtransition.cpp @@ -55,13 +55,14 @@ 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; + bool *m_wasDeleted; protected: virtual void finished(); @@ -73,16 +74,19 @@ QQuickItemViewTransitionJob::QQuickItemViewTransitionJob() , m_item(0) , m_type(QQuickItemViewTransitioner::NoTransition) , m_isTarget(false) + , m_wasDeleted(0) { } QQuickItemViewTransitionJob::~QQuickItemViewTransitionJob() { + if (m_wasDeleted) + *m_wasDeleted = true; if (m_transitioner) 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; @@ -110,7 +114,7 @@ void QQuickItemViewTransitionJob::startTransition(QQuickViewItem *item, QQuickIt QQuickViewTransitionAttached *attached = static_cast<QQuickViewTransitionAttached*>(qmlAttachedPropertiesObject<QQuickViewTransitionAttached>(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); @@ -134,8 +138,16 @@ void QQuickItemViewTransitionJob::finished() { QQuickTransitionManager::finished(); - if (m_transitioner) + if (m_transitioner) { + bool deleted = false; + m_wasDeleted = &deleted; m_transitioner->finishedTransition(this, m_item); + if (deleted) + return; + m_wasDeleted = 0; + + m_transitioner = 0; + } m_item = 0; m_toPos.setX(0); @@ -197,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: @@ -302,7 +314,7 @@ const QList<QObject *> &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; @@ -315,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(); @@ -341,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, @@ -354,35 +365,33 @@ qreal QQuickViewItem::itemY() const return item->y(); } -void QQuickViewItem::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); } } -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; @@ -391,7 +400,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; @@ -466,7 +475,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; @@ -486,12 +495,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 @@ -500,20 +509,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; |