void QAnimationGroupJob::resetUncontrolledAnimationsFinishTime() { for (QAbstractAnimationJob *animation = firstChild(); animation; animation = animation->nextSibling()) { if (animation->duration() == -1 || animation->loopCount() < 0) { resetUncontrolledAnimationFinishTime(animation); } } }
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(); }
int QQmlAnimationTimer::closestPauseAnimationTimeToFinish() { int closestTimeToFinish = INT_MAX; for (int i = 0; i < runningPauseAnimations.size(); ++i) { QAbstractAnimationJob *animation = runningPauseAnimations.at(i); int timeToFinish; if (animation->direction() == QAbstractAnimationJob::Forward) timeToFinish = animation->duration() - animation->currentLoopTime(); else timeToFinish = animation->currentLoopTime(); if (timeToFinish < closestTimeToFinish) closestTimeToFinish = timeToFinish; } return closestTimeToFinish; }