ScriptAction without scriptName shouldn't match a StateChangeScript
authorMichael Brasser <michael.brasser@nokia.com>
Wed, 9 May 2012 01:50:01 +0000 (11:50 +1000)
committerQt by Nokia <qt-info@nokia.com>
Wed, 9 May 2012 03:38:22 +0000 (05:38 +0200)
Change-Id: Idfce9b25fd2396771f45fc2487bc363edb56ddd6
Reviewed-by: Yunqiao Yin <charles.yin@nokia.com>
src/quick/util/qquickanimation.cpp
tests/auto/quick/qquickanimations/data/scriptActionBug.qml [new file with mode: 0644]
tests/auto/quick/qquickanimations/tst_qquickanimations.cpp

index 3a5674f..2fca7ba 100644 (file)
@@ -937,15 +937,17 @@ QAbstractAnimationJob* QQuickScriptAction::transition(QQuickStateActions &action
 
     d->hasRunScriptScript = false;
     d->reversing = (direction == Backward);
-    for (int ii = 0; ii < actions.count(); ++ii) {
-        QQuickAction &action = actions[ii];
-
-        if (action.event && action.event->type() == QQuickActionEvent::Script
-            && static_cast<QQuickStateChangeScript*>(action.event)->name() == d->name) {
-            d->runScriptScript = static_cast<QQuickStateChangeScript*>(action.event)->script();
-            d->hasRunScriptScript = true;
-            action.actionDone = true;
-            break;  //only match one (names should be unique)
+    if (!d->name.isEmpty()) {
+        for (int ii = 0; ii < actions.count(); ++ii) {
+            QQuickAction &action = actions[ii];
+
+            if (action.event && action.event->type() == QQuickActionEvent::Script
+                && static_cast<QQuickStateChangeScript*>(action.event)->name() == d->name) {
+                d->runScriptScript = static_cast<QQuickStateChangeScript*>(action.event)->script();
+                d->hasRunScriptScript = true;
+                action.actionDone = true;
+                break;  //only match one (names should be unique)
+            }
         }
     }
     return initInstance(new QActionAnimation(d->createAction()));
diff --git a/tests/auto/quick/qquickanimations/data/scriptActionBug.qml b/tests/auto/quick/qquickanimations/data/scriptActionBug.qml
new file mode 100644 (file)
index 0000000..48566db
--- /dev/null
@@ -0,0 +1,17 @@
+import QtQuick 2.0
+
+Item {
+    property bool actionTriggered: false
+    property bool stateChangeScriptTriggered: false
+
+    states: State {
+        name: "state1"
+        StateChangeScript { script: stateChangeScriptTriggered = true }
+    }
+
+    transitions: Transition {
+        ScriptAction { script: actionTriggered = true }
+    }
+
+    Component.onCompleted: state = "state1"
+}
index 60b0465..8cfdf74 100644 (file)
@@ -108,6 +108,7 @@ private slots:
     void loopingBug();
     void anchorBug();
     void pathAnimationInOutBackBug();
+    void scriptActionBug();
 };
 
 #define QTIMED_COMPARE(lhs, rhs) do { \
@@ -1377,6 +1378,18 @@ void tst_qquickanimations::anchorBug()
     QCOMPARE(static_cast<QQuickBulkValueAnimator*>(animation.qtAnimation())->easingCurve(), QEasingCurve(QEasingCurve::InOutBack));
 }
 
+//ScriptAction should not match a StateChangeScript if no scriptName has been specified
+void tst_qquickanimations::scriptActionBug()
+{
+    QQmlEngine engine;
+    QQmlComponent c(&engine, testFileUrl("scriptActionBug.qml"));
+    QObject *obj = c.create();
+
+    //Both the ScriptAction and StateChangeScript should be triggered
+    QCOMPARE(obj->property("actionTriggered").toBool(), true);
+    QCOMPARE(obj->property("actionTriggered").toBool(), true);
+}
+
 QTEST_MAIN(tst_qquickanimations)
 
 #include "tst_qquickanimations.moc"