4#include <QtCore/qthreadstorage.h>
6#include "private/qabstractanimationjob_p.h"
7#include "private/qanimationgroupjob_p.h"
8#include "private/qanimationjobutil_p.h"
9#include "private/qqmlengine_p.h"
10#include "private/qqmlglobal_p.h"
11#include "private/qdoubleendedlist_p.h"
25QQmlAnimationTimer::QQmlAnimationTimer() :
27 currentAnimationIdx(0), insideTick(
false),
28 startAnimationPending(
false), stopTimerPending(
false),
29 runningLeafAnimations(0)
54 for (
const auto &
animation : std::as_const(animations))
56 for (
const auto &
animation : std::as_const(animationsToStart))
58 for (
const auto &
animation : std::as_const(runningPauseAnimations))
65 if (
create && !animationTimer()->hasLocalData()) {
67 animationTimer()->setLocalData(inst);
69 inst = animationTimer() ? animationTimer()->localData() : 0;
83 instU->updateAnimationTimers();
99 for (currentAnimationIdx = 0; currentAnimationIdx < animations.
size(); ++currentAnimationIdx) {
105 if (animationTickDump()) {
106 qDebug() <<
"***** Dumping Animation Tree ***** ( tick:" << lastTick <<
"delta:" << delta <<
")";
107 for (
int i = 0;
i < animations.
size(); ++
i)
111 currentAnimationIdx = 0;
122 if (runningLeafAnimations == 0 && !runningPauseAnimations.
isEmpty())
132 if (!startAnimationPending)
134 startAnimationPending =
false;
139 animations += animationsToStart;
140 animationsToStart.
clear();
147 stopTimerPending =
false;
148 bool pendingStart = startAnimationPending && animationsToStart.
size() > 0;
149 if (animations.
isEmpty() && !pendingStart) {
167 if (!startAnimationPending) {
168 startAnimationPending =
true;
185 if (idx <= currentAnimationIdx)
186 --currentAnimationIdx;
188 if (animations.
isEmpty() && !stopTimerPending) {
189 stopTimerPending =
true;
208 runningLeafAnimations++;
221 runningLeafAnimations--;
223 Q_ASSERT(runningLeafAnimations >= 0);
226int QQmlAnimationTimer::closestPauseAnimationTimeToFinish()
228 int closestTimeToFinish = INT_MAX;
229 for (
int i = 0;
i < runningPauseAnimations.
size(); ++
i) {
238 if (timeToFinish < closestTimeToFinish)
239 closestTimeToFinish = timeToFinish;
241 return closestTimeToFinish;
251 , m_totalCurrentTime(0)
254 , m_uncontrolledFinishTime(-1)
255 , m_currentLoopStartTime(0)
256 , m_hasRegisteredTimer(
false)
259 , m_disableUserControl(
false)
260 , m_hasCurrentTimeChangeListeners(
false)
261 , m_isRenderThreadJob(
false)
262 , m_isRenderThreadProxy(
false)
377 || (oldDirection ==
Forward && (oldCurrentTime * (oldCurrentLoop + 1)) == (dura *
m_loopCount))
378 || (oldDirection ==
Backward && oldCurrentTime == 0)) {
429 return dura * loopcount;
434 msecs =
qMax(msecs, 0);
457 msecs =
qMin(totalDura, msecs);
470 m_currentTime = (dura <= 0) ? msecs : ((msecs - 1) % dura) + 1;
536 qWarning(
"QAbstractAnimationJob::pause: Cannot pause a stopped animation");
546 qWarning(
"QAbstractAnimationJob::resume: "
547 "Cannot resume an animation that is not paused");
652 d <<
"AbstractAnimationJob(" <<
Qt::hex << (
const void *)
this <<
Qt::dec <<
") state:"
659 d <<
"AbstractAnimationJob(null)";
669#include "moc_qabstractanimationjob_p.cpp"
void setDirection(QAbstractAnimationJob::Direction direction)
std::vector< ChangeListener > changeListeners
int totalDuration() const
virtual void debugAnimation(QDebug d) const
virtual void updateState(QAbstractAnimationJob::State newState, QAbstractAnimationJob::State oldState)
bool m_hasCurrentTimeChangeListeners
int m_uncontrolledFinishTime
QAbstractAnimationJob::State m_state
virtual int duration() const
int m_currentLoopStartTime
bool m_hasRegisteredTimer
void addAnimationChangeListener(QAnimationJobChangeListener *listener, QAbstractAnimationJob::ChangeTypes)
virtual void updateDirection(QAbstractAnimationJob::Direction direction)
QQmlAnimationTimer * m_timer
virtual ~QAbstractAnimationJob()
void setCurrentTime(int msecs)
QAbstractAnimationJob::State state() const
void fireTopLevelAnimationLoopChanged()
void currentTimeChanged(int currentTime)
bool userControlDisabled() const
void setLoopCount(int loopCount)
bool m_disableUserControl
void currentLoopChanged()
void setDisableUserControl()
virtual void updateLoopCount(int)
QAbstractAnimationJob::Direction m_direction
void stateChanged(QAbstractAnimationJob::State newState, QAbstractAnimationJob::State oldState)
virtual void topLevelAnimationLoopChanged()
QAbstractAnimationJob::Direction direction() const
virtual void updateCurrentTime(int)
void setState(QAbstractAnimationJob::State state)
QAnimationGroupJob * m_group
void setEnableUserControl()
void removeAnimationChangeListener(QAnimationJobChangeListener *listener, QAbstractAnimationJob::ChangeTypes)
Direction direction
the direction of the animation when it is in \l Running state.
int currentLoopTime() const
Returns the current time inside the current loop.
void setCurrentTime(int msecs)
virtual void uncontrolledAnimationFinished(QAbstractAnimationJob *animation)
void removeAnimation(QAbstractAnimationJob *animation)
virtual ~QAnimationJobChangeListener()
qsizetype size() const noexcept
bool isEmpty() const noexcept
void removeAt(qsizetype i)
bool removeOne(const AT &t)
const_reference at(qsizetype i) const noexcept
const QObjectList & children() const
Returns a list of child objects.
void unregisterAnimation(QAbstractAnimationJob *animation)
static QQmlAnimationTimer * instance()
void updateAnimationTimer()
void updateAnimationsTime(qint64 timeStep) override
void registerAnimation(QAbstractAnimationJob *animation, bool isTopLevel)
void restartAnimationTimer() override
static bool designerMode()
static void stopAnimationTimer(QAbstractAnimationTimer *timer)
static void startAnimationTimer(QAbstractAnimationTimer *timer)
static void resumeAnimationTimer(QAbstractAnimationTimer *timer)
static QUnifiedTimer * instance()
static void pauseAnimationTimer(QAbstractAnimationTimer *timer, int duration)
int duration
the duration of the animation
QSet< QString >::iterator it
void newState(QList< State > &states, const char *token, const char *lexem, bool pre)
Combined button and popup list for selecting options.
QTextStream & hex(QTextStream &stream)
Calls QTextStream::setIntegerBase(16) on stream and returns stream.
QTextStream & dec(QTextStream &stream)
Calls QTextStream::setIntegerBase(10) on stream and returns stream.
QDebug operator<<(QDebug d, const QAbstractAnimationJob *job)
#define RETURN_IF_DELETED(func)
#define Q_GLOBAL_STATIC(TYPE, NAME,...)
constexpr const T & qMin(const T &a, const T &b)
constexpr const T & qMax(const T &a, const T &b)
#define DEFINE_BOOL_CONFIG_OPTION(name, var)
static double elapsed(qint64 after, qint64 before)
static double currentTime()
qsizetype indexOf(const AT &t, qsizetype from=0) const noexcept