summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorThierry Bastian <thierry.bastian@nokia.com>2009-10-06 11:06:05 (GMT)
committerThierry Bastian <thierry.bastian@nokia.com>2009-10-06 11:13:39 (GMT)
commit1f5afc4300d3d7e3063f4e2c80a280a5098717d1 (patch)
tree35aa8a65104394278ce26b0b040d852c98d7e415 /src
parent9dcd06efae3e2d78ef402bf06e655e7e95550a39 (diff)
downloadQt-1f5afc4300d3d7e3063f4e2c80a280a5098717d1.zip
Qt-1f5afc4300d3d7e3063f4e2c80a280a5098717d1.tar.gz
Qt-1f5afc4300d3d7e3063f4e2c80a280a5098717d1.tar.bz2
QParallelAnimationGroup: set the correct state for the animations
There were cases (now covered by autotests) where the state of the animations could be wrong. Reviewed-by: janarve
Diffstat (limited to 'src')
-rw-r--r--src/corelib/animation/qparallelanimationgroup.cpp76
-rw-r--r--src/corelib/animation/qparallelanimationgroup_p.h2
2 files changed, 49 insertions, 29 deletions
diff --git a/src/corelib/animation/qparallelanimationgroup.cpp b/src/corelib/animation/qparallelanimationgroup.cpp
index 5b7fd22..2812854 100644
--- a/src/corelib/animation/qparallelanimationgroup.cpp
+++ b/src/corelib/animation/qparallelanimationgroup.cpp
@@ -143,13 +143,14 @@ void QParallelAnimationGroup::updateCurrentTime(int currentTime)
// simulate completion of the loop seeking backwards
for (int i = 0; i < d->animations.size(); ++i) {
QAbstractAnimation *animation = d->animations.at(i);
+ //we need to make sure the animation is in the right state
+ //and then rewind it
+ d->applyGroupState(animation);
animation->setCurrentTime(0);
animation->stop();
}
}
- bool timeFwd = ((d->currentLoop == d->lastLoop && currentTime >= d->lastCurrentTime)
- || d->currentLoop > d->lastLoop);
#ifdef QANIMATION_DEBUG
qDebug("QParallellAnimationGroup %5d: setCurrentTime(%d), loop:%d, last:%d, timeFwd:%d, lastcurrent:%d, %d",
__LINE__, d->currentTime, d->currentLoop, d->lastLoop, timeFwd, d->lastCurrentTime, state());
@@ -158,34 +159,19 @@ void QParallelAnimationGroup::updateCurrentTime(int currentTime)
for (int i = 0; i < d->animations.size(); ++i) {
QAbstractAnimation *animation = d->animations.at(i);
const int dura = animation->totalDuration();
- if (dura == -1 && d->isUncontrolledAnimationFinished(animation))
- continue;
- if (dura == -1 || (currentTime <= dura && dura != 0)
- || (dura == 0 && d->currentLoop != d->lastLoop)) {
- switch (state()) {
- case Running:
- animation->start();
- break;
- case Paused:
- animation->pause();
- break;
- case Stopped:
- default:
- break;
- }
+ //if the loopcount is bigger we should always start all animations
+ if (d->currentLoop > d->lastLoop
+ //if we're at the end of the animation, we need to start it if it wasn't already started in this loop
+ //this happens in Backward direction where not all animations are started at the same time
+ || d->shouldAnimationStart(animation, d->lastCurrentTime > dura /*startIfAtEnd*/)) {
+ d->applyGroupState(animation);
}
- if (dura <= 0) {
- if (dura == -1)
- animation->setCurrentTime(currentTime);
- continue;
+ if (animation->state() == state()) {
+ animation->setCurrentTime(currentTime);
+ if (dura > 0 && currentTime > dura)
+ animation->stop();
}
-
- if ((timeFwd && d->lastCurrentTime <= dura)
- || (!timeFwd && d->currentTime <= dura))
- animation->setCurrentTime(currentTime);
- if (currentTime > dura)
- animation->stop();
}
d->lastLoop = d->currentLoop;
d->lastCurrentTime = currentTime;
@@ -208,7 +194,8 @@ void QParallelAnimationGroup::updateState(QAbstractAnimation::State oldState,
break;
case Paused:
for (int i = 0; i < d->animations.size(); ++i)
- d->animations.at(i)->pause();
+ if (d->animations.at(i)->state() == Running)
+ d->animations.at(i)->pause();
break;
case Running:
d->connectUncontrolledAnimations();
@@ -217,7 +204,8 @@ void QParallelAnimationGroup::updateState(QAbstractAnimation::State oldState,
if (oldState == Stopped)
animation->stop();
animation->setDirection(d->direction);
- animation->start();
+ if (d->shouldAnimationStart(animation, oldState == Stopped))
+ animation->start();
}
break;
}
@@ -280,6 +268,36 @@ void QParallelAnimationGroupPrivate::connectUncontrolledAnimations()
}
}
+bool QParallelAnimationGroupPrivate::shouldAnimationStart(QAbstractAnimation *animation, bool startIfAtEnd) const
+{
+ const int dura = animation->totalDuration();
+ if (dura == -1)
+ return !isUncontrolledAnimationFinished(animation);
+ if (startIfAtEnd)
+ return currentTime <= dura;
+ if (direction == QAbstractAnimation::Forward)
+ return currentTime < dura;
+ else //direction == QAbstractAnimation::Backward
+ return currentTime && currentTime <= dura;
+}
+
+void QParallelAnimationGroupPrivate::applyGroupState(QAbstractAnimation *animation)
+{
+ switch (state)
+ {
+ case QAbstractAnimation::Running:
+ animation->start();
+ break;
+ case QAbstractAnimation::Paused:
+ animation->pause();
+ break;
+ case QAbstractAnimation::Stopped:
+ default:
+ break;
+ }
+}
+
+
bool QParallelAnimationGroupPrivate::isUncontrolledAnimationFinished(QAbstractAnimation *anim) const
{
return uncontrolledFinishTime.value(anim, -1) >= 0;
diff --git a/src/corelib/animation/qparallelanimationgroup_p.h b/src/corelib/animation/qparallelanimationgroup_p.h
index 8e1fb34..fa0ef95 100644
--- a/src/corelib/animation/qparallelanimationgroup_p.h
+++ b/src/corelib/animation/qparallelanimationgroup_p.h
@@ -74,6 +74,8 @@ public:
int lastLoop;
int lastCurrentTime;
+ bool shouldAnimationStart(QAbstractAnimation *animation, bool startIfAtEnd) const;
+ void applyGroupState(QAbstractAnimation *animation);
bool isUncontrolledAnimationFinished(QAbstractAnimation *anim) const;
void connectUncontrolledAnimations();
void disconnectUncontrolledAnimations();