Accept default targets for transitions
authorBea Lam <bea.lam@nokia.com>
Fri, 3 Feb 2012 03:18:05 +0000 (13:18 +1000)
committerQt by Nokia <qt-info@nokia.com>
Wed, 8 Feb 2012 02:27:31 +0000 (03:27 +0100)
QDeclarativeAbstractAnimation::transition(),
QDeclarativeTransition::prepare() and QDeclarativeTransitionManager
now accept a QObject* to specify a default target for a transition.
For view transitions, this will allow the view to pass a view item
as the default target for a view transition so that the Transition
does not have to explicitly set the target for every animation.

Change-Id: I2c8d5535283335e139d98ef56f399f338627fb3e
Reviewed-by: Michael Brasser <michael.brasser@nokia.com>
src/quick/items/qquickanimation.cpp
src/quick/items/qquickanimation_p.h
src/quick/util/qdeclarativeanimation.cpp
src/quick/util/qdeclarativeanimation_p.h
src/quick/util/qdeclarativetransition.cpp
src/quick/util/qdeclarativetransition_p.h
src/quick/util/qdeclarativetransitionmanager.cpp
src/quick/util/qdeclarativetransitionmanager_p_p.h

index baf1c8d..4962fc2 100644 (file)
@@ -206,7 +206,8 @@ QPointF QQuickParentAnimationPrivate::computeTransformOrigin(QQuickItem::Transfo
 
 QAbstractAnimationJob* QQuickParentAnimation::transition(QDeclarativeStateActions &actions,
                         QDeclarativeProperties &modified,
-                        TransitionDirection direction)
+                        TransitionDirection direction,
+                        QObject *defaultTarget)
 {
     Q_D(QQuickParentAnimation);
 
@@ -387,7 +388,7 @@ QAbstractAnimationJob* QQuickParentAnimation::transition(QDeclarativeStateAction
         for (int ii = 0; ii < d->animations.count(); ++ii) {
             if (valid)
                 d->animations.at(ii)->setDefaultTarget(d->defaultProperty);
-            anim = d->animations.at(ii)->transition(actions, modified, direction);
+            anim = d->animations.at(ii)->transition(actions, modified, direction, defaultTarget);
             ag->appendAnimation(anim);
         }
 
@@ -521,9 +522,11 @@ void QQuickAnchorAnimation::setEasing(const QEasingCurve &e)
 
 QAbstractAnimationJob* QQuickAnchorAnimation::transition(QDeclarativeStateActions &actions,
                         QDeclarativeProperties &modified,
-                        TransitionDirection direction)
+                        TransitionDirection direction,
+                        QObject *defaultTarget)
 {
     Q_UNUSED(modified);
+    Q_UNUSED(defaultTarget);
     Q_D(QQuickAnchorAnimation);
     QDeclarativeAnimationPropertyUpdater *data = new QDeclarativeAnimationPropertyUpdater;
     data->interpolatorType = QMetaType::QReal;
@@ -823,15 +826,18 @@ void QQuickPathAnimation::setEndRotation(qreal rotation)
 
 QAbstractAnimationJob* QQuickPathAnimation::transition(QDeclarativeStateActions &actions,
                                            QDeclarativeProperties &modified,
-                                           TransitionDirection direction)
+                                           TransitionDirection direction,
+                                           QObject *defaultTarget)
 {
     Q_D(QQuickPathAnimation);
 
+    QQuickItem *target = d->target ? d->target : qobject_cast<QQuickItem*>(defaultTarget);
+
     QQuickPathAnimationUpdater prevData;
     bool havePrevData = false;
-    if (d->activeAnimations.contains(d->target)) {
+    if (d->activeAnimations.contains(target)) {
         havePrevData = true;
-        prevData = *d->activeAnimations[d->target]->pathUpdater();
+        prevData = *d->activeAnimations[target]->pathUpdater();
     }
 
     QList<QQuickItem*> keys = d->activeAnimations.keys();
@@ -846,7 +852,7 @@ QAbstractAnimationJob* QQuickPathAnimation::transition(QDeclarativeStateActions
     QQuickPathAnimationUpdater *data = new QQuickPathAnimationUpdater();
     QQuickPathAnimationAnimator *pa = new QQuickPathAnimationAnimator(d);
 
-    d->activeAnimations[d->target] = pa;
+    d->activeAnimations[target] = pa;
 
     data->orientation = d->orientation;
     data->anchorPoint = d->anchorPoint;
@@ -863,21 +869,21 @@ QAbstractAnimationJob* QQuickPathAnimation::transition(QDeclarativeStateActions
         QDeclarativeAction &action = actions[i];
         if (action.event)
             continue;
-        if (action.specifiedObject == d->target && action.property.name() == QLatin1String("x")) {
+        if (action.specifiedObject == target && action.property.name() == QLatin1String("x")) {
             data->toX = action.toValue.toReal();
             modified << action.property;
             action.fromValue = action.toValue;
         }
-        if (action.specifiedObject == d->target && action.property.name() == QLatin1String("y")) {
+        if (action.specifiedObject == target && action.property.name() == QLatin1String("y")) {
             data->toY = action.toValue.toReal();
             modified << action.property;
             action.fromValue = action.toValue;
         }
     }
 
-    if (d->target && d->path &&
+    if (target && d->path &&
         (modified.count() > origModifiedSize || data->toDefined)) {
-        data->target = d->target;
+        data->target = target;
         data->path = d->path;
         data->path->invalidateSequentialHistory();
 
index 924fe5d..38eba6d 100644 (file)
@@ -82,7 +82,8 @@ Q_SIGNALS:
 protected:
     virtual QAbstractAnimationJob* transition(QDeclarativeStateActions &actions,
                             QDeclarativeProperties &modified,
-                            TransitionDirection direction);
+                            TransitionDirection direction,
+                            QObject *defaultTarget = 0);
 };
 
 class QQuickAnchorAnimationPrivate;
@@ -113,7 +114,8 @@ Q_SIGNALS:
 protected:
     virtual QAbstractAnimationJob* transition(QDeclarativeStateActions &actions,
                             QDeclarativeProperties &modified,
-                            TransitionDirection direction);
+                            TransitionDirection direction,
+                            QObject *defaultTarget = 0);
 };
 
 class QQuickItem;
@@ -177,7 +179,8 @@ public:
 protected:
     virtual QAbstractAnimationJob* transition(QDeclarativeStateActions &actions,
                             QDeclarativeProperties &modified,
-                            TransitionDirection direction);
+                            TransitionDirection direction,
+                            QObject *defaultTarget = 0);
 Q_SIGNALS:
     void durationChanged(int);
     void easingChanged(const QEasingCurve &);
index ad86c56..e70c3ea 100644 (file)
@@ -582,11 +582,13 @@ QAbstractAnimationJob* QDeclarativeAbstractAnimation::initInstance(QAbstractAnim
 
 QAbstractAnimationJob* QDeclarativeAbstractAnimation::transition(QDeclarativeStateActions &actions,
                                       QDeclarativeProperties &modified,
-                                      TransitionDirection direction)
+                                      TransitionDirection direction,
+                                      QObject *defaultTarget)
 {
     Q_UNUSED(actions);
     Q_UNUSED(modified);
     Q_UNUSED(direction);
+    Q_UNUSED(defaultTarget);
     return 0;
 }
 
@@ -658,12 +660,14 @@ void QDeclarativePauseAnimation::setDuration(int duration)
 
 QAbstractAnimationJob* QDeclarativePauseAnimation::transition(QDeclarativeStateActions &actions,
                                     QDeclarativeProperties &modified,
-                                    TransitionDirection direction)
+                                    TransitionDirection direction,
+                                    QObject *defaultTarget)
 {
     Q_D(QDeclarativePauseAnimation);
     Q_UNUSED(actions);
     Q_UNUSED(modified);
     Q_UNUSED(direction);
+    Q_UNUSED(defaultTarget);
 
     return initInstance(new QPauseAnimationJob(d->duration));
 }
@@ -913,10 +917,12 @@ void QDeclarativeScriptActionPrivate::execute()
 
 QAbstractAnimationJob* QDeclarativeScriptAction::transition(QDeclarativeStateActions &actions,
                                     QDeclarativeProperties &modified,
-                                    TransitionDirection direction)
+                                    TransitionDirection direction,
+                                    QObject *defaultTarget)
 {
     Q_D(QDeclarativeScriptAction);
     Q_UNUSED(modified);
+    Q_UNUSED(defaultTarget);
 
     d->hasRunScriptScript = false;
     d->reversing = (direction == Backward);
@@ -1087,7 +1093,8 @@ void QDeclarativePropertyAction::setValue(const QVariant &v)
 
 QAbstractAnimationJob* QDeclarativePropertyAction::transition(QDeclarativeStateActions &actions,
                                       QDeclarativeProperties &modified,
-                                      TransitionDirection direction)
+                                      TransitionDirection direction,
+                                      QObject *defaultTarget)
 {
     Q_D(QDeclarativePropertyAction);
     Q_UNUSED(direction);
@@ -1121,6 +1128,9 @@ QAbstractAnimationJob* QDeclarativePropertyAction::transition(QDeclarativeStateA
         targets << d->defaultProperty.object();
     }
 
+    if (defaultTarget && targets.isEmpty())
+        targets << defaultTarget;
+
     QDeclarativeSetPropertyAnimationAction *data = new QDeclarativeSetPropertyAnimationAction;
 
     bool hasExplicit = false;
@@ -1652,7 +1662,8 @@ QDeclarativeSequentialAnimation::~QDeclarativeSequentialAnimation()
 
 QAbstractAnimationJob* QDeclarativeSequentialAnimation::transition(QDeclarativeStateActions &actions,
                                     QDeclarativeProperties &modified,
-                                    TransitionDirection direction)
+                                    TransitionDirection direction,
+                                    QObject *defaultTarget)
 {
     Q_D(QDeclarativeAnimationGroup);
 
@@ -1670,7 +1681,7 @@ QAbstractAnimationJob* QDeclarativeSequentialAnimation::transition(QDeclarativeS
     for (int ii = from; ii < d->animations.count() && ii >= 0; ii += inc) {
         if (valid)
             d->animations.at(ii)->setDefaultTarget(d->defaultProperty);
-        anim = d->animations.at(ii)->transition(actions, modified, direction);
+        anim = d->animations.at(ii)->transition(actions, modified, direction, defaultTarget);
         inc == -1 ? ag->prependAnimation(anim) : ag->appendAnimation(anim);
     }
 
@@ -1718,7 +1729,8 @@ QDeclarativeParallelAnimation::~QDeclarativeParallelAnimation()
 
 QAbstractAnimationJob* QDeclarativeParallelAnimation::transition(QDeclarativeStateActions &actions,
                                       QDeclarativeProperties &modified,
-                                      TransitionDirection direction)
+                                      TransitionDirection direction,
+                                      QObject *defaultTarget)
 {
     Q_D(QDeclarativeAnimationGroup);
     QParallelAnimationGroupJob *ag = new QParallelAnimationGroupJob;
@@ -1728,7 +1740,7 @@ QAbstractAnimationJob* QDeclarativeParallelAnimation::transition(QDeclarativeSta
     for (int ii = 0; ii < d->animations.count(); ++ii) {
         if (valid)
             d->animations.at(ii)->setDefaultTarget(d->defaultProperty);
-        anim = d->animations.at(ii)->transition(actions, modified, direction);
+        anim = d->animations.at(ii)->transition(actions, modified, direction, defaultTarget);
         ag->appendAnimation(anim);
     }
     return initInstance(ag);
@@ -2391,7 +2403,8 @@ void QDeclarativeAnimationPropertyUpdater::setValue(qreal v)
 }
 
 QDeclarativeStateActions QDeclarativePropertyAnimation::createTransitionActions(QDeclarativeStateActions &actions,
-                                                                                QDeclarativeProperties &modified)
+                                                                                QDeclarativeProperties &modified,
+                                                                                QObject *defaultTarget)
 {
     Q_D(QDeclarativePropertyAnimation);
     QDeclarativeStateActions newActions;
@@ -2414,6 +2427,9 @@ QDeclarativeStateActions QDeclarativePropertyAnimation::createTransitionActions(
         targets << d->defaultProperty.object();
     }
 
+    if (defaultTarget && targets.isEmpty())
+        targets << defaultTarget;
+
     if (props.isEmpty() && !d->defaultProperties.isEmpty()) {
         props << d->defaultProperties.split(QLatin1Char(','));
     }
@@ -2484,11 +2500,12 @@ QDeclarativeStateActions QDeclarativePropertyAnimation::createTransitionActions(
 
 QAbstractAnimationJob* QDeclarativePropertyAnimation::transition(QDeclarativeStateActions &actions,
                                                                      QDeclarativeProperties &modified,
-                                                                     TransitionDirection direction)
+                                                                     TransitionDirection direction,
+                                                                     QObject *defaultTarget)
 {
     Q_D(QDeclarativePropertyAnimation);
 
-    QDeclarativeStateActions dataActions = createTransitionActions(actions, modified);
+    QDeclarativeStateActions dataActions = createTransitionActions(actions, modified, defaultTarget);
 
     QDeclarativeBulkValueAnimator *animator = new QDeclarativeBulkValueAnimator;
     animator->setDuration(d->duration);
index 8bd6d4f..ec6a428 100644 (file)
@@ -128,7 +128,8 @@ public:
     enum TransitionDirection { Forward, Backward };
     virtual QAbstractAnimationJob* transition(QDeclarativeStateActions &actions,
                             QDeclarativeProperties &modified,
-                            TransitionDirection direction);
+                            TransitionDirection direction,
+                            QObject *defaultTarget = 0);
     QAbstractAnimationJob* qtAnimation();
 
 private Q_SLOTS:
@@ -161,7 +162,8 @@ Q_SIGNALS:
 protected:
     QAbstractAnimationJob* transition(QDeclarativeStateActions &actions,
                                           QDeclarativeProperties &modified,
-                                          TransitionDirection direction);
+                                          TransitionDirection direction,
+                                          QObject *defaultTarget = 0);
 };
 
 class QDeclarativeScriptActionPrivate;
@@ -186,7 +188,8 @@ public:
 protected:
     virtual QAbstractAnimationJob* transition(QDeclarativeStateActions &actions,
                             QDeclarativeProperties &modified,
-                            TransitionDirection direction);
+                            TransitionDirection direction,
+                            QObject *defaultTarget = 0);
 };
 
 class QDeclarativePropertyActionPrivate;
