aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/util/qdeclarativetransition.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/quick/util/qdeclarativetransition.cpp')
-rw-r--r--src/quick/util/qdeclarativetransition.cpp100
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>