Don't use deleted QQuickPathAnimationAnimator
authorCharles Yin <charles.yin@nokia.com>
Mon, 28 May 2012 06:09:26 +0000 (16:09 +1000)
committerQt by Nokia <qt-info@nokia.com>
Tue, 29 May 2012 03:57:48 +0000 (05:57 +0200)
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>
src/quick/items/qquickitemanimation.cpp
src/quick/util/qquickanimation.cpp
src/quick/util/qquickanimationcontroller.cpp
src/quick/util/qquickbehavior.cpp

index e79b9c3..a0437b2 100644 (file)
@@ -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)
index c04018c..bc39355 100644 (file)
@@ -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);
 }
index 3013127..f81b39c 100644 (file)
@@ -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();
+        }
     }
 }
 
index d201dfa..1623a00 100644 (file)
@@ -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);
 }