From a072ddb5072d837ff6d2ff1f09800e8e3917f034 Mon Sep 17 00:00:00 2001 From: Thierry Bastian Date: Wed, 21 Oct 2009 10:49:42 +0200 Subject: 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 --- src/corelib/animation/qabstractanimation.cpp | 21 +++++++++------------ 1 file 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); } } -- cgit v0.12