@@ -230,7 +233,8 @@ Q_SIGNALS:
 protected:
     virtual QAbstractAnimationJob* transition(QDeclarativeStateActions &actions,
                             QDeclarativeProperties &modified,
-                            TransitionDirection direction);
+                            TransitionDirection direction,
+                            QObject *defaultTarget = 0);
 };
 
 class QDeclarativePropertyAnimationPrivate;
@@ -279,12 +283,14 @@ public:
 
 protected:
     QDeclarativeStateActions createTransitionActions(QDeclarativeStateActions &actions,
-                                                     QDeclarativeProperties &modified);
+                                                     QDeclarativeProperties &modified,
+                                                     QObject *defaultTarget = 0);
 
     QDeclarativePropertyAnimation(QDeclarativePropertyAnimationPrivate &dd, QObject *parent);
     virtual QAbstractAnimationJob* transition(QDeclarativeStateActions &actions,
                             QDeclarativeProperties &modified,
-                            TransitionDirection direction);
+                            TransitionDirection direction,
+                            QObject *defaultTarget = 0);
 Q_SIGNALS:
     void durationChanged(int);
     void fromChanged(QVariant);
@@ -418,7 +424,8 @@ public:
 protected:
     virtual QAbstractAnimationJob* transition(QDeclarativeStateActions &actions,
                             QDeclarativeProperties &modified,
-                            TransitionDirection direction);
+                            TransitionDirection direction,
+                            QObject *defaultTarget = 0);
 };
 
 class Q_QUICK_PRIVATE_EXPORT QDeclarativeParallelAnimation : public QDeclarativeAnimationGroup
