void QSequentialAnimationGroupJob::uncontrolledAnimationFinished(QAbstractAnimationJob *animation) { Q_UNUSED(animation); Q_ASSERT(animation == m_currentAnimation); setUncontrolledAnimationFinishTime(m_currentAnimation, m_currentAnimation->currentTime()); int totalTime = currentTime(); if (m_direction == Forward) { // set the current animation to be the next one if (m_currentAnimation->nextSibling()) setCurrentAnimation(m_currentAnimation->nextSibling()); for (QAbstractAnimationJob *a = animation->nextSibling(); a; a = a->nextSibling()) { int dur = a->duration(); if (dur == -1) { totalTime = -1; break; } else { totalTime += dur; } } } else { // set the current animation to be the previous one if (m_currentAnimation->previousSibling()) setCurrentAnimation(m_currentAnimation->previousSibling()); for (QAbstractAnimationJob *a = animation->previousSibling(); a; a = a->previousSibling()) { int dur = a->duration(); if (dur == -1) { totalTime = -1; break; } else { totalTime += dur; } } } if (totalTime >= 0) setUncontrolledAnimationFinishTime(this, totalTime); if (atEnd()) stop(); }
void QSequentialAnimationGroupJob::rewindForwards(const AnimationIndex &newAnimationIndex) { if (m_previousLoop > m_currentLoop) { // we need to fast rewind to the beginning for (QAbstractAnimationJob *anim = m_currentAnimation; anim; anim = anim->previousSibling()) { RETURN_IF_DELETED(setCurrentAnimation(anim, true)); RETURN_IF_DELETED(anim->setCurrentTime(0)); } // this will make sure the current animation is reset to the end if (lastChild() && !lastChild()->previousSibling()) { //count == 1 // we need to force activation because setCurrentAnimation will have no effect RETURN_IF_DELETED(activateCurrentAnimation()); } else { RETURN_IF_DELETED(setCurrentAnimation(lastChild(), true)); } } // and now we need to fast rewind from the current position to for (QAbstractAnimationJob *anim = m_currentAnimation; anim && anim != newAnimationIndex.animation; anim = anim->previousSibling()) { RETURN_IF_DELETED(setCurrentAnimation(anim, true)); RETURN_IF_DELETED(anim->setCurrentTime(0)); } // setting the new current animation will happen later }