/*! \internal This manages advancing the execution of a group running forwards (time has gone forward), which is the same behaviour for rewinding the execution of a group running backwards (time has gone backward). */ void QSequentialAnimationGroupPrivate::advanceForwards(const AnimationIndex &newAnimationIndex) { if (lastLoop < currentLoop) { // we need to fast forward to the end for (int i = currentAnimationIndex; i < animations.size(); ++i) { QAbstractAnimation *anim = animations.at(i); setCurrentAnimation(i, true); anim->setCurrentTime(animationActualTotalDuration(i)); } // this will make sure the current animation is reset to the beginning if (animations.size() == 1) // we need to force activation because setCurrentAnimation will have no effect activateCurrentAnimation(); else setCurrentAnimation(0, true); } // and now we need to fast forward from the current position to for (int i = currentAnimationIndex; i < newAnimationIndex.index; ++i) { //### WRONG, QAbstractAnimation *anim = animations.at(i); setCurrentAnimation(i, true); anim->setCurrentTime(animationActualTotalDuration(i)); } // setting the new current animation will happen later }
void QSequentialAnimationGroupPrivate::setCurrentAnimation(int index, bool intermediate) { Q_Q(QSequentialAnimationGroup); index = qMin(index, animations.count() - 1); if (index == -1) { Q_ASSERT(animations.isEmpty()); currentAnimationIndex = -1; currentAnimation = 0; return; } // need these two checks below because this func can be called after the current animation // has been removed if (index == currentAnimationIndex && animations.at(index) == currentAnimation) return; // stop the old current animation if (currentAnimation) currentAnimation->stop(); currentAnimation = animations.at(index); currentAnimationIndex = index; emit q->currentAnimationChanged(currentAnimation); activateCurrentAnimation(intermediate); }
/*! \internal This manages rewinding the execution of a group running forwards (time has gone forward), which is the same behaviour for advancing the execution of a group running backwards (time has gone backward). */ void QSequentialAnimationGroupPrivate::rewindForwards(const AnimationIndex &newAnimationIndex) { if (lastLoop > currentLoop) { // we need to fast rewind to the beginning for (int i = currentAnimationIndex; i >= 0 ; --i) { QAbstractAnimation *anim = animations.at(i); setCurrentAnimation(i, true); anim->setCurrentTime(0); } // this will make sure the current animation is reset to the end if (animations.size() == 1) // we need to force activation because setCurrentAnimation will have no effect activateCurrentAnimation(); else setCurrentAnimation(animations.count() - 1, true); } // and now we need to fast rewind from the current position to for (int i = currentAnimationIndex; i > newAnimationIndex.index; --i) { QAbstractAnimation *anim = animations.at(i); setCurrentAnimation(i, true); anim->setCurrentTime(0); } // setting the new current animation will happen later }
void QSequentialAnimationGroupJob::restart() { // restarting the group by making the first/last animation the current one if (m_direction == Forward) { m_previousLoop = 0; if (m_currentAnimation == firstChild()) activateCurrentAnimation(); else setCurrentAnimation(firstChild()); } else { // direction == Backward m_previousLoop = m_loopCount - 1; if (m_currentAnimation == lastChild()) activateCurrentAnimation(); else setCurrentAnimation(lastChild()); } }
void QSequentialAnimationGroupPrivate::restart() { // restarting the group by making the first/last animation the current one if (direction == QAbstractAnimation::Forward) { lastLoop = 0; if (currentAnimationIndex == 0) activateCurrentAnimation(); else setCurrentAnimation(0); } else { // direction == QAbstractAnimation::Backward lastLoop = loopCount - 1; int index = animations.size() - 1; if (currentAnimationIndex == index) activateCurrentAnimation(); else setCurrentAnimation(index); } }
void QSequentialAnimationGroupJob::setCurrentAnimation(QAbstractAnimationJob *anim, bool intermediate) { if (!anim) { Q_ASSERT(!firstChild()); m_currentAnimation = 0; return; } if (anim == m_currentAnimation) return; // stop the old current animation if (m_currentAnimation) m_currentAnimation->stop(); m_currentAnimation = anim; activateCurrentAnimation(intermediate); }
void QSequentialAnimationGroupJob::advanceForwards(const AnimationIndex &newAnimationIndex) { if (m_previousLoop < m_currentLoop) { // we need to fast forward to the end for (QAbstractAnimationJob *anim = m_currentAnimation; anim; anim = anim->nextSibling()) { setCurrentAnimation(anim, true); RETURN_IF_DELETED(anim->setCurrentTime(animationActualTotalDuration(anim))); } // this will make sure the current animation is reset to the beginning if (firstChild() && !firstChild()->nextSibling()) //count == 1 // we need to force activation because setCurrentAnimation will have no effect activateCurrentAnimation(); else setCurrentAnimation(firstChild(), true); } // and now we need to fast forward from the current position to for (QAbstractAnimationJob *anim = m_currentAnimation; anim && anim != newAnimationIndex.animation; anim = anim->nextSibling()) { //### WRONG, setCurrentAnimation(anim, true); RETURN_IF_DELETED(anim->setCurrentTime(animationActualTotalDuration(anim))); } // setting the new current animation will happen later }
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 }