@@ -433,7 +440,8 @@ public:
 protected:
     virtual QAbstractAnimationJob* transition(QDeclarativeStateActions &actions,
                             QDeclarativeProperties &modified,
-                            TransitionDirection direction);
+                            TransitionDirection direction,
+                            QObject *defaultTarget = 0);
 };
 
 
index 2a05dd2..c52ce92 100644 (file)
@@ -217,7 +217,8 @@ void QDeclarativeTransition::setReversed(bool r)
 
 QDeclarativeTransitionInstance *QDeclarativeTransition::prepare(QDeclarativeStateOperation::ActionList &actions,
                             QList<QDeclarativeProperty> &after,
-                            QDeclarativeTransitionManager *manager)
+                            QDeclarativeTransitionManager *manager,
+                            QObject *defaultTarget)
 {
     Q_D(QDeclarativeTransition);
 
@@ -232,7 +233,7 @@ QDeclarativeTransitionInstance *QDeclarativeTransition::prepare(QDeclarativeStat
 
     QAbstractAnimationJob *anim = 0;
     for (int i = start; i != end;) {
-        anim = d->animations.at(i)->transition(actions, after, direction);
+        anim = d->animations.at(i)->transition(actions, after, direction, defaultTarget);
         if (anim)
             d->reversed ? group->prependAnimation(anim) : group->appendAnimation(anim);
         d->reversed ? --i : ++i;
index 64fd45b..839a626 100644 (file)
@@ -106,7 +106,8 @@ public:
 
     QDeclarativeTransitionInstance *prepare(QDeclarativeStateOperation::ActionList &actions,
                  QList<QDeclarativeProperty> &after,
-                 QDeclarativeTransitionManager *end);
+                 QDeclarativeTransitionManager *end,
+                 QObject *defaultTarget);
 
     void setReversed(bool r);
 
index a2de7db..7b4e8f4 100644 (file)
@@ -128,7 +128,8 @@ void QDeclarativeTransitionManager::finished()
 }
 
 void QDeclarativeTransitionManager::transition(const QList<QDeclarativeAction> &list,
-                                      QDeclarativeTransition *transition)
+                                      QDeclarativeTransition *transition,
+                                      QObject *defaultTarget)
 {
     cancel();
 
@@ -208,7 +209,7 @@ void QDeclarativeTransitionManager::transition(const QList<QDeclarativeAction> &
     if (transition) {
         QList<QDeclarativeProperty> touched;
         QDeclarativeTransitionInstance *oldInstance = d->transitionInstance;
-        d->transitionInstance = transition->prepare(applyList, touched, this);
+        d->transitionInstance = transition->prepare(applyList, touched, this, defaultTarget);
         d->transitionInstance->start();
         if (oldInstance && oldInstance != d->transitionInstance)
             delete oldInstance;
index 4e5d1a9..d548c05 100644 (file)
@@ -68,7 +68,7 @@ public:
 
     bool isRunning() const;
 
-    void transition(const QList<QDeclarativeAction> &, QDeclarativeTransition *transition);
+    void transition(const QList<QDeclarativeAction> &, QDeclarativeTransition *transition, QObject *defaultTarget = 0);
 
     void cancel();