diff options
author | Thierry Bastian <thierry.bastian@nokia.com> | 2009-10-21 08:49:42 (GMT) |
---|---|---|
committer | Thierry Bastian <thierry.bastian@nokia.com> | 2009-10-21 08:49:42 (GMT) |
commit | a072ddb5072d837ff6d2ff1f09800e8e3917f034 (patch) | |
tree | 89e42c12b79ebb38923ebf6ae9d340f7098f306e /src/corelib | |
parent | 619d049371ac8a180de3d91140bf252f44c25dad (diff) | |
download | Qt-a072ddb5072d837ff6d2ff1f09800e8e3917f034.zip Qt-a072ddb5072d837ff6d2ff1f09800e8e3917f034.tar.gz Qt-a072ddb5072d837ff6d2ff1f09800e8e3917f034.tar.bz2 |
Fixes to the way animations are registered to the timer
It could happen that an animation would be unregistered when it
shouldn't.
Reviewed-by: Leo Cunha
Diffstat (limited to 'src/corelib')
-rw-r--r-- | src/corelib/animation/qabstractanimation.cpp | 21 |
1 files changed, 9 insertions, 12 deletions
diff --git a/src/corelib/animation/qabstractanimation.cpp b/src/corelib/animation/qabstractanimation.cpp index 2f776d3..f83c2a1 100644 --- a/src/corelib/animation/qabstractanimation.cpp +++ b/src/corelib/animation/qabstractanimation.cpp @@ -279,11 +279,11 @@ void QUnifiedTimer::registerAnimation(QAbstractAnimation *animation, bool isTopL void QUnifiedTimer::unregisterAnimation(QAbstractAnimation *animation) { + unregisterRunningAnimation(animation); + if (!QAbstractAnimationPrivate::get(animation)->hasRegisteredTimer) return; - unregisterRunningAnimation(animation); - int idx = animations.indexOf(animation); if (idx != -1) { animations.removeAt(idx); @@ -384,25 +384,20 @@ void QAbstractAnimationPrivate::setState(QAbstractAnimation::State newState) QUnifiedTimer::instance()->ensureTimerUpdate(q); if (!guard) return; + //here we're sure that we were in running state before and that the + //animation is currently registered QUnifiedTimer::instance()->unregisterAnimation(q); break; case QAbstractAnimation::Running: { bool isTopLevel = !group || group->state() == QAbstractAnimation::Stopped; + QUnifiedTimer::instance()->registerAnimation(q, isTopLevel); // this ensures that the value is updated now that the animation is running if (oldState == QAbstractAnimation::Stopped) { if (isTopLevel) // currentTime needs to be updated if pauseTimer is active QUnifiedTimer::instance()->ensureTimerUpdate(q); - if (!guard) - return; - } - - // test needed in case we stop in the setCurrentTime inside ensureTimerUpdate (zero duration) - if (state == QAbstractAnimation::Running) { - // register timer if our parent is not running - QUnifiedTimer::instance()->registerAnimation(q, isTopLevel); } } break; @@ -415,7 +410,8 @@ void QAbstractAnimationPrivate::setState(QAbstractAnimation::State newState) if (deleteWhenStopped) q->deleteLater(); - QUnifiedTimer::instance()->unregisterAnimation(q); + if (oldState == QAbstractAnimation::Running) + QUnifiedTimer::instance()->unregisterAnimation(q); if (dura == -1 || loopCount < 0 || (oldDirection == QAbstractAnimation::Forward && (oldCurrentTime * (oldCurrentLoop + 1)) == (dura * loopCount)) @@ -462,7 +458,8 @@ QAbstractAnimation::~QAbstractAnimation() QAbstractAnimation::State oldState = d->state; d->state = Stopped; emit stateChanged(oldState, d->state); - QUnifiedTimer::instance()->unregisterAnimation(this); + if (oldState == QAbstractAnimation::Running) + QUnifiedTimer::instance()->unregisterAnimation(this); } } |