20int QParallelAnimationGroupJob::duration()
const
24 for (
const QAbstractAnimationJob *animation : m_children) {
25 int currentDuration = animation->totalDuration();
26 if (currentDuration == -1)
28 ret = qMax(ret, currentDuration);
34void QParallelAnimationGroupJob::updateCurrentTime(
int )
36 if (m_children.isEmpty())
39 if (m_currentLoop > m_previousLoop) {
41 int dura = duration();
46 for (QAbstractAnimationJob *animation : m_children) {
47 int currentDuration = animation->totalDuration();
48 if (currentDuration >= 0)
49 dura = qMax(dura, currentDuration);
53 for (QAbstractAnimationJob *animation : m_children) {
54 if (!animation->isStopped())
55 RETURN_IF_DELETED(animation->setCurrentTime(dura));
58 }
else if (m_currentLoop < m_previousLoop) {
60 for (QAbstractAnimationJob *animation : m_children) {
63 applyGroupState(animation);
64 RETURN_IF_DELETED(animation->setCurrentTime(0));
70 for (QAbstractAnimationJob *animation : m_children) {
71 const int dura = animation->totalDuration();
73 if (m_currentLoop > m_previousLoop
76 || shouldAnimationStart(animation, m_previousCurrentTime > dura )) {
77 applyGroupState(animation);
80 if (animation->state() == state()) {
81 RETURN_IF_DELETED(animation->setCurrentTime(m_currentTime));
82 if (dura > 0 && m_currentTime > dura)
86 m_previousLoop = m_currentLoop;
87 m_previousCurrentTime = m_currentTime;
90void QParallelAnimationGroupJob::updateState(QAbstractAnimationJob::State newState,
91 QAbstractAnimationJob::State oldState)
93 QAnimationGroupJob::updateState(newState, oldState);
97 for (QAbstractAnimationJob *animation : m_children)
101 for (QAbstractAnimationJob *animation : m_children)
102 if (animation->isRunning())
106 for (QAbstractAnimationJob *animation : m_children) {
107 if (oldState == Stopped) {
109 m_previousLoop = m_direction == Forward ? 0 : m_loopCount - 1;
111 RETURN_IF_DELETED(resetUncontrolledAnimationFinishTime(animation));
112 animation->setDirection(m_direction);
113 if (shouldAnimationStart(animation, oldState == Stopped))
114 RETURN_IF_DELETED(animation->start());
151void QParallelAnimationGroupJob::updateDirection(QAbstractAnimationJob::Direction direction)
155 for (QAbstractAnimationJob *animation : m_children) {
156 animation->setDirection(direction);
159 if (direction == Forward) {
161 m_previousCurrentTime = 0;
164 m_previousLoop = (m_loopCount == -1 ? 0 : m_loopCount - 1);
165 m_previousCurrentTime = duration();
170void QParallelAnimationGroupJob::uncontrolledAnimationFinished(QAbstractAnimationJob *animation)
172 Q_ASSERT(animation && (animation->duration() == -1 || animation->loopCount() < 0));
173 int uncontrolledRunningCount = 0;
175 for (QAbstractAnimationJob *child : m_children) {
176 if (child == animation) {
177 setUncontrolledAnimationFinishTime(animation, animation->currentTime());
178 }
else if (child->duration() == -1 || child->loopCount() < 0) {
179 if (uncontrolledAnimationFinishTime(child) == -1)
180 ++uncontrolledRunningCount;
184 if (uncontrolledRunningCount > 0)
188 bool running =
false;
189 for (QAbstractAnimationJob *job : m_children) {
190 if (job->state() == Running)
192 maxDuration = qMax(maxDuration, job->totalDuration());
195 setUncontrolledAnimationFinishTime(
this, qMax(maxDuration + m_currentLoopStartTime, currentTime()));
198 && ((m_direction == Forward && m_currentLoop == m_loopCount -1)
199 || (m_direction == Backward && m_currentLoop == 0))) {