void QAbstractAnimation::setCurrentTime(int msecs) { Q_D(QAbstractAnimation); msecs = qMax(msecs, 0); // Calculate new time and loop. int dura = duration(); int totalDura = dura <= 0 ? dura : ((d->loopCount < 0) ? -1 : dura * d->loopCount); if (totalDura != -1) msecs = qMin(totalDura, msecs); d->totalCurrentTime = msecs; // Update new values. int oldLoop = d->currentLoop; d->currentLoop = ((dura <= 0) ? 0 : (msecs / dura)); if (d->currentLoop == d->loopCount) { //we're at the end d->currentTime = qMax(0, dura); d->currentLoop = qMax(0, d->loopCount - 1); } else { if (d->direction == Forward) { d->currentTime = (dura <= 0) ? msecs : (msecs % dura); } else { d->currentTime = (dura <= 0) ? msecs : ((msecs - 1) % dura) + 1; if (d->currentTime == dura) --d->currentLoop; } } updateCurrentTime(d->currentTime); if (d->currentLoop != oldLoop) emit currentLoopChanged(d->currentLoop); // All animations are responsible for stopping the animation when their // own end state is reached; in this case the animation is time driven, // and has reached the end. if ((d->direction == Forward && d->totalCurrentTime == totalDura) || (d->direction == Backward && d->totalCurrentTime == 0)) { stop(); } }
void QAbstractAnimationJob::setCurrentTime(int msecs) { msecs = qMax(msecs, 0); // Calculate new time and loop. int dura = duration(); int totalDura; int oldLoop = m_currentLoop; if (dura < 0 && m_direction == Forward) { totalDura = -1; if (m_uncontrolledFinishTime >= 0 && msecs >= m_uncontrolledFinishTime) { msecs = m_uncontrolledFinishTime; if (m_currentLoop == m_loopCount - 1) { totalDura = m_uncontrolledFinishTime; } else { ++m_currentLoop; m_currentLoopStartTime = msecs; m_uncontrolledFinishTime = -1; } } m_totalCurrentTime = msecs; m_currentTime = msecs - m_currentLoopStartTime; } else { totalDura = dura <= 0 ? dura : ((m_loopCount < 0) ? -1 : dura * m_loopCount); if (totalDura != -1) msecs = qMin(totalDura, msecs); m_totalCurrentTime = msecs; // Update new values. m_currentLoop = ((dura <= 0) ? 0 : (msecs / dura)); if (m_currentLoop == m_loopCount) { //we're at the end m_currentTime = qMax(0, dura); m_currentLoop = qMax(0, m_loopCount - 1); } else { if (m_direction == Forward) { m_currentTime = (dura <= 0) ? msecs : (msecs % dura); } else { m_currentTime = (dura <= 0) ? msecs : ((msecs - 1) % dura) + 1; if (m_currentTime == dura) --m_currentLoop; } } } if (m_currentLoop != oldLoop && !m_group) //### verify Running as well? fireTopLevelAnimationLoopChanged(); RETURN_IF_DELETED(updateCurrentTime(m_currentTime)); if (m_currentLoop != oldLoop) currentLoopChanged(); // All animations are responsible for stopping the animation when their // own end state is reached; in this case the animation is time driven, // and has reached the end. if ((m_direction == Forward && m_totalCurrentTime == totalDura) || (m_direction == Backward && m_totalCurrentTime == 0)) { RETURN_IF_DELETED(stop()); } if (m_hasCurrentTimeChangeListeners) currentTimeChanged(m_currentTime); }