From f5a43c09dbbf0caece4976303250a7582f6037ec Mon Sep 17 00:00:00 2001 From: Bea Lam Date: Fri, 3 Feb 2012 13:18:05 +1000 Subject: [PATCH] Accept default targets for transitions 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 --- src/quick/items/qquickanimation.cpp | 28 ++++++++++------ src/quick/items/qquickanimation_p.h | 9 +++-- src/quick/util/qdeclarativeanimation.cpp | 39 ++++++++++++++++------ src/quick/util/qdeclarativeanimation_p.h | 24 ++++++++----- src/quick/util/qdeclarativetransition.cpp | 5 +-- src/quick/util/qdeclarativetransition_p.h | 3 +- src/quick/util/qdeclarativetransitionmanager.cpp | 5 +-- src/quick/util/qdeclarativetransitionmanager_p_p.h | 2 +- 8 files changed, 76 insertions(+), 39 deletions(-) diff --git a/src/quick/items/qquickanimation.cpp b/src/quick/items/qquickanimation.cpp index baf1c8d..4962fc2 100644 --- a/src/quick/items/qquickanimation.cpp +++ b/src/quick/items/qquickanimation.cpp @@ -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(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 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(); diff --git a/src/quick/items/qquickanimation_p.h b/src/quick/items/qquickanimation_p.h index 924fe5d..38eba6d 100644 --- a/src/quick/items/qquickanimation_p.h +++ b/src/quick/items/qquickanimation_p.h @@ -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 &); diff --git a/src/quick/util/qdeclarativeanimation.cpp b/src/quick/util/qdeclarativeanimation.cpp index ad86c56..e70c3ea 100644 --- a/src/quick/util/qdeclarativeanimation.cpp +++ b/src/quick/util/qdeclarativeanimation.cpp @@ -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); diff --git a/src/quick/util/qdeclarativeanimation_p.h b/src/quick/util/qdeclarativeanimation_p.h index 8bd6d4f..ec6a428 100644 --- a/src/quick/util/qdeclarativeanimation_p.h +++ b/src/quick/util/qdeclarativeanimation_p.h @@ -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); }; diff --git a/src/quick/util/qdeclarativetransition.cpp b/src/quick/util/qdeclarativetransition.cpp index 2a05dd2..c52ce92 100644 --- a/src/quick/util/qdeclarativetransition.cpp +++ b/src/quick/util/qdeclarativetransition.cpp @@ -217,7 +217,8 @@ void QDeclarativeTransition::setReversed(bool r) QDeclarativeTransitionInstance *QDeclarativeTransition::prepare(QDeclarativeStateOperation::ActionList &actions, QList &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; diff --git a/src/quick/util/qdeclarativetransition_p.h b/src/quick/util/qdeclarativetransition_p.h index 64fd45b..839a626 100644 --- a/src/quick/util/qdeclarativetransition_p.h +++ b/src/quick/util/qdeclarativetransition_p.h @@ -106,7 +106,8 @@ public: QDeclarativeTransitionInstance *prepare(QDeclarativeStateOperation::ActionList &actions, QList &after, - QDeclarativeTransitionManager *end); + QDeclarativeTransitionManager *end, + QObject *defaultTarget); void setReversed(bool r); diff --git a/src/quick/util/qdeclarativetransitionmanager.cpp b/src/quick/util/qdeclarativetransitionmanager.cpp index a2de7db..7b4e8f4 100644 --- a/src/quick/util/qdeclarativetransitionmanager.cpp +++ b/src/quick/util/qdeclarativetransitionmanager.cpp @@ -128,7 +128,8 @@ void QDeclarativeTransitionManager::finished() } void QDeclarativeTransitionManager::transition(const QList &list, - QDeclarativeTransition *transition) + QDeclarativeTransition *transition, + QObject *defaultTarget) { cancel(); @@ -208,7 +209,7 @@ void QDeclarativeTransitionManager::transition(const QList & if (transition) { QList 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; diff --git a/src/quick/util/qdeclarativetransitionmanager_p_p.h b/src/quick/util/qdeclarativetransitionmanager_p_p.h index 4e5d1a9..d548c05 100644 --- a/src/quick/util/qdeclarativetransitionmanager_p_p.h +++ b/src/quick/util/qdeclarativetransitionmanager_p_p.h @@ -68,7 +68,7 @@ public: bool isRunning() const; - void transition(const QList &, QDeclarativeTransition *transition); + void transition(const QList &, QDeclarativeTransition *transition, QObject *defaultTarget = 0); void cancel(); -- 2.7.4