aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/util
diff options
context:
space:
mode:
authorCharles Yin <charles.yin@nokia.com>2012-05-28 16:09:26 +1000
committerQt by Nokia <qt-info@nokia.com>2012-05-29 05:57:48 +0200
commitc187ebb93167e69e9e157cb236ef16e39e1b2fb9 (patch)
tree13f25dddf8f5132a6b30d331f486ea99c3362000 /src/quick/util
parent0eec47c65982f586a8602af964b454494f0f49f3 (diff)
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 <michael.brasser@nokia.com>
Diffstat (limited to 'src/quick/util')
-rw-r--r--src/quick/util/qquickanimation.cpp26
-rw-r--r--src/quick/util/qquickanimationcontroller.cpp12
-rw-r--r--src/quick/util/qquickbehavior.cpp14
3 files changed, 30 insertions, 22 deletions
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<QQmlProperty> 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);
}