From c187ebb93167e69e9e157cb236ef16e39e1b2fb9 Mon Sep 17 00:00:00 2001 From: Charles Yin Date: Mon, 28 May 2012 16:09:26 +1000 Subject: Don't use deleted QQuickPathAnimationAnimator 1) If QQuickPathAnimationAnimator was deleted, just return 0 for transition 2) Add Null checking for all animation::transition() calls Change-Id: I1248d08fe05da5c9ff58f7b812ff11545959032f Reviewed-by: Michael Brasser --- src/quick/items/qquickitemanimation.cpp | 11 ++++++----- src/quick/util/qquickanimation.cpp | 26 +++++++++++++++----------- src/quick/util/qquickanimationcontroller.cpp | 12 +++++++----- src/quick/util/qquickbehavior.cpp | 14 ++++++++------ 4 files changed, 36 insertions(+), 27 deletions(-) (limited to 'src/quick') diff --git a/src/quick/items/qquickitemanimation.cpp b/src/quick/items/qquickitemanimation.cpp index e79b9c3bc1..a0437b271e 100644 --- a/src/quick/items/qquickitemanimation.cpp +++ b/src/quick/items/qquickitemanimation.cpp @@ -389,7 +389,8 @@ QAbstractAnimationJob* QQuickParentAnimation::transition(QQuickStateActions &act if (valid) d->animations.at(ii)->setDefaultTarget(d->defaultProperty); anim = d->animations.at(ii)->transition(actions, modified, direction, defaultTarget); - ag->appendAnimation(anim); + if (anim) + ag->appendAnimation(anim); } //TODO: simplify/clarify logic @@ -913,16 +914,16 @@ QAbstractAnimationJob* QQuickPathAnimation::transition(QQuickStateActions &actio } pa->setFromSourcedValue(&data->fromSourced); pa->setAnimValue(data); + pa->setDuration(d->duration); + pa->setEasingCurve(d->easingCurve); + return initInstance(pa); } else { pa->setFromSourcedValue(0); pa->setAnimValue(0); delete pa; delete data; } - - pa->setDuration(d->duration); - pa->setEasingCurve(d->easingCurve); - return initInstance(pa); + return 0; } void QQuickPathAnimationUpdater::setValue(qreal v) diff --git a/src/quick/util/qquickanimation.cpp b/src/quick/util/qquickanimation.cpp index c04018c794..bc39355a48 100644 --- a/src/quick/util/qquickanimation.cpp +++ b/src/quick/util/qquickanimation.cpp @@ -164,15 +164,17 @@ void QQuickAbstractAnimationPrivate::commence() QAbstractAnimationJob *oldInstance = animationInstance; animationInstance = q->transition(actions, properties, QQuickAbstractAnimation::Forward); - if (oldInstance != animationInstance) { - animationInstance->addAnimationChangeListener(this, QAbstractAnimationJob::Completion); - if (oldInstance) - delete oldInstance; - } - animationInstance->start(); - if (animationInstance->isStopped()) { - running = false; - emit q->completed(); + if (oldInstance && oldInstance != animationInstance) + delete oldInstance; + + if (animationInstance) { + if (oldInstance != animationInstance) + animationInstance->addAnimationChangeListener(this, QAbstractAnimationJob::Completion); + animationInstance->start(); + if (animationInstance->isStopped()) { + running = false; + emit q->completed(); + } } } @@ -1693,7 +1695,8 @@ QAbstractAnimationJob* QQuickSequentialAnimation::transition(QQuickStateActions if (valid) d->animations.at(ii)->setDefaultTarget(d->defaultProperty); anim = d->animations.at(ii)->transition(actions, modified, direction, defaultTarget); - inc == -1 ? ag->prependAnimation(anim) : ag->appendAnimation(anim); + if (anim) + inc == -1 ? ag->prependAnimation(anim) : ag->appendAnimation(anim); } return initInstance(ag); @@ -1752,7 +1755,8 @@ QAbstractAnimationJob* QQuickParallelAnimation::transition(QQuickStateActions &a if (valid) d->animations.at(ii)->setDefaultTarget(d->defaultProperty); anim = d->animations.at(ii)->transition(actions, modified, direction, defaultTarget); - ag->appendAnimation(anim); + if (anim) + ag->appendAnimation(anim); } return initInstance(ag); } diff --git a/src/quick/util/qquickanimationcontroller.cpp b/src/quick/util/qquickanimationcontroller.cpp index 3013127500..f81b39c8a8 100644 --- a/src/quick/util/qquickanimationcontroller.cpp +++ b/src/quick/util/qquickanimationcontroller.cpp @@ -204,11 +204,13 @@ void QQuickAnimationController::reload() d->animationInstance = d->animation->transition(actions, properties, QQuickAbstractAnimation::Forward); if (oldInstance && oldInstance != d->animationInstance) delete oldInstance; - d->animationInstance->setLoopCount(1); - d->animationInstance->setDisableUserControl(); - d->animationInstance->start(); - d->animationInstance->pause(); - updateProgress(); + if (d->animationInstance) { + d->animationInstance->setLoopCount(1); + d->animationInstance->setDisableUserControl(); + d->animationInstance->start(); + d->animationInstance->pause(); + updateProgress(); + } } } diff --git a/src/quick/util/qquickbehavior.cpp b/src/quick/util/qquickbehavior.cpp index d201dfad66..1623a00a49 100644 --- a/src/quick/util/qquickbehavior.cpp +++ b/src/quick/util/qquickbehavior.cpp @@ -204,13 +204,15 @@ void QQuickBehavior::write(const QVariant &value) QList after; QAbstractAnimationJob *prev = d->animationInstance; d->animationInstance = d->animation->transition(actions, after, QQuickAbstractAnimation::Forward); - if (d->animationInstance != prev) { - d->animationInstance->addAnimationChangeListener(d, QAbstractAnimationJob::StateChange); - if (prev) - delete prev; + if (prev && prev != d->animationInstance) + delete prev; + + if (d->animationInstance) { + if (d->animationInstance != prev) + d->animationInstance->addAnimationChangeListener(d, QAbstractAnimationJob::StateChange); + d->animationInstance->start(); + d->blockRunningChanged = false; } - d->animationInstance->start(); - d->blockRunningChanged = false; if (!after.contains(d->property)) QQmlPropertyPrivate::write(d->property, value, QQmlPropertyPrivate::BypassInterceptor | QQmlPropertyPrivate::DontRemoveBinding); } -- cgit v1.2.3