aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/items/qquickitemviewtransition.cpp
diff options
context:
space:
mode:
authorMatthew Vogt <matthew.vogt@nokia.com>2012-03-12 08:18:01 +1000
committerMatthew Vogt <matthew.vogt@nokia.com>2012-03-12 08:35:40 +1000
commit1f52c5430144eb7ba6baa7e3954675ca0707b947 (patch)
tree22106095d5cc61c7b5625c8ff2639e1530d2c3b0 /src/quick/items/qquickitemviewtransition.cpp
parent616bbd1988f3b92f7d980b6c9a1278f11b712573 (diff)
parented74ec4c40f1476c545bcaacb12fe3a607172035 (diff)
Merge branch 'master' of git://gitorious.org/qt/qtdeclarative into api_changes
Diffstat (limited to 'src/quick/items/qquickitemviewtransition.cpp')
-rw-r--r--src/quick/items/qquickitemviewtransition.cpp77
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;