From 17fa564a94f98486ff41030c47629bd902c48e8d Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Tue, 2 Feb 2021 09:17:39 +0100 Subject: Animations: Drop checks for duplicate jobs We cannot return the same job multiple times from transition(). The calling code takes ownership of the job, and even retaining a pointer to it in the animation would be a problem. There are no animations that return the same job multiple times, though. Task-number: QTBUG-90401 Change-Id: I3a113c624a20dceee745cd6a4fca6f3634bdbdd1 Reviewed-by: Fabian Kosmale --- src/quick/util/qquickanimation.cpp | 16 +++++++--------- src/quick/util/qquickbehavior.cpp | 19 +++++++++---------- 2 files changed, 16 insertions(+), 19 deletions(-) (limited to 'src') diff --git a/src/quick/util/qquickanimation.cpp b/src/quick/util/qquickanimation.cpp index bfdc863d10..f2ee096af7 100644 --- a/src/quick/util/qquickanimation.cpp +++ b/src/quick/util/qquickanimation.cpp @@ -165,17 +165,15 @@ void QQuickAbstractAnimationPrivate::commence() QQuickStateActions actions; QQmlProperties properties; - QAbstractAnimationJob *oldInstance = animationInstance; - animationInstance = q->transition(actions, properties, QQuickAbstractAnimation::Forward); - if (oldInstance && oldInstance != animationInstance) - delete oldInstance; + auto *newInstance = q->transition(actions, properties, QQuickAbstractAnimation::Forward); + Q_ASSERT(newInstance != animationInstance); + delete animationInstance; + animationInstance = newInstance; if (animationInstance) { - if (oldInstance != animationInstance) { - if (q->threadingModel() == QQuickAbstractAnimation::RenderThread) - animationInstance = new QQuickAnimatorProxyJob(animationInstance, q); - animationInstance->addAnimationChangeListener(this, QAbstractAnimationJob::Completion); - } + if (q->threadingModel() == QQuickAbstractAnimation::RenderThread) + animationInstance = new QQuickAnimatorProxyJob(animationInstance, q); + animationInstance->addAnimationChangeListener(this, QAbstractAnimationJob::Completion); emit q->started(); animationInstance->start(); } diff --git a/src/quick/util/qquickbehavior.cpp b/src/quick/util/qquickbehavior.cpp index ceda5589b2..70e283bdb0 100644 --- a/src/quick/util/qquickbehavior.cpp +++ b/src/quick/util/qquickbehavior.cpp @@ -308,21 +308,20 @@ void QQuickBehavior::write(const QVariant &value) actions << action; QList after; - QAbstractAnimationJob *prev = d->animationInstance; - d->animationInstance = d->animation->transition(actions, after, QQuickAbstractAnimation::Forward); - - if (d->animationInstance && d->animation->threadingModel() == QQuickAbstractAnimation::RenderThread) - d->animationInstance = new QQuickAnimatorProxyJob(d->animationInstance, d->animation); - - if (prev && prev != d->animationInstance) - delete prev; + auto *newInstance = d->animation->transition(actions, after, QQuickAbstractAnimation::Forward); + Q_ASSERT(newInstance != d->animationInstance); + delete d->animationInstance; + d->animationInstance = newInstance; if (d->animationInstance) { - if (d->animationInstance != prev) - d->animationInstance->addAnimationChangeListener(d, QAbstractAnimationJob::StateChange); + if (d->animation->threadingModel() == QQuickAbstractAnimation::RenderThread) + d->animationInstance = new QQuickAnimatorProxyJob(d->animationInstance, d->animation); + + d->animationInstance->addAnimationChangeListener(d, QAbstractAnimationJob::StateChange); d->animationInstance->start(); d->blockRunningChanged = false; } + if (!after.contains(d->property)) QQmlPropertyPrivate::write(d->property, value, QQmlPropertyData::BypassInterceptor | QQmlPropertyData::DontRemoveBinding); } -- cgit v1.2.3