diff options
Diffstat (limited to 'src/quick/util/qdeclarativetransition.cpp')
-rw-r--r-- | src/quick/util/qdeclarativetransition.cpp | 100 |
1 files changed, 60 insertions, 40 deletions
diff --git a/src/quick/util/qdeclarativetransition.cpp b/src/quick/util/qdeclarativetransition.cpp index 12966b53f7..2a05dd20d3 100644 --- a/src/quick/util/qdeclarativetransition.cpp +++ b/src/quick/util/qdeclarativetransition.cpp @@ -48,7 +48,7 @@ #include "qdeclarativeanimation_p_p.h" #include "qdeclarativetransitionmanager_p_p.h" -#include <QParallelAnimationGroup> +#include "private/qparallelanimationgroupjob_p.h" QT_BEGIN_NAMESPACE @@ -96,16 +96,44 @@ QT_BEGIN_NAMESPACE \sa {QML Animation and Transitions}, {declarative/animation/states}{states example}, {qmlstates}{States}, {QtDeclarative} */ +QDeclarativeTransitionInstance::QDeclarativeTransitionInstance() + : m_anim(0) +{ +} + +QDeclarativeTransitionInstance::~QDeclarativeTransitionInstance() +{ + delete m_anim; +} + +void QDeclarativeTransitionInstance::start() +{ + if (m_anim) + m_anim->start(); +} + +void QDeclarativeTransitionInstance::stop() +{ + if (m_anim) + m_anim->stop(); +} + +bool QDeclarativeTransitionInstance::isRunning() const +{ + return m_anim && m_anim->state() == QAbstractAnimationJob::Running; +} + + //ParallelAnimationWrapper allows us to do a "callback" when the animation finishes, rather than connecting //and disconnecting signals and slots frequently -class ParallelAnimationWrapper : public QParallelAnimationGroup +class ParallelAnimationWrapper : public QParallelAnimationGroupJob { - Q_OBJECT public: - ParallelAnimationWrapper(QObject *parent = 0) : QParallelAnimationGroup(parent) {} - QDeclarativeTransitionPrivate *trans; + ParallelAnimationWrapper() : QParallelAnimationGroupJob() {} + QDeclarativeTransitionManager *manager; + protected: - virtual void updateState(QAbstractAnimation::State newState, QAbstractAnimation::State oldState); + virtual void updateState(QAbstractAnimationJob::State newState, QAbstractAnimationJob::State oldState); }; class QDeclarativeTransitionPrivate : public QObjectPrivate @@ -114,9 +142,8 @@ class QDeclarativeTransitionPrivate : public QObjectPrivate public: QDeclarativeTransitionPrivate() : fromState(QLatin1String("*")), toState(QLatin1String("*")), - reversed(false), reversible(false), enabled(true), manager(0) + reversed(false), reversible(false), enabled(true) { - group.trans = this; } QString fromState; @@ -124,13 +151,7 @@ public: bool reversed; bool reversible; bool enabled; - ParallelAnimationWrapper group; - QDeclarativeTransitionManager *manager; - void complete() - { - manager->complete(); - } static void append_animation(QDeclarativeListProperty<QDeclarativeAbstractAnimation> *list, QDeclarativeAbstractAnimation *a); static int animation_count(QDeclarativeListProperty<QDeclarativeAbstractAnimation> *list); static QDeclarativeAbstractAnimation* animation_at(QDeclarativeListProperty<QDeclarativeAbstractAnimation> *list, int pos); @@ -142,7 +163,6 @@ void QDeclarativeTransitionPrivate::append_animation(QDeclarativeListProperty<QD { QDeclarativeTransition *q = static_cast<QDeclarativeTransition *>(list->object); q->d_func()->animations.append(a); - q->d_func()->group.addAnimation(a->qtAnimation()); a->setDisableUserControl(); } @@ -163,24 +183,22 @@ void QDeclarativeTransitionPrivate::clear_animations(QDeclarativeListProperty<QD QDeclarativeTransition *q = static_cast<QDeclarativeTransition *>(list->object); while (q->d_func()->animations.count()) { QDeclarativeAbstractAnimation *firstAnim = q->d_func()->animations.at(0); - q->d_func()->group.removeAnimation(firstAnim->qtAnimation()); q->d_func()->animations.removeAll(firstAnim); } } -void ParallelAnimationWrapper::updateState(QAbstractAnimation::State newState, QAbstractAnimation::State oldState) +void ParallelAnimationWrapper::updateState(QAbstractAnimationJob::State newState, QAbstractAnimationJob::State oldState) { - QParallelAnimationGroup::updateState(newState, oldState); + QParallelAnimationGroupJob::updateState(newState, oldState); if (newState == Stopped && (duration() == -1 - || (direction() == QAbstractAnimation::Forward && currentLoopTime() == duration()) - || (direction() == QAbstractAnimation::Backward && currentLoopTime() == 0))) + || (direction() == QAbstractAnimationJob::Forward && currentLoopTime() == duration()) + || (direction() == QAbstractAnimationJob::Backward && currentLoopTime() == 0))) { - trans->complete(); + manager->complete(); } } - QDeclarativeTransition::QDeclarativeTransition(QObject *parent) : QObject(*(new QDeclarativeTransitionPrivate), parent) { @@ -188,12 +206,7 @@ QDeclarativeTransition::QDeclarativeTransition(QObject *parent) QDeclarativeTransition::~QDeclarativeTransition() { -} - -void QDeclarativeTransition::stop() -{ Q_D(QDeclarativeTransition); - d->group.stop(); } void QDeclarativeTransition::setReversed(bool r) @@ -202,7 +215,7 @@ void QDeclarativeTransition::setReversed(bool r) d->reversed = r; } -void QDeclarativeTransition::prepare(QDeclarativeStateOperation::ActionList &actions, +QDeclarativeTransitionInstance *QDeclarativeTransition::prepare(QDeclarativeStateOperation::ActionList &actions, QList<QDeclarativeProperty> &after, QDeclarativeTransitionManager *manager) { @@ -210,19 +223,26 @@ void QDeclarativeTransition::prepare(QDeclarativeStateOperation::ActionList &act qmlExecuteDeferred(this); - if (d->reversed) { - for (int ii = d->animations.count() - 1; ii >= 0; --ii) { - d->animations.at(ii)->transition(actions, after, QDeclarativeAbstractAnimation::Backward); - } - } else { - for (int ii = 0; ii < d->animations.count(); ++ii) { - d->animations.at(ii)->transition(actions, after, QDeclarativeAbstractAnimation::Forward); - } + ParallelAnimationWrapper *group = new ParallelAnimationWrapper(); + group->manager = manager; + + QDeclarativeAbstractAnimation::TransitionDirection direction = d->reversed ? QDeclarativeAbstractAnimation::Backward : QDeclarativeAbstractAnimation::Forward; + int start = d->reversed ? d->animations.count() - 1 : 0; + int end = d->reversed ? -1 : d->animations.count(); + + QAbstractAnimationJob *anim = 0; + for (int i = start; i != end;) { + anim = d->animations.at(i)->transition(actions, after, direction); + if (anim) + d->reversed ? group->prependAnimation(anim) : group->appendAnimation(anim); + d->reversed ? --i : ++i; } - d->manager = manager; - d->group.setDirection(d->reversed ? QAbstractAnimation::Backward : QAbstractAnimation::Forward); - d->group.start(); + group->setDirection(d->reversed ? QAbstractAnimationJob::Backward : QAbstractAnimationJob::Forward); + + QDeclarativeTransitionInstance *wrapper = new QDeclarativeTransitionInstance; + wrapper->m_anim = group; + return wrapper; } /*! @@ -389,4 +409,4 @@ QDeclarativeListProperty<QDeclarativeAbstractAnimation> QDeclarativeTransition:: QT_END_NAMESPACE -#include <qdeclarativetransition.moc> +//#include <qdeclarativetransition.moc> |