21int QParallelAnimationGroupJob::duration()
const
25 for (
const QAbstractAnimationJob *animation : m_children) {
26 int currentDuration = animation->totalDuration();
27 if (currentDuration == -1)
29 ret = qMax(ret, currentDuration);
35void QParallelAnimationGroupJob::updateCurrentTime(
int )
37 if (m_children.isEmpty())
40 if (m_currentLoop > m_previousLoop) {
42 int dura = duration();
47 for (QAbstractAnimationJob *animation : m_children) {
48 int currentDuration = animation->totalDuration();
49 if (currentDuration >= 0)
50 dura = qMax(dura, currentDuration);
54 for (QAbstractAnimationJob *animation : m_children) {
55 if (!animation->isStopped())
56 RETURN_IF_DELETED(animation->setCurrentTime(dura));
59 }
else if (m_currentLoop < m_previousLoop) {
61 for (QAbstractAnimationJob *animation : m_children) {
64 applyGroupState(animation);
65 RETURN_IF_DELETED(animation->setCurrentTime(0));
71 for (QAbstractAnimationJob *animation : m_children) {
72 const int dura = animation->totalDuration();
74 if (m_currentLoop > m_previousLoop
77 || shouldAnimationStart(animation, m_previousCurrentTime > dura )) {
78 applyGroupState(animation);
81 if (animation->state() == state()) {
82 RETURN_IF_DELETED(animation->setCurrentTime(m_currentTime));
83 if (dura > 0 && m_currentTime > dura)
87 m_previousLoop = m_currentLoop;
88 m_previousCurrentTime = m_currentTime;
91void QParallelAnimationGroupJob::updateState(QAbstractAnimationJob::State newState,
92 QAbstractAnimationJob::State oldState)
94 QAnimationGroupJob::updateState(newState, oldState);
98 for (QAbstractAnimationJob *animation : m_children)
102 for (QAbstractAnimationJob *animation : m_children)
103 if (animation->isRunning())
107 for (QAbstractAnimationJob *animation : m_children) {
108 if (oldState == Stopped) {
110 m_previousLoop = m_direction == Forward ? 0 : m_loopCount - 1;
112 RETURN_IF_DELETED(resetUncontrolledAnimationFinishTime(animation));
113 animation->setDirection(m_direction);
114 if (shouldAnimationStart(animation, oldState == Stopped))
115 RETURN_IF_DELETED(animation->start());
152void QParallelAnimationGroupJob::updateDirection(QAbstractAnimationJob::Direction direction)
156 for (QAbstractAnimationJob *animation : m_children) {
157 animation->setDirection(direction);
160 if (direction == Forward) {
162 m_previousCurrentTime = 0;
165 m_previousLoop = (m_loopCount == -1 ? 0 : m_loopCount - 1);
166 m_previousCurrentTime = duration();
171void QParallelAnimationGroupJob::uncontrolledAnimationFinished(QAbstractAnimationJob *animation)
173 Q_ASSERT(animation && (animation->duration() == -1 || animation->loopCount() < 0));
174 int uncontrolledRunningCount = 0;
176 for (QAbstractAnimationJob *child : m_children) {
177 if (child == animation) {
178 setUncontrolledAnimationFinishTime(animation, animation->currentTime());
179 }
else if (child->duration() == -1 || child->loopCount() < 0) {
180 if (uncontrolledAnimationFinishTime(child) == -1)
181 ++uncontrolledRunningCount;
185 if (uncontrolledRunningCount > 0)
189 bool running =
false;
190 for (QAbstractAnimationJob *job : m_children) {
191 if (job->state() == Running)
193 maxDuration = qMax(maxDuration, job->totalDuration());
196 setUncontrolledAnimationFinishTime(
this, qMax(maxDuration + m_currentLoopStartTime, currentTime()));
199 && ((m_direction == Forward && m_currentLoop == m_loopCount -1)
200 || (m_direction == Backward && m_currentLoop == 0))) {