diff options
author | Warwick Allison <warwick.allison@nokia.com> | 2009-11-09 03:07:49 (GMT) |
---|---|---|
committer | Warwick Allison <warwick.allison@nokia.com> | 2009-11-09 03:07:49 (GMT) |
commit | 58e1842aa9703f81c2f55758ba186315524027d8 (patch) | |
tree | 617ab67b149e9e35b6dbd19e90f8044f078ca899 | |
parent | d96ec3cff51b952a2db9dd016ca5b21d9bb21adf (diff) | |
parent | 7620586aa79c027e5dfd246d53232826333ce715 (diff) | |
download | Qt-58e1842aa9703f81c2f55758ba186315524027d8.zip Qt-58e1842aa9703f81c2f55758ba186315524027d8.tar.gz Qt-58e1842aa9703f81c2f55758ba186315524027d8.tar.bz2 |
Merge branch 'kinetic-declarativeui' of git@scm.dev.nokia.troll.no:qt/kinetic into kinetic-declarativeui
225 files changed, 8312 insertions, 1494 deletions
diff --git a/demos/declarative/calculator/calculator.qml b/demos/declarative/calculator/calculator.qml index 54af7ad..d9b73ed 100644 --- a/demos/declarative/calculator/calculator.qml +++ b/demos/declarative/calculator/calculator.qml @@ -118,7 +118,7 @@ Rectangle { } transitions: Transition { - NumberAnimation { properties: "x,y,width"; easing: "easeOutBounce"; duration: 500 } - NumberAnimation { properties: "opacity"; easing: "easeInOutQuad"; duration: 500 } + NumberAnimation { matchProperties: "x,y,width"; easing: "easeOutBounce"; duration: 500 } + NumberAnimation { matchProperties: "opacity"; easing: "easeInOutQuad"; duration: 500 } } } diff --git a/demos/declarative/flickr/common/ImageDetails.qml b/demos/declarative/flickr/common/ImageDetails.qml index 19cad06..95c32e8 100644 --- a/demos/declarative/flickr/common/ImageDetails.qml +++ b/demos/declarative/flickr/common/ImageDetails.qml @@ -149,7 +149,7 @@ Flipable { property: "smooth" value: false } - NumberAnimation { easing: "easeInOutQuad"; properties: "angle"; duration: 500 } + NumberAnimation { easing: "easeInOutQuad"; matchProperties: "angle"; duration: 500 } PropertyAction { target: bigImage property: "smooth" diff --git a/demos/declarative/flickr/common/MediaLineEdit.qml b/demos/declarative/flickr/common/MediaLineEdit.qml index b24b296..abc8034 100644 --- a/demos/declarative/flickr/common/MediaLineEdit.qml +++ b/demos/declarative/flickr/common/MediaLineEdit.qml @@ -42,7 +42,7 @@ Item { ] transitions: [ Transition { - NumberAnimation { properties: "x,width"; duration: 500; easing: "easeInOutQuad" } + NumberAnimation { matchProperties: "x,width"; duration: 500; easing: "easeInOutQuad" } } ] diff --git a/demos/declarative/flickr/common/ScrollBar.qml b/demos/declarative/flickr/common/ScrollBar.qml index feebcb0..2c1ec8a 100644 --- a/demos/declarative/flickr/common/ScrollBar.qml +++ b/demos/declarative/flickr/common/ScrollBar.qml @@ -32,7 +32,7 @@ Item { to: "*" NumberAnimation { target: container - properties: "opacity" + matchProperties: "opacity" duration: 400 } } diff --git a/demos/declarative/flickr/common/Star.qml b/demos/declarative/flickr/common/Star.qml index 173021b..c5abcca 100644 --- a/demos/declarative/flickr/common/Star.qml +++ b/demos/declarative/flickr/common/Star.qml @@ -37,7 +37,7 @@ Item { transitions: [ Transition { NumberAnimation { - properties: "opacity,scale,x,y" + matchProperties: "opacity,scale,x,y" easing: "easeOutBounce" } } diff --git a/demos/declarative/flickr/flickr-desktop.qml b/demos/declarative/flickr/flickr-desktop.qml index 337f77c..9c85237 100644 --- a/demos/declarative/flickr/flickr-desktop.qml +++ b/demos/declarative/flickr/flickr-desktop.qml @@ -84,15 +84,15 @@ Item { from: "*"; to: "Details" SequentialAnimation { ParentAction { } - NumberAnimation { properties: "x,y,scale,opacity,angle"; duration: 500; easing: "easeInOutQuad" } + NumberAnimation { matchProperties: "x,y,scale,opacity,angle"; duration: 500; easing: "easeInOutQuad" } } }, Transition { from: "Details"; to: "*" SequentialAnimation { ParentAction { } - NumberAnimation { properties: "x,y,scale,opacity,angle"; duration: 500; easing: "easeInOutQuad" } - PropertyAction { target: wrapper; properties: "z" } + NumberAnimation { matchProperties: "x,y,scale,opacity,angle"; duration: 500; easing: "easeInOutQuad" } + PropertyAction { matchTargets: wrapper; matchProperties: "z" } } } ] @@ -178,7 +178,7 @@ Item { transitions: [ Transition { from: "*"; to: "*" - NumberAnimation { properties: "y"; duration: 1000; easing: "easeOutBounce(amplitude:0.5)" } + NumberAnimation { matchProperties: "y"; duration: 1000; easing: "easeOutBounce(amplitude:0.5)" } } ] } diff --git a/demos/declarative/flickr/flickr-mobile.qml b/demos/declarative/flickr/flickr-mobile.qml index 0a89c4f..583f992 100644 --- a/demos/declarative/flickr/flickr-mobile.qml +++ b/demos/declarative/flickr/flickr-mobile.qml @@ -38,7 +38,7 @@ Item { } transitions: Transition { - NumberAnimation { properties: "x"; duration: 500; easing: "easeInOutQuad" } + NumberAnimation { matchProperties: "x"; duration: 500; easing: "easeInOutQuad" } } } @@ -76,7 +76,7 @@ Item { } transitions: Transition { - NumberAnimation { properties: "x"; duration: 500; easing: "easeInOutQuad" } + NumberAnimation { matchProperties: "x"; duration: 500; easing: "easeInOutQuad" } } } } diff --git a/demos/declarative/flickr/mobile/GridDelegate.qml b/demos/declarative/flickr/mobile/GridDelegate.qml index 9b9fb24..3a42507 100644 --- a/demos/declarative/flickr/mobile/GridDelegate.qml +++ b/demos/declarative/flickr/mobile/GridDelegate.qml @@ -55,14 +55,14 @@ Transition { from: "Show"; to: "Details" ParentAction { } - NumberAnimation { properties: "x,y"; duration: 500; easing: "easeInOutQuad" } + NumberAnimation { matchProperties: "x,y"; duration: 500; easing: "easeInOutQuad" } }, Transition { from: "Details"; to: "Show" SequentialAnimation { ParentAction { } - NumberAnimation { properties: "x,y"; duration: 500; easing: "easeInOutQuad" } - PropertyAction { target: wrapper; properties: "z" } + NumberAnimation { matchProperties: "x,y"; duration: 500; easing: "easeInOutQuad" } + PropertyAction { matchTargets: wrapper; matchProperties: "z" } } } ] diff --git a/demos/declarative/flickr/mobile/ImageDetails.qml b/demos/declarative/flickr/mobile/ImageDetails.qml index 1963bf5..9116428 100644 --- a/demos/declarative/flickr/mobile/ImageDetails.qml +++ b/demos/declarative/flickr/mobile/ImageDetails.qml @@ -117,7 +117,7 @@ Flipable { transitions: Transition { SequentialAnimation { PropertyAction { target: bigImage; property: "smooth"; value: false } - NumberAnimation { easing: "easeInOutQuad"; properties: "angle"; duration: 500 } + NumberAnimation { easing: "easeInOutQuad"; matchProperties: "angle"; duration: 500 } PropertyAction { target: bigImage; property: "smooth"; value: !flickable.moving } } } diff --git a/demos/declarative/flickr/mobile/TitleBar.qml b/demos/declarative/flickr/mobile/TitleBar.qml index 07b9762..0341585 100644 --- a/demos/declarative/flickr/mobile/TitleBar.qml +++ b/demos/declarative/flickr/mobile/TitleBar.qml @@ -71,6 +71,6 @@ Item { } transitions: Transition { - NumberAnimation { properties: "x"; easing: "easeInOutQuad" } + NumberAnimation { matchProperties: "x"; easing: "easeInOutQuad" } } } diff --git a/demos/declarative/minehunt/minehunt.qml b/demos/declarative/minehunt/minehunt.qml index e71ce90..596e82d 100644 --- a/demos/declarative/minehunt/minehunt.qml +++ b/demos/declarative/minehunt/minehunt.qml @@ -93,7 +93,7 @@ Item { } NumberAnimation { easing: "easeInOutQuad" - properties: "angle" + matchProperties: "angle" } ScriptAction{ script: if(modelData.hasMine && modelData.flipped){expl.explode = true;} diff --git a/demos/declarative/twitter/content/HomeTitleBar.qml b/demos/declarative/twitter/content/HomeTitleBar.qml index f0d6d75..b4f24ea 100644 --- a/demos/declarative/twitter/content/HomeTitleBar.qml +++ b/demos/declarative/twitter/content/HomeTitleBar.qml @@ -114,7 +114,7 @@ Item { transitions: [ Transition { from: "*"; to: "*" - NumberAnimation { properties: "x,y,width,height"; easing: "easeInOutQuad" } + NumberAnimation { matchProperties: "x,y,width,height"; easing: "easeInOutQuad" } } ] } diff --git a/demos/declarative/twitter/content/MultiTitleBar.qml b/demos/declarative/twitter/content/MultiTitleBar.qml index ef7de65..ef8a450 100644 --- a/demos/declarative/twitter/content/MultiTitleBar.qml +++ b/demos/declarative/twitter/content/MultiTitleBar.qml @@ -18,7 +18,7 @@ Item { } ] transitions: [ - Transition { NumberAnimation { properties: "x,y"; duration: 500; easing: "easeInOutQuad" } } + Transition { NumberAnimation { matchProperties: "x,y"; duration: 500; easing: "easeInOutQuad" } } ] } diff --git a/demos/declarative/twitter/content/TitleBar.qml b/demos/declarative/twitter/content/TitleBar.qml index 07b9762..0341585 100644 --- a/demos/declarative/twitter/content/TitleBar.qml +++ b/demos/declarative/twitter/content/TitleBar.qml @@ -71,6 +71,6 @@ Item { } transitions: Transition { - NumberAnimation { properties: "x"; easing: "easeInOutQuad" } + NumberAnimation { matchProperties: "x"; easing: "easeInOutQuad" } } } diff --git a/demos/declarative/twitter/twitter.qml b/demos/declarative/twitter/twitter.qml index 6cc67a1..db1ae39 100644 --- a/demos/declarative/twitter/twitter.qml +++ b/demos/declarative/twitter/twitter.qml @@ -87,7 +87,7 @@ Item { } ] transitions: [ - Transition { NumberAnimation { properties: "x,y"; duration: 500; easing: "easeInOutQuad" } } + Transition { NumberAnimation { matchProperties: "x,y"; duration: 500; easing: "easeInOutQuad" } } ] } } diff --git a/demos/declarative/webbrowser/fieldtext/FieldText.qml b/demos/declarative/webbrowser/fieldtext/FieldText.qml index b1c1938..6b1d271 100644 --- a/demos/declarative/webbrowser/fieldtext/FieldText.qml +++ b/demos/declarative/webbrowser/fieldtext/FieldText.qml @@ -149,7 +149,7 @@ Item { to: "*" reversible: true NumberAnimation { - properties: "opacity,leftMargin,rightMargin" + matchProperties: "opacity,leftMargin,rightMargin" duration: 200 } ColorAnimation { diff --git a/demos/declarative/webbrowser/webbrowser.qml b/demos/declarative/webbrowser/webbrowser.qml index cfc2aa7..6be3e09 100644 --- a/demos/declarative/webbrowser/webbrowser.qml +++ b/demos/declarative/webbrowser/webbrowser.qml @@ -149,8 +149,8 @@ Item { transitions: [ Transition { NumberAnimation { - target: header - properties: "progressOff" + matchTargets: header + matchProperties: "progressOff" easing: "easeInOutQuad" duration: 300 } @@ -341,7 +341,7 @@ Item { transitions: [ Transition { NumberAnimation { - properties: "opacity" + matchProperties: "opacity" easing: "easeInOutQuad" duration: 300 } @@ -397,7 +397,7 @@ Item { transitions: [ Transition { NumberAnimation { - properties: "opacity" + matchProperties: "opacity" easing: "easeInOutQuad" duration: 320 } diff --git a/doc/src/declarative/animation.qdoc b/doc/src/declarative/animation.qdoc index ef18de3..1314493 100644 --- a/doc/src/declarative/animation.qdoc +++ b/doc/src/declarative/animation.qdoc @@ -81,6 +81,22 @@ Rectangle { \image propanim.gif +When you assign an animation as a value source, you do not need to specify \c property +or \c target; they are automatically selected for you. You do, however, need to specify \c to, and explicitly +start the animation (usually via the \c running property). + +\qml +Rectangle { + id: rect + width: 200; height: 200; + Rectangle { + color: "red" + width: 50; height: 50 + x: NumberAnimation { to: 50; running: true } + } +} +\endqml + A property animation can also be specified as a resource that is manipulated from script. \qml @@ -100,12 +116,16 @@ Image { } \endqml +As can be seen, when an animation is used like this (as opposed to as a value source) you will need +to explicitly set the \c target and \c property to animate. + Animations can be joined into a group using SequentialAnimation and ParallelAnimation. \target state-transitions \section1 Transitions -QML transitions describe animations to perform when \l{qmlstates}{state} changes occur. +QML transitions describe animations to perform when \l{qmlstates}{state} changes occur. A transition +can only be triggered by a state change. For example, a transition could describe how an item moves from its initial position to its new position: @@ -113,7 +133,7 @@ For example, a transition could describe how an item moves from its initial posi transitions: [ Transition { NumberAnimation { - properties: "x,y" + matchProperties: "x,y" easing: "easeOutBounce" duration: 200 } @@ -123,11 +143,11 @@ transitions: [ As you can see from the above example, transitions make use of the same basic animation classes introduced above. However, you generally use a different set of properties when working with transitions. In the example, -no target or property has been specified. Instead, we have specified properties, which acts as a selector to -determine which property changes to animate; in this case, we will animate any x,y properties that have -changed on any objects. +no \c target or \c property has been specified. Instead, we have specified \c matchProperties, +which (along with \c matchTargets) acts as a selector to determine which property changes to animate; +in this case, we will animate any x,y properties that have changed on any objects. -QML transitions also selectors to determine which state changes a transition should apply to: +QML transitions also have selectors to determine which state changes a transition should apply to: \code Transition { @@ -137,7 +157,9 @@ Transition { } \endcode -Transitions can happen in parallel, in sequence, or in any combination of the two: +Transitions can happen in parallel, in sequence, or in any combination of the two. By default, the top-level +animations in a transition will happen in parallel. The following example shows a rather complex transition +making use of both sequential and parallel animations: \code Transition { @@ -145,33 +167,56 @@ Transition { to: "MyState" reversible: true SequentialAnimation { - ColorAnimation { - property: "color" - duration: 1000 - } - PauseAnimation { - duration: 1000 - } + ColorAnimation { duration: 1000 } + PauseAnimation { duration: 1000 } ParallelAnimation { NumberAnimation { duration: 1000 easing: "easeOutBounce" - target: box1 - properties: "x,y" + matchTargets: box1 + matchProperties: "x,y" } NumberAnimation { duration: 1000 - target: box2 - properties: "x,y" + matchTargets: box2 + matchProperties: "x,y" } } } } \endcode +To insert an explicit animation into your transition, you can use \target and \property as normal. + +\code +Transition { + from: "*" + to: "MyState" + reversible: true + SequentialAnimation { + NumberAnimation { + duration: 1000 + easing: "easeOutBounce" + // animate myItem's x and y if they have changed in the state + matchTargets: myItem + matchProperties: "x,y" + } + NumberAnimation { + duration: 1000 + // animate myItem2's y to 200, regardless of what happens in the state + target: myItem2 + property: "y" + to: 200 + } + } +} +\endcode + \section1 Property Behaviors -A property behavior specifies a default animation to run whenever the property's value changes. +A property behavior specifies a default animation to run whenever the property's value changes, regardless +of what caused the change. Unlike Transition, Behavior doesn't provide a way to indicate that a Behavior +should only apply under certain circumstances. In the following snippet, we specify that we want the x position of redRect to be animated whenever it changes. The animation will last 300 milliseconds and use an InOutQuad easing curve. @@ -185,6 +230,9 @@ Rectangle { } \endqml +Like using an animation as a value source, when used in a Behavior and animation does not need to specify +a \c target or \c property. + To trigger this behavior, we could: \list \o Enter a state that changes x diff --git a/doc/src/declarative/elements.qdoc b/doc/src/declarative/elements.qdoc index 69535ce..81a6c96 100644 --- a/doc/src/declarative/elements.qdoc +++ b/doc/src/declarative/elements.qdoc @@ -187,11 +187,8 @@ The following table lists the QML elements provided by the Qt Declarative module \list \o \l Blur \o \l Colorize -\o \l Grayscale -\o \l Pixelize \o \l DropShadow \o \l Opacity -\o \l Bloom \o \l Particles \list \o \l ParticleMotionLinear diff --git a/doc/src/declarative/focus.qdoc b/doc/src/declarative/focus.qdoc index ec6a02f..6eca667 100644 --- a/doc/src/declarative/focus.qdoc +++ b/doc/src/declarative/focus.qdoc @@ -75,6 +75,8 @@ Item { \endlist +See also the \l {Keys}{Keys attached property} and {KeyNavigation}{KeyNavigation attached property}. + \section1 Querying the Active Focus Item Whether or not an \l Item has \e {active focus} can be queried through the diff --git a/doc/src/snippets/declarative/listview/highlight.qml b/doc/src/snippets/declarative/listview/highlight.qml index 7970ede..b016f9a 100644 --- a/doc/src/snippets/declarative/listview/highlight.qml +++ b/doc/src/snippets/declarative/listview/highlight.qml @@ -30,7 +30,7 @@ Rectangle { } ] transitions: [ - Transition { NumberAnimation { properties: "x"; duration: 200 } } + Transition { NumberAnimation { matchProperties: "x"; duration: 200 } } ] } } diff --git a/examples/declarative/anchors/anchor-changes.qml b/examples/declarative/anchors/anchor-changes.qml index f6fd35d..2ebe1c0 100644 --- a/examples/declarative/anchors/anchor-changes.qml +++ b/examples/declarative/anchors/anchor-changes.qml @@ -41,6 +41,6 @@ Item { } transitions : Transition { - NumberAnimation { properties: "y,height" } + NumberAnimation { matchProperties: "y,height" } } } diff --git a/examples/declarative/animations/easing.qml b/examples/declarative/animations/easing.qml index 59e9b17..a9ba05f 100644 --- a/examples/declarative/animations/easing.qml +++ b/examples/declarative/animations/easing.qml @@ -80,8 +80,8 @@ Rectangle { transitions: Transition { ParallelAnimation { - NumberAnimation { properties: "x"; easing: type; duration: 1000 } - ColorAnimation { properties: "color"; easing: type; duration: 1000 } + NumberAnimation { matchProperties: "x"; easing: type; duration: 1000 } + ColorAnimation { matchProperties: "color"; easing: type; duration: 1000 } } } } diff --git a/examples/declarative/behaviours/test.qml b/examples/declarative/behaviours/test.qml index 946559b..4a44fd7 100644 --- a/examples/declarative/behaviours/test.qml +++ b/examples/declarative/behaviours/test.qml @@ -61,7 +61,7 @@ Rectangle { SequentialAnimation { NumberAnimation { target: bluerect - properties: "y" + property: "y" from: 0 to: 10 easing: "easeOutBounce(amplitude:30)" @@ -69,7 +69,7 @@ Rectangle { } NumberAnimation { target: bluerect - properties: "y" + property: "y" from: 10 to: 0 easing: "easeOutBounce(amplitude:30)" @@ -83,14 +83,14 @@ Rectangle { SequentialAnimation { NumberAnimation { target: bluerect - properties: "opacity" + property: "opacity" to: 0 duration: 150 } PropertyAction {} NumberAnimation { target: bluerect - properties: "opacity" + property: "opacity" to: 1 duration: 150 } diff --git a/examples/declarative/layouts/Button.qml b/examples/declarative/layouts/Button.qml index 44d0c7b..215b536 100644 --- a/examples/declarative/layouts/Button.qml +++ b/examples/declarative/layouts/Button.qml @@ -17,6 +17,6 @@ Rectangle { border.color: "black"; color: "steelblue"; radius: 5; width: pix.wid transitions: Transition{ - NumberAnimation { properties:"x,left"; easing:"easeInOutQuad"; duration:200 } + NumberAnimation { matchProperties:"x,left"; easing:"easeInOutQuad"; duration:200 } } } diff --git a/examples/declarative/layouts/positioners.qml b/examples/declarative/layouts/positioners.qml index 90efde2..129effe 100644 --- a/examples/declarative/layouts/positioners.qml +++ b/examples/declarative/layouts/positioners.qml @@ -11,17 +11,17 @@ Rectangle { y: 0 move: Transition { NumberAnimation { - properties: "y"; easing: "easeOutBounce" + matchProperties: "y"; easing: "easeOutBounce" } } add: Transition { NumberAnimation { - properties: "y"; from: 500; duration:500; easing: "easeOutQuad" + matchProperties: "y"; from: 500; duration:500; easing: "easeOutQuad" } } remove: Transition { NumberAnimation { - properties:"y"; to: 500; duration:500; easing: "easeInQuad" + matchProperties:"y"; to: 500; duration:500; easing: "easeInQuad" } } Rectangle { color: "red"; width: 100; height: 50; border.color: "black"; radius: 15 } @@ -36,23 +36,23 @@ Rectangle { y: 300 move: Transition { NumberAnimation { - properties: "x"; easing: "easeOutBounce" + matchProperties: "x"; easing: "easeOutBounce" } } add: Transition { NumberAnimation { - properties: "x"; from: 500; duration:500; easing: "easeOutQuad" + matchProperties: "x"; from: 500; duration:500; easing: "easeOutQuad" } NumberAnimation { - properties: "opacity"; from: 0; duration: 500; + matchProperties: "opacity"; from: 0; duration: 500; } } remove: Transition { NumberAnimation { - properties: "x"; to: 500; duration:500; easing: "easeInQuad" + matchProperties: "x"; to: 500; duration:500; easing: "easeInQuad" } NumberAnimation { - properties: "opacity"; from: 1; duration: 500 + matchProperties: "opacity"; from: 1; duration: 500 } } Rectangle { color: "red"; width: 50; height: 100; border.color: "black"; radius: 15 } @@ -103,25 +103,25 @@ Rectangle { remove: Transition { NumberAnimation { - properties: "opacity"; from: 1; to: 0; duration: 500 + matchProperties: "opacity"; from: 1; to: 0; duration: 500 } NumberAnimation { - properties: "x,y"; easing: "easeOutBounce" + matchProperties: "x,y"; easing: "easeOutBounce" } } move: Transition { NumberAnimation { - properties: "x,y"; easing: "easeOutBounce" + matchProperties: "x,y"; easing: "easeOutBounce" } } add: Transition { NumberAnimation { - properties: "opacity"; from: 0; to: 1; duration: 500 + matchProperties: "opacity"; from: 0; to: 1; duration: 500 } NumberAnimation { - properties: "x,y"; easing: "easeOutBounce" + matchProperties: "x,y"; easing: "easeOutBounce" } } diff --git a/examples/declarative/listview/dynamic.qml b/examples/declarative/listview/dynamic.qml index 2607527..101b708 100644 --- a/examples/declarative/listview/dynamic.qml +++ b/examples/declarative/listview/dynamic.qml @@ -122,7 +122,7 @@ Rectangle { PropertyChanges { target: verticalScrollBar; opacity: 1 } } ] - transitions: [ Transition { NumberAnimation { properties: "opacity"; duration: 400 } } ] + transitions: [ Transition { NumberAnimation { matchProperties: "opacity"; duration: 400 } } ] } Row { diff --git a/examples/declarative/listview/highlight.qml b/examples/declarative/listview/highlight.qml index be1f62d..9665499 100644 --- a/examples/declarative/listview/highlight.qml +++ b/examples/declarative/listview/highlight.qml @@ -31,7 +31,7 @@ Rectangle { transitions: [ Transition { NumberAnimation { - properties: "x"; duration: 200 + matchProperties: "x"; duration: 200 } } ] diff --git a/examples/declarative/listview/recipes.qml b/examples/declarative/listview/recipes.qml index 3410f56..c133351 100644 --- a/examples/declarative/listview/recipes.qml +++ b/examples/declarative/listview/recipes.qml @@ -124,7 +124,7 @@ Rectangle { ParallelAnimation { ColorAnimation { property: "color"; duration: 500 } NumberAnimation { - duration: 300; properties: "detailsOpacity,x,viewportY,height,width" + duration: 300; matchProperties: "detailsOpacity,x,viewportY,height,width" } } } diff --git a/examples/declarative/loader/Browser.qml b/examples/declarative/loader/Browser.qml index 9139346..f3a1182 100644 --- a/examples/declarative/loader/Browser.qml +++ b/examples/declarative/loader/Browser.qml @@ -132,12 +132,12 @@ Rectangle { Transition { to: "current" SequentialAnimation { - NumberAnimation { properties: "x"; duration: 250 } + NumberAnimation { matchProperties: "x"; duration: 250 } } }, Transition { - NumberAnimation { properties: "x"; duration: 250 } - NumberAnimation { properties: "x"; duration: 250 } + NumberAnimation { matchProperties: "x"; duration: 250 } + NumberAnimation { matchProperties: "x"; duration: 250 } } ] } @@ -171,11 +171,11 @@ Rectangle { Transition { to: "current" SequentialAnimation { - NumberAnimation { properties: "x"; duration: 250 } + NumberAnimation { matchProperties: "x"; duration: 250 } } }, Transition { - NumberAnimation { properties: "x"; duration: 250 } + NumberAnimation { matchProperties: "x"; duration: 250 } } ] } diff --git a/examples/declarative/parallax/qml/ParallaxView.qml b/examples/declarative/parallax/qml/ParallaxView.qml index ac84b47..98dd246 100644 --- a/examples/declarative/parallax/qml/ParallaxView.qml +++ b/examples/declarative/parallax/qml/ParallaxView.qml @@ -80,7 +80,7 @@ Item { } transitions: Transition { NumberAnimation { - properties: "scale,y" + matchProperties: "scale,y" } } } diff --git a/examples/declarative/scrollbar/ScrollBar.qml b/examples/declarative/scrollbar/ScrollBar.qml index 802b537..f68775c 100644 --- a/examples/declarative/scrollbar/ScrollBar.qml +++ b/examples/declarative/scrollbar/ScrollBar.qml @@ -2,7 +2,7 @@ import Qt 4.6 Item { id: scrollBar - // The properties that define the scrollbar's state. + // The matchProperties that define the scrollbar's state. // position and pageSize are in the range 0.0 - 1.0. They are relative to the // height of the page, i.e. a pageSize of 0.5 means that you can see 50% // of the height of the view. diff --git a/examples/declarative/scrollbar/display.qml b/examples/declarative/scrollbar/display.qml index 536a8b7..0b9f95a 100644 --- a/examples/declarative/scrollbar/display.qml +++ b/examples/declarative/scrollbar/display.qml @@ -27,7 +27,7 @@ Rectangle { from: "*" to: "*" NumberAnimation { - properties: "opacity" + matchProperties: "opacity" duration: 400 } } diff --git a/examples/declarative/searchbox/SearchBox.qml b/examples/declarative/searchbox/SearchBox.qml index 7077a11..42b5d67 100644 --- a/examples/declarative/searchbox/SearchBox.qml +++ b/examples/declarative/searchbox/SearchBox.qml @@ -50,11 +50,11 @@ FocusScope { transitions: [ Transition { from: ""; to: "hasText" - NumberAnimation { exclude: typeSomething; properties: "opacity" } + NumberAnimation { exclude: typeSomething; matchProperties: "opacity" } }, Transition { from: "hasText"; to: "" - NumberAnimation { properties: "opacity" } + NumberAnimation { matchProperties: "opacity" } } ] } diff --git a/examples/declarative/slideswitch/Switch.qml b/examples/declarative/slideswitch/Switch.qml index 1620805..4e13976 100644 --- a/examples/declarative/slideswitch/Switch.qml +++ b/examples/declarative/slideswitch/Switch.qml @@ -52,7 +52,7 @@ Item { ] transitions: [ Transition { - NumberAnimation { properties: "x"; easing: "easeInOutQuad"; duration: 200 } + NumberAnimation { matchProperties: "x"; easing: "easeInOutQuad"; duration: 200 } } ] } diff --git a/examples/declarative/snow/ImageBatch.qml b/examples/declarative/snow/ImageBatch.qml index 95b9b97..1d738b2 100644 --- a/examples/declarative/snow/ImageBatch.qml +++ b/examples/declarative/snow/ImageBatch.qml @@ -23,7 +23,7 @@ GridView { transitions: Transition { SequentialAnimation { PauseAnimation { duration: 150 } - PropertyAction { properties: "z" } + PropertyAction { matchProperties: "z" } } } model: XmlListModel { @@ -42,7 +42,7 @@ GridView { width: grid.imageWidth; height: grid.imageHeight; Image { id: flickrImage; source: url; fillMode: Image.PreserveAspectFit; smooth: true; anchors.fill: parent; - opacity: (status == Image.Ready)?1:0; opacity: Behavior { NumberAnimation { properties: "opacity" } } } + opacity: (status == Image.Ready)?1:0; opacity: Behavior { NumberAnimation { } } } Loading { anchors.centerIn: parent; visible: flickrImage.status!=1 } states: State { @@ -55,15 +55,15 @@ GridView { to: "selected" SequentialAnimation { PauseAnimation { duration: 150 } - PropertyAction { properties: "z" } - NumberAnimation { properties: "scale"; duration: 150; } + PropertyAction { matchProperties: "z" } + NumberAnimation { matchProperties: "scale"; duration: 150; } } }, Transition { from: "selected" SequentialAnimation { - NumberAnimation { properties: "scale"; duration: 150 } - PropertyAction { properties: "z" } + NumberAnimation { matchProperties: "scale"; duration: 150 } + PropertyAction { matchProperties: "z" } } } ] diff --git a/examples/declarative/states/transitions.qml b/examples/declarative/states/transitions.qml index ba97d9be..925d90e 100644 --- a/examples/declarative/states/transitions.qml +++ b/examples/declarative/states/transitions.qml @@ -48,23 +48,23 @@ Rectangle { } ] - // transitions define how the properties change. + // transitions define how the matchProperties change. transitions: [ // When transitioning to 'Position1' move x,y over a duration of 1 second, // with easeOutBounce easing function. Transition { from: "*"; to: "Position1" - NumberAnimation { properties: "x,y"; easing: "easeOutBounce"; duration: 1000 } + NumberAnimation { matchProperties: "x,y"; easing: "easeOutBounce"; duration: 1000 } }, // When transitioning to 'Position2' move x,y over a duration of 2 seconds, // with easeInOutQuad easing function. Transition { from: "*"; to: "Position2" - NumberAnimation { properties: "x,y"; easing: "easeInOutQuad"; duration: 2000 } + NumberAnimation { matchProperties: "x,y"; easing: "easeInOutQuad"; duration: 2000 } }, // For any other state changes move x,y linearly over duration of 200ms. Transition { - NumberAnimation { properties: "x,y"; duration: 200 } + NumberAnimation { matchProperties: "x,y"; duration: 200 } } ] } diff --git a/examples/declarative/tutorials/helloworld/tutorial3.qml b/examples/declarative/tutorials/helloworld/tutorial3.qml index 534d663..52c3fe8 100644 --- a/examples/declarative/tutorials/helloworld/tutorial3.qml +++ b/examples/declarative/tutorials/helloworld/tutorial3.qml @@ -28,7 +28,7 @@ Rectangle { transitions: Transition { from: ""; to: "down"; reversible: true ParallelAnimation { - NumberAnimation { properties: "y,rotation"; duration: 500; easing: "easeInOutQuad" } + NumberAnimation { matchProperties: "y,rotation"; duration: 500; easing: "easeInOutQuad" } ColorAnimation { property: "color"; duration: 500 } } } diff --git a/examples/declarative/tutorials/samegame/samegame4/content/BoomBlock.qml b/examples/declarative/tutorials/samegame/samegame4/content/BoomBlock.qml index 4c2ba43..2eb2ceb 100644 --- a/examples/declarative/tutorials/samegame/samegame4/content/BoomBlock.qml +++ b/examples/declarative/tutorials/samegame/samegame4/content/BoomBlock.qml @@ -24,7 +24,7 @@ Item { id:block } } opacity: 0 - opacity: Behavior { NumberAnimation { properties:"opacity"; duration: 200 } } + opacity: Behavior { NumberAnimation { matchProperties:"opacity"; duration: 200 } } anchors.fill: parent } //![2] diff --git a/examples/declarative/follow/click.wav b/examples/declarative/tvtennis/click.wav Binary files differindex 26c46f8..26c46f8 100644 --- a/examples/declarative/follow/click.wav +++ b/examples/declarative/tvtennis/click.wav diff --git a/examples/declarative/follow/paddle.wav b/examples/declarative/tvtennis/paddle.wav Binary files differindex 604e0e5..604e0e5 100644 --- a/examples/declarative/follow/paddle.wav +++ b/examples/declarative/tvtennis/paddle.wav diff --git a/examples/declarative/follow/tvtennis.qml b/examples/declarative/tvtennis/tvtennis.qml index d39e913..d39e913 100644 --- a/examples/declarative/follow/tvtennis.qml +++ b/examples/declarative/tvtennis/tvtennis.qml diff --git a/examples/declarative/velocity/Day.qml b/examples/declarative/velocity/Day.qml index 030fa13..3a7ffa9 100644 --- a/examples/declarative/velocity/Day.qml +++ b/examples/declarative/velocity/Day.qml @@ -71,7 +71,7 @@ Rectangle { } transitions: Transition { - NumberAnimation { properties: "rotation,scale"; duration: 200 } + NumberAnimation { matchProperties: "rotation,scale"; duration: 200 } } } } diff --git a/examples/declarative/webview/autosize.qml b/examples/declarative/webview/autosize.qml index 74c6844..1614906 100644 --- a/examples/declarative/webview/autosize.qml +++ b/examples/declarative/webview/autosize.qml @@ -1,7 +1,7 @@ import Qt 4.6 // The WebView size is determined by the width, height, -// preferredWidth, and preferredHeight properties. +// preferredWidth, and preferredHeight matchProperties. Rectangle { id: rect color: "white" diff --git a/examples/declarative/webview/content/FieldText.qml b/examples/declarative/webview/content/FieldText.qml index b1c1938..6b1d271 100644 --- a/examples/declarative/webview/content/FieldText.qml +++ b/examples/declarative/webview/content/FieldText.qml @@ -149,7 +149,7 @@ Item { to: "*" reversible: true NumberAnimation { - properties: "opacity,leftMargin,rightMargin" + matchProperties: "opacity,leftMargin,rightMargin" duration: 200 } ColorAnimation { diff --git a/examples/declarative/xmldata/yahoonews.qml b/examples/declarative/xmldata/yahoonews.qml index 7d8b8a2..4add361 100644 --- a/examples/declarative/xmldata/yahoonews.qml +++ b/examples/declarative/xmldata/yahoonews.qml @@ -61,8 +61,8 @@ Rectangle { transitions: Transition { from: "*"; to: "Details"; reversible: true SequentialAnimation { - NumberAnimation { duration: 200; properties: "height"; easing: "easeOutQuad" } - NumberAnimation { duration: 200; properties: "opacity" } + NumberAnimation { duration: 200; matchProperties: "height"; easing: "easeOutQuad" } + NumberAnimation { duration: 200; matchProperties: "opacity" } } } } diff --git a/src/corelib/animation/qabstractanimation.cpp b/src/corelib/animation/qabstractanimation.cpp index 948a084..5110ce8 100644 --- a/src/corelib/animation/qabstractanimation.cpp +++ b/src/corelib/animation/qabstractanimation.cpp @@ -262,11 +262,11 @@ void QUnifiedTimer::registerAnimation(QAbstractAnimation *animation, bool isTopL void QUnifiedTimer::unregisterAnimation(QAbstractAnimation *animation) { + unregisterRunningAnimation(animation); + if (!QAbstractAnimationPrivate::get(animation)->hasRegisteredTimer) return; - unregisterRunningAnimation(animation); - int idx = animations.indexOf(animation); if (idx != -1) { animations.removeAt(idx); @@ -347,34 +347,32 @@ void QAbstractAnimationPrivate::setState(QAbstractAnimation::State newState) state = newState; QWeakPointer<QAbstractAnimation> guard(q); - q->updateState(oldState, newState); - if (!guard) - return; + //(un)registration of the animation must always happen before calls to + //virtual function (updateState) to ensure a correct state of the timer + bool isTopLevel = !group || group->state() == QAbstractAnimation::Stopped; + if (oldState == QAbstractAnimation::Running) { + if (newState == QAbstractAnimation::Paused && hasRegisteredTimer) + QUnifiedTimer::instance()->ensureTimerUpdate(); + //the animation, is not running any more + QUnifiedTimer::instance()->unregisterAnimation(q); + } else { + QUnifiedTimer::instance()->registerAnimation(q, isTopLevel); + } - //this is to be safe if updateState changes the state - if (state == oldState) + q->updateState(oldState, newState); + if (!guard || newState != state) //this is to be safe if updateState changes the state return; // Notify state change emit q->stateChanged(oldState, newState); - if (!guard) + if (!guard || newState != state) //this is to be safe if updateState changes the state return; switch (state) { case QAbstractAnimation::Paused: - if (hasRegisteredTimer) - // currentTime needs to be updated if pauseTimer is active - QUnifiedTimer::instance()->ensureTimerUpdate(); - if (!guard) - return; - //here we're sure that we were in running state before and that the - //animation is currently registered - QUnifiedTimer::instance()->unregisterAnimation(q); break; case QAbstractAnimation::Running: { - bool isTopLevel = !group || group->state() == QAbstractAnimation::Stopped; - QUnifiedTimer::instance()->registerAnimation(q, isTopLevel); // this ensures that the value is updated now that the animation is running if (oldState == QAbstractAnimation::Stopped) { @@ -389,15 +387,10 @@ void QAbstractAnimationPrivate::setState(QAbstractAnimation::State newState) case QAbstractAnimation::Stopped: // Leave running state. int dura = q->duration(); - if (!guard) - return; if (deleteWhenStopped) q->deleteLater(); - if (oldState == QAbstractAnimation::Running) - QUnifiedTimer::instance()->unregisterAnimation(q); - if (dura == -1 || loopCount < 0 || (oldDirection == QAbstractAnimation::Forward && (oldCurrentTime * (oldCurrentLoop + 1)) == (dura * loopCount)) || (oldDirection == QAbstractAnimation::Backward && oldCurrentTime == 0)) { diff --git a/src/declarative/QmlChanges.txt b/src/declarative/QmlChanges.txt index c85ef77..97cefd5 100644 --- a/src/declarative/QmlChanges.txt +++ b/src/declarative/QmlChanges.txt @@ -70,6 +70,8 @@ ListView: wrap -> keyNavigationWraps ListView: autoHighlight -> highlightFollowsCurrentItem GridView: wrap -> keyNavigationWraps GridView: autoHighlight -> highlightFollowsCurrentItem +Animation: targets -> matchTargets +Animation: properties -> matchProperties Additions: MouseRegion: add "acceptedButtons" property diff --git a/src/declarative/graphicsitems/qmlgraphicsanchors.cpp b/src/declarative/graphicsitems/qmlgraphicsanchors.cpp index 404daad..f6dc5fd 100644 --- a/src/declarative/graphicsitems/qmlgraphicsanchors.cpp +++ b/src/declarative/graphicsitems/qmlgraphicsanchors.cpp @@ -152,13 +152,23 @@ void QmlGraphicsAnchorsPrivate::fillChanged() if (!fill || !isItemComplete()) return; - if (fill == item->parentItem()) { //child-parent - setItemPos(QPointF(leftMargin, topMargin)); - } else if (fill->parentItem() == item->parentItem()) { //siblings - setItemPos(QPointF(fill->x()+leftMargin, fill->y()+topMargin)); + if (updatingFill < 2) { + ++updatingFill; + + if (fill == item->parentItem()) { //child-parent + setItemPos(QPointF(leftMargin, topMargin)); + } else if (fill->parentItem() == item->parentItem()) { //siblings + setItemPos(QPointF(fill->x()+leftMargin, fill->y()+topMargin)); + } + setItemWidth(fill->width()-leftMargin-rightMargin); + setItemHeight(fill->height()-topMargin-bottomMargin); + + --updatingFill; + } else { + // ### Make this certain :) + qmlInfo(QmlGraphicsAnchors::tr("Possible anchor loop detected on fill."), item); } - setItemWidth(fill->width()-leftMargin-rightMargin); - setItemHeight(fill->height()-topMargin-bottomMargin); + } void QmlGraphicsAnchorsPrivate::centerInChanged() @@ -166,16 +176,25 @@ void QmlGraphicsAnchorsPrivate::centerInChanged() if (!centerIn || fill || !isItemComplete()) return; - if (centerIn == item->parentItem()) { - QPointF p((item->parentItem()->width() - item->width()) / 2., - (item->parentItem()->height() - item->height()) / 2.); - setItemPos(p); + if (updatingCenterIn < 2) { + ++updatingCenterIn; - } else if (centerIn->parentItem() == item->parentItem()) { + if (centerIn == item->parentItem()) { + QPointF p((item->parentItem()->width() - item->width()) / 2., + (item->parentItem()->height() - item->height()) / 2.); + setItemPos(p); - QPointF p(centerIn->x() + (centerIn->width() - item->width()) / 2., - centerIn->y() + (centerIn->height() - item->height()) / 2.); - setItemPos(p); + } else if (centerIn->parentItem() == item->parentItem()) { + + QPointF p(centerIn->x() + (centerIn->width() - item->width()) / 2., + centerIn->y() + (centerIn->height() - item->height()) / 2.); + setItemPos(p); + } + + --updatingCenterIn; + } else { + // ### Make this certain :) + qmlInfo(QmlGraphicsAnchors::tr("Possible anchor loop detected on centerIn."), item); } } diff --git a/src/declarative/graphicsitems/qmlgraphicsanchors_p_p.h b/src/declarative/graphicsitems/qmlgraphicsanchors_p_p.h index 5f8b2c1..d21d9c5 100644 --- a/src/declarative/graphicsitems/qmlgraphicsanchors_p_p.h +++ b/src/declarative/graphicsitems/qmlgraphicsanchors_p_p.h @@ -89,7 +89,7 @@ class QmlGraphicsAnchorsPrivate : public QObjectPrivate public: QmlGraphicsAnchorsPrivate() : updatingMe(false), updatingHorizontalAnchor(0), - updatingVerticalAnchor(0), item(0), usedAnchors(0), fill(0), + updatingVerticalAnchor(0), updatingFill(0), updatingCenterIn(0), item(0), usedAnchors(0), fill(0), centerIn(0), leftMargin(0), rightMargin(0), topMargin(0), bottomMargin(0), vCenterOffset(0), hCenterOffset(0), baselineOffset(0), componentComplete(true) @@ -109,6 +109,8 @@ public: bool updatingMe; int updatingHorizontalAnchor; int updatingVerticalAnchor; + int updatingFill; + int updatingCenterIn; void setItemHeight(qreal); void setItemWidth(qreal); diff --git a/src/declarative/graphicsitems/qmlgraphicsflickable.cpp b/src/declarative/graphicsitems/qmlgraphicsflickable.cpp index b030495..ea9c173 100644 --- a/src/declarative/graphicsitems/qmlgraphicsflickable.cpp +++ b/src/declarative/graphicsitems/qmlgraphicsflickable.cpp @@ -1177,7 +1177,7 @@ void QmlGraphicsFlickable::setMaximumFlickVelocity(qreal v) } /*! - \qmlproperty real Flickable::maximumFlickVelocity + \qmlproperty real Flickable::flickDeceleration This property holds the rate at which a flick will decelerate. The default is 500. diff --git a/src/declarative/graphicsitems/qmlgraphicsgridview.cpp b/src/declarative/graphicsitems/qmlgraphicsgridview.cpp index 7427266..f39f5c7 100644 --- a/src/declarative/graphicsitems/qmlgraphicsgridview.cpp +++ b/src/declarative/graphicsitems/qmlgraphicsgridview.cpp @@ -1154,7 +1154,7 @@ void QmlGraphicsGridView::keyPressEvent(QKeyEvent *event) } /*! - \qmlmethod GridView::moveCurrentIndexUp + \qmlmethod GridView::moveCurrentIndexUp() Move the currentIndex up one item in the view. The current index will wrap if keyNavigationWraps is true and it @@ -1177,7 +1177,7 @@ void QmlGraphicsGridView::moveCurrentIndexUp() } /*! - \qmlmethod GridView::moveCurrentIndexDown + \qmlmethod GridView::moveCurrentIndexDown() Move the currentIndex down one item in the view. The current index will wrap if keyNavigationWraps is true and it @@ -1200,7 +1200,7 @@ void QmlGraphicsGridView::moveCurrentIndexDown() } /*! - \qmlmethod GridView::moveCurrentIndexLeft + \qmlmethod GridView::moveCurrentIndexLeft() Move the currentIndex left one item in the view. The current index will wrap if keyNavigationWraps is true and it @@ -1223,7 +1223,7 @@ void QmlGraphicsGridView::moveCurrentIndexLeft() } /*! - \qmlmethod GridView::moveCurrentIndexRight + \qmlmethod GridView::moveCurrentIndexRight() Move the currentIndex right one item in the view. The current index will wrap if keyNavigationWraps is true and it diff --git a/src/declarative/graphicsitems/qmlgraphicsitem.cpp b/src/declarative/graphicsitems/qmlgraphicsitem.cpp index 77e6db8..572aa98 100644 --- a/src/declarative/graphicsitems/qmlgraphicsitem.cpp +++ b/src/declarative/graphicsitems/qmlgraphicsitem.cpp @@ -389,6 +389,76 @@ void QmlGraphicsItemKeyFilter::componentComplete() if (m_next) m_next->componentComplete(); } + +/*! + \qmlclass KeyNavigation + \brief The KeyNavigation attached property supports key navigation by arrow keys. + + It is common in key-based UIs to use arrow keys to navigate + between focussed items. The KeyNavigation property provides a + convenient way of specifying which item will gain focus + when an arrow key is pressed. The following example provides + key navigation for a 2x2 grid of items. + + \code + Grid { + columns: 2 + width: 100; height: 100 + Rectangle { + id: item1 + focus: true + width: 50; height: 50 + color: focus ? "red" : "lightgray" + KeyNavigation.right: item2 + KeyNavigation.down: item3 + } + Rectangle { + id: item2 + width: 50; height: 50 + color: focus ? "red" : "lightgray" + KeyNavigation.left: item1 + KeyNavigation.down: item4 + } + Rectangle { + id: item3 + width: 50; height: 50 + color: focus ? "red" : "lightgray" + KeyNavigation.right: item4 + KeyNavigation.up: item1 + } + Rectangle { + id: item4 + width: 50; height: 50 + color: focus ? "red" : "lightgray" + KeyNavigation.left: item3 + KeyNavigation.up: item2 + } + } + \endcode + + KeyNavigation receives key events after the item it is attached to. + If the item accepts an arrow key event, the KeyNavigation + attached property will not receive an event for that key. + + If an item has been set for a direction and the KeyNavigation + attached property receives the corresponding + key press and release events, the events will be accepted by + KeyNaviagtion and will not propagate any further. + + \sa {Keys}{Keys attached property} +*/ + +/*! + \qmlproperty Item KeyNavigation::left + \qmlproperty Item KeyNavigation::right + \qmlproperty Item KeyNavigation::up + \qmlproperty Item KeyNavigation::down + + These properties hold the item to assign focus to + when Key_Left, Key_Right, Key_Up or Key_Down are + pressed. +*/ + class QmlGraphicsKeyNavigationAttachedPrivate : public QObjectPrivate { public: @@ -606,7 +676,7 @@ void QmlGraphicsKeyNavigationAttached::keyReleased(QKeyEvent *event) See \l {Qt::Key}{Qt.Key} for the list of keyboard codes. - \sa KeyEvent + \sa KeyEvent, {KeyNavigation}{KeyNavigation attached property} */ /*! @@ -1119,7 +1189,7 @@ void QmlGraphicsKeysAttached::keyPressed(QKeyEvent *event) // If we specifically handle a key then default to accepted ke.setAccepted(true); int idx = QmlGraphicsKeysAttached::staticMetaObject.indexOfSignal(keySignal); - metaObject()->method(idx).invoke(this, Q_ARG(QmlGraphicsKeysAttached, &ke)); + metaObject()->method(idx).invoke(this, Qt::DirectConnection, Q_ARG(QmlGraphicsKeyEvent*, &ke)); } } if (!ke.isAccepted()) @@ -1838,6 +1908,17 @@ void QmlGraphicsItem::setClip(bool c) */ /*! + \qmlproperty bool Item::visible + + Whether the item is visible. By default this is true. + + \note visible is not linked to actual visibility; if you item + goes off screen, or the opacity changes to 0, etc this will + not affect the visible property. +*/ + + +/*! This function is called to handle this item's changes in geometry from \a oldGeometry to \a newGeometry. If the two geometries are the same, it doesn't do anything. diff --git a/src/declarative/graphicsitems/qmlgraphicslistview.cpp b/src/declarative/graphicsitems/qmlgraphicslistview.cpp index 1f5d51d..53287a6 100644 --- a/src/declarative/graphicsitems/qmlgraphicslistview.cpp +++ b/src/declarative/graphicsitems/qmlgraphicslistview.cpp @@ -434,7 +434,6 @@ void QmlGraphicsListViewPrivate::clear() visibleIndex = 0; releaseItem(currentItem); currentItem = 0; - currentIndex = -1; createHighlight(); trackedItem = 0; } @@ -746,7 +745,7 @@ void QmlGraphicsListViewPrivate::updateCurrentSection() void QmlGraphicsListViewPrivate::updateCurrent(int modelIndex) { Q_Q(QmlGraphicsListView); - if (!isValid() || modelIndex < 0 || modelIndex >= model->count()) { + if (!q->isComponentComplete() || !isValid() || modelIndex < 0 || modelIndex >= model->count()) { if (currentItem) { currentItem->attached->setIsCurrentItem(false); releaseItem(currentItem); @@ -1114,16 +1113,20 @@ void QmlGraphicsListView::setModel(const QVariant &model) dataModel->setModel(model); } if (d->model) { - if (d->currentIndex >= d->model->count() || d->currentIndex < 0) - setCurrentIndex(0); - else - d->updateCurrent(d->currentIndex); + if (isComponentComplete()) { + refill(); + if (d->currentIndex >= d->model->count() || d->currentIndex < 0) { + setCurrentIndex(0); + } else { + d->moveReason = QmlGraphicsListViewPrivate::SetIndex; + d->updateCurrent(d->currentIndex); + } + } connect(d->model, SIGNAL(itemsInserted(int,int)), this, SLOT(itemsInserted(int,int))); connect(d->model, SIGNAL(itemsRemoved(int,int)), this, SLOT(itemsRemoved(int,int))); connect(d->model, SIGNAL(itemsMoved(int,int,int)), this, SLOT(itemsMoved(int,int,int))); connect(d->model, SIGNAL(createdItem(int, QmlGraphicsItem*)), this, SLOT(createdItem(int,QmlGraphicsItem*))); connect(d->model, SIGNAL(destroyingItem(QmlGraphicsItem*)), this, SLOT(destroyingItem(QmlGraphicsItem*))); - refill(); emit countChanged(); } } @@ -1156,8 +1159,11 @@ void QmlGraphicsListView::setDelegate(QmlComponent *delegate) } if (QmlGraphicsVisualDataModel *dataModel = qobject_cast<QmlGraphicsVisualDataModel*>(d->model)) { dataModel->setDelegate(delegate); - d->updateCurrent(d->currentIndex); - refill(); + if (isComponentComplete()) { + refill(); + d->moveReason = QmlGraphicsListViewPrivate::SetIndex; + d->updateCurrent(d->currentIndex); + } } } @@ -1178,7 +1184,7 @@ int QmlGraphicsListView::currentIndex() const void QmlGraphicsListView::setCurrentIndex(int index) { Q_D(QmlGraphicsListView); - if (d->isValid() && index != d->currentIndex && index < d->model->count() && index >= 0) { + if (isComponentComplete() && d->isValid() && index != d->currentIndex && index < d->model->count() && index >= 0) { d->moveReason = QmlGraphicsListViewPrivate::SetIndex; cancelFlick(); d->updateCurrent(index); @@ -1254,7 +1260,7 @@ void QmlGraphicsListView::setHighlight(QmlComponent *highlight) is scrolled. This is because the view moves to maintain the highlight within the preferred highlight range (or visible viewport). - \sa highlight + \sa highlight, highlightMoveSpeed */ bool QmlGraphicsListView::highlightFollowsCurrentItem() const { @@ -1473,8 +1479,13 @@ QString QmlGraphicsListView::currentSection() const /*! \qmlproperty real ListView::highlightMoveSpeed + \qmlproperty real ListView::highlightResizeSpeed + These properties hold the move and resize animation speed of the highlight delegate. + + highlightFollowsCurrentItem must be true for these properties + to have effect. - This property holds the moving animation speed of the highlight delegate. + \sa highlightFollowsCurrentItem */ qreal QmlGraphicsListView::highlightMoveSpeed() const { @@ -1488,15 +1499,12 @@ void QmlGraphicsListView::setHighlightMoveSpeed(qreal speed) if (d->highlightMoveSpeed != speed) { d->highlightMoveSpeed = speed; + if (d->highlightPosAnimator) + d->highlightPosAnimator->setVelocity(d->highlightMoveSpeed); emit highlightMoveSpeedChanged(); } } -/*! - \qmlproperty real ListView::highlightResizeSpeed - - This property holds the resizing animation speed of the highlight delegate. -*/ qreal QmlGraphicsListView::highlightResizeSpeed() const { Q_D(const QmlGraphicsListView);\ @@ -1509,6 +1517,8 @@ void QmlGraphicsListView::setHighlightResizeSpeed(qreal speed) if (d->highlightResizeSpeed != speed) { d->highlightResizeSpeed = speed; + if (d->highlightSizeAnimator) + d->highlightSizeAnimator->setVelocity(d->highlightResizeSpeed); emit highlightResizeSpeedChanged(); } } @@ -1666,9 +1676,11 @@ void QmlGraphicsListView::componentComplete() { Q_D(QmlGraphicsListView); QmlGraphicsFlickable::componentComplete(); + refill(); if (d->currentIndex < 0) d->updateCurrent(0); - refill(); + else + d->updateCurrent(d->currentIndex); d->fixupPosition(); } @@ -1748,6 +1760,7 @@ void QmlGraphicsListView::itemsInserted(int modelIndex, int count) d->updateUnrequestedIndexes(); if (!d->visibleItems.count() || d->model->count() <= 1) { d->layout(); + d->updateSections(); d->updateCurrent(qMax(0, qMin(d->currentIndex, d->model->count()-1))); emit countChanged(); return; @@ -1827,6 +1840,7 @@ void QmlGraphicsListView::itemsInserted(int modelIndex, int count) added.at(j)->attached->emitAdd(); d->updateUnrequestedPositions(); d->updateViewport(); + d->updateSections(); emit countChanged(); } @@ -2009,6 +2023,7 @@ void QmlGraphicsListView::itemsMoved(int from, int to, int count) d->visibleItems.first()->setPosition(firstItemPos); d->layout(); + d->updateSections(); } void QmlGraphicsListView::createdItem(int index, QmlGraphicsItem *item) diff --git a/src/declarative/graphicsitems/qmlgraphicslistview_p.h b/src/declarative/graphicsitems/qmlgraphicslistview_p.h index 446d71a..3f46434 100644 --- a/src/declarative/graphicsitems/qmlgraphicslistview_p.h +++ b/src/declarative/graphicsitems/qmlgraphicslistview_p.h @@ -64,8 +64,11 @@ class Q_DECLARATIVE_EXPORT QmlGraphicsListView : public QmlGraphicsFlickable Q_PROPERTY(int currentIndex READ currentIndex WRITE setCurrentIndex NOTIFY currentIndexChanged) Q_PROPERTY(QmlGraphicsItem *currentItem READ currentItem NOTIFY currentIndexChanged) Q_PROPERTY(int count READ count NOTIFY countChanged) + Q_PROPERTY(QmlComponent *highlight READ highlight WRITE setHighlight) Q_PROPERTY(bool highlightFollowsCurrentItem READ highlightFollowsCurrentItem WRITE setHighlightFollowsCurrentItem) + Q_PROPERTY(qreal highlightMoveSpeed READ highlightMoveSpeed WRITE setHighlightMoveSpeed NOTIFY highlightMoveSpeedChanged) + Q_PROPERTY(qreal highlightResizeSpeed READ highlightResizeSpeed WRITE setHighlightResizeSpeed NOTIFY highlightResizeSpeedChanged) Q_PROPERTY(qreal preferredHighlightBegin READ preferredHighlightBegin WRITE setPreferredHighlightBegin) Q_PROPERTY(qreal preferredHighlightEnd READ preferredHighlightEnd WRITE setPreferredHighlightEnd) @@ -78,8 +81,6 @@ class Q_DECLARATIVE_EXPORT QmlGraphicsListView : public QmlGraphicsFlickable Q_PROPERTY(QString sectionExpression READ sectionExpression WRITE setSectionExpression NOTIFY sectionExpressionChanged) Q_PROPERTY(QString currentSection READ currentSection NOTIFY currentSectionChanged) - Q_PROPERTY(qreal highlightMoveSpeed READ highlightMoveSpeed WRITE setHighlightMoveSpeed NOTIFY highlightMoveSpeedChanged) - Q_PROPERTY(qreal highlightResizeSpeed READ highlightResizeSpeed WRITE setHighlightResizeSpeed NOTIFY highlightResizeSpeedChanged) Q_ENUMS(HighlightRangeMode) Q_ENUMS(Orientation) Q_CLASSINFO("DefaultProperty", "data") diff --git a/src/declarative/graphicsitems/qmlgraphicsmouseregion.cpp b/src/declarative/graphicsitems/qmlgraphicsmouseregion.cpp index 196cdf2..22c2c0a 100644 --- a/src/declarative/graphicsitems/qmlgraphicsmouseregion.cpp +++ b/src/declarative/graphicsitems/qmlgraphicsmouseregion.cpp @@ -146,19 +146,19 @@ void QmlGraphicsDrag::setYmax(qreal m) */ /*! - \qmlsignal MouseRegion::onEntered + \qmlsignal MouseRegion::onEntered() This handler is called when the mouse enters the mouse region. */ /*! - \qmlsignal MouseRegion::onExited + \qmlsignal MouseRegion::onExited() This handler is called when the mouse exists the mouse region. */ /*! - \qmlsignal MouseRegion::onPositionChanged(mouse) + \qmlsignal MouseRegion::onPositionChanged(MouseEvent mouse) This handler is called when the mouse position changes. diff --git a/src/declarative/qml/qmlcompiler.cpp b/src/declarative/qml/qmlcompiler.cpp index 240f16c..8e92eb4 100644 --- a/src/declarative/qml/qmlcompiler.cpp +++ b/src/declarative/qml/qmlcompiler.cpp @@ -1714,7 +1714,7 @@ bool QmlCompiler::buildGroupedProperty(QmlParser::Property *prop, prop->value, obj, ctxt.incr())); obj->addValueTypeProperty(prop); } else { - COMPILE_EXCEPTION(prop, qApp->translate("QmlCompiler","Invalid property access")); + COMPILE_EXCEPTION(prop, qApp->translate("QmlCompiler","Invalid grouped property access")); } } else { @@ -1722,7 +1722,7 @@ bool QmlCompiler::buildGroupedProperty(QmlParser::Property *prop, prop->value->metatype = QmlEnginePrivate::get(engine)->metaObjectForType(prop->type); if (!prop->value->metatype) - COMPILE_EXCEPTION(prop, qApp->translate("QmlCompiler","Cannot nest non-QObject property \"%1\"").arg(QString::fromUtf8(prop->name))); + COMPILE_EXCEPTION(prop, qApp->translate("QmlCompiler","Invalid grouped property access")); obj->addGroupedProperty(prop); @@ -1749,8 +1749,11 @@ bool QmlCompiler::buildValueTypeProperty(QObject *type, prop->index = idx; prop->type = p.userType(); - if (prop->value || prop->values.count() != 1) - COMPILE_EXCEPTION(prop, qApp->translate("QmlCompiler","Invalid property use")); + if (prop->value) + COMPILE_EXCEPTION(prop, qApp->translate("QmlCompiler","Property assignment expected")); + + if (prop->values.count() != 1) + COMPILE_EXCEPTION(prop, qApp->translate("QmlCompiler","Single property assignment expected")); Value *value = prop->values.at(0); @@ -1758,7 +1761,7 @@ bool QmlCompiler::buildValueTypeProperty(QObject *type, bool isPropertyValue = output->types.at(value->object->type).type->propertyValueSourceCast() != -1; bool isPropertyInterceptor = output->types.at(value->object->type).type->propertyValueInterceptorCast() != -1; if (!isPropertyValue && !isPropertyInterceptor) { - COMPILE_EXCEPTION(prop, qApp->translate("QmlCompiler","Invalid property use")); + COMPILE_EXCEPTION(prop, qApp->translate("QmlCompiler","Unexpected object assignment")); } else { COMPILE_CHECK(buildObject(value->object, ctxt)); diff --git a/src/declarative/qml/qmlcontext_p.h b/src/declarative/qml/qmlcontext_p.h index 7f9be0f..22d981f 100644 --- a/src/declarative/qml/qmlcontext_p.h +++ b/src/declarative/qml/qmlcontext_p.h @@ -74,7 +74,7 @@ class QmlExpressionPrivate; class QmlAbstractExpression; class QmlBinding_Id; -class QmlContextPrivate : public QObjectPrivate +class Q_DECLARATIVE_EXPORT QmlContextPrivate : public QObjectPrivate { Q_DECLARE_PUBLIC(QmlContext) public: diff --git a/src/declarative/qml/qmldom.cpp b/src/declarative/qml/qmldom.cpp index b6e794b..39d6730 100644 --- a/src/declarative/qml/qmldom.cpp +++ b/src/declarative/qml/qmldom.cpp @@ -52,8 +52,6 @@ QT_BEGIN_NAMESPACE -DEFINE_BOOL_CONFIG_OPTION(compilerDump, QML_COMPILER_DUMP) - QmlDomDocumentPrivate::QmlDomDocumentPrivate() : root(0) { @@ -191,11 +189,6 @@ bool QmlDomDocument::load(QmlEngine *engine, const QByteArray &data, const QUrl } if (td->data.tree()) { - if (compilerDump()) { - qWarning() << "-AST------------------------------------------------------------------------------"; - td->data.tree()->dump(); - qWarning() << "----------------------------------------------------------------------------------"; - } d->root = td->data.tree(); d->root->addref(); } diff --git a/src/declarative/qml/qmlengine.cpp b/src/declarative/qml/qmlengine.cpp index e46205d..177818f 100644 --- a/src/declarative/qml/qmlengine.cpp +++ b/src/declarative/qml/qmlengine.cpp @@ -908,7 +908,7 @@ QVariant QmlEnginePrivate::scriptValueToVariant(const QScriptValue &val) else if (dc == contextClass) return QVariant(); - QScriptClass *sc = val.scriptClass(); + QScriptDeclarativeClass *sc = QScriptDeclarativeClass::scriptClass(val); if (!sc) { return val.toVariant(); } else if (sc == valueTypeClass) { @@ -929,20 +929,7 @@ QVariant QmlScriptClass::toVariant(QmlEngine *engine, const QScriptValue &val) QmlEnginePrivate *ep = static_cast<QmlEnginePrivate *>(QObjectPrivate::get(engine)); - QScriptDeclarativeClass *dc = QScriptDeclarativeClass::scriptClass(val); - if (dc == ep->objectClass) - return QVariant::fromValue(ep->objectClass->toQObject(val)); - else if (dc == ep->contextClass) - return QVariant(); - - QScriptClass *sc = val.scriptClass(); - if (!sc) { - return val.toVariant(); - } else if (sc == ep->valueTypeClass) { - return ep->valueTypeClass->toVariant(val); - } - - return QVariant(); + return ep->scriptValueToVariant(val); } // XXX this beyonds in QUrl::toLocalFile() diff --git a/src/declarative/qml/qmlparser.cpp b/src/declarative/qml/qmlparser.cpp index 7fd57f3..ee69b14 100644 --- a/src/declarative/qml/qmlparser.cpp +++ b/src/declarative/qml/qmlparser.cpp @@ -200,28 +200,6 @@ QmlParser::Object::DynamicSlot::DynamicSlot(const DynamicSlot &o) { } -void QmlParser::Object::dump(int indent) const -{ - QByteArray ba(indent * 4, ' '); - if (type != -1) { - qWarning() << ba.constData() << "Object:" << typeName; - } else { - qWarning() << ba.constData() << "Object: fetched"; - } - - for (QHash<QByteArray, Property *>::ConstIterator iter = properties.begin(); - iter != properties.end(); - ++iter) { - qWarning() << ba.constData() << " Property" << iter.key(); - (*iter)->dump(indent + 1); - } - - if (defaultProperty) { - qWarning() << ba.constData() << " Default property"; - defaultProperty->dump(indent + 1); - } -} - QmlParser::Property::Property() : parent(0), type(0), index(-1), value(0), isDefault(true), isDeferred(false) { @@ -256,15 +234,6 @@ bool QmlParser::Property::isEmpty() const return !value && values.isEmpty(); } -void QmlParser::Property::dump(int indent) const -{ - QByteArray ba(indent * 4, ' '); - for (int ii = 0; ii < values.count(); ++ii) - values.at(ii)->dump(indent); - if (value) - value->dump(indent); -} - QmlParser::Value::Value() : type(Unknown), object(0) { @@ -275,69 +244,6 @@ QmlParser::Value::~Value() if (object) object->release(); } -void QmlParser::Value::dump(int indent) const -{ - QByteArray type; - switch(this->type) { - default: - case Value::Unknown: - type = "Unknown"; - break; - case Value::Literal: - type = "Literal"; - break; - case Value::PropertyBinding: - type = "PropertyBinding"; - break; - case Value::ValueSource: - type = "ValueSource"; - break; - case Value::ValueInterceptor: - type = "ValueInterceptor"; - break; - case Value::CreatedObject: - type = "CreatedObject"; - break; - case Value::SignalObject: - type = "SignalObject"; - break; - case Value::SignalExpression: - type = "SignalExpression"; - break; - case Value::Id: - type = "Id"; - break; - } - - QByteArray primType; - switch(this->value.type()) { - default: - case Variant::Invalid: - primType = "Invalid"; - break; - case Variant::Boolean: - primType = "Boolean"; - break; - case Variant::Number: - primType = "Number"; - break; - case Variant::String: - primType = "String"; - break; - case Variant::Script: - primType = "Script"; - break; - } - - QByteArray ba(indent * 4, ' '); - if (object) { - qWarning() << ba.constData() << "Value (" << type << "):"; - object->dump(indent + 1); - } else { - qWarning() << ba.constData() << "Value (" << type << "):" << primType.constData() << primitive(); - } -} - QmlParser::Variant::Variant() : t(Invalid) {} diff --git a/src/declarative/qml/qmlparser_p.h b/src/declarative/qml/qmlparser_p.h index 5bffff2..4f080e5 100644 --- a/src/declarative/qml/qmlparser_p.h +++ b/src/declarative/qml/qmlparser_p.h @@ -216,8 +216,6 @@ namespace QmlParser QList<DynamicSignal> dynamicSignals; // The list of dynamic slots QList<DynamicSlot> dynamicSlots; - - void dump(int = 0) const; }; class Variant @@ -299,8 +297,6 @@ namespace QmlParser Object *object; LocationSpan location; - - void dump(int = 0) const; }; class Property : public QmlRefCount @@ -342,8 +338,6 @@ namespace QmlParser LocationSpan location; LocationRange listValueRange; QList<int> listCommaPositions; - - void dump(int = 0) const; }; } diff --git a/src/declarative/qml/qmlvaluetypescriptclass.cpp b/src/declarative/qml/qmlvaluetypescriptclass.cpp index 0c30992..e939e80 100644 --- a/src/declarative/qml/qmlvaluetypescriptclass.cpp +++ b/src/declarative/qml/qmlvaluetypescriptclass.cpp @@ -44,15 +44,14 @@ QT_BEGIN_NAMESPACE -struct QmlValueTypeReference { +struct QmlValueTypeReference : public QScriptDeclarativeClass::Object { QmlValueType *type; QGuard<QObject> object; int property; }; -Q_DECLARE_METATYPE(QmlValueTypeReference); QmlValueTypeScriptClass::QmlValueTypeScriptClass(QmlEngine *bindEngine) -: QScriptClass(QmlEnginePrivate::getScriptEngine(bindEngine)), engine(bindEngine) +: QScriptDeclarativeClass(QmlEnginePrivate::getScriptEngine(bindEngine)), engine(bindEngine) { } @@ -62,89 +61,83 @@ QmlValueTypeScriptClass::~QmlValueTypeScriptClass() QScriptValue QmlValueTypeScriptClass::newObject(QObject *object, int coreIndex, QmlValueType *type) { - QmlValueTypeReference ref = { type, object, coreIndex }; - QScriptEngine *scriptEngine = QmlEnginePrivate::getScriptEngine(engine); - return scriptEngine->newObject(this, scriptEngine->newVariant(qVariantFromValue(ref))); + QmlValueTypeReference *ref = new QmlValueTypeReference; + ref->type = type; + ref->object = object; + ref->property = coreIndex; + return QScriptDeclarativeClass::newObject(QmlEnginePrivate::getScriptEngine(engine), this, ref); } -QmlValueTypeScriptClass::QueryFlags -QmlValueTypeScriptClass::queryProperty(const QScriptValue &object, - const QScriptString &name, - QueryFlags flags, uint *id) +QScriptClass::QueryFlags +QmlValueTypeScriptClass::queryProperty(Object *obj, const Identifier &name, + QScriptClass::QueryFlags) { - Q_UNUSED(flags); - QmlValueTypeReference ref = - qvariant_cast<QmlValueTypeReference>(object.data().toVariant()); + QmlValueTypeReference *ref = static_cast<QmlValueTypeReference *>(obj); - if (!ref.object) + m_lastIndex = -1; + + if (!ref->object) return 0; - QByteArray propName = name.toString().toUtf8(); + QByteArray propName = toString(name).toUtf8(); - int idx = ref.type->metaObject()->indexOfProperty(propName.constData()); - if (idx == -1) + m_lastIndex = ref->type->metaObject()->indexOfProperty(propName.constData()); + if (m_lastIndex == -1) return 0; - *id = idx; - QMetaProperty prop = ref.object->metaObject()->property(idx); + QMetaProperty prop = ref->object->metaObject()->property(m_lastIndex); - QmlValueTypeScriptClass::QueryFlags rv = - QmlValueTypeScriptClass::HandlesReadAccess; + QScriptClass::QueryFlags rv = + QScriptClass::HandlesReadAccess; if (prop.isWritable()) - rv |= QmlValueTypeScriptClass::HandlesWriteAccess; + rv |= QScriptClass::HandlesWriteAccess; return rv; } -QScriptValue QmlValueTypeScriptClass::property(const QScriptValue &object, - const QScriptString &name, - uint id) +QScriptValue QmlValueTypeScriptClass::property(Object *obj, const Identifier &) { - Q_UNUSED(name); - QmlValueTypeReference ref = - qvariant_cast<QmlValueTypeReference>(object.data().toVariant()); - - if (!ref.object) - return QScriptValue(); + QmlValueTypeReference *ref = static_cast<QmlValueTypeReference *>(obj); - ref.type->read(ref.object, ref.property); - - QMetaProperty p = ref.type->metaObject()->property(id); - QVariant rv = p.read(ref.type); + QMetaProperty p = ref->type->metaObject()->property(m_lastIndex); + ref->type->read(ref->object, ref->property); + QVariant rv = p.read(ref->type); return static_cast<QmlEnginePrivate *>(QObjectPrivate::get(engine))->scriptValueFromVariant(rv); } -void QmlValueTypeScriptClass::setProperty(QScriptValue &object, - const QScriptString &name, - uint id, +void QmlValueTypeScriptClass::setProperty(Object *obj, const Identifier &, const QScriptValue &value) { - Q_UNUSED(name); - QmlValueTypeReference ref = - qvariant_cast<QmlValueTypeReference>(object.data().toVariant()); - - if (!ref.object) - return; + QmlValueTypeReference *ref = static_cast<QmlValueTypeReference *>(obj); QVariant v = QmlScriptClass::toVariant(engine, value); - ref.type->read(ref.object, ref.property); - QMetaProperty p = ref.type->metaObject()->property(id); - p.write(ref.type, v); - ref.type->write(ref.object, ref.property, 0); + ref->type->read(ref->object, ref->property); + QMetaProperty p = ref->type->metaObject()->property(m_lastIndex); + p.write(ref->type, v); + ref->type->write(ref->object, ref->property, 0); } -QVariant QmlValueTypeScriptClass::toVariant(const QScriptValue &val) +QVariant QmlValueTypeScriptClass::toVariant(Object *obj, bool *ok) { - QmlValueTypeReference ref = - qvariant_cast<QmlValueTypeReference>(val.data().toVariant()); + QmlValueTypeReference *ref = static_cast<QmlValueTypeReference *>(obj); - if (!ref.object) + if (ok) *ok = true; + + if (ref->object) { + ref->type->read(ref->object, ref->property); + return ref->type->value(); + } else { return QVariant(); + } +} + +QVariant QmlValueTypeScriptClass::toVariant(const QScriptValue &value) +{ + Q_ASSERT(scriptClass(value) == this); - QMetaProperty p = ref.object->metaObject()->property(ref.property); - return p.read(ref.object); + return toVariant(object(value), 0); } QT_END_NAMESPACE diff --git a/src/declarative/qml/qmlvaluetypescriptclass_p.h b/src/declarative/qml/qmlvaluetypescriptclass_p.h index bd31ec1..19020b2 100644 --- a/src/declarative/qml/qmlvaluetypescriptclass_p.h +++ b/src/declarative/qml/qmlvaluetypescriptclass_p.h @@ -59,7 +59,7 @@ QT_BEGIN_NAMESPACE class QmlEngine; class QmlValueType; -class QmlValueTypeScriptClass : public QScriptClass +class QmlValueTypeScriptClass : public QScriptDeclarativeClass { public: QmlValueTypeScriptClass(QmlEngine *); @@ -67,20 +67,16 @@ public: QScriptValue newObject(QObject *object, int coreIndex, QmlValueType *); - virtual QueryFlags queryProperty(const QScriptValue &object, - const QScriptString &name, - QueryFlags flags, uint *id); - virtual QScriptValue property(const QScriptValue &object, - const QScriptString &name, - uint id); - virtual void setProperty(QScriptValue &object, - const QScriptString &name, - uint id, - const QScriptValue &value); + virtual QScriptClass::QueryFlags queryProperty(Object *, const Identifier &, + QScriptClass::QueryFlags flags); + virtual QScriptValue property(Object *, const Identifier &); + virtual void setProperty(Object *, const Identifier &name, const QScriptValue &); + virtual QVariant toVariant(Object *, bool *ok = 0); QVariant toVariant(const QScriptValue &); private: QmlEngine *engine; + int m_lastIndex; }; QT_END_NAMESPACE diff --git a/src/declarative/util/qmlanimation.cpp b/src/declarative/util/qmlanimation.cpp index bd4c6f7..94cdadf 100644 --- a/src/declarative/util/qmlanimation.cpp +++ b/src/declarative/util/qmlanimation.cpp @@ -422,21 +422,6 @@ void QmlAbstractAnimation::setGroup(QmlAnimationGroup *g) setParent(g); } -/*! - \qmlproperty Object PropertyAction::target - This property holds an explicit target object to animate. - - The exact effect of the \c target property depends on how the animation - is being used. Refer to the \l animation documentation for details. -*/ - -/*! - \qmlproperty Object PropertyAnimation::target - This property holds an explicit target object to animate. - - The exact effect of the \c target property depends on how the animation - is being used. Refer to the \l animation documentation for details. -*/ QObject *QmlAbstractAnimation::target() const { Q_D(const QmlAbstractAnimation); @@ -459,21 +444,6 @@ void QmlAbstractAnimation::setTarget(QObject *o) emit targetChanged(d->target, d->propertyName); } -/*! - \qmlproperty string PropertyAction::property - This property holds an explicit property to animated. - - The exact effect of the \c property property depends on how the animation - is being used. Refer to the \l animation documentation for details. -*/ - -/*! - \qmlproperty string PropertyAnimation::property - This property holds an explicit property to animated. - - The exact effect of the \c property property depends on how the animation - is being used. Refer to the \l animation documentation for details. -*/ QString QmlAbstractAnimation::property() const { Q_D(const QmlAbstractAnimation); @@ -880,7 +850,7 @@ QML_DEFINE_TYPE(Qt,4,6,ScriptAction,QmlScriptAction) Set \c thewebview.url to the value set for the destination state: \code - PropertyAction { target: thewebview; property: "url" } + PropertyAction { matchTargets: thewebview; matchProperties: "url" } \endcode The PropertyAction is immediate - @@ -909,8 +879,33 @@ void QmlPropertyActionPrivate::init() } /*! - \qmlproperty string PropertyAction::properties - This property holds the properties to be immediately set, comma-separated. + \qmlproperty Object PropertyAction::target + This property holds an explicit target object to animate. + + The exact effect of the \c target property depends on how the animation + is being used. Refer to the \l animation documentation for details. +*/ + +/*! + \qmlproperty string PropertyAction::property + This property holds an explicit property to animated. + + The exact effect of the \c property property depends on how the animation + is being used. Refer to the \l animation documentation for details. +*/ + +/*! + \qmlproperty string PropertyAction::matchProperties + This property holds a comma-separated list of property names this action + will match against. These names are used in conjunction with matchTargets + to create a list of properties that the action will set, assuming those + properties have changed. + + This property is typically used for an action appearing as part of a Transition. + + By default, no property names will be matched. + + \sa matchTargets PropertyAnimation::matchProperties */ QString QmlPropertyAction::properties() const { @@ -928,9 +923,16 @@ void QmlPropertyAction::setProperties(const QString &p) } /*! - \qmlproperty list<Item> PropertyAction::targets - This property holds the items selected to be affected by this animation (all if not set). - \sa exclude + \qmlproperty list<Object> PropertyAction::matchTargets + This property holds a list of objects this action will match against. + These objects are used in conjunction with matchProperties to create a list of properties + that the action will set, assuming those properties have changed. + + This property is typically used for an action appearing as part of a Transition. + + By default, all changing targets will be matched. + + \sa exclude matchProperties PropertyAnimation::matchTargets */ QList<QObject *> *QmlPropertyAction::targets() { @@ -939,9 +941,9 @@ QList<QObject *> *QmlPropertyAction::targets() } /*! - \qmlproperty list<Item> PropertyAction::exclude - This property holds the items not to be affected by this animation. - \sa targets + \qmlproperty list<Object> PropertyAction::exclude + This property holds the objects not to be affected by this animation. + \sa matchTargets */ QList<QObject *> *QmlPropertyAction::exclude() { @@ -1014,19 +1016,26 @@ void QmlPropertyAction::transition(QmlStateActions &actions, QStringList props = d->properties.isEmpty() ? QStringList() : d->properties.split(QLatin1Char(',')); for (int ii = 0; ii < props.count(); ++ii) props[ii] = props.at(ii).trimmed(); - if (!d->propertyName.isEmpty() && !props.contains(d->propertyName)) - props.append(d->propertyName); - - bool targetNeedsReset = false; - if (d->userProperty.isValid() && props.isEmpty() && !target()) { - props.append(d->userProperty.value.name()); - d->target = d->userProperty.value.object(); - targetNeedsReset = true; - } + + bool hasSelectors = !props.isEmpty() || !d->targets.isEmpty() || !d->exclude.isEmpty(); + bool hasTarget = !d->propertyName.isEmpty() || d->target; + + if (hasSelectors && hasTarget) { + qmlInfo(tr("matchTargets/matchProperties/exclude and target/property are mutually exclusive."), this); + return; + } QmlSetPropertyAnimationAction *data = new QmlSetPropertyAnimationAction; - QSet<QObject *> objs; + if (hasTarget && d->value.isValid()) { + Action myAction; + myAction.property = d->createProperty(target(), d->propertyName); + if (myAction.property.isValid()) { + myAction.toValue = d->value; + data->actions << myAction; + } + } + for (int ii = 0; ii < actions.count(); ++ii) { Action &action = actions[ii]; @@ -1038,9 +1047,7 @@ void QmlPropertyAction::transition(QmlStateActions &actions, if ((d->targets.isEmpty() || d->targets.contains(obj) || (!same && d->targets.contains(sObj))) && (!d->exclude.contains(obj)) && (same || (!d->exclude.contains(sObj))) && - (props.contains(propertyName) || (!same && props.contains(sPropertyName))) && - (!target() || target() == obj || (!same && target() == sObj))) { - objs.insert(obj); + (props.contains(propertyName) || (!same && props.contains(sPropertyName)))) { Action myAction = action; if (d->value.isValid()) @@ -1049,18 +1056,20 @@ void QmlPropertyAction::transition(QmlStateActions &actions, modified << action.property; data->actions << myAction; action.fromValue = myAction.toValue; - } - } + } else if (d->userProperty.isValid() && + !hasSelectors && !hasTarget) { + if ((d->userProperty.value.object() == obj || (!same && d->userProperty.value.object() == sObj)) && + (d->userProperty.value.name() == propertyName || (!same && d->userProperty.value.name() == sPropertyName))) { + //### same as above. merge + Action myAction = action; - if (d->value.isValid() && target() && !objs.contains(target())) { - QObject *obj = target(); - for (int jj = 0; jj < props.count(); ++jj) { - Action myAction; - myAction.property = d->createProperty(obj, props.at(jj)); - if (!myAction.property.isValid()) - continue; - myAction.toValue = d->value; - data->actions << myAction; + if (d->value.isValid()) + myAction.toValue = d->value; + + modified << action.property; + data->actions << myAction; + action.fromValue = myAction.toValue; + } } } @@ -1069,8 +1078,6 @@ void QmlPropertyAction::transition(QmlStateActions &actions, } else { delete data; } - if (targetNeedsReset) - d->target = 0; } QML_DEFINE_TYPE(Qt,4,6,PropertyAction,QmlPropertyAction) @@ -1222,7 +1229,7 @@ QML_DEFINE_TYPE(Qt,4,6,ParentAction,QmlParentAction) Animate a set of properties over 200ms, from their values in the start state to their values in the end state of the transition: \code - NumberAnimation { properties: "x,y,scale"; duration: 200 } + NumberAnimation { matchProperties: "x,y,scale"; duration: 200 } \endcode */ @@ -1500,6 +1507,8 @@ void QmlPropertyAnimationPrivate::convertVariant(QVariant &variant, int type) \code VariantAnimation { property: "size"; to: "20x20"; duration: 200 } \endcode + + \a qmlanimation.html */ QmlPropertyAnimation::QmlPropertyAnimation(QObject *parent) @@ -1785,11 +1794,53 @@ void QmlPropertyAnimation::setEasing(const QString &e) } /*! - \qmlproperty string PropertyAnimation::properties - This property holds the properties this animation should be applied to. + \qmlproperty Object PropertyAnimation::target + This property holds an explicit target object to animate. + + target is used in conjunction with property to determine + what property should be animated. + + \sa property matchTargets +*/ + +/*! + \qmlproperty string PropertyAnimation::property + This property holds an explicit property name to animate. + + property is used in conjunction with target to determine + what property should be animated. + + \sa target matchProperties +*/ + +/*! + \qmlproperty string PropertyAnimation::matchProperties + This property holds a comma-separated list of property names this animation + will match against. These names are used in conjunction with matchTargets + to create a list of properties that the animation will animate, assuming those + properties have changed. + + In the following example, the change in 'x' will be animated by the transition, while + the change in 'y' will not. + \qml + State { + PropertyChanges { + target: myItem + x: 15; y: 15 + } + } + Transition { + PropertyAnimation { + matchProperties: "x" + } + } + \endqml + + This property is typically used for an animation appearing as part of a Transition. + + By default, no property names will be matched. - This is a comma-separated list of properties that should use - this animation when they change. + \sa matchTargets PropertyAction::matchTargets */ QString QmlPropertyAnimation::properties() const { @@ -1808,9 +1859,37 @@ void QmlPropertyAnimation::setProperties(const QString &prop) } /*! - \qmlproperty list<Item> PropertyAnimation::targets - This property holds the items selected to be affected by this animation (all if not set). - \sa exclude + \qmlproperty list<Object> PropertyAnimation::matchTargets + This property holds a list of objects this animation will match against. + These objects are used in conjunction with matchProperties to create a list of properties + that the animation will animate, assuming those properties have changed. + + In the following example, the changes to \c myItem will be animated by the transition, while + the changes to \c myOtherItem will not. + \qml + State { + PropertyChanges { + target: myItem + x: 15; y: 15 + } + PropertyChanges { + target: myOtherItem + x: 30; y: 30 + } + } + Transition { + PropertyAnimation { + matchTargets: myItem + matchProperties: "x,y" + } + } + \endqml + + This property is typically used for an animation appearing as part of a Transition. + + By default, all changing targets will be matched. + + \sa exclude matchProperties */ QList<QObject *> *QmlPropertyAnimation::targets() { @@ -1819,9 +1898,9 @@ QList<QObject *> *QmlPropertyAnimation::targets() } /*! - \qmlproperty list<Item> PropertyAnimation::exclude + \qmlproperty list<Object> PropertyAnimation::exclude This property holds the items not to be affected by this animation. - \sa targets + \sa matchTargets */ QList<QObject *> *QmlPropertyAnimation::exclude() { @@ -1933,24 +2012,37 @@ void QmlPropertyAnimation::transition(QmlStateActions &actions, QStringList props = d->properties.isEmpty() ? QStringList() : d->properties.split(QLatin1Char(',')); for (int ii = 0; ii < props.count(); ++ii) props[ii] = props.at(ii).trimmed(); - if (!d->propertyName.isEmpty() && !props.contains(d->propertyName)) - props.append(d->propertyName); - bool useType = (props.isEmpty() && d->defaultToInterpolatorType) ? true : false; + bool hasSelectors = !props.isEmpty() || !d->targets.isEmpty() || !d->exclude.isEmpty(); + bool hasTarget = !d->propertyName.isEmpty() || d->target; - bool targetNeedsReset = false; - if (d->userProperty.isValid() && props.isEmpty() && !target()) { - props.append(d->userProperty.value.name()); - d->target = d->userProperty.value.object(); - targetNeedsReset = true; + if (hasSelectors && hasTarget) { + qmlInfo(tr("matchTargets/matchProperties/exclude and target/property are mutually exclusive."), this); + return; } + bool useType = (props.isEmpty() && d->propertyName.isEmpty() && d->defaultToInterpolatorType) ? true : false; + PropertyUpdater *data = new PropertyUpdater; data->interpolatorType = d->interpolatorType; data->interpolator = d->interpolator; data->reverse = direction == Backward ? true : false; - QSet<QObject *> objs; + //an explicit animation has been specified + if (hasTarget && d->toIsDefined) { + Action myAction; + myAction.property = d->createProperty(target(), d->propertyName); + if (myAction.property.isValid()) { + if (d->fromIsDefined) { + d->convertVariant(d->from, d->interpolatorType ? d->interpolatorType : myAction.property.propertyType()); + myAction.fromValue = d->from; + } + d->convertVariant(d->to, d->interpolatorType ? d->interpolatorType : myAction.property.propertyType()); + myAction.toValue = d->to; + data->actions << myAction; + } + } + for (int ii = 0; ii < actions.count(); ++ii) { Action &action = actions[ii]; @@ -1963,16 +2055,13 @@ void QmlPropertyAnimation::transition(QmlStateActions &actions, if ((d->targets.isEmpty() || d->targets.contains(obj) || (!same && d->targets.contains(sObj))) && (!d->exclude.contains(obj)) && (same || (!d->exclude.contains(sObj))) && (props.contains(propertyName) || (!same && props.contains(sPropertyName)) - || (useType && action.property.propertyType() == d->interpolatorType)) && - (!target() || target() == obj || (!same && target() == sObj))) { - objs.insert(obj); + || (useType && action.property.propertyType() == d->interpolatorType))) { Action myAction = action; - if (d->fromIsDefined) { + if (d->fromIsDefined) myAction.fromValue = d->from; - } else { + else myAction.fromValue = QVariant(); - } if (d->toIsDefined) myAction.toValue = d->to; @@ -1983,25 +2072,29 @@ void QmlPropertyAnimation::transition(QmlStateActions &actions, data->actions << myAction; action.fromValue = myAction.toValue; - } - } - - if (d->toIsDefined && target() && !objs.contains(target())) { - QObject *obj = target(); - for (int jj = 0; jj < props.count(); ++jj) { - Action myAction; - myAction.property = d->createProperty(obj, props.at(jj)); - if (!myAction.property.isValid()) - continue; - - if (d->fromIsDefined) { - d->convertVariant(d->from, d->interpolatorType ? d->interpolatorType : myAction.property.propertyType()); - myAction.fromValue = d->from; - } - d->convertVariant(d->to, d->interpolatorType ? d->interpolatorType : myAction.property.propertyType()); - myAction.toValue = d->to; - data->actions << myAction; - } + } else if (d->userProperty.isValid() && + !hasSelectors && !hasTarget) { + if ((d->userProperty.value.object() == obj || (!same && d->userProperty.value.object() == sObj)) && + (d->userProperty.value.name() == propertyName || (!same && d->userProperty.value.name() == sPropertyName))) { + //### same as above. merge + Action myAction = action; + + if (d->fromIsDefined) + myAction.fromValue = d->from; + else + myAction.fromValue = QVariant(); + if (d->toIsDefined) + myAction.toValue = d->to; + + d->convertVariant(myAction.fromValue, d->interpolatorType ? d->interpolatorType : myAction.property.propertyType()); + d->convertVariant(myAction.toValue, d->interpolatorType ? d->interpolatorType : myAction.property.propertyType()); + + modified << action.property; + + data->actions << myAction; + action.fromValue = myAction.toValue; + } + } } if (data->actions.count()) { @@ -2009,8 +2102,6 @@ void QmlPropertyAnimation::transition(QmlStateActions &actions, } else { delete data; } - if (targetNeedsReset) - d->target = 0; } QML_DEFINE_TYPE(Qt,4,6,PropertyAnimation,QmlPropertyAnimation) diff --git a/src/declarative/util/qmlanimation_p.h b/src/declarative/util/qmlanimation_p.h index 214bab9..3a9839e 100644 --- a/src/declarative/util/qmlanimation_p.h +++ b/src/declarative/util/qmlanimation_p.h @@ -191,8 +191,8 @@ class QmlPropertyAction : public QmlAbstractAnimation Q_PROPERTY(QObject *target READ target WRITE setTarget NOTIFY targetChanged) Q_PROPERTY(QString property READ property WRITE setProperty NOTIFY targetChanged) - Q_PROPERTY(QString properties READ properties WRITE setProperties NOTIFY propertiesChanged) - Q_PROPERTY(QList<QObject *>* targets READ targets) + Q_PROPERTY(QString matchProperties READ properties WRITE setProperties NOTIFY propertiesChanged) + Q_PROPERTY(QList<QObject *>* matchTargets READ targets) Q_PROPERTY(QList<QObject *>* exclude READ exclude) Q_PROPERTY(QVariant value READ value WRITE setValue NOTIFY valueChanged) @@ -260,8 +260,8 @@ class Q_AUTOTEST_EXPORT QmlPropertyAnimation : public QmlAbstractAnimation Q_PROPERTY(QString easing READ easing WRITE setEasing NOTIFY easingChanged) Q_PROPERTY(QObject *target READ target WRITE setTarget NOTIFY targetChanged) Q_PROPERTY(QString property READ property WRITE setProperty NOTIFY targetChanged) - Q_PROPERTY(QString properties READ properties WRITE setProperties NOTIFY propertiesChanged) - Q_PROPERTY(QList<QObject *>* targets READ targets) + Q_PROPERTY(QString matchProperties READ properties WRITE setProperties NOTIFY propertiesChanged) + Q_PROPERTY(QList<QObject *>* matchTargets READ targets) Q_PROPERTY(QList<QObject *>* exclude READ exclude) public: diff --git a/src/declarative/util/qmltimer.cpp b/src/declarative/util/qmltimer.cpp index 0aa0747..8ee9059 100644 --- a/src/declarative/util/qmltimer.cpp +++ b/src/declarative/util/qmltimer.cpp @@ -176,6 +176,11 @@ void QmlTimer::setRepeating(bool repeating) /*! \qmlproperty bool Timer::triggeredOnStart + When the Timer is started the first trigger is normally after the specified + interval has elapsed. It is sometimes desireable to trigger immediately + when the timer is started, for example to establish an initial + state. + If \a triggeredOnStart is true, the timer will be triggered immediately when started, and subsequently at the specified interval. Note that for a Timer with \e repeat set to false, this will result in the timer being diff --git a/src/gui/styles/qwindowsxpstyle.cpp b/src/gui/styles/qwindowsxpstyle.cpp index 9fd9ce9..fe7f5d7 100644 --- a/src/gui/styles/qwindowsxpstyle.cpp +++ b/src/gui/styles/qwindowsxpstyle.cpp @@ -2926,10 +2926,10 @@ void QWindowsXPStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCo } // Draw arrow p->save(); - p->setPen(option->palette.dark()); + p->setPen(option->palette.dark().color()); p->drawLine(menuarea.left(), menuarea.top() + 3, menuarea.left(), menuarea.bottom() - 3); - p->setPen(option->palette.light()); + p->setPen(option->palette.light().color()); p->drawLine(menuarea.left() - 1, menuarea.top() + 3, menuarea.left() - 1, menuarea.bottom() - 3); diff --git a/tests/auto/declarative/anchors/data/anchors.qml b/tests/auto/declarative/anchors/data/anchors.qml index 377dd2d..765e5b6 100644 --- a/tests/auto/declarative/anchors/data/anchors.qml +++ b/tests/auto/declarative/anchors/data/anchors.qml @@ -114,4 +114,31 @@ Rectangle { y: 70; width: 10; height: 10 anchors.horizontalCenter: parent.left } + Rectangle { + id: Rect22; objectName: "Rect22" + width: 10; height: 10 + anchors.centerIn: MasterRect + } + Rectangle { + id: Rect23; objectName: "Rect23" + anchors.left: MasterRect.left + anchors.leftMargin: 5 + anchors.right: MasterRect.right + anchors.rightMargin: 5 + anchors.top: MasterRect.top + anchors.topMargin: 5 + anchors.bottom: MasterRect.bottom + anchors.bottomMargin: 5 + } + Text { + id: text1; objectName: "text1" + y: 200; + text: "Hello" + } + Text { + id: text2; objectName: "text2" + anchors.baseline: text1.baseline + anchors.left: text1.right + text: "World" + } } diff --git a/tests/auto/declarative/anchors/data/crash1.qml b/tests/auto/declarative/anchors/data/crash1.qml new file mode 100644 index 0000000..fd9dc55 --- /dev/null +++ b/tests/auto/declarative/anchors/data/crash1.qml @@ -0,0 +1,11 @@ +import Qt 4.6 + +Column { + Text { + text: "foo" + anchors.fill: parent + } + Text { + text: "bar" + } +} diff --git a/tests/auto/declarative/anchors/tst_anchors.cpp b/tests/auto/declarative/anchors/tst_anchors.cpp index 8abf04f..4c85d2d 100644 --- a/tests/auto/declarative/anchors/tst_anchors.cpp +++ b/tests/auto/declarative/anchors/tst_anchors.cpp @@ -43,6 +43,7 @@ #include <QtDeclarative/qmlcomponent.h> #include <QtDeclarative/qmlview.h> #include <private/qmlgraphicsrectangle_p.h> +#include <private/qmlgraphicstext_p.h> #include <QtDeclarative/private/qmlgraphicsanchors_p_p.h> @@ -61,6 +62,7 @@ private slots: void illegalSets(); void reset(); void nullItem(); + void crash1(); }; /* @@ -131,6 +133,21 @@ void tst_anchors::basicAnchors() QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("Rect20"))->x(), 235.0); QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("Rect21"))->x(), -5.0); + //centerIn + QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("Rect22"))->x(), 69.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("Rect22"))->y(), 5.0); + + //margins + QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("Rect23"))->x(), 31.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("Rect23"))->y(), 5.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("Rect23"))->width(), 86.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("Rect23"))->height(), 10.0); + + //baseline + QmlGraphicsText *text1 = findItem<QmlGraphicsText>(view->root(), QLatin1String("text1")); + QmlGraphicsText *text2 = findItem<QmlGraphicsText>(view->root(), QLatin1String("text2")); + QCOMPARE(text1->y(), text2->y()); + delete view; } @@ -232,6 +249,20 @@ void tst_anchors::nullItem() item->anchors()->setBottom(anchor); } +void tst_anchors::crash1() +{ + QmlView *view = new QmlView; + + view->setUrl(QUrl("file://" SRCDIR "/data/crash1.qml")); + + QString expect = "QML QmlGraphicsText (" + view->url().toString() + ":4:5" + ") Possible anchor loop detected on fill."; + QTest::ignoreMessage(QtWarningMsg, expect.toLatin1()); + view->execute(); + qApp->processEvents(); + + delete view; +} + QTEST_MAIN(tst_anchors) #include "tst_anchors.moc" diff --git a/tests/auto/declarative/animations/data/badproperty1.qml b/tests/auto/declarative/animations/data/badproperty1.qml index 78da34a..df1a98d 100644 --- a/tests/auto/declarative/animations/data/badproperty1.qml +++ b/tests/auto/declarative/animations/data/badproperty1.qml @@ -19,6 +19,6 @@ Rectangle { PropertyChanges { target: MyRect; border.color: "blue" } } transitions: Transition { - ColorAnimation { target: MyRect; to: "red"; properties: "pen.colr"; duration: 1000 } + ColorAnimation { target: MyRect; to: "red"; property: "pen.colr"; duration: 1000 } } } diff --git a/tests/auto/declarative/animations/data/badtype4.qml b/tests/auto/declarative/animations/data/badtype4.qml index 0c0a636..5db6c17 100644 --- a/tests/auto/declarative/animations/data/badtype4.qml +++ b/tests/auto/declarative/animations/data/badtype4.qml @@ -20,7 +20,7 @@ Rectangle { } transitions: Transition { //comment out each in turn to make sure each only animates the relevant property - ColorAnimation { properties: "x,color"; duration: 1000 } //x is real, color is color - NumberAnimation { properties: "x,color"; duration: 1000 } //x is real, color is color + ColorAnimation { matchProperties: "x,color"; duration: 1000 } //x is real, color is color + NumberAnimation { matchProperties: "x,color"; duration: 1000 } //x is real, color is color } } diff --git a/tests/auto/declarative/animations/data/dotproperty.qml b/tests/auto/declarative/animations/data/dotproperty.qml index ee076c2..3ddb002 100644 --- a/tests/auto/declarative/animations/data/dotproperty.qml +++ b/tests/auto/declarative/animations/data/dotproperty.qml @@ -16,9 +16,9 @@ Rectangle { } states: State { name: "state1" - PropertyChanges { target: MyRect; pen.color: "blue" } + PropertyChanges { target: MyRect; border.color: "blue" } } transitions: Transition { - ColorAnimation { properties: "pen.color"; duration: 1000 } + ColorAnimation { matchProperties: "border.color"; duration: 1000 } } } diff --git a/tests/auto/declarative/animations/data/mixedtype1.qml b/tests/auto/declarative/animations/data/mixedtype1.qml index ed50582..5ecf14f 100644 --- a/tests/auto/declarative/animations/data/mixedtype1.qml +++ b/tests/auto/declarative/animations/data/mixedtype1.qml @@ -19,6 +19,6 @@ Rectangle { PropertyChanges { target: MyRect; x: 200; border.width: 10 } } transitions: Transition { - PropertyAnimation { properties: "x,border.width"; duration: 1000 } //x is real, border.width is int + PropertyAnimation { matchProperties: "x,border.width"; duration: 1000 } //x is real, border.width is int } } diff --git a/tests/auto/declarative/animations/data/mixedtype2.qml b/tests/auto/declarative/animations/data/mixedtype2.qml index 4854c2e..645f1d0 100644 --- a/tests/auto/declarative/animations/data/mixedtype2.qml +++ b/tests/auto/declarative/animations/data/mixedtype2.qml @@ -19,6 +19,6 @@ Rectangle { PropertyChanges { target: MyRect; x: 200; color: "blue" } } transitions: Transition { - PropertyAnimation { properties: "x,color"; duration: 1000 } //x is real, color is color + PropertyAnimation { matchProperties: "x,color"; duration: 1000 } //x is real, color is color } } diff --git a/tests/auto/declarative/animations/data/properties.qml b/tests/auto/declarative/animations/data/properties.qml new file mode 100644 index 0000000..a8023b4 --- /dev/null +++ b/tests/auto/declarative/animations/data/properties.qml @@ -0,0 +1,14 @@ +import Qt 4.6 + +Rectangle { + width: 400 + height: 400 + Rectangle { + id: theRect + objectName: "TheRect" + color: "red" + width: 50; height: 50 + x: 100; y: 100 + x: NumberAnimation { to: 200; running: true; } + } +} diff --git a/tests/auto/declarative/animations/data/properties2.qml b/tests/auto/declarative/animations/data/properties2.qml new file mode 100644 index 0000000..aab7661 --- /dev/null +++ b/tests/auto/declarative/animations/data/properties2.qml @@ -0,0 +1,14 @@ +import Qt 4.6 + +Rectangle { + width: 400 + height: 400 + Rectangle { + id: theRect + objectName: "TheRect" + color: "red" + width: 50; height: 50 + x: 100; y: 100 + x: NumberAnimation { matchTargets: theRect; matchProperties: "x"; to: 200; running: true } + } +} diff --git a/tests/auto/declarative/animations/data/properties3.qml b/tests/auto/declarative/animations/data/properties3.qml new file mode 100644 index 0000000..fd21a85 --- /dev/null +++ b/tests/auto/declarative/animations/data/properties3.qml @@ -0,0 +1,14 @@ +import Qt 4.6 + +Rectangle { + width: 400 + height: 400 + Rectangle { + id: theRect + objectName: "TheRect" + color: "red" + width: 50; height: 50 + x: 100; y: 100 + x: NumberAnimation { target: theRect; property: "x"; to: 300; running: true } + } +} diff --git a/tests/auto/declarative/animations/data/properties4.qml b/tests/auto/declarative/animations/data/properties4.qml new file mode 100644 index 0000000..e23651c --- /dev/null +++ b/tests/auto/declarative/animations/data/properties4.qml @@ -0,0 +1,14 @@ +import Qt 4.6 + +Rectangle { + width: 400 + height: 400 + Rectangle { + id: theRect + objectName: "TheRect" + color: "red" + width: 50; height: 50 + x: 100; y: 100 + x: NumberAnimation { target: theRect; property: "y"; to: 200; running: true } + } +} diff --git a/tests/auto/declarative/animations/data/properties5.qml b/tests/auto/declarative/animations/data/properties5.qml new file mode 100644 index 0000000..25c9866 --- /dev/null +++ b/tests/auto/declarative/animations/data/properties5.qml @@ -0,0 +1,14 @@ +import Qt 4.6 + +Rectangle { + width: 400 + height: 400 + Rectangle { + id: theRect + objectName: "TheRect" + color: "red" + width: 50; height: 50 + x: 100; y: 100 + x: NumberAnimation { matchTargets: theRect; matchProperties: "y"; to: 200; running: true } + } +} diff --git a/tests/auto/declarative/animations/data/propertiesTransition.qml b/tests/auto/declarative/animations/data/propertiesTransition.qml new file mode 100644 index 0000000..75603b9 --- /dev/null +++ b/tests/auto/declarative/animations/data/propertiesTransition.qml @@ -0,0 +1,29 @@ +import Qt 4.6 + +Rectangle { + width: 400 + height: 400 + Rectangle { + id: theRect + objectName: "TheRect" + color: "red" + width: 50; height: 50 + x: 100; y: 100 + } + + states: State { + name: "moved" + PropertyChanges { + target: theRect + x: 200 + } + } + transitions: Transition { + NumberAnimation { matchTargets: theRect; matchProperties: "x" } + } + + MouseRegion { + anchors.fill: parent + onClicked: parent.state = "moved" + } +} diff --git a/tests/auto/declarative/animations/data/propertiesTransition2.qml b/tests/auto/declarative/animations/data/propertiesTransition2.qml new file mode 100644 index 0000000..ae59157 --- /dev/null +++ b/tests/auto/declarative/animations/data/propertiesTransition2.qml @@ -0,0 +1,29 @@ +import Qt 4.6 + +Rectangle { + width: 400 + height: 400 + Rectangle { + id: theRect + objectName: "TheRect" + color: "red" + width: 50; height: 50 + x: 100; y: 100 + } + + states: State { + name: "moved" + PropertyChanges { + target: theRect + x: 200 + } + } + transitions: Transition { + NumberAnimation { target: theRect; property: "y"; to: 200 } + } + + MouseRegion { + anchors.fill: parent + onClicked: parent.state = "moved" + } +} diff --git a/tests/auto/declarative/animations/data/propertiesTransition3.qml b/tests/auto/declarative/animations/data/propertiesTransition3.qml new file mode 100644 index 0000000..eedba7b --- /dev/null +++ b/tests/auto/declarative/animations/data/propertiesTransition3.qml @@ -0,0 +1,29 @@ +import Qt 4.6 + +Rectangle { + width: 400 + height: 400 + Rectangle { + id: theRect + objectName: "TheRect" + color: "red" + width: 50; height: 50 + x: 100; y: 100 + } + + states: State { + name: "moved" + PropertyChanges { + target: theRect + x: 200 + } + } + transitions: Transition { + NumberAnimation { matchTargets: theRect; matchProperties: "y" } + } + + MouseRegion { + anchors.fill: parent + onClicked: parent.state = "moved" + } +} diff --git a/tests/auto/declarative/animations/data/propertiesTransition4.qml b/tests/auto/declarative/animations/data/propertiesTransition4.qml new file mode 100644 index 0000000..301f796 --- /dev/null +++ b/tests/auto/declarative/animations/data/propertiesTransition4.qml @@ -0,0 +1,29 @@ +import Qt 4.6 + +Rectangle { + width: 400 + height: 400 + Rectangle { + id: theRect + objectName: "TheRect" + color: "red" + width: 50; height: 50 + x: 100; y: 100 + } + + states: State { + name: "moved" + PropertyChanges { + target: theRect + x: 200 + } + } + transitions: Transition { + NumberAnimation { target: theRect; matchProperties: "x" } + } + + MouseRegion { + anchors.fill: parent + onClicked: parent.state = "moved" + } +} diff --git a/tests/auto/declarative/animations/data/propertiesTransition5.qml b/tests/auto/declarative/animations/data/propertiesTransition5.qml new file mode 100644 index 0000000..565c519 --- /dev/null +++ b/tests/auto/declarative/animations/data/propertiesTransition5.qml @@ -0,0 +1,29 @@ +import Qt 4.6 + +Rectangle { + width: 400 + height: 400 + Rectangle { + id: theRect + objectName: "TheRect" + color: "red" + width: 50; height: 50 + x: 100; y: 100 + } + + states: State { + name: "moved" + PropertyChanges { + target: theRect + x: 200 + } + } + transitions: Transition { + NumberAnimation { matchTargets: theRect; property: "x" } + } + + MouseRegion { + anchors.fill: parent + onClicked: parent.state = "moved" + } +} diff --git a/tests/auto/declarative/animations/data/propertiesTransition6.qml b/tests/auto/declarative/animations/data/propertiesTransition6.qml new file mode 100644 index 0000000..b541dab --- /dev/null +++ b/tests/auto/declarative/animations/data/propertiesTransition6.qml @@ -0,0 +1,29 @@ +import Qt 4.6 + +Rectangle { + width: 400 + height: 400 + Rectangle { + id: theRect + objectName: "TheRect" + color: "red" + width: 50; height: 50 + x: 100; y: 100 + } + + states: State { + name: "moved" + PropertyChanges { + target: theRect + x: 200 + } + } + transitions: Transition { + NumberAnimation { matchTargets: theItem; matchProperties: "x" } + } + + MouseRegion { + anchors.fill: parent + onClicked: parent.state = "moved" + } +} diff --git a/tests/auto/declarative/animations/tst_animations.cpp b/tests/auto/declarative/animations/tst_animations.cpp index ca383bb..a4402cb 100644 --- a/tests/auto/declarative/animations/tst_animations.cpp +++ b/tests/auto/declarative/animations/tst_animations.cpp @@ -59,6 +59,8 @@ private slots: void badTypes(); void badProperties(); void mixedTypes(); + void properties(); + void propertiesTransition(); }; #define QTIMED_COMPARE(lhs, rhs) do { \ @@ -198,11 +200,12 @@ void tst_animations::badProperties() { QmlEngine engine; QmlComponent c(&engine, QUrl("file://" SRCDIR "/data/badproperty1.qml")); + QTest::ignoreMessage(QtWarningMsg, "QML QmlColorAnimation (file://" SRCDIR "/data/badproperty1.qml:22:9) Cannot animate non-existant property \"pen.colr\""); QmlGraphicsRectangle *rect = qobject_cast<QmlGraphicsRectangle*>(c.create()); QVERIFY(rect); - QTest::ignoreMessage(QtWarningMsg, "QML QmlColorAnimation (file://" SRCDIR "/data/badproperty1.qml:22:9) Cannot animate non-existant property \"pen.colr\""); - rect->setState("state1"); + //### should we warn here are well? + //rect->setState("state1"); } } @@ -244,6 +247,143 @@ void tst_animations::mixedTypes() } } +void tst_animations::properties() +{ + const int waitDuration = 300; + { + QmlEngine engine; + QmlComponent c(&engine, QUrl("file://" SRCDIR "/data/properties.qml")); + QmlGraphicsRectangle *rect = qobject_cast<QmlGraphicsRectangle*>(c.create()); + QVERIFY(rect); + + QmlGraphicsRectangle *myRect = rect->findChild<QmlGraphicsRectangle*>("TheRect"); + QVERIFY(myRect); + QTest::qWait(waitDuration); + QTIMED_COMPARE(myRect->x(),qreal(200)); + } + + { + QmlEngine engine; + QmlComponent c(&engine, QUrl("file://" SRCDIR "/data/properties2.qml")); + QmlGraphicsRectangle *rect = qobject_cast<QmlGraphicsRectangle*>(c.create()); + QVERIFY(rect); + + QmlGraphicsRectangle *myRect = rect->findChild<QmlGraphicsRectangle*>("TheRect"); + QVERIFY(myRect); + QTest::qWait(waitDuration); + QTIMED_COMPARE(myRect->x(),qreal(200)); + } + + { + QmlEngine engine; + QmlComponent c(&engine, QUrl("file://" SRCDIR "/data/properties3.qml")); + QmlGraphicsRectangle *rect = qobject_cast<QmlGraphicsRectangle*>(c.create()); + QVERIFY(rect); + + QmlGraphicsRectangle *myRect = rect->findChild<QmlGraphicsRectangle*>("TheRect"); + QVERIFY(myRect); + QTest::qWait(waitDuration); + QTIMED_COMPARE(myRect->x(),qreal(300)); + } + + { + QmlEngine engine; + QmlComponent c(&engine, QUrl("file://" SRCDIR "/data/properties4.qml")); + QmlGraphicsRectangle *rect = qobject_cast<QmlGraphicsRectangle*>(c.create()); + QVERIFY(rect); + + QmlGraphicsRectangle *myRect = rect->findChild<QmlGraphicsRectangle*>("TheRect"); + QVERIFY(myRect); + QTest::qWait(waitDuration); + QTIMED_COMPARE(myRect->y(),qreal(200)); + QTIMED_COMPARE(myRect->x(),qreal(100)); + } + + { + QmlEngine engine; + QmlComponent c(&engine, QUrl("file://" SRCDIR "/data/properties5.qml")); + QmlGraphicsRectangle *rect = qobject_cast<QmlGraphicsRectangle*>(c.create()); + QVERIFY(rect); + + QmlGraphicsRectangle *myRect = rect->findChild<QmlGraphicsRectangle*>("TheRect"); + QVERIFY(myRect); + QTest::qWait(waitDuration); + QTIMED_COMPARE(myRect->x(),qreal(100)); + QTIMED_COMPARE(myRect->y(),qreal(100)); + } +} + +void tst_animations::propertiesTransition() +{ + const int waitDuration = 300; + { + QmlEngine engine; + QmlComponent c(&engine, QUrl("file://" SRCDIR "/data/propertiesTransition.qml")); + QmlGraphicsRectangle *rect = qobject_cast<QmlGraphicsRectangle*>(c.create()); + QVERIFY(rect); + + rect->setState("moved"); + QmlGraphicsRectangle *myRect = rect->findChild<QmlGraphicsRectangle*>("TheRect"); + QVERIFY(myRect); + QTest::qWait(waitDuration); + QTIMED_COMPARE(myRect->x(),qreal(200)); + } + + { + QmlEngine engine; + QmlComponent c(&engine, QUrl("file://" SRCDIR "/data/propertiesTransition2.qml")); + QmlGraphicsRectangle *rect = qobject_cast<QmlGraphicsRectangle*>(c.create()); + QVERIFY(rect); + + QmlGraphicsRectangle *myRect = rect->findChild<QmlGraphicsRectangle*>("TheRect"); + QVERIFY(myRect); + rect->setState("moved"); + QCOMPARE(myRect->x(),qreal(200)); + QCOMPARE(myRect->y(),qreal(100)); + QTest::qWait(waitDuration); + QTIMED_COMPARE(myRect->y(),qreal(200)); + } + + { + QmlEngine engine; + QmlComponent c(&engine, QUrl("file://" SRCDIR "/data/propertiesTransition3.qml")); + QmlGraphicsRectangle *rect = qobject_cast<QmlGraphicsRectangle*>(c.create()); + QVERIFY(rect); + + QmlGraphicsRectangle *myRect = rect->findChild<QmlGraphicsRectangle*>("TheRect"); + QVERIFY(myRect); + QTest::ignoreMessage(QtWarningMsg, "QML QmlNumberAnimation (file:///home/brasser/depot/kinetic-declarativeui/qt/tests/auto/declarative/animations/data/propertiesTransition4.qml:22:9) targets/properties/exclude and target/property are mutually exclusive."); + rect->setState("moved"); + QCOMPARE(myRect->x(),qreal(200)); + } + + { + QmlEngine engine; + QmlComponent c(&engine, QUrl("file://" SRCDIR "/data/propertiesTransition4.qml")); + QmlGraphicsRectangle *rect = qobject_cast<QmlGraphicsRectangle*>(c.create()); + QVERIFY(rect); + + QmlGraphicsRectangle *myRect = rect->findChild<QmlGraphicsRectangle*>("TheRect"); + QVERIFY(myRect); + QTest::ignoreMessage(QtWarningMsg, "QML QmlNumberAnimation (file:///home/brasser/depot/kinetic-declarativeui/qt/tests/auto/declarative/animations/data/propertiesTransition5.qml:22:9) targets/properties/exclude and target/property are mutually exclusive."); + rect->setState("moved"); + QCOMPARE(myRect->x(),qreal(200)); + } + + { + QmlEngine engine; + QmlComponent c(&engine, QUrl("file://" SRCDIR "/data/propertiesTransition5.qml")); + QmlGraphicsRectangle *rect = qobject_cast<QmlGraphicsRectangle*>(c.create()); + QVERIFY(rect); + + //### should output warning at some point -- theItem doesn't exist + QmlGraphicsRectangle *myRect = rect->findChild<QmlGraphicsRectangle*>("TheRect"); + QVERIFY(myRect); + rect->setState("moved"); + QCOMPARE(myRect->x(),qreal(200)); + } +} + QTEST_MAIN(tst_animations) #include "tst_animations.moc" diff --git a/tests/auto/declarative/behaviors/data/nonSelecting.qml b/tests/auto/declarative/behaviors/data/nonSelecting.qml index ae9a9f5..ba36d93 100644 --- a/tests/auto/declarative/behaviors/data/nonSelecting.qml +++ b/tests/auto/declarative/behaviors/data/nonSelecting.qml @@ -8,7 +8,7 @@ Rectangle { width: 100; height: 100; color: "green" x: Behavior { objectName: "MyBehavior"; - NumberAnimation { target: rect; property: "y"; duration: 200; } + NumberAnimation { target: rect; property: "x"; duration: 200; } } } MouseRegion { diff --git a/tests/auto/declarative/behaviors/data/nonSelecting2.qml b/tests/auto/declarative/behaviors/data/nonSelecting2.qml new file mode 100644 index 0000000..e9849eb --- /dev/null +++ b/tests/auto/declarative/behaviors/data/nonSelecting2.qml @@ -0,0 +1,26 @@ +import Qt 4.6 +Rectangle { + width: 400 + height: 400 + Rectangle { + id: rect + objectName: "MyRect" + width: 100; height: 100; color: "green" + x: Behavior { + objectName: "MyBehavior"; + NumberAnimation { matchTargets: rect; matchProperties: "y"; duration: 200; } + } + } + MouseRegion { + id: clicker + anchors.fill: parent + } + states: State { + name: "moved" + when: clicker.pressed + PropertyChanges { + target: rect + x: 200 + } + } +} diff --git a/tests/auto/declarative/behaviors/tst_behaviors.cpp b/tests/auto/declarative/behaviors/tst_behaviors.cpp index da910d9..6343968 100644 --- a/tests/auto/declarative/behaviors/tst_behaviors.cpp +++ b/tests/auto/declarative/behaviors/tst_behaviors.cpp @@ -208,14 +208,27 @@ void tst_behaviors::emptyBehavior() void tst_behaviors::nonSelectingBehavior() { - QmlEngine engine; - QmlComponent c(&engine, QUrl("file://" SRCDIR "/data/nonSelecting.qml")); - QmlGraphicsRectangle *rect = qobject_cast<QmlGraphicsRectangle*>(c.create()); - QVERIFY(rect); + { + QmlEngine engine; + QmlComponent c(&engine, QUrl("file://" SRCDIR "/data/nonSelecting.qml")); + QmlGraphicsRectangle *rect = qobject_cast<QmlGraphicsRectangle*>(c.create()); + QVERIFY(rect); - rect->setState("moved"); - qreal x = qobject_cast<QmlGraphicsRectangle*>(rect->findChild<QmlGraphicsRectangle*>("MyRect"))->x(); - QCOMPARE(x, qreal(200)); //should change immediately + rect->setState("moved"); + qreal x = qobject_cast<QmlGraphicsRectangle*>(rect->findChild<QmlGraphicsRectangle*>("MyRect"))->x(); + QCOMPARE(x, qreal(200)); //should change immediately + } + + { + QmlEngine engine; + QmlComponent c(&engine, QUrl("file://" SRCDIR "/data/nonSelecting2.qml")); + QmlGraphicsRectangle *rect = qobject_cast<QmlGraphicsRectangle*>(c.create()); + QVERIFY(rect); + + rect->setState("moved"); + qreal x = qobject_cast<QmlGraphicsRectangle*>(rect->findChild<QmlGraphicsRectangle*>("MyRect"))->x(); + QCOMPARE(x, qreal(200)); //should change immediately + } } void tst_behaviors::reassignedAnimation() diff --git a/tests/auto/declarative/declarative.pro b/tests/auto/declarative/declarative.pro index a061d56..b6d2241 100644 --- a/tests/auto/declarative/declarative.pro +++ b/tests/auto/declarative/declarative.pro @@ -7,24 +7,27 @@ SUBDIRS += \ datetimeformatter \ # Cover examples \ layouts \ # Cover - listview \ # Cover + qmlgraphicslistview \ # Cover qmlgraphicsgridview \ # Cover numberformatter \ # Cover + parserstress \ # Cover pathview \ # Cover qfxloader \ # Cover - qfxtextedit \ # Cover - qfxtextinput \ # Cover - qfxwebview \ # Cover qmetaobjectbuilder \ # Cover qmlbinding \ # Cover + qmlconnection \ # Cover qmlcontext \ # Cover qmldom \ # Cover qmlecmascript \ # Cover qmlerror \ # Cover qmlfontloader \ # Cover + qmlgraphicsitem \ # Cover qmlgraphicsborderimage \ # Cover qmlgraphicsparticles \ # Cover qmlgraphicstext \ # Cover + qmlgraphicstextedit \ # Cover + qmlgraphicstextinput \ # Cover + qmlgraphicswebview \ # Cover qmlinfo \ # Cover qmllanguage \ # Cover qmllist \ # Cover diff --git a/tests/auto/declarative/layouts/data/grid-animated.qml b/tests/auto/declarative/layouts/data/grid-animated.qml index 9edccaf..6b128ce 100644 --- a/tests/auto/declarative/layouts/data/grid-animated.qml +++ b/tests/auto/declarative/layouts/data/grid-animated.qml @@ -7,17 +7,17 @@ Item { columns: 3 add: Transition { NumberAnimation { - properties: "x,y"; from: -100 + matchProperties: "x,y"; from: -100 } } remove: Transition { NumberAnimation { - properties: "x,y"; to: -100 + matchProperties: "x,y"; to: -100 } } move: Transition { NumberAnimation { - properties: "x,y"; + matchProperties: "x,y"; } } Rectangle { diff --git a/tests/auto/declarative/layouts/data/horizontal-animated.qml b/tests/auto/declarative/layouts/data/horizontal-animated.qml index f757d18..c29d6df 100644 --- a/tests/auto/declarative/layouts/data/horizontal-animated.qml +++ b/tests/auto/declarative/layouts/data/horizontal-animated.qml @@ -6,17 +6,17 @@ Item { Row { add: Transition { NumberAnimation { - properties: "x"; from: -100 + matchProperties: "x"; from: -100 } } remove: Transition { NumberAnimation { - properties: "x"; to: -100 + matchProperties: "x"; to: -100 } } move: Transition { NumberAnimation { - properties: "x"; + matchProperties: "x"; } } Rectangle { diff --git a/tests/auto/declarative/layouts/data/vertical-animated.qml b/tests/auto/declarative/layouts/data/vertical-animated.qml index f52a78a..fcbc5f7 100644 --- a/tests/auto/declarative/layouts/data/vertical-animated.qml +++ b/tests/auto/declarative/layouts/data/vertical-animated.qml @@ -6,17 +6,17 @@ Item { Column { add: Transition { NumberAnimation { - properties: "y"; from: -100 + matchProperties: "y"; from: -100 } } remove: Transition { NumberAnimation { - properties: "y"; to: -100 + matchProperties: "y"; to: -100 } } move: Transition { NumberAnimation { - properties: "y"; + matchProperties: "y"; } } Rectangle { diff --git a/tests/auto/declarative/parserstress/parserstress.pro b/tests/auto/declarative/parserstress/parserstress.pro new file mode 100644 index 0000000..48f147a --- /dev/null +++ b/tests/auto/declarative/parserstress/parserstress.pro @@ -0,0 +1,7 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative +macx:CONFIG -= app_bundle + +SOURCES += tst_parserstress.cpp + +DEFINES += SRCDIR=\\\"$$PWD\\\" diff --git a/tests/auto/declarative/parserstress/tst_parserstress.cpp b/tests/auto/declarative/parserstress/tst_parserstress.cpp new file mode 100644 index 0000000..dd8f347 --- /dev/null +++ b/tests/auto/declarative/parserstress/tst_parserstress.cpp @@ -0,0 +1,141 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <qtest.h> +#include <QmlEngine> +#include <QmlComponent> +#include <QDebug> +#include <QDir> +#include <QFile> + +class tst_parserstress : public QObject +{ + Q_OBJECT +public: + tst_parserstress() {} + +private slots: + void ecmascript_data(); + void ecmascript(); + +private: + static QStringList findJSFiles(const QDir &); + QmlEngine engine; +}; + +QStringList tst_parserstress::findJSFiles(const QDir &d) +{ + QStringList rv; + + QStringList files = d.entryList(QStringList() << QLatin1String("*.js"), + QDir::Files); + foreach (const QString &file, files) { + if (file == "browser.js") + continue; + rv << d.absoluteFilePath(file); + } + + QStringList dirs = d.entryList(QDir::Dirs | QDir::NoDotAndDotDot | + QDir::NoSymLinks); + foreach (const QString &dir, dirs) { + QDir sub = d; + sub.cd(dir); + rv << findJSFiles(sub); + } + + return rv; +} + +void tst_parserstress::ecmascript_data() +{ + QDir dir(SRCDIR); + dir.cdUp(); + dir.cdUp(); + dir.cd("qscriptjstestsuite"); + dir.cd("tests"); + + QStringList files = findJSFiles(dir); + + QTest::addColumn<QString>("file"); + foreach (const QString &file, files) { + QTest::newRow(qPrintable(file)) << file; + } +} + +void tst_parserstress::ecmascript() +{ + QFETCH(QString, file); + + QFile f(file); + QVERIFY(f.open(QIODevice::ReadOnly)); + + QByteArray data = f.readAll(); + + QVERIFY(!data.isEmpty()); + + QString dataStr = QString::fromUtf8(data); + + QString qml = "import Qt 4.6\n"; + qml+= "\n"; + qml+= "Object {\n"; + qml+= " property int test\n"; + qml+= " test: {\n"; + qml+= dataStr + "\n"; + qml+= " return 1;\n"; + qml+= " }\n"; + qml+= " Script {\n"; + qml+= " function stress() {\n"; + qml+= dataStr; + qml+= " }\n"; + qml+= " }\n"; + qml+= "}\n"; + + QByteArray qmlData = qml.toUtf8(); + + QmlComponent component(&engine, qmlData, + QUrl::fromLocalFile(SRCDIR + QString("/dummy.qml"))); + QVERIFY(!component.isError()); +} + + +QTEST_MAIN(tst_parserstress) + +#include "tst_parserstress.moc" diff --git a/tests/auto/declarative/qmlconnection/data/test-connection.qml b/tests/auto/declarative/qmlconnection/data/test-connection.qml new file mode 100644 index 0000000..9534621 --- /dev/null +++ b/tests/auto/declarative/qmlconnection/data/test-connection.qml @@ -0,0 +1,10 @@ +import Qt 4.6 + +Item { + id: screen; width: 50 + + property bool tested: false + signal testMe + + Connection { sender: screen; signal: "widthChanged()"; script: screen.tested = true } +} diff --git a/tests/auto/declarative/qfxtextedit/qfxtextedit.pro b/tests/auto/declarative/qmlconnection/qmlconnection.pro index b5e0464..3d46fa6 100644 --- a/tests/auto/declarative/qfxtextedit/qfxtextedit.pro +++ b/tests/auto/declarative/qmlconnection/qmlconnection.pro @@ -2,7 +2,7 @@ load(qttest_p4) contains(QT_CONFIG,declarative): QT += declarative gui macx:CONFIG -= app_bundle -SOURCES += tst_qfxtextedit.cpp +SOURCES += tst_qmlconnection.cpp # Define SRCDIR equal to test's source directory DEFINES += SRCDIR=\\\"$$PWD\\\" diff --git a/tests/auto/declarative/qmlconnection/tst_qmlconnection.cpp b/tests/auto/declarative/qmlconnection/tst_qmlconnection.cpp new file mode 100644 index 0000000..c6d2cc4 --- /dev/null +++ b/tests/auto/declarative/qmlconnection/tst_qmlconnection.cpp @@ -0,0 +1,85 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include <qtest.h> +#include <QtDeclarative/qmlengine.h> +#include <QtDeclarative/qmlcomponent.h> +#include <private/qmlconnection_p.h> +#include <private/qmlgraphicsitem_p.h> +#include "../../../shared/util.h" + +class tst_qmlconnection : public QObject + +{ + Q_OBJECT +public: + tst_qmlconnection(); + +private slots: + void connection(); + +private: + QmlEngine engine; +}; + +tst_qmlconnection::tst_qmlconnection() +{ +} + +void tst_qmlconnection::connection() +{ + QmlEngine engine; + QmlComponent c(&engine, QUrl("file://" SRCDIR "/data/test-connection.qml")); + QmlGraphicsItem *item = qobject_cast<QmlGraphicsItem*>(c.create()); + + QVERIFY(item != 0); + + QCOMPARE(item->property("tested").toBool(), false); + QCOMPARE(item->width(), 50.); + emit item->setWidth(100.); + QCOMPARE(item->width(), 100.); + QCOMPARE(item->property("tested").toBool(), true); + + delete item; +} + +QTEST_MAIN(tst_qmlconnection) + +#include "tst_qmlconnection.moc" diff --git a/tests/auto/declarative/qmlgraphicsitem/data/keynavigation.qml b/tests/auto/declarative/qmlgraphicsitem/data/keynavigation.qml new file mode 100644 index 0000000..9281a17 --- /dev/null +++ b/tests/auto/declarative/qmlgraphicsitem/data/keynavigation.qml @@ -0,0 +1,39 @@ +import Qt 4.6 + +Grid { + columns: 2 + width: 100; height: 100 + Rectangle { + id: item1 + objectName: "item1" + focus: true + width: 50; height: 50 + color: focus ? "red" : "lightgray" + KeyNavigation.right: item2 + KeyNavigation.down: item3 + } + Rectangle { + id: item2 + objectName: "item2" + width: 50; height: 50 + color: focus ? "red" : "lightgray" + KeyNavigation.left: item1 + KeyNavigation.down: item4 + } + Rectangle { + id: item3 + objectName: "item3" + width: 50; height: 50 + color: focus ? "red" : "lightgray" + KeyNavigation.right: item4 + KeyNavigation.up: item1 + } + Rectangle { + id: item4 + objectName: "item4" + width: 50; height: 50 + color: focus ? "red" : "lightgray" + KeyNavigation.left: item3 + KeyNavigation.up: item2 + } +} diff --git a/tests/auto/declarative/qmlgraphicsitem/data/keys.qml b/tests/auto/declarative/qmlgraphicsitem/data/keys.qml new file mode 100644 index 0000000..7c16559 --- /dev/null +++ b/tests/auto/declarative/qmlgraphicsitem/data/keys.qml @@ -0,0 +1,15 @@ +import Qt 4.6 + +Item { + focus: true + Keys.onPressed: keysTestObject.keyPress(event.key, event.text, event.modifiers) + Keys.onReleased: { keysTestObject.keyRelease(event.key, event.text, event.modifiers); event.accepted = true; } + Keys.onReturnPressed: keysTestObject.keyPress(event.key, "Return", event.modifiers) + Keys.forwardTo: [ item2 ] + + Item { + id: item2 + Keys.onPressed: keysTestObject.forwardedKey(event.key) + Keys.onReleased: keysTestObject.forwardedKey(event.key) + } +} diff --git a/tests/auto/declarative/qmlgraphicsitem/qmlgraphicsitem.pro b/tests/auto/declarative/qmlgraphicsitem/qmlgraphicsitem.pro new file mode 100644 index 0000000..ddabf9a --- /dev/null +++ b/tests/auto/declarative/qmlgraphicsitem/qmlgraphicsitem.pro @@ -0,0 +1,7 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative gui +macx:CONFIG -= app_bundle + +SOURCES += tst_qmlgraphicsitem.cpp + +DEFINES += SRCDIR=\\\"$$PWD\\\" diff --git a/tests/auto/declarative/qmlgraphicsitem/tst_qmlgraphicsitem.cpp b/tests/auto/declarative/qmlgraphicsitem/tst_qmlgraphicsitem.cpp new file mode 100644 index 0000000..b4b3eaf --- /dev/null +++ b/tests/auto/declarative/qmlgraphicsitem/tst_qmlgraphicsitem.cpp @@ -0,0 +1,240 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include <qtest.h> +#include <QtDeclarative/qmlengine.h> +#include <QtDeclarative/qmlcomponent.h> +#include <QtDeclarative/qmlcontext.h> +#include <QtDeclarative/qmlview.h> +#include <qmlgraphicsitem.h> + +class tst_QmlGraphicsItem : public QObject + +{ + Q_OBJECT +public: + tst_QmlGraphicsItem(); + +private slots: + void keys(); + void keyNavigation(); + +private: + template<typename T> + T *findItem(QmlGraphicsItem *parent, const QString &objectName); +}; + +class KeysTestObject : public QObject +{ + Q_OBJECT +public: + KeysTestObject() : mKey(0), mModifiers(0), mForwardedKey(0) {} + + void reset() { + mKey = 0; + mText = QString(); + mModifiers = 0; + mForwardedKey = 0; + } + +public slots: + void keyPress(int key, QString text, int modifiers) { + mKey = key; + mText = text; + mModifiers = modifiers; + } + void keyRelease(int key, QString text, int modifiers) { + mKey = key; + mText = text; + mModifiers = modifiers; + } + void forwardedKey(int key) { + mForwardedKey = key; + } + +public: + int mKey; + QString mText; + int mModifiers; + int mForwardedKey; + +private: +}; + + +tst_QmlGraphicsItem::tst_QmlGraphicsItem() +{ +} + +void tst_QmlGraphicsItem::keys() +{ + QmlView *canvas = new QmlView(0); + canvas->setFixedSize(240,320); + + canvas->setUrl(QUrl("file://" SRCDIR "/data/keys.qml")); + + KeysTestObject *testObject = new KeysTestObject; + canvas->rootContext()->setContextProperty("keysTestObject", testObject); + + canvas->execute(); + canvas->show(); + qApp->processEvents(); + + QEvent wa(QEvent::WindowActivate); + QApplication::sendEvent(canvas, &wa); + QFocusEvent fe(QEvent::FocusIn); + QApplication::sendEvent(canvas, &fe); + + QKeyEvent key(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier, "A", false, 1); + QApplication::sendEvent(canvas, &key); + QCOMPARE(testObject->mKey, int(Qt::Key_A)); + QCOMPARE(testObject->mForwardedKey, int(Qt::Key_A)); + QCOMPARE(testObject->mText, QLatin1String("A")); + QVERIFY(testObject->mModifiers == Qt::NoModifier); + QVERIFY(!key.isAccepted()); + + testObject->reset(); + + key = QKeyEvent(QEvent::KeyRelease, Qt::Key_A, Qt::ShiftModifier, "A", false, 1); + QApplication::sendEvent(canvas, &key); + QCOMPARE(testObject->mKey, int(Qt::Key_A)); + QCOMPARE(testObject->mForwardedKey, int(Qt::Key_A)); + QCOMPARE(testObject->mText, QLatin1String("A")); + QVERIFY(testObject->mModifiers == Qt::ShiftModifier); + QVERIFY(key.isAccepted()); + + testObject->reset(); + + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Return, Qt::NoModifier, "", false, 1); + QApplication::sendEvent(canvas, &key); + QCOMPARE(testObject->mKey, int(Qt::Key_Return)); + QCOMPARE(testObject->mForwardedKey, int(Qt::Key_Return)); + QCOMPARE(testObject->mText, QLatin1String("Return")); + QVERIFY(testObject->mModifiers == Qt::NoModifier); + QVERIFY(key.isAccepted()); + + delete canvas; + delete testObject; +} + +void tst_QmlGraphicsItem::keyNavigation() +{ + QmlView *canvas = new QmlView(0); + canvas->setFixedSize(240,320); + + canvas->setUrl(QUrl("file://" SRCDIR "/data/keynavigation.qml")); + canvas->execute(); + canvas->show(); + qApp->processEvents(); + + QEvent wa(QEvent::WindowActivate); + QApplication::sendEvent(canvas, &wa); + QFocusEvent fe(QEvent::FocusIn); + QApplication::sendEvent(canvas, &fe); + + QmlGraphicsItem *item = findItem<QmlGraphicsItem>(canvas->root(), "item1"); + QVERIFY(item); + QVERIFY(item->hasFocus()); + + // right + QKeyEvent key(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1); + QApplication::sendEvent(canvas, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QmlGraphicsItem>(canvas->root(), "item2"); + QVERIFY(item); + QVERIFY(item->hasFocus()); + + // down + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier, "", false, 1); + QApplication::sendEvent(canvas, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QmlGraphicsItem>(canvas->root(), "item4"); + QVERIFY(item); + QVERIFY(item->hasFocus()); + + // left + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier, "", false, 1); + QApplication::sendEvent(canvas, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QmlGraphicsItem>(canvas->root(), "item3"); + QVERIFY(item); + QVERIFY(item->hasFocus()); + + // up + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier, "", false, 1); + QApplication::sendEvent(canvas, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QmlGraphicsItem>(canvas->root(), "item1"); + QVERIFY(item); + QVERIFY(item->hasFocus()); +} + +template<typename T> +T *tst_QmlGraphicsItem::findItem(QmlGraphicsItem *parent, const QString &objectName) +{ + if (!parent) + return 0; + + const QMetaObject &mo = T::staticMetaObject; + //qDebug() << parent->QGraphicsObject::children().count() << "children"; + for (int i = 0; i < parent->QGraphicsObject::children().count(); ++i) { + QmlGraphicsItem *item = qobject_cast<QmlGraphicsItem*>(parent->QGraphicsObject::children().at(i)); + if(!item) + continue; + //qDebug() << "try" << item; + if (mo.cast(item) && (objectName.isEmpty() || item->objectName() == objectName)) + return static_cast<T*>(item); + item = findItem<T>(item, objectName); + if (item) + return static_cast<T*>(item); + } + + return 0; +} + + + +QTEST_MAIN(tst_QmlGraphicsItem) + +#include "tst_qmlgraphicsitem.moc" diff --git a/tests/auto/declarative/listview/data/listview-enforcerange.qml b/tests/auto/declarative/qmlgraphicslistview/data/listview-enforcerange.qml index 46fddae..46fddae 100644 --- a/tests/auto/declarative/listview/data/listview-enforcerange.qml +++ b/tests/auto/declarative/qmlgraphicslistview/data/listview-enforcerange.qml diff --git a/tests/auto/declarative/qmlgraphicslistview/data/listview-initCurrent.qml b/tests/auto/declarative/qmlgraphicslistview/data/listview-initCurrent.qml new file mode 100644 index 0000000..5b1fee6 --- /dev/null +++ b/tests/auto/declarative/qmlgraphicslistview/data/listview-initCurrent.qml @@ -0,0 +1,49 @@ +import Qt 4.6 + +Rectangle { + width: 240 + height: 320 + color: "#ffffff" + resources: [ + Component { + id: myDelegate + Rectangle { + id: wrapper + objectName: "wrapper" + height: 20 + width: 240 + Text { + text: index + } + Text { + x: 30 + id: textName + objectName: "textName" + text: name + } + Text { + x: 120 + id: textNumber + objectName: "textNumber" + text: number + } + Text { + x: 200 + text: wrapper.y + } + color: ListView.isCurrentItem ? "lightsteelblue" : "white" + } + } + ] + ListView { + id: list + objectName: "list" + focus: true + currentIndex: 3 + width: 240 + height: 320 + model: testModel + delegate: myDelegate + highlightMoveSpeed: 1000 + } +} diff --git a/tests/auto/declarative/listview/data/listview-sections.qml b/tests/auto/declarative/qmlgraphicslistview/data/listview-sections.qml index 56700be..2edc0bd 100644 --- a/tests/auto/declarative/listview/data/listview-sections.qml +++ b/tests/auto/declarative/qmlgraphicslistview/data/listview-sections.qml @@ -54,6 +54,6 @@ Rectangle { height: 320 model: testModel delegate: myDelegate - sectionExpression: "Math.floor(index/5)" + sectionExpression: "Math.floor(number/5)" } } diff --git a/tests/auto/declarative/listview/data/listview.qml b/tests/auto/declarative/qmlgraphicslistview/data/listview.qml index b7b838b..93a3ae3 100644 --- a/tests/auto/declarative/listview/data/listview.qml +++ b/tests/auto/declarative/qmlgraphicslistview/data/listview.qml @@ -38,9 +38,11 @@ Rectangle { ListView { id: list objectName: "list" + focus: true width: 240 height: 320 model: testModel delegate: myDelegate + highlightMoveSpeed: 1000 } } diff --git a/tests/auto/declarative/listview/listview.pro b/tests/auto/declarative/qmlgraphicslistview/qmlgraphicslistview.pro index 23b0706..f00de39 100644 --- a/tests/auto/declarative/listview/listview.pro +++ b/tests/auto/declarative/qmlgraphicslistview/qmlgraphicslistview.pro @@ -2,7 +2,7 @@ load(qttest_p4) contains(QT_CONFIG,declarative): QT += declarative macx:CONFIG -= app_bundle -SOURCES += tst_listview.cpp +SOURCES += tst_qmlgraphicslistview.cpp # Define SRCDIR equal to test's source directory DEFINES += SRCDIR=\\\"$$PWD\\\" diff --git a/tests/auto/declarative/listview/tst_listview.cpp b/tests/auto/declarative/qmlgraphicslistview/tst_qmlgraphicslistview.cpp index 5575ace..de26635 100644 --- a/tests/auto/declarative/listview/tst_listview.cpp +++ b/tests/auto/declarative/qmlgraphicslistview/tst_qmlgraphicslistview.cpp @@ -69,6 +69,7 @@ private slots: void qListModelInterface_moved(); void qAbstractItemModel_moved(); + void currentIndex(); void enforceRange(); void spacing(); void sections(); @@ -252,6 +253,9 @@ void tst_QmlGraphicsListView::items() QCOMPARE(listview->count(), model.count()); QCOMPARE(viewport->childItems().count(), model.count()+1); // assumes all are visible, +1 for the (default) highlight item + // current item should be first item + QCOMPARE(listview->currentItem(), findItem<QmlGraphicsItem>(viewport, "wrapper", 0)); + for (int i = 0; i < model.count(); ++i) { QmlGraphicsText *name = findItem<QmlGraphicsText>(viewport, "textName", i); QVERIFY(name != 0); @@ -261,11 +265,6 @@ void tst_QmlGraphicsListView::items() QCOMPARE(number->text(), model.number(i)); } - listview->incrementCurrentIndex(); - QCOMPARE(listview->currentIndex(), 1); - listview->decrementCurrentIndex(); - QCOMPARE(listview->currentIndex(), 0); - // set an empty model and confirm that items are destroyed T model2; ctxt->setContextProperty("testModel", &model2); @@ -334,7 +333,7 @@ void tst_QmlGraphicsListView::inserted() model.insertItem(1, "Will", "9876"); // let transitions settle. - QTest::qWait(1000); + QTest::qWait(500); QCOMPARE(viewport->childItems().count(), model.count()+1); // assumes all are visible, +1 for the (default) highlight item @@ -354,7 +353,7 @@ void tst_QmlGraphicsListView::inserted() model.insertItem(0, "Foo", "1111"); // zero index, and current item // let transitions settle. - QTest::qWait(1000); + QTest::qWait(500); QCOMPARE(viewport->childItems().count(), model.count()+1); // assumes all are visible, +1 for the (default) highlight item @@ -375,14 +374,14 @@ void tst_QmlGraphicsListView::inserted() for (int i = model.count(); i < 30; ++i) model.insertItem(i, "Hello", QString::number(i)); - QTest::qWait(1000); + QTest::qWait(500); listview->setViewportY(80); - QTest::qWait(1000); + QTest::qWait(500); // Insert item outside visible area model.insertItem(1, "Hello", "1324"); - QTest::qWait(1000); + QTest::qWait(500); QVERIFY(listview->viewportY() == 80); @@ -420,7 +419,7 @@ void tst_QmlGraphicsListView::removed() model.removeItem(1); // let transitions settle. - QTest::qWait(1000); + QTest::qWait(500); QmlGraphicsText *name = findItem<QmlGraphicsText>(viewport, "textName", 1); QVERIFY(name != 0); @@ -442,7 +441,7 @@ void tst_QmlGraphicsListView::removed() model.removeItem(0); // post: top item starts at 20 // let transitions settle. - QTest::qWait(1000); + QTest::qWait(500); name = findItem<QmlGraphicsText>(viewport, "textName", 0); QVERIFY(name != 0); @@ -463,7 +462,7 @@ void tst_QmlGraphicsListView::removed() // Remove items not visible model.removeItem(18); // let transitions settle. - QTest::qWait(1000); + QTest::qWait(500); // Confirm items positioned correctly itemCount = findItems<QmlGraphicsItem>(viewport, "wrapper").count(); @@ -480,7 +479,7 @@ void tst_QmlGraphicsListView::removed() model.removeItem(1); // post: top item will be at 40 // let transitions settle. - QTest::qWait(1000); + QTest::qWait(500); // Confirm items positioned correctly for (int i = 2; i < 18; ++i) { @@ -492,7 +491,7 @@ void tst_QmlGraphicsListView::removed() listview->setViewportY(40); // That's the top now // let transitions settle. - QTest::qWait(1000); + QTest::qWait(500); // Confirm items positioned correctly itemCount = findItems<QmlGraphicsItem>(viewport, "wrapper").count(); @@ -530,7 +529,7 @@ void tst_QmlGraphicsListView::moved() model.moveItem(1, 4); // let transitions settle. - QTest::qWait(1000); + QTest::qWait(500); QmlGraphicsText *name = findItem<QmlGraphicsText>(viewport, "textName", 1); QVERIFY(name != 0); @@ -561,7 +560,7 @@ void tst_QmlGraphicsListView::moved() model.moveItem(1, 18); // let transitions settle. - QTest::qWait(1000); + QTest::qWait(500); // Confirm items positioned correctly and indexes correct for (int i = 3; i < model.count() && i < itemCount; ++i) { @@ -581,7 +580,7 @@ void tst_QmlGraphicsListView::moved() model.moveItem(20, 4); // let transitions settle. - QTest::qWait(1000); + QTest::qWait(500); // Confirm items positioned correctly and indexes correct for (int i = 3; i < model.count() && i < itemCount; ++i) { @@ -617,6 +616,9 @@ void tst_QmlGraphicsListView::enforceRange() QmlGraphicsListView *listview = findItem<QmlGraphicsListView>(canvas->root(), "list"); QVERIFY(listview != 0); + QCOMPARE(listview->preferredHighlightBegin(), 100.0); + QCOMPARE(listview->preferredHighlightEnd(), 100.0); + QmlGraphicsItem *viewport = listview->viewport(); QVERIFY(viewport != 0); @@ -634,7 +636,7 @@ void tst_QmlGraphicsListView::enforceRange() // Check currentIndex is updated when viewport moves listview->setViewportY(20); - QTest::qWait(1000); + QTest::qWait(500); QCOMPARE(listview->currentIndex(), 6); @@ -702,7 +704,7 @@ void tst_QmlGraphicsListView::sections() TestModel model; for (int i = 0; i < 30; i++) - model.addItem("Item" + QString::number(i), ""); + model.addItem("Item" + QString::number(i), QString::number(i)); QmlContext *ctxt = canvas->rootContext(); ctxt->setContextProperty("testModel", &model); @@ -724,6 +726,36 @@ void tst_QmlGraphicsListView::sections() QCOMPARE(item->y(), qreal(i*20 + ((i+4)/5) * 20)); } + // Remove section boundary + model.removeItem(5); + + // New section header created + QmlGraphicsItem *item = findItem<QmlGraphicsItem>(viewport, "wrapper", 5); + QVERIFY(item); + QCOMPARE(item->height(), 40.0); + + model.insertItem(3, "New Item", "3"); + + // Section header moved + item = findItem<QmlGraphicsItem>(viewport, "wrapper", 5); + QVERIFY(item); + QCOMPARE(item->height(), 20.0); + + item = findItem<QmlGraphicsItem>(viewport, "wrapper", 6); + QVERIFY(item); + QCOMPARE(item->height(), 40.0); + + // insert item which will become a section header + model.insertItem(6, "Replace header", "5"); + + item = findItem<QmlGraphicsItem>(viewport, "wrapper", 6); + QVERIFY(item); + QCOMPARE(item->height(), 40.0); + + item = findItem<QmlGraphicsItem>(viewport, "wrapper", 7); + QVERIFY(item); + QCOMPARE(item->height(), 20.0); + QVERIFY(listview->currentSection() == "0"); listview->setViewportY(140); @@ -732,6 +764,86 @@ void tst_QmlGraphicsListView::sections() delete canvas; } +void tst_QmlGraphicsListView::currentIndex() +{ + TestModel model; + for (int i = 0; i < 30; i++) + model.addItem("Item" + QString::number(i), QString::number(i)); + + QmlView *canvas = new QmlView(0); + canvas->setFixedSize(240,320); + + QmlContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + QString filename(SRCDIR "/data/listview-initCurrent.qml"); + QFile file(filename); + file.open(QFile::ReadOnly); + QString qml = file.readAll(); + canvas->setQml(qml, filename); + + canvas->execute(); + qApp->processEvents(); + + QmlGraphicsListView *listview = findItem<QmlGraphicsListView>(canvas->root(), "list"); + QVERIFY(listview != 0); + + QmlGraphicsItem *viewport = listview->viewport(); + QVERIFY(viewport != 0); + + // current item should be third item + QCOMPARE(listview->currentIndex(), 3); + QCOMPARE(listview->currentItem(), findItem<QmlGraphicsItem>(viewport, "wrapper", 3)); + + // no wrap + listview->setCurrentIndex(0); + QCOMPARE(listview->currentIndex(), 0); + + listview->incrementCurrentIndex(); + QCOMPARE(listview->currentIndex(), 1); + listview->decrementCurrentIndex(); + QCOMPARE(listview->currentIndex(), 0); + + listview->decrementCurrentIndex(); + QCOMPARE(listview->currentIndex(), 0); + + // with wrap + listview->setWrapEnabled(true); + + listview->decrementCurrentIndex(); + QCOMPARE(listview->currentIndex(), model.count()-1); + + QTest::qWait(1000); + QCOMPARE(listview->viewportY(), 279.0); + + listview->incrementCurrentIndex(); + QCOMPARE(listview->currentIndex(), 0); + + QTest::qWait(1000); + QCOMPARE(listview->viewportY(), 0.0); + + // Test keys + canvas->show(); + qApp->processEvents(); + + QEvent wa(QEvent::WindowActivate); + QApplication::sendEvent(canvas, &wa); + QFocusEvent fe(QEvent::FocusIn); + QApplication::sendEvent(canvas, &fe); + + QKeyEvent key(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier, "", false, 1); + QApplication::sendEvent(canvas, &key); + QVERIFY(key.isAccepted()); + QCOMPARE(listview->currentIndex(), 1); + + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier, "", false, 1); + QApplication::sendEvent(canvas, &key); + QVERIFY(key.isAccepted()); + QCOMPARE(listview->currentIndex(), 0); + + delete canvas; +} + void tst_QmlGraphicsListView::qListModelInterface_items() { items<TestModel>(); @@ -850,4 +962,4 @@ QList<T*> tst_QmlGraphicsListView::findItems(QmlGraphicsItem *parent, const QStr QTEST_MAIN(tst_QmlGraphicsListView) -#include "tst_listview.moc" +#include "tst_qmlgraphicslistview.moc" diff --git a/tests/auto/declarative/qmlgraphicsparticles/tst_qmlgraphicsparticles.cpp b/tests/auto/declarative/qmlgraphicsparticles/tst_qmlgraphicsparticles.cpp index ed68eaf..c8d181b 100644 --- a/tests/auto/declarative/qmlgraphicsparticles/tst_qmlgraphicsparticles.cpp +++ b/tests/auto/declarative/qmlgraphicsparticles/tst_qmlgraphicsparticles.cpp @@ -96,6 +96,9 @@ void tst_QmlGraphicsParticles::properties() particles->setEmissionRate(12); QCOMPARE(particles->emissionRate(), 12); + + particles->setEmitting(false); + QCOMPARE(particles->emitting(), false); } void tst_QmlGraphicsParticles::runs() diff --git a/tests/auto/declarative/qmlgraphicstext/tst_qmlgraphicstext.cpp b/tests/auto/declarative/qmlgraphicstext/tst_qmlgraphicstext.cpp index 2a3cdde..1e10873 100644 --- a/tests/auto/declarative/qmlgraphicstext/tst_qmlgraphicstext.cpp +++ b/tests/auto/declarative/qmlgraphicstext/tst_qmlgraphicstext.cpp @@ -45,6 +45,7 @@ #include <private/qmlgraphicstext_p.h> #include <private/qmlvaluetype_p.h> #include <QFontMetrics> +#include <QGraphicsSceneMouseEvent> #include <math.h> class tst_qmlgraphicstext : public QObject @@ -78,6 +79,8 @@ private slots: void letterSpacing(); void wordSpacing(); + void clickLink(); + private: QStringList standard; QStringList richText; @@ -258,6 +261,10 @@ void tst_qmlgraphicstext::wrap() QVERIFY(textObject != 0); QCOMPARE(textObject->width(), 30.); QVERIFY(textObject->height() > textHeight); + + int oldHeight = textObject->height(); + textObject->setWidth(100); + QVERIFY(textObject->height() < oldHeight); } for (int i = 0; i < richText.size(); i++) @@ -730,6 +737,54 @@ void tst_qmlgraphicstext::wordSpacing() } } +class EventSender : public QGraphicsItem +{ +public: + void sendEvent(QEvent *event) { sceneEvent(event); } +}; + +class LinkTest : public QObject +{ + Q_OBJECT +public: + LinkTest() {} + + QString link; + +public slots: + void linkClicked(QString l) { link = l; } +}; + +void tst_qmlgraphicstext::clickLink() +{ + { + QString componentStr = "import Qt 4.6\nText { text: \"<a href=\\\"http://qt.nokia.com\\\">Hello world!</a>\" }"; + QmlComponent textComponent(&engine, componentStr.toLatin1(), QUrl("file://")); + QmlGraphicsText *textObject = qobject_cast<QmlGraphicsText*>(textComponent.create()); + + QVERIFY(textObject != 0); + + LinkTest test; + QObject::connect(textObject, SIGNAL(linkActivated(QString)), &test, SLOT(linkClicked(QString))); + + { + QGraphicsSceneMouseEvent me(QEvent::GraphicsSceneMousePress); + me.setPos(QPointF(textObject->x()/2, textObject->y()/2)); + me.setButton(Qt::LeftButton); + static_cast<EventSender*>(static_cast<QGraphicsItem*>(textObject))->sendEvent(&me); + } + + { + QGraphicsSceneMouseEvent me(QEvent::GraphicsSceneMouseRelease); + me.setPos(QPointF(textObject->x()/2, textObject->y()/2)); + me.setButton(Qt::LeftButton); + static_cast<EventSender*>(static_cast<QGraphicsItem*>(textObject))->sendEvent(&me); + } + + QCOMPARE(test.link, QLatin1String("http://qt.nokia.com")); + } +} + QTEST_MAIN(tst_qmlgraphicstext) #include "tst_qmlgraphicstext.moc" diff --git a/tests/auto/declarative/qfxtextedit/data/cursorTest.qml b/tests/auto/declarative/qmlgraphicstextedit/data/cursorTest.qml index e5df8f1..e5df8f1 100644 --- a/tests/auto/declarative/qfxtextedit/data/cursorTest.qml +++ b/tests/auto/declarative/qmlgraphicstextedit/data/cursorTest.qml diff --git a/tests/auto/declarative/qfxtextedit/data/navigation.qml b/tests/auto/declarative/qmlgraphicstextedit/data/navigation.qml index 5b8613f..5b8613f 100644 --- a/tests/auto/declarative/qfxtextedit/data/navigation.qml +++ b/tests/auto/declarative/qmlgraphicstextedit/data/navigation.qml diff --git a/tests/auto/declarative/qfxtextinput/qfxtextinput.pro b/tests/auto/declarative/qmlgraphicstextedit/qmlgraphicstextedit.pro index fe2e3e3..9e6a71a 100644 --- a/tests/auto/declarative/qfxtextinput/qfxtextinput.pro +++ b/tests/auto/declarative/qmlgraphicstextedit/qmlgraphicstextedit.pro @@ -2,7 +2,7 @@ load(qttest_p4) contains(QT_CONFIG,declarative): QT += declarative gui macx:CONFIG -= app_bundle -SOURCES += tst_qfxtextinput.cpp +SOURCES += tst_qmlgraphicstextedit.cpp # Define SRCDIR equal to test's source directory DEFINES += SRCDIR=\\\"$$PWD\\\" diff --git a/tests/auto/declarative/qfxtextedit/tst_qfxtextedit.cpp b/tests/auto/declarative/qmlgraphicstextedit/tst_qmlgraphicstextedit.cpp index 19d5998..4287f01 100644 --- a/tests/auto/declarative/qfxtextedit/tst_qfxtextedit.cpp +++ b/tests/auto/declarative/qmlgraphicstextedit/tst_qmlgraphicstextedit.cpp @@ -51,12 +51,12 @@ #include <QFontMetrics> #include <QmlView> -class tst_qfxtextedit : public QObject +class tst_qmlgraphicstextedit : public QObject { Q_OBJECT public: - tst_qfxtextedit(); + tst_qmlgraphicstextedit(); private slots: void text(); @@ -91,7 +91,7 @@ private: QmlEngine engine; }; -tst_qfxtextedit::tst_qfxtextedit() +tst_qmlgraphicstextedit::tst_qmlgraphicstextedit() { standard << "the quick brown fox jumped over the lazy dog" << "the quick brown fox\n jumped over the lazy dog"; @@ -134,7 +134,7 @@ tst_qfxtextedit::tst_qfxtextedit() // } -void tst_qfxtextedit::text() +void tst_qmlgraphicstextedit::text() { { QmlComponent texteditComponent(&engine, "import Qt 4.6\nTextEdit { text: \"\" }", QUrl()); @@ -170,7 +170,7 @@ void tst_qfxtextedit::text() } } -void tst_qfxtextedit::width() +void tst_qmlgraphicstextedit::width() { // uses Font metrics to find the width for standard and document to find the width for rich { @@ -213,7 +213,7 @@ void tst_qfxtextedit::width() } } -void tst_qfxtextedit::wrap() +void tst_qmlgraphicstextedit::wrap() { // for specified width and wrap set true { @@ -247,7 +247,7 @@ void tst_qfxtextedit::wrap() } //the alignment tests may be trivial o.oa -void tst_qfxtextedit::hAlign() +void tst_qmlgraphicstextedit::hAlign() { //test one align each, and then test if two align fails. @@ -279,7 +279,7 @@ void tst_qfxtextedit::hAlign() } -void tst_qfxtextedit::vAlign() +void tst_qmlgraphicstextedit::vAlign() { //test one align each, and then test if two align fails. @@ -311,7 +311,7 @@ void tst_qfxtextedit::vAlign() } -void tst_qfxtextedit::font() +void tst_qmlgraphicstextedit::font() { //test size, then bold, then italic, then family { @@ -366,7 +366,7 @@ void tst_qfxtextedit::font() } } -void tst_qfxtextedit::color() +void tst_qmlgraphicstextedit::color() { //test style for (int i = 0; i < colorStrings.size(); i++) @@ -393,7 +393,7 @@ void tst_qfxtextedit::color() } } -void tst_qfxtextedit::selection() +void tst_qmlgraphicstextedit::selection() { QString testStr = standard[0];//TODO: What should happen for multiline/rich text? QString componentStr = "import Qt 4.6\nTextEdit { text: \""+ testStr +"\"; }"; @@ -473,7 +473,7 @@ void tst_qfxtextedit::selection() QVERIFY(textEditObject->selectedText().size() == 10); } -void tst_qfxtextedit::cursorDelegate() +void tst_qmlgraphicstextedit::cursorDelegate() { QmlView* view = createView(SRCDIR "/data/cursorTest.qml"); view->execute(); @@ -504,7 +504,7 @@ void tst_qfxtextedit::cursorDelegate() TextEdit element should only handle left/right keys until the cursor reaches the extent of the text, then they should ignore the keys. */ -void tst_qfxtextedit::navigation() +void tst_qmlgraphicstextedit::navigation() { QmlView *canvas = createView(SRCDIR "/data/navigation.qml"); canvas->execute(); @@ -528,7 +528,7 @@ void tst_qfxtextedit::navigation() QVERIFY(input->hasFocus() == true); } -void tst_qfxtextedit::simulateKey(QmlView *view, int key) +void tst_qmlgraphicstextedit::simulateKey(QmlView *view, int key) { QKeyEvent press(QKeyEvent::KeyPress, key, 0); QKeyEvent release(QKeyEvent::KeyRelease, key, 0); @@ -537,7 +537,7 @@ void tst_qfxtextedit::simulateKey(QmlView *view, int key) QApplication::sendEvent(view, &release); } -QmlView *tst_qfxtextedit::createView(const QString &filename) +QmlView *tst_qmlgraphicstextedit::createView(const QString &filename) { QmlView *canvas = new QmlView(0); @@ -550,6 +550,6 @@ QmlView *tst_qfxtextedit::createView(const QString &filename) } -QTEST_MAIN(tst_qfxtextedit) +QTEST_MAIN(tst_qmlgraphicstextedit) -#include "tst_qfxtextedit.moc" +#include "tst_qmlgraphicstextedit.moc" diff --git a/tests/auto/declarative/qfxtextinput/data/cursorTest.qml b/tests/auto/declarative/qmlgraphicstextinput/data/cursorTest.qml index ddc98cc..ddc98cc 100644 --- a/tests/auto/declarative/qfxtextinput/data/cursorTest.qml +++ b/tests/auto/declarative/qmlgraphicstextinput/data/cursorTest.qml diff --git a/tests/auto/declarative/qfxtextinput/data/navigation.qml b/tests/auto/declarative/qmlgraphicstextinput/data/navigation.qml index 282c52c..282c52c 100644 --- a/tests/auto/declarative/qfxtextinput/data/navigation.qml +++ b/tests/auto/declarative/qmlgraphicstextinput/data/navigation.qml diff --git a/tests/auto/declarative/qmlgraphicstextinput/qmlgraphicstextinput.pro b/tests/auto/declarative/qmlgraphicstextinput/qmlgraphicstextinput.pro new file mode 100644 index 0000000..fd75fec --- /dev/null +++ b/tests/auto/declarative/qmlgraphicstextinput/qmlgraphicstextinput.pro @@ -0,0 +1,8 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative gui +macx:CONFIG -= app_bundle + +SOURCES += tst_qmlgraphicstextinput.cpp + +# Define SRCDIR equal to test's source directory +DEFINES += SRCDIR=\\\"$$PWD\\\" diff --git a/tests/auto/declarative/qfxtextinput/tst_qfxtextinput.cpp b/tests/auto/declarative/qmlgraphicstextinput/tst_qmlgraphicstextinput.cpp index 8eeb22d..8e9fa5e 100644 --- a/tests/auto/declarative/qfxtextinput/tst_qfxtextinput.cpp +++ b/tests/auto/declarative/qmlgraphicstextinput/tst_qmlgraphicstextinput.cpp @@ -46,12 +46,12 @@ #include <private/qmlgraphicstextinput_p.h> #include <QDebug> -class tst_qfxtextinput : public QObject +class tst_qmlgraphicstextinput : public QObject { Q_OBJECT public: - tst_qfxtextinput(); + tst_qmlgraphicstextinput(); private slots: void text(); @@ -76,7 +76,7 @@ private: QStringList colorStrings; }; -tst_qfxtextinput::tst_qfxtextinput() +tst_qmlgraphicstextinput::tst_qmlgraphicstextinput() { standard << "the quick brown fox jumped over the lazy dog" << "It's supercalifragisiticexpialidocious!" @@ -96,7 +96,7 @@ tst_qfxtextinput::tst_qfxtextinput() << "#2AC05F"; } -void tst_qfxtextinput::text() +void tst_qmlgraphicstextinput::text() { { QmlComponent textinputComponent(&engine, "import Qt 4.6\nTextInput { text: \"\" }", QUrl()); @@ -118,7 +118,7 @@ void tst_qfxtextinput::text() } -void tst_qfxtextinput::width() +void tst_qmlgraphicstextinput::width() { // uses Font metrics to find the width for standard { @@ -144,7 +144,7 @@ void tst_qfxtextinput::width() } } -void tst_qfxtextinput::font() +void tst_qmlgraphicstextinput::font() { //test size, then bold, then italic, then family { @@ -199,7 +199,7 @@ void tst_qfxtextinput::font() } } -void tst_qfxtextinput::color() +void tst_qmlgraphicstextinput::color() { //test style for (int i = 0; i < colorStrings.size(); i++) @@ -226,7 +226,7 @@ void tst_qfxtextinput::color() } } -void tst_qfxtextinput::selection() +void tst_qmlgraphicstextinput::selection() { QString testStr = standard[0]; QString componentStr = "import Qt 4.6\nTextInput { text: \""+ testStr +"\"; }"; @@ -306,7 +306,7 @@ void tst_qfxtextinput::selection() QVERIFY(textinputObject->selectedText().size() == 10); } -void tst_qfxtextinput::maxLength() +void tst_qmlgraphicstextinput::maxLength() { QString componentStr = "import Qt 4.6\nTextInput { maximumLength: 10; }"; QmlComponent textinputComponent(&engine, componentStr.toLatin1(), QUrl()); @@ -321,7 +321,7 @@ void tst_qfxtextinput::maxLength() //TODO: Simulated keypress input adding 11 chars at a time } -void tst_qfxtextinput::masks() +void tst_qmlgraphicstextinput::masks() { QString componentStr = "import Qt 4.6\nTextInput { maximumLength: 10; }"; QmlComponent textinputComponent(&engine, componentStr.toLatin1(), QUrl()); @@ -331,7 +331,7 @@ void tst_qfxtextinput::masks() //TODO: Me } -void tst_qfxtextinput::validators() +void tst_qmlgraphicstextinput::validators() { QString componentStr = "import Qt 4.6\nTextInput { maximumLength: 10; }"; QmlComponent textinputComponent(&engine, componentStr.toLatin1(), QUrl()); @@ -345,7 +345,7 @@ void tst_qfxtextinput::validators() TextInput element should only handle left/right keys until the cursor reaches the extent of the text, then they should ignore the keys. */ -void tst_qfxtextinput::navigation() +void tst_qmlgraphicstextinput::navigation() { QmlView *canvas = createView(SRCDIR "/data/navigation.qml"); canvas->execute(); @@ -368,7 +368,7 @@ void tst_qfxtextinput::navigation() QVERIFY(input->hasFocus() == true); } -void tst_qfxtextinput::cursorDelegate() +void tst_qmlgraphicstextinput::cursorDelegate() { QmlView* view = createView(SRCDIR "/data/cursorTest.qml"); view->execute(); @@ -396,7 +396,7 @@ void tst_qfxtextinput::cursorDelegate() QVERIFY(!textInputObject->findChild<QmlGraphicsItem*>("cursorInstance")); } -void tst_qfxtextinput::simulateKey(QmlView *view, int key) +void tst_qmlgraphicstextinput::simulateKey(QmlView *view, int key) { QKeyEvent press(QKeyEvent::KeyPress, key, 0); QKeyEvent release(QKeyEvent::KeyRelease, key, 0); @@ -405,7 +405,7 @@ void tst_qfxtextinput::simulateKey(QmlView *view, int key) QApplication::sendEvent(view, &release); } -QmlView *tst_qfxtextinput::createView(const QString &filename) +QmlView *tst_qmlgraphicstextinput::createView(const QString &filename) { QmlView *canvas = new QmlView(0); @@ -417,6 +417,6 @@ QmlView *tst_qfxtextinput::createView(const QString &filename) return canvas; } -QTEST_MAIN(tst_qfxtextinput) +QTEST_MAIN(tst_qmlgraphicstextinput) -#include "tst_qfxtextinput.moc" +#include "tst_qmlgraphicstextinput.moc" diff --git a/tests/auto/declarative/qmllanguage/data/assignBasicTypes.qml b/tests/auto/declarative/qmllanguage/data/assignBasicTypes.qml index 50723a3..c86c96b 100644 --- a/tests/auto/declarative/qmllanguage/data/assignBasicTypes.qml +++ b/tests/auto/declarative/qmllanguage/data/assignBasicTypes.qml @@ -23,6 +23,7 @@ MyTypeObject { boolProperty: true variantProperty: "Hello World!" vectorProperty: "10,1,2.2" + urlProperty: "main.qml" objectProperty: MyTypeObject { intProperty: 8 } } diff --git a/tests/auto/declarative/qmllanguage/data/attachedProperties.qml b/tests/auto/declarative/qmllanguage/data/attachedProperties.qml index 8343754..fec96cc 100644 --- a/tests/auto/declarative/qmllanguage/data/attachedProperties.qml +++ b/tests/auto/declarative/qmllanguage/data/attachedProperties.qml @@ -1,5 +1,8 @@ import Test 1.0 +import Test 1.0 as Namespace import Qt 4.6 + Object { MyQmlObject.value: 10 + Namespace.MyQmlObject.value2: 13 } diff --git a/tests/auto/declarative/qmllanguage/data/fakeDotProperty.errors.txt b/tests/auto/declarative/qmllanguage/data/fakeDotProperty.errors.txt index e56ad3a..3074823 100644 --- a/tests/auto/declarative/qmllanguage/data/fakeDotProperty.errors.txt +++ b/tests/auto/declarative/qmllanguage/data/fakeDotProperty.errors.txt @@ -1 +1 @@ -3:5:Invalid property access +3:5:Invalid grouped property access diff --git a/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.1.errors.txt b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.1.errors.txt new file mode 100644 index 0000000..68fe671 --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.1.errors.txt @@ -0,0 +1 @@ +5:17:Cannot assign to non-existant property "foo" diff --git a/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.1.qml b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.1.qml new file mode 100644 index 0000000..e99c635 --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.1.qml @@ -0,0 +1,7 @@ +import Test 1.0 +import Qt 4.6 + +Object { + MyQmlObject.foo: 10 +} + diff --git a/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.10.errors.txt b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.10.errors.txt new file mode 100644 index 0000000..7f630f4 --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.10.errors.txt @@ -0,0 +1 @@ +5:15:Non-existant attached object diff --git a/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.10.qml b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.10.qml new file mode 100644 index 0000000..8f987ce --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.10.qml @@ -0,0 +1,6 @@ +import Test 1.0 as Namespace +import Qt 4.6 + +Object { + Namespace.MadeUpClass.foo: 10 +} diff --git a/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.11.errors.txt b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.11.errors.txt new file mode 100644 index 0000000..fee5050 --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.11.errors.txt @@ -0,0 +1 @@ +5:15:Not an attached property name diff --git a/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.11.qml b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.11.qml new file mode 100644 index 0000000..18770fc --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.11.qml @@ -0,0 +1,7 @@ +import Test 1.0 as Namespace +import Qt 4.6 + +Object { + Namespace.madeUpClass.foo: 10 +} + diff --git a/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.2.errors.txt b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.2.errors.txt new file mode 100644 index 0000000..9f06e07 --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.2.errors.txt @@ -0,0 +1 @@ +5:27:Cannot assign to non-existant property "foo" diff --git a/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.2.qml b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.2.qml new file mode 100644 index 0000000..3c9ae5b --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.2.qml @@ -0,0 +1,6 @@ +import Test 1.0 as Namespace +import Qt 4.6 + +Object { + Namespace.MyQmlObject.foo: 10 +} diff --git a/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.3.errors.txt b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.3.errors.txt new file mode 100644 index 0000000..05161c4 --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.3.errors.txt @@ -0,0 +1 @@ +5:5:Invalid attached object assignment diff --git a/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.3.qml b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.3.qml new file mode 100644 index 0000000..e9405a4 --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.3.qml @@ -0,0 +1,8 @@ +import Test 1.0 +import Qt 4.6 + +Object { + MyQmlObject: 10 +} + + diff --git a/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.4.errors.txt b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.4.errors.txt new file mode 100644 index 0000000..a208bcf --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.4.errors.txt @@ -0,0 +1 @@ +5:15:Invalid attached object assignment diff --git a/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.4.qml b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.4.qml new file mode 100644 index 0000000..6fbf718 --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.4.qml @@ -0,0 +1,7 @@ +import Test 1.0 as Namespace +import Qt 4.6 + +Object { + Namespace.MyQmlObject: 10 +} + diff --git a/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.5.errors.txt b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.5.errors.txt new file mode 100644 index 0000000..05161c4 --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.5.errors.txt @@ -0,0 +1 @@ +5:5:Invalid attached object assignment diff --git a/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.5.qml b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.5.qml new file mode 100644 index 0000000..1827a16 --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.5.qml @@ -0,0 +1,7 @@ +import Test 1.0 +import Qt 4.6 + +Object { + MyQmlObject: Object {} +} + diff --git a/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.6.errors.txt b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.6.errors.txt new file mode 100644 index 0000000..e232b23 --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.6.errors.txt @@ -0,0 +1 @@ +5:5:Non-existant attached object diff --git a/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.6.qml b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.6.qml new file mode 100644 index 0000000..5c7f0ec --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.6.qml @@ -0,0 +1,7 @@ +import Test 1.0 +import Qt 4.6 + +Object { + Test.MyQmlObject: Object {} +} + diff --git a/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.7.errors.txt b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.7.errors.txt new file mode 100644 index 0000000..e232b23 --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.7.errors.txt @@ -0,0 +1 @@ +5:5:Non-existant attached object diff --git a/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.7.qml b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.7.qml new file mode 100644 index 0000000..841cc08 --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.7.qml @@ -0,0 +1,6 @@ +import Test 1.0 +import Qt 4.6 + +Object { + MyTypeObject.foo: 10 +} diff --git a/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.8.errors.txt b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.8.errors.txt new file mode 100644 index 0000000..7f630f4 --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.8.errors.txt @@ -0,0 +1 @@ +5:15:Non-existant attached object diff --git a/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.8.qml b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.8.qml new file mode 100644 index 0000000..f1b4b96 --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.8.qml @@ -0,0 +1,6 @@ +import Test 1.0 as Namespace +import Qt 4.6 + +Object { + Namespace.MyTypeObject.foo: 10 +} diff --git a/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.9.errors.txt b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.9.errors.txt new file mode 100644 index 0000000..e232b23 --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.9.errors.txt @@ -0,0 +1 @@ +5:5:Non-existant attached object diff --git a/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.9.qml b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.9.qml new file mode 100644 index 0000000..99c4a5c --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.9.qml @@ -0,0 +1,7 @@ +import Test 1.0 +import Qt 4.6 + +Object { + MadeUpClass.foo: 10 +} + diff --git a/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.1.errors.txt b/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.1.errors.txt index 7c00ce4..810fd31 100644 --- a/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.1.errors.txt +++ b/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.1.errors.txt @@ -1 +1 @@ -5:5:Invalid property access +5:5:Invalid grouped property access diff --git a/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.2.errors.txt b/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.2.errors.txt index 7c00ce4..810fd31 100644 --- a/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.2.errors.txt +++ b/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.2.errors.txt @@ -1 +1 @@ -5:5:Invalid property access +5:5:Invalid grouped property access diff --git a/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.3.errors.txt b/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.3.errors.txt new file mode 100644 index 0000000..f6d6f29 --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.3.errors.txt @@ -0,0 +1 @@ +4:5:Invalid grouped property access diff --git a/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.3.qml b/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.3.qml new file mode 100644 index 0000000..0bbfc4f --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.3.qml @@ -0,0 +1,5 @@ +import Test 1.0 + +MyQmlObject { + customType.x: 10 +} diff --git a/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.4.errors.txt b/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.4.errors.txt new file mode 100644 index 0000000..19934fa --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.4.errors.txt @@ -0,0 +1 @@ +4:5:Cannot assign to non-existant property "foo" diff --git a/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.4.qml b/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.4.qml new file mode 100644 index 0000000..134fef9 --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.4.qml @@ -0,0 +1,5 @@ +import Test 1.0 + +MyQmlObject { + foo.x: 10 +} diff --git a/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.5.errors.txt b/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.5.errors.txt new file mode 100644 index 0000000..2c8a970 --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.5.errors.txt @@ -0,0 +1 @@ +4:18:Property assignment expected diff --git a/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.5.qml b/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.5.qml new file mode 100644 index 0000000..55cefe6 --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.5.qml @@ -0,0 +1,5 @@ +import Test 1.0 + +MyTypeObject { + rectProperty.x.foo: 100 +} diff --git a/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.6.errors.txt b/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.6.errors.txt new file mode 100644 index 0000000..8331725 --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.6.errors.txt @@ -0,0 +1 @@ +5:18:Single property assignment expected diff --git a/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.6.qml b/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.6.qml new file mode 100644 index 0000000..9ec33ab --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.6.qml @@ -0,0 +1,6 @@ +import Test 1.0 + +MyTypeObject { + rectProperty.x: 100 + rectProperty.x: 101 +} diff --git a/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.7.errors.txt b/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.7.errors.txt new file mode 100644 index 0000000..4a7e383 --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.7.errors.txt @@ -0,0 +1 @@ +4:-1:Cannot set properties on nullGrouped as it is null diff --git a/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.7.qml b/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.7.qml new file mode 100644 index 0000000..b77fb90 --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.7.qml @@ -0,0 +1,5 @@ +import Test 1.0 + +MyTypeObject { + nullGrouped.script: print(1921) +} diff --git a/tests/auto/declarative/qmllanguage/data/missingValueTypeProperty.errors.txt b/tests/auto/declarative/qmllanguage/data/missingValueTypeProperty.errors.txt new file mode 100644 index 0000000..dfaa218 --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/missingValueTypeProperty.errors.txt @@ -0,0 +1 @@ +4:18:Cannot assign to non-existant property "foo" diff --git a/tests/auto/declarative/qmllanguage/data/missingValueTypeProperty.qml b/tests/auto/declarative/qmllanguage/data/missingValueTypeProperty.qml new file mode 100644 index 0000000..9a0fa6a --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/missingValueTypeProperty.qml @@ -0,0 +1,5 @@ +import Test 1.0 + +MyTypeObject { + rectProperty.foo: 9 +} diff --git a/tests/auto/declarative/qmllanguage/data/objectValueTypeProperty.errors.txt b/tests/auto/declarative/qmllanguage/data/objectValueTypeProperty.errors.txt new file mode 100644 index 0000000..db7d9c0 --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/objectValueTypeProperty.errors.txt @@ -0,0 +1 @@ +4:18:Unexpected object assignment diff --git a/tests/auto/declarative/qmllanguage/data/objectValueTypeProperty.qml b/tests/auto/declarative/qmllanguage/data/objectValueTypeProperty.qml new file mode 100644 index 0000000..9924773 --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/objectValueTypeProperty.qml @@ -0,0 +1,6 @@ +import Test 1.0 + +MyTypeObject { + rectProperty.x: MyTypeObject {} +} + diff --git a/tests/auto/declarative/qmllanguage/data/wrongType.15.errors.txt b/tests/auto/declarative/qmllanguage/data/wrongType.15.errors.txt new file mode 100644 index 0000000..44768e3 --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/wrongType.15.errors.txt @@ -0,0 +1 @@ +3:18:Invalid property assignment: url expected diff --git a/tests/auto/declarative/qmllanguage/data/wrongType.15.qml b/tests/auto/declarative/qmllanguage/data/wrongType.15.qml new file mode 100644 index 0000000..633a5ba --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/wrongType.15.qml @@ -0,0 +1,4 @@ +import Test 1.0 +MyTypeObject { + urlProperty: 12 +} diff --git a/tests/auto/declarative/qmllanguage/testtypes.h b/tests/auto/declarative/qmllanguage/testtypes.h index e654faa..b251f87 100644 --- a/tests/auto/declarative/qmllanguage/testtypes.h +++ b/tests/auto/declarative/qmllanguage/testtypes.h @@ -80,14 +80,19 @@ class MyAttachedObject : public QObject { Q_OBJECT Q_PROPERTY(int value READ value WRITE setValue) + Q_PROPERTY(int value2 READ value2 WRITE setValue2) public: - MyAttachedObject(QObject *parent) : QObject(parent), m_value(0) {} + MyAttachedObject(QObject *parent) : QObject(parent), m_value(0), m_value2(0) {} int value() const { return m_value; } void setValue(int v) { m_value = v; } + int value2() const { return m_value2; } + void setValue2(int v) { m_value2 = v; } + private: int m_value; + int m_value2; }; class MyQmlObject : public QObject, public MyInterface, public QmlParserStatus @@ -201,9 +206,11 @@ class MyTypeObject : public QObject Q_PROPERTY(bool boolProperty READ boolProperty WRITE setBoolProperty); Q_PROPERTY(QVariant variantProperty READ variantProperty WRITE setVariantProperty); Q_PROPERTY(QVector3D vectorProperty READ vectorProperty WRITE setVectorProperty); + Q_PROPERTY(QUrl urlProperty READ urlProperty WRITE setUrlProperty); Q_PROPERTY(QmlScriptString scriptProperty READ scriptProperty WRITE setScriptProperty); Q_PROPERTY(MyGroupedObject *grouped READ grouped CONSTANT); + Q_PROPERTY(MyGroupedObject *nullGrouped READ nullGrouped CONSTANT); public: MyTypeObject() @@ -413,6 +420,14 @@ public: vectorPropertyValue = v; } + QUrl urlPropertyValue; + QUrl urlProperty() const { + return urlPropertyValue; + } + void setUrlProperty(const QUrl &v) { + urlPropertyValue = v; + } + QmlScriptString scriptPropertyValue; QmlScriptString scriptProperty() const { return scriptPropertyValue; @@ -424,6 +439,8 @@ public: MyGroupedObject groupedValue; MyGroupedObject *grouped() { return &groupedValue; } + MyGroupedObject *nullGrouped() { return 0; } + void doAction() { emit action(); } signals: void action(); diff --git a/tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp b/tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp index c646583..c23bb2d 100644 --- a/tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp +++ b/tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp @@ -141,6 +141,7 @@ private: QFile file(QLatin1String("data/") + QLatin1String(errorfile)); \ QVERIFY(file.open(QIODevice::ReadOnly)); \ QByteArray data = file.readAll(); \ + file.close(); \ QList<QByteArray> expected = data.split('\n'); \ expected.removeAll(QByteArray("")); \ QList<QmlError> errors = component.errors(); \ @@ -154,7 +155,16 @@ private: } \ if (qgetenv("DEBUG") != "" && expected != actual) \ qWarning() << "Expected:" << expected << "Actual:" << actual; \ - QCOMPARE(expected, actual); \ + if (qgetenv("QMLLANGUAGE_UPDATEERRORS") != "" && expected != actual) {\ + QFile file(QLatin1String("data/") + QLatin1String(errorfile)); \ + QVERIFY(file.open(QIODevice::WriteOnly)); \ + for (int ii = 0; ii < actual.count(); ++ii) { \ + file.write(actual.at(ii)); file.write("\n"); \ + } \ + file.close(); \ + } else { \ + QCOMPARE(expected, actual); \ + } \ } inline QUrl TEST_FILE(const QString &filename) @@ -214,6 +224,7 @@ void tst_qmllanguage::errors_data() QTest::newRow("wrongType (color for size)") << "wrongType.12.qml" << "wrongType.12.errors.txt" << false; QTest::newRow("wrongType (number string for int)") << "wrongType.13.qml" << "wrongType.13.errors.txt" << false; QTest::newRow("wrongType (int for string)") << "wrongType.14.qml" << "wrongType.14.errors.txt" << false; + QTest::newRow("wrongType (int for url)") << "wrongType.15.qml" << "wrongType.15.errors.txt" << false; QTest::newRow("readOnly.1") << "readOnly.1.qml" << "readOnly.1.errors.txt" << false; QTest::newRow("readOnly.2") << "readOnly.2.qml" << "readOnly.2.errors.txt" << false; @@ -240,8 +251,14 @@ void tst_qmllanguage::errors_data() QTest::newRow("missingSignal") << "missingSignal.qml" << "missingSignal.errors.txt" << false; QTest::newRow("finalOverride") << "finalOverride.qml" << "finalOverride.errors.txt" << false; QTest::newRow("customParserIdNotAllowed") << "customParserIdNotAllowed.qml" << "customParserIdNotAllowed.errors.txt" << false; + QTest::newRow("invalidGroupedProperty.1") << "invalidGroupedProperty.1.qml" << "invalidGroupedProperty.1.errors.txt" << false; QTest::newRow("invalidGroupedProperty.2") << "invalidGroupedProperty.2.qml" << "invalidGroupedProperty.2.errors.txt" << false; + QTest::newRow("invalidGroupedProperty.3") << "invalidGroupedProperty.3.qml" << "invalidGroupedProperty.3.errors.txt" << false; + QTest::newRow("invalidGroupedProperty.4") << "invalidGroupedProperty.4.qml" << "invalidGroupedProperty.4.errors.txt" << false; + QTest::newRow("invalidGroupedProperty.5") << "invalidGroupedProperty.5.qml" << "invalidGroupedProperty.5.errors.txt" << false; + QTest::newRow("invalidGroupedProperty.6") << "invalidGroupedProperty.6.qml" << "invalidGroupedProperty.6.errors.txt" << false; + QTest::newRow("invalidGroupedProperty.7") << "invalidGroupedProperty.7.qml" << "invalidGroupedProperty.7.errors.txt" << true; QTest::newRow("importNamespaceConflict") << "importNamespaceConflict.qml" << "importNamespaceConflict.errors.txt" << false; QTest::newRow("importVersionMissing (builtin)") << "importVersionMissingBuiltIn.qml" << "importVersionMissingBuiltIn.errors.txt" << false; @@ -278,13 +295,28 @@ void tst_qmllanguage::errors_data() QTest::newRow("Component.5") << "component.5.qml" << "component.5.errors.txt" << false; QTest::newRow("Component.6") << "component.6.qml" << "component.6.errors.txt" << false; + QTest::newRow("invalidAttachedProperty.1") << "invalidAttachedProperty.1.qml" << "invalidAttachedProperty.1.errors.txt" << false; + QTest::newRow("invalidAttachedProperty.2") << "invalidAttachedProperty.2.qml" << "invalidAttachedProperty.2.errors.txt" << false; + QTest::newRow("invalidAttachedProperty.3") << "invalidAttachedProperty.3.qml" << "invalidAttachedProperty.3.errors.txt" << false; + QTest::newRow("invalidAttachedProperty.4") << "invalidAttachedProperty.4.qml" << "invalidAttachedProperty.4.errors.txt" << false; + QTest::newRow("invalidAttachedProperty.5") << "invalidAttachedProperty.5.qml" << "invalidAttachedProperty.5.errors.txt" << false; + QTest::newRow("invalidAttachedProperty.6") << "invalidAttachedProperty.6.qml" << "invalidAttachedProperty.6.errors.txt" << false; + QTest::newRow("invalidAttachedProperty.7") << "invalidAttachedProperty.7.qml" << "invalidAttachedProperty.7.errors.txt" << false; + QTest::newRow("invalidAttachedProperty.8") << "invalidAttachedProperty.8.qml" << "invalidAttachedProperty.8.errors.txt" << false; + QTest::newRow("invalidAttachedProperty.9") << "invalidAttachedProperty.9.qml" << "invalidAttachedProperty.9.errors.txt" << false; + QTest::newRow("invalidAttachedProperty.10") << "invalidAttachedProperty.10.qml" << "invalidAttachedProperty.10.errors.txt" << false; + QTest::newRow("invalidAttachedProperty.11") << "invalidAttachedProperty.11.qml" << "invalidAttachedProperty.11.errors.txt" << false; + QTest::newRow("nestedErrors") << "nestedErrors.qml" << "nestedErrors.errors.txt" << false; QTest::newRow("defaultGrouped") << "defaultGrouped.qml" << "defaultGrouped.errors.txt" << false; QTest::newRow("emptySignal") << "emptySignal.qml" << "emptySignal.errors.txt" << false; QTest::newRow("doubleSignal") << "doubleSignal.qml" << "doubleSignal.errors.txt" << false; QTest::newRow("invalidRoot") << "invalidRoot.qml" << "invalidRoot.errors.txt" << false; + QTest::newRow("missingValueTypeProperty") << "missingValueTypeProperty.qml" << "missingValueTypeProperty.errors.txt" << false; + QTest::newRow("objectValueTypeProperty") << "objectValueTypeProperty.qml" << "objectValueTypeProperty.errors.txt" << false; } + void tst_qmllanguage::errors() { QFETCH(QString, file); @@ -420,6 +452,7 @@ void tst_qmllanguage::assignBasicTypes() QCOMPARE(object->boolProperty(), true); QCOMPARE(object->variantProperty(), QVariant("Hello World!")); QCOMPARE(object->vectorProperty(), QVector3D(10, 1, 2.2)); + QCOMPARE(object->urlProperty(), component.url().resolved(QUrl("main.qml"))); QVERIFY(object->objectProperty() != 0); MyTypeObject *child = qobject_cast<MyTypeObject *>(object->objectProperty()); QVERIFY(child != 0); @@ -611,6 +644,7 @@ void tst_qmllanguage::attachedProperties() QObject *attached = qmlAttachedPropertiesObject<MyQmlObject>(object); QVERIFY(attached != 0); QCOMPARE(attached->property("value"), QVariant(10)); + QCOMPARE(attached->property("value2"), QVariant(13)); } // Tests non-static object properties diff --git a/tests/auto/declarative/qmlsystempalette/tst_qmlsystempalette.cpp b/tests/auto/declarative/qmlsystempalette/tst_qmlsystempalette.cpp index 039eaa8..2648463 100644 --- a/tests/auto/declarative/qmlsystempalette/tst_qmlsystempalette.cpp +++ b/tests/auto/declarative/qmlsystempalette/tst_qmlsystempalette.cpp @@ -38,7 +38,9 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ + #include <qtest.h> +#include <QDebug> #include <QtDeclarative/qmlengine.h> #include <QtDeclarative/qmlcomponent.h> #include <private/qmlsystempalette_p.h> @@ -56,6 +58,7 @@ private slots: void activePalette(); void inactivePalette(); void disabledPalette(); + void paletteChanged(); private: QmlEngine engine; @@ -149,6 +152,30 @@ void tst_qmlsystempalette::disabledPalette() delete object; } +void tst_qmlsystempalette::paletteChanged() +{ + QString componentStr = "import Qt 4.6\nSystemPalette { }"; + QmlComponent component(&engine, componentStr.toLatin1(), QUrl("file://")); + QmlSystemPalette *object = qobject_cast<QmlSystemPalette*>(component.create()); + + QVERIFY(object != 0); + + QPalette p; + p.setCurrentColorGroup(QPalette::Active); + p.setColor(QPalette::Active, QPalette::Text, QColor("red")); + p.setColor(QPalette::Active, QPalette::ButtonText, QColor("green")); + p.setColor(QPalette::Active, QPalette::WindowText, QColor("blue")); + + qApp->setPalette(p); + + object->setColorGroup(QmlSystemPalette::Active); + QTRY_COMPARE(QColor("red"), object->text()); + QTRY_COMPARE(QColor("green"), object->buttonText()); + QTRY_COMPARE(QColor("blue"), object->windowText()); + + delete object; +} + QTEST_MAIN(tst_qmlsystempalette) #include "tst_qmlsystempalette.moc" diff --git a/tests/auto/declarative/qmltimer/tst_qmltimer.cpp b/tests/auto/declarative/qmltimer/tst_qmltimer.cpp index 9c5dc30..cf54647 100644 --- a/tests/auto/declarative/qmltimer/tst_qmltimer.cpp +++ b/tests/auto/declarative/qmltimer/tst_qmltimer.cpp @@ -91,6 +91,9 @@ void tst_qmltimer::notRepeating() QmlComponent component(&engine, QByteArray("import Qt 4.6\nTimer { interval: 100; running: true }"), QUrl("file://")); QmlTimer *timer = qobject_cast<QmlTimer*>(component.create()); QVERIFY(timer != 0); + QVERIFY(timer->isRunning()); + QVERIFY(!timer->isRepeating()); + QCOMPARE(timer->interval(), 100); TimerHelper helper; connect(timer, SIGNAL(triggered()), &helper, SLOT(timeout())); @@ -107,6 +110,7 @@ void tst_qmltimer::notRepeatingStart() QmlComponent component(&engine, QByteArray("import Qt 4.6\nTimer { interval: 100 }"), QUrl("file://")); QmlTimer *timer = qobject_cast<QmlTimer*>(component.create()); QVERIFY(timer != 0); + QVERIFY(!timer->isRunning()); TimerHelper helper; connect(timer, SIGNAL(triggered()), &helper, SLOT(timeout())); @@ -138,6 +142,11 @@ void tst_qmltimer::repeat() QTest::qWait(TIMEOUT_TIMEOUT); QVERIFY(helper.count > oldCount); + + oldCount = helper.count; + timer->stop(); + QTest::qWait(TIMEOUT_TIMEOUT); + QVERIFY(helper.count == oldCount); } void tst_qmltimer::triggeredOnStart() @@ -146,6 +155,7 @@ void tst_qmltimer::triggeredOnStart() QmlComponent component(&engine, QByteArray("import Qt 4.6\nTimer { interval: 100; running: true; triggeredOnStart: true }"), QUrl("file://")); QmlTimer *timer = qobject_cast<QmlTimer*>(component.create()); QVERIFY(timer != 0); + QVERIFY(timer->triggeredOnStart()); TimerHelper helper; connect(timer, SIGNAL(triggered()), &helper, SLOT(timeout())); diff --git a/tests/auto/declarative/valuetypes/data/bindingVariantCopy.qml b/tests/auto/declarative/valuetypes/data/bindingVariantCopy.qml new file mode 100644 index 0000000..691a56c --- /dev/null +++ b/tests/auto/declarative/valuetypes/data/bindingVariantCopy.qml @@ -0,0 +1,13 @@ +import Test 1.0 + +MyTypeObject { + property var object + object: MyTypeObject { + rect.x: 19 + rect.y: 33 + rect.width: 5 + rect.height: 99 + } + + rect: object.rect +} diff --git a/tests/auto/declarative/valuetypes/data/deletedObject.js b/tests/auto/declarative/valuetypes/data/deletedObject.js new file mode 100644 index 0000000..f554a0f --- /dev/null +++ b/tests/auto/declarative/valuetypes/data/deletedObject.js @@ -0,0 +1,13 @@ +var savedReference; + +function startup() +{ + savedReference = object.rect; + print("Test: " + savedReference.x); +} + +function afterDelete() +{ + print("Test: " + savedReference.x); +} + diff --git a/tests/auto/declarative/valuetypes/data/deletedObject.qml b/tests/auto/declarative/valuetypes/data/deletedObject.qml new file mode 100644 index 0000000..05459f4 --- /dev/null +++ b/tests/auto/declarative/valuetypes/data/deletedObject.qml @@ -0,0 +1,12 @@ +import Test 1.0 +import Qt 4.6 + +MyTypeObject { + property var object + + Script { source: "deletedObject.js" } + + object: MyTypeObject {} + Component.onCompleted: startup() + onRunScript: afterDelete() +} diff --git a/tests/auto/declarative/valuetypes/data/scriptVariantCopy.qml b/tests/auto/declarative/valuetypes/data/scriptVariantCopy.qml new file mode 100644 index 0000000..29157e8 --- /dev/null +++ b/tests/auto/declarative/valuetypes/data/scriptVariantCopy.qml @@ -0,0 +1,14 @@ +import Test 1.0 + +MyTypeObject { + property var object + object: MyTypeObject { + rect.x: 19 + rect.y: 33 + rect.width: 5 + rect.height: 99 + } + + onRunScript: rect = object.rect +} + diff --git a/tests/auto/declarative/valuetypes/tst_valuetypes.cpp b/tests/auto/declarative/valuetypes/tst_valuetypes.cpp index d09bdf5..d42bfc5 100644 --- a/tests/auto/declarative/valuetypes/tst_valuetypes.cpp +++ b/tests/auto/declarative/valuetypes/tst_valuetypes.cpp @@ -70,6 +70,9 @@ private slots: void valueSources(); void valueInterceptors(); void bindingConflict(); + void deletedObject(); + void bindingVariantCopy(); + void scriptVariantCopy(); void cppClasses(); private: @@ -503,6 +506,54 @@ void tst_valuetypes::bindingConflict() delete t; \ } +// Test that accessing a reference to a valuetype after the owning object is deleted +// doesn't crash +void tst_valuetypes::deletedObject() +{ + QmlComponent component(&engine, TEST_FILE("deletedObject.qml")); + QTest::ignoreMessage(QtDebugMsg, "Test: 2"); + MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create()); + QVERIFY(object != 0); + + QObject *dObject = qvariant_cast<QObject *>(object->property("object")); + QVERIFY(dObject != 0); + delete dObject; + + QTest::ignoreMessage(QtDebugMsg, "Test: undefined"); + object->emitRunScript(); + + delete object; +} + +// Test that value types can be assigned to another value type property in a binding +void tst_valuetypes::bindingVariantCopy() +{ + QmlComponent component(&engine, TEST_FILE("bindingVariantCopy.qml")); + MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->rect(), QRect(19, 33, 5, 99)); + + delete object; +} + +// Test that value types can be assigned to another value type property in script +void tst_valuetypes::scriptVariantCopy() +{ + QmlComponent component(&engine, TEST_FILE("scriptVariantCopy.qml")); + MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->rect(), QRect(2, 3, 109, 102)); + + object->emitRunScript(); + + QCOMPARE(object->rect(), QRect(19, 33, 5, 99)); + + delete object; +} + + // Test that the value type classes can be used manually void tst_valuetypes::cppClasses() { diff --git a/tests/auto/declarative/visual/bindinganimation/bindinganimation.qml b/tests/auto/declarative/visual/bindinganimation/bindinganimation.qml index 90ef1e5..efbb1b4 100644 --- a/tests/auto/declarative/visual/bindinganimation/bindinganimation.qml +++ b/tests/auto/declarative/visual/bindinganimation/bindinganimation.qml @@ -28,7 +28,7 @@ Rectangle { transitions: [ Transition { NumberAnimation { - properties: "x" + matchProperties: "x" } } ] diff --git a/tests/auto/declarative/visual/easing/easing.qml b/tests/auto/declarative/visual/easing/easing.qml index f81400b..1e8e907 100644 --- a/tests/auto/declarative/visual/easing/easing.qml +++ b/tests/auto/declarative/visual/easing/easing.qml @@ -176,7 +176,7 @@ Rectangle { to: "to" reversible: true NumberAnimation { - properties: "x" + matchProperties: "x" easing: type duration: 1000 } diff --git a/tests/auto/declarative/visual/qfxtext/font/data-MAC/plaintext.qml b/tests/auto/declarative/visual/qfxtext/font/data-MAC/plaintext.qml deleted file mode 100644 index 266c9a3..0000000 --- a/tests/auto/declarative/visual/qfxtext/font/data-MAC/plaintext.qml +++ /dev/null @@ -1,351 +0,0 @@ -import Qt.VisualTest 4.6 - -VisualTest { - Frame { - msec: 0 - } - Frame { - msec: 16 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 32 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 48 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 64 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 80 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 96 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 112 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 128 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 144 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 160 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 176 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 192 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 208 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 224 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 240 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 256 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 272 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 288 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 304 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 320 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 336 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 352 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 368 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 384 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 400 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 416 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 432 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 448 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 464 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 480 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 496 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 512 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 528 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 544 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 560 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 576 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 592 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 608 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 624 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 640 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 656 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 672 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 688 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 704 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 720 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 736 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 752 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 768 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 784 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 800 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 816 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 832 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 848 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 864 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 880 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 896 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 912 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 928 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 944 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 960 - image: "plaintext.0.png" - } - Frame { - msec: 976 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 992 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 1008 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 1024 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 1040 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 1056 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 1072 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 1088 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 1104 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 1120 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 1136 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 1152 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 1168 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 1184 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Key { - type: 6 - key: 16777249 - modifiers: 0 - text: "" - autorep: false - count: 1 - } - Frame { - msec: 1200 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 1216 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 1232 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 1248 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 1264 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 1280 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 1296 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 1312 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 1328 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } - Frame { - msec: 1344 - hash: "9f3d0a505dec1982d9b405be72c265f8" - } -} diff --git a/tests/auto/declarative/visual/qfxtext/font/data-MAC/richtext.qml b/tests/auto/declarative/visual/qfxtext/font/data-MAC/richtext.qml deleted file mode 100644 index e971809..0000000 --- a/tests/auto/declarative/visual/qfxtext/font/data-MAC/richtext.qml +++ /dev/null @@ -1,359 +0,0 @@ -import Qt.VisualTest 4.6 - -VisualTest { - Frame { - msec: 0 - } - Frame { - msec: 16 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 32 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 48 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 64 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 80 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 96 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 112 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 128 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 144 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 160 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 176 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 192 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 208 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 224 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 240 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 256 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 272 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 288 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 304 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 320 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 336 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 352 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 368 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 384 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 400 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 416 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 432 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 448 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 464 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 480 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 496 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 512 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 528 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 544 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 560 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 576 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 592 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 608 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 624 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 640 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 656 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 672 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 688 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 704 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 720 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 736 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 752 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 768 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 784 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 800 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 816 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 832 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 848 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 864 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 880 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 896 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 912 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 928 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 944 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 960 - image: "richtext.0.png" - } - Frame { - msec: 976 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 992 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 1008 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 1024 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 1040 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 1056 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 1072 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 1088 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 1104 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 1120 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 1136 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 1152 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Key { - type: 6 - key: 16777249 - modifiers: 0 - text: "" - autorep: false - count: 1 - } - Frame { - msec: 1168 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 1184 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 1200 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 1216 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 1232 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 1248 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 1264 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 1280 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 1296 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 1312 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 1328 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 1344 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 1360 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } - Frame { - msec: 1376 - hash: "259cc9829171ea866dac4ffe8ef6b489" - } -} diff --git a/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.0.png b/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.0.png Binary files differnew file mode 100644 index 0000000..3d5acbc --- /dev/null +++ b/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.0.png diff --git a/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.1.png b/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.1.png Binary files differnew file mode 100644 index 0000000..bebb1aa --- /dev/null +++ b/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.1.png diff --git a/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.2.png b/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.2.png Binary files differnew file mode 100644 index 0000000..d092053 --- /dev/null +++ b/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.2.png diff --git a/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.3.png b/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.3.png Binary files differnew file mode 100644 index 0000000..aa79f8b --- /dev/null +++ b/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.3.png diff --git a/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.4.png b/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.4.png Binary files differnew file mode 100644 index 0000000..98e8817 --- /dev/null +++ b/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.4.png diff --git a/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.5.png b/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.5.png Binary files differnew file mode 100644 index 0000000..a3f9d8f --- /dev/null +++ b/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.5.png diff --git a/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.qml b/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.qml new file mode 100644 index 0000000..5464d01 --- /dev/null +++ b/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.qml @@ -0,0 +1,1623 @@ +import Qt.VisualTest 4.6 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + hash: "7e16e6360fc2e9db67dbf11d58042745" + } + Frame { + msec: 32 + hash: "7e16e6360fc2e9db67dbf11d58042745" + } + Frame { + msec: 48 + hash: "7e16e6360fc2e9db67dbf11d58042745" + } + Frame { + msec: 64 + hash: "7e16e6360fc2e9db67dbf11d58042745" + } + Frame { + msec: 80 + hash: "7e16e6360fc2e9db67dbf11d58042745" + } + Frame { + msec: 96 + hash: "7e16e6360fc2e9db67dbf11d58042745" + } + Frame { + msec: 112 + hash: "7e16e6360fc2e9db67dbf11d58042745" + } + Frame { + msec: 128 + hash: "9becb90d9f8a61f5afacdc53d137ebcb" + } + Frame { + msec: 144 + hash: "9becb90d9f8a61f5afacdc53d137ebcb" + } + Frame { + msec: 160 + hash: "9becb90d9f8a61f5afacdc53d137ebcb" + } + Frame { + msec: 176 + hash: "9becb90d9f8a61f5afacdc53d137ebcb" + } + Frame { + msec: 192 + hash: "9becb90d9f8a61f5afacdc53d137ebcb" + } + Frame { + msec: 208 + hash: "9becb90d9f8a61f5afacdc53d137ebcb" + } + Frame { + msec: 224 + hash: "90fb4e4ba04ac32b52c10b3258431c04" + } + Frame { + msec: 240 + hash: "90fb4e4ba04ac32b52c10b3258431c04" + } + Frame { + msec: 256 + hash: "90fb4e4ba04ac32b52c10b3258431c04" + } + Frame { + msec: 272 + hash: "73c06997014af4e008b546b53fe349fb" + } + Frame { + msec: 288 + hash: "73c06997014af4e008b546b53fe349fb" + } + Frame { + msec: 304 + hash: "73c06997014af4e008b546b53fe349fb" + } + Frame { + msec: 320 + hash: "451a9408b04826ab35749d9120efd6bb" + } + Frame { + msec: 336 + hash: "451a9408b04826ab35749d9120efd6bb" + } + Frame { + msec: 352 + hash: "1c25b3d65e8590f8c213afa76b722e97" + } + Frame { + msec: 368 + hash: "1c25b3d65e8590f8c213afa76b722e97" + } + Frame { + msec: 384 + hash: "1c25b3d65e8590f8c213afa76b722e97" + } + Frame { + msec: 400 + hash: "e64fa5eba05f81e6f263dc8543f21b1a" + } + Frame { + msec: 416 + hash: "e64fa5eba05f81e6f263dc8543f21b1a" + } + Frame { + msec: 432 + hash: "845581f8d03f4fe9323fc282e84f919b" + } + Frame { + msec: 448 + hash: "845581f8d03f4fe9323fc282e84f919b" + } + Frame { + msec: 464 + hash: "136fb272f4d806927b46a1269b18f63d" + } + Frame { + msec: 480 + hash: "8532ee7ce3488f9e038643e4fa48751d" + } + Frame { + msec: 496 + hash: "8532ee7ce3488f9e038643e4fa48751d" + } + Frame { + msec: 512 + hash: "af5f794f73e16a5c3b9e437418c873ee" + } + Frame { + msec: 528 + hash: "af5f794f73e16a5c3b9e437418c873ee" + } + Frame { + msec: 544 + hash: "d75e53f2cea8e9b61a5e50f95060552e" + } + Frame { + msec: 560 + hash: "0374aae76f8cfd75f119ff4b86dba817" + } + Frame { + msec: 576 + hash: "d36e1a56078d7cfa246b57f886c230b4" + } + Frame { + msec: 592 + hash: "d36e1a56078d7cfa246b57f886c230b4" + } + Frame { + msec: 608 + hash: "30692e6658ac730670a489c880fd4485" + } + Frame { + msec: 624 + hash: "3aace4dc5bc503ed0df1b00b444780f0" + } + Frame { + msec: 640 + hash: "b6936d72cbaff0c6bb64fc08152e8680" + } + Frame { + msec: 656 + hash: "b6936d72cbaff0c6bb64fc08152e8680" + } + Frame { + msec: 672 + hash: "8beee45f26f9f7b94b84a807a0c42217" + } + Frame { + msec: 688 + hash: "80529f6b8d12838b58c4af73c1985792" + } + Frame { + msec: 704 + hash: "967f7e4f58a8e29b5d76eac011af643d" + } + Frame { + msec: 720 + hash: "395863cffd5440b0a4805975b766a3cf" + } + Frame { + msec: 736 + hash: "f9c919f45316d93d2c8693b62930850f" + } + Frame { + msec: 752 + hash: "cf8ffc1132935b5df49da90953009fa0" + } + Frame { + msec: 768 + hash: "8e44d6cf4c29313352ad0118db003958" + } + Frame { + msec: 784 + hash: "31ca6f5b62fd8c08fa17b1008c4e6a22" + } + Frame { + msec: 800 + hash: "96773abcace99ba692a5be096df85a54" + } + Frame { + msec: 816 + hash: "e92daff761c739f231ba2c05785c44fb" + } + Frame { + msec: 832 + hash: "c1b1056ef06a0454680f2146bb87a56b" + } + Frame { + msec: 848 + hash: "dc02f4f6b0ff1572a64fd133819fd794" + } + Frame { + msec: 864 + hash: "9f87d4d33942d32a4048ca2b785a1fed" + } + Frame { + msec: 880 + hash: "57d989f52d8bee06694166bf8bdffef0" + } + Frame { + msec: 896 + hash: "09c3602a08d6d3e2afb654c328606871" + } + Frame { + msec: 912 + hash: "b075ae21dbd3acef5c4d0f11cadce3c9" + } + Frame { + msec: 928 + hash: "d54b5b295a9ca2bc65131a0775d8d009" + } + Frame { + msec: 944 + hash: "599b244ff9b4ddceb682a059338f6f97" + } + Frame { + msec: 960 + image: "test-flipable.0.png" + } + Frame { + msec: 976 + hash: "9fd5a0f023f89511bdd4b7e429f940ab" + } + Frame { + msec: 992 + hash: "ad18f401dc07032ffc52b90fd5581319" + } + Frame { + msec: 1008 + hash: "b12cbf8e97bc48e12d9543ffc1c578a2" + } + Frame { + msec: 1024 + hash: "7c9895dae776c2a4a6d5e1dd50d86336" + } + Frame { + msec: 1040 + hash: "ebd8018990ce867c3308121dccbfc1bc" + } + Frame { + msec: 1056 + hash: "4818f99e2f71c0ec7636aa777f4df875" + } + Frame { + msec: 1072 + hash: "09371a634d7801742075aadc131b5fb6" + } + Frame { + msec: 1088 + hash: "e03e96eaa2640cf6d820d9992c0c51f4" + } + Frame { + msec: 1104 + hash: "daf19227a7e51e437d0a13fdf8b1a26f" + } + Frame { + msec: 1120 + hash: "539ccebf96da504f0c5dfe5496ed95ce" + } + Frame { + msec: 1136 + hash: "63d851b3a8758e4cd95624b44cf9e7c9" + } + Frame { + msec: 1152 + hash: "8ee67f06977858444a775ca8c5109411" + } + Frame { + msec: 1168 + hash: "44849e7b8cc8d187da234daba784bc6e" + } + Frame { + msec: 1184 + hash: "ec9892a5602892ba5a2075b61672d91b" + } + Frame { + msec: 1200 + hash: "b12aec87daa7c09276ae5d4b619276a1" + } + Frame { + msec: 1216 + hash: "816d9d278fecde0867efadae2c4b5839" + } + Frame { + msec: 1232 + hash: "65daf0b21f860cb87c28a11c3d947f3b" + } + Frame { + msec: 1248 + hash: "f3bc5c605ac0cb287e8c1d1cb58d85ca" + } + Frame { + msec: 1264 + hash: "2988cc8030891abd7493294fc2c6964c" + } + Frame { + msec: 1280 + hash: "cbfc98561559f3aa8bdec7c40da559c0" + } + Frame { + msec: 1296 + hash: "636335822b15f32861696439773e1794" + } + Frame { + msec: 1312 + hash: "3fbb7a8920ff95fce7bfefcb540c6de8" + } + Frame { + msec: 1328 + hash: "4036080b6aafa72e5310ce33615ff8f8" + } + Frame { + msec: 1344 + hash: "48fb5685e63e81f1790f5481bc06dac4" + } + Frame { + msec: 1360 + hash: "f1f58f0eebbffc3b389c6669c5419081" + } + Frame { + msec: 1376 + hash: "5481248e889fb4fe9f4cf54f69d9f614" + } + Frame { + msec: 1392 + hash: "efbf81fc1db57a6020fcfe97077233b7" + } + Frame { + msec: 1408 + hash: "67ff11e6143718c95418f4851265081e" + } + Frame { + msec: 1424 + hash: "a403ec3d25e73b557ba08aa903cb9006" + } + Frame { + msec: 1440 + hash: "293b9f1cc31af93f22b4c1369567c4ba" + } + Frame { + msec: 1456 + hash: "8ff7cee41c6f19eeda417052c1b071d6" + } + Frame { + msec: 1472 + hash: "cd8d4484158d7dcdc7662ea8c8daea07" + } + Frame { + msec: 1488 + hash: "b991e62a7d6751bdd3e2d690e690821c" + } + Frame { + msec: 1504 + hash: "c60aca5007dadc628f242db9d593cf1f" + } + Frame { + msec: 1520 + hash: "e78af45d2042130a9d34b654157a9ada" + } + Frame { + msec: 1536 + hash: "cc35b2fcc585191d3f46840fdcacc94f" + } + Frame { + msec: 1552 + hash: "9e33a9f73e1019e7d694d108fd95f2ad" + } + Frame { + msec: 1568 + hash: "f08adfe4286703702c9393a905ec01d2" + } + Frame { + msec: 1584 + hash: "56bdfcb8fbb776b3799676ba7934a354" + } + Frame { + msec: 1600 + hash: "da3b8e41b9639bb71cf95b671d8a2c63" + } + Frame { + msec: 1616 + hash: "92855bf2208369f361b677bc66e9c79d" + } + Frame { + msec: 1632 + hash: "e5403ff384dca3c10b091e166160624f" + } + Frame { + msec: 1648 + hash: "932b5ebeaa4576575179b04a4c131ef5" + } + Frame { + msec: 1664 + hash: "37a23d4a895fa83226f66736caa87281" + } + Frame { + msec: 1680 + hash: "f6926e493dfd7deee613cf9bb7529f5e" + } + Frame { + msec: 1696 + hash: "338e40ae3e047cf7731377fc1b4d3cb7" + } + Frame { + msec: 1712 + hash: "0dfdd9a1d83a706a09318c83fd08b6fe" + } + Frame { + msec: 1728 + hash: "4487366ee7ec1e0fdafc88cfa82e7977" + } + Frame { + msec: 1744 + hash: "28f0b7824b5bb311d46c94afa7d7bb66" + } + Frame { + msec: 1760 + hash: "34b15e5a3602fd7bf2f217c308fa5d09" + } + Frame { + msec: 1776 + hash: "667b9286f32fe43a0cb5d65cdfa965cd" + } + Frame { + msec: 1792 + hash: "629888aae80ea85db07a383df352214a" + } + Frame { + msec: 1808 + hash: "9afbd09687efa09eb3b03570bf8be531" + } + Frame { + msec: 1824 + hash: "0e1dac5b9d2a0acab1516d01a286a0ec" + } + Frame { + msec: 1840 + hash: "dd058795bd3957d02dc296419c17819c" + } + Frame { + msec: 1856 + hash: "158618e8529cba8531183b2f72e90340" + } + Frame { + msec: 1872 + hash: "c9062e6405b3b7fd0b2a794119220b1d" + } + Frame { + msec: 1888 + hash: "8dadb6da9f12dac689406a43e7e61bea" + } + Frame { + msec: 1904 + hash: "fd66704ce98410a7b1dd69f7cd6ddd26" + } + Frame { + msec: 1920 + image: "test-flipable.1.png" + } + Frame { + msec: 1936 + hash: "d4a21104b4f8044486fbe6516e4ae7b5" + } + Frame { + msec: 1952 + hash: "20fd373c13d4d06b9105c80ed6f4edb7" + } + Frame { + msec: 1968 + hash: "ff9bc1aa538b69e72ed1a501ea0d56de" + } + Frame { + msec: 1984 + hash: "3f3d5f3ca770b84e86fea3188e082493" + } + Frame { + msec: 2000 + hash: "fe7de3d2083208993e527b13ae7edadd" + } + Frame { + msec: 2016 + hash: "b5f7c630f6e61c7ddac8493e17a1f53e" + } + Frame { + msec: 2032 + hash: "c80d37b370a4ada6217c81f5e82ecd6f" + } + Frame { + msec: 2048 + hash: "84051de621753e12e3e11316d14dfe73" + } + Frame { + msec: 2064 + hash: "fd238f83a26ed8c2cee3e3d042af903b" + } + Frame { + msec: 2080 + hash: "949d2ed3e1d1c674e77ef3c8a6b779ba" + } + Frame { + msec: 2096 + hash: "42f602bcd7b517cf16554a88998d16a8" + } + Frame { + msec: 2112 + hash: "318bd97d726826398887ff218e61df32" + } + Frame { + msec: 2128 + hash: "5a0699f422475f0d3f17cddb606b4715" + } + Frame { + msec: 2144 + hash: "3eb8e765ff9f38fd56a69a8bc2d534c3" + } + Frame { + msec: 2160 + hash: "dd548f565a0787789ec13e141f808b11" + } + Frame { + msec: 2176 + hash: "a78a6a9f014b8c2e7a202b80e6c2e09f" + } + Frame { + msec: 2192 + hash: "3d0ff083b6f1f994caa660016245876d" + } + Frame { + msec: 2208 + hash: "ce6a7491571ce3d5799791579428b615" + } + Frame { + msec: 2224 + hash: "67e700035648fd5354ec0806a412be89" + } + Frame { + msec: 2240 + hash: "b03f1bfe2bdbf52aae0dff6ae4821914" + } + Frame { + msec: 2256 + hash: "4d75ac3064288c3a56e9fd6ed6022fc6" + } + Frame { + msec: 2272 + hash: "dc6677725f6bf0bdcab25287a096a0e6" + } + Frame { + msec: 2288 + hash: "827e5e274fb331c6f9997172894b1f4d" + } + Frame { + msec: 2304 + hash: "c3cf3b3968441b735684fc6e55ebb1ce" + } + Frame { + msec: 2320 + hash: "01eebde46aff9d7484cffb0b0d27c415" + } + Frame { + msec: 2336 + hash: "614ad3481a993b5ff5ec008aa3d4751f" + } + Frame { + msec: 2352 + hash: "614ad3481a993b5ff5ec008aa3d4751f" + } + Frame { + msec: 2368 + hash: "2f253dcdbe2fabc768cdd5bfa8004a36" + } + Frame { + msec: 2384 + hash: "90b130853f8e28a01c90825c412f98b9" + } + Frame { + msec: 2400 + hash: "567bf7684e4b2f76715bcc588a2b7dfb" + } + Frame { + msec: 2416 + hash: "63412cfccdd8646530ebdb37eba16ee9" + } + Frame { + msec: 2432 + hash: "63412cfccdd8646530ebdb37eba16ee9" + } + Frame { + msec: 2448 + hash: "e1c5381a621dfe50e4b04d881ce2c4b7" + } + Frame { + msec: 2464 + hash: "553bff0aa031ed1279170c19bf024539" + } + Frame { + msec: 2480 + hash: "2b8c079d8526ce4d0640014cca38c6b8" + } + Frame { + msec: 2496 + hash: "2b8c079d8526ce4d0640014cca38c6b8" + } + Frame { + msec: 2512 + hash: "ac356478635b5d34001a50997eb3c82c" + } + Frame { + msec: 2528 + hash: "ac356478635b5d34001a50997eb3c82c" + } + Frame { + msec: 2544 + hash: "93d64e7bec7d9e254066d79c0db41f28" + } + Frame { + msec: 2560 + hash: "010ec13762826006a1dbf60b8c4660c9" + } + Frame { + msec: 2576 + hash: "010ec13762826006a1dbf60b8c4660c9" + } + Frame { + msec: 2592 + hash: "2f882016d4e3e29ec6689cfa1189e00e" + } + Frame { + msec: 2608 + hash: "2f882016d4e3e29ec6689cfa1189e00e" + } + Frame { + msec: 2624 + hash: "676f8aba3379c9935b9bd269bd140cf2" + } + Frame { + msec: 2640 + hash: "676f8aba3379c9935b9bd269bd140cf2" + } + Frame { + msec: 2656 + hash: "78e0dca60c04d3defbd90457685dbab3" + } + Frame { + msec: 2672 + hash: "78e0dca60c04d3defbd90457685dbab3" + } + Frame { + msec: 2688 + hash: "0ff9fd6b09fc14abacb794353b9500f6" + } + Frame { + msec: 2704 + hash: "0ff9fd6b09fc14abacb794353b9500f6" + } + Frame { + msec: 2720 + hash: "0ff9fd6b09fc14abacb794353b9500f6" + } + Frame { + msec: 2736 + hash: "6d813ee777a5900c65aca5939c004d0c" + } + Frame { + msec: 2752 + hash: "6d813ee777a5900c65aca5939c004d0c" + } + Frame { + msec: 2768 + hash: "0acaa3ece071ad4461cf4a79d65a0f03" + } + Frame { + msec: 2784 + hash: "0acaa3ece071ad4461cf4a79d65a0f03" + } + Frame { + msec: 2800 + hash: "0acaa3ece071ad4461cf4a79d65a0f03" + } + Frame { + msec: 2816 + hash: "0acaa3ece071ad4461cf4a79d65a0f03" + } + Frame { + msec: 2832 + hash: "b2ef52b66896649413b3852bcf642e1c" + } + Frame { + msec: 2848 + hash: "b2ef52b66896649413b3852bcf642e1c" + } + Frame { + msec: 2864 + hash: "b2ef52b66896649413b3852bcf642e1c" + } + Frame { + msec: 2880 + image: "test-flipable.2.png" + } + Frame { + msec: 2896 + hash: "b2ef52b66896649413b3852bcf642e1c" + } + Frame { + msec: 2912 + hash: "1daeebce8e7eef80b135d2e4f83f780b" + } + Frame { + msec: 2928 + hash: "1daeebce8e7eef80b135d2e4f83f780b" + } + Frame { + msec: 2944 + hash: "1daeebce8e7eef80b135d2e4f83f780b" + } + Frame { + msec: 2960 + hash: "1daeebce8e7eef80b135d2e4f83f780b" + } + Frame { + msec: 2976 + hash: "1daeebce8e7eef80b135d2e4f83f780b" + } + Frame { + msec: 2992 + hash: "1daeebce8e7eef80b135d2e4f83f780b" + } + Frame { + msec: 3008 + hash: "1daeebce8e7eef80b135d2e4f83f780b" + } + Frame { + msec: 3024 + hash: "1daeebce8e7eef80b135d2e4f83f780b" + } + Frame { + msec: 3040 + hash: "1daeebce8e7eef80b135d2e4f83f780b" + } + Frame { + msec: 3056 + hash: "1daeebce8e7eef80b135d2e4f83f780b" + } + Frame { + msec: 3072 + hash: "1daeebce8e7eef80b135d2e4f83f780b" + } + Frame { + msec: 3088 + hash: "1daeebce8e7eef80b135d2e4f83f780b" + } + Frame { + msec: 3104 + hash: "1daeebce8e7eef80b135d2e4f83f780b" + } + Frame { + msec: 3120 + hash: "1daeebce8e7eef80b135d2e4f83f780b" + } + Frame { + msec: 3136 + hash: "b2ef52b66896649413b3852bcf642e1c" + } + Frame { + msec: 3152 + hash: "b2ef52b66896649413b3852bcf642e1c" + } + Frame { + msec: 3168 + hash: "b2ef52b66896649413b3852bcf642e1c" + } + Frame { + msec: 3184 + hash: "b2ef52b66896649413b3852bcf642e1c" + } + Frame { + msec: 3200 + hash: "b2ef52b66896649413b3852bcf642e1c" + } + Frame { + msec: 3216 + hash: "b2ef52b66896649413b3852bcf642e1c" + } + Frame { + msec: 3232 + hash: "0acaa3ece071ad4461cf4a79d65a0f03" + } + Frame { + msec: 3248 + hash: "0acaa3ece071ad4461cf4a79d65a0f03" + } + Frame { + msec: 3264 + hash: "0acaa3ece071ad4461cf4a79d65a0f03" + } + Frame { + msec: 3280 + hash: "6d813ee777a5900c65aca5939c004d0c" + } + Frame { + msec: 3296 + hash: "6d813ee777a5900c65aca5939c004d0c" + } + Frame { + msec: 3312 + hash: "6d813ee777a5900c65aca5939c004d0c" + } + Frame { + msec: 3328 + hash: "0ff9fd6b09fc14abacb794353b9500f6" + } + Frame { + msec: 3344 + hash: "0ff9fd6b09fc14abacb794353b9500f6" + } + Frame { + msec: 3360 + hash: "78e0dca60c04d3defbd90457685dbab3" + } + Frame { + msec: 3376 + hash: "78e0dca60c04d3defbd90457685dbab3" + } + Frame { + msec: 3392 + hash: "78e0dca60c04d3defbd90457685dbab3" + } + Frame { + msec: 3408 + hash: "676f8aba3379c9935b9bd269bd140cf2" + } + Frame { + msec: 3424 + hash: "676f8aba3379c9935b9bd269bd140cf2" + } + Frame { + msec: 3440 + hash: "2f882016d4e3e29ec6689cfa1189e00e" + } + Frame { + msec: 3456 + hash: "2f882016d4e3e29ec6689cfa1189e00e" + } + Frame { + msec: 3472 + hash: "010ec13762826006a1dbf60b8c4660c9" + } + Frame { + msec: 3488 + hash: "93d64e7bec7d9e254066d79c0db41f28" + } + Frame { + msec: 3504 + hash: "93d64e7bec7d9e254066d79c0db41f28" + } + Frame { + msec: 3520 + hash: "ac356478635b5d34001a50997eb3c82c" + } + Frame { + msec: 3536 + hash: "ac356478635b5d34001a50997eb3c82c" + } + Frame { + msec: 3552 + hash: "2b8c079d8526ce4d0640014cca38c6b8" + } + Frame { + msec: 3568 + hash: "553bff0aa031ed1279170c19bf024539" + } + Frame { + msec: 3584 + hash: "e1c5381a621dfe50e4b04d881ce2c4b7" + } + Frame { + msec: 3600 + hash: "e1c5381a621dfe50e4b04d881ce2c4b7" + } + Frame { + msec: 3616 + hash: "63412cfccdd8646530ebdb37eba16ee9" + } + Frame { + msec: 3632 + hash: "567bf7684e4b2f76715bcc588a2b7dfb" + } + Frame { + msec: 3648 + hash: "90b130853f8e28a01c90825c412f98b9" + } + Frame { + msec: 3664 + hash: "90b130853f8e28a01c90825c412f98b9" + } + Frame { + msec: 3680 + hash: "2f253dcdbe2fabc768cdd5bfa8004a36" + } + Frame { + msec: 3696 + hash: "614ad3481a993b5ff5ec008aa3d4751f" + } + Frame { + msec: 3712 + hash: "01eebde46aff9d7484cffb0b0d27c415" + } + Frame { + msec: 3728 + hash: "c3cf3b3968441b735684fc6e55ebb1ce" + } + Frame { + msec: 3744 + hash: "827e5e274fb331c6f9997172894b1f4d" + } + Frame { + msec: 3760 + hash: "dc6677725f6bf0bdcab25287a096a0e6" + } + Frame { + msec: 3776 + hash: "4d75ac3064288c3a56e9fd6ed6022fc6" + } + Frame { + msec: 3792 + hash: "b03f1bfe2bdbf52aae0dff6ae4821914" + } + Frame { + msec: 3808 + hash: "67e700035648fd5354ec0806a412be89" + } + Frame { + msec: 3824 + hash: "ce6a7491571ce3d5799791579428b615" + } + Frame { + msec: 3840 + image: "test-flipable.3.png" + } + Frame { + msec: 3856 + hash: "a78a6a9f014b8c2e7a202b80e6c2e09f" + } + Frame { + msec: 3872 + hash: "dd548f565a0787789ec13e141f808b11" + } + Frame { + msec: 3888 + hash: "3eb8e765ff9f38fd56a69a8bc2d534c3" + } + Frame { + msec: 3904 + hash: "9729b36fe9dbabf0c46e78b723885530" + } + Frame { + msec: 3920 + hash: "5a0699f422475f0d3f17cddb606b4715" + } + Frame { + msec: 3936 + hash: "318bd97d726826398887ff218e61df32" + } + Frame { + msec: 3952 + hash: "42f602bcd7b517cf16554a88998d16a8" + } + Frame { + msec: 3968 + hash: "fd238f83a26ed8c2cee3e3d042af903b" + } + Frame { + msec: 3984 + hash: "84051de621753e12e3e11316d14dfe73" + } + Frame { + msec: 4000 + hash: "0c6d27488abbfd4f1ee4570a33a2c89e" + } + Frame { + msec: 4016 + hash: "c80d37b370a4ada6217c81f5e82ecd6f" + } + Frame { + msec: 4032 + hash: "fe7de3d2083208993e527b13ae7edadd" + } + Frame { + msec: 4048 + hash: "e5b616cefec125e8ad714d0c739ff902" + } + Frame { + msec: 4064 + hash: "3f3d5f3ca770b84e86fea3188e082493" + } + Frame { + msec: 4080 + hash: "20fd373c13d4d06b9105c80ed6f4edb7" + } + Frame { + msec: 4096 + hash: "2d6f6cf66bbd50a6546bc54e5aa91fb8" + } + Frame { + msec: 4112 + hash: "d4a21104b4f8044486fbe6516e4ae7b5" + } + Frame { + msec: 4128 + hash: "fd66704ce98410a7b1dd69f7cd6ddd26" + } + Frame { + msec: 4144 + hash: "33dcba73c46fa6513d4241e9cc75c417" + } + Frame { + msec: 4160 + hash: "c9062e6405b3b7fd0b2a794119220b1d" + } + Frame { + msec: 4176 + hash: "c1663c9ad895d67981a170f6b67a5331" + } + Frame { + msec: 4192 + hash: "dd058795bd3957d02dc296419c17819c" + } + Frame { + msec: 4208 + hash: "7cf357d1eb96e65f30a0cb4b7315b2f7" + } + Frame { + msec: 4224 + hash: "9afbd09687efa09eb3b03570bf8be531" + } + Frame { + msec: 4240 + hash: "321d29c57276959e095c5cb9366daf03" + } + Frame { + msec: 4256 + hash: "238c029a6be60ca4e1909d4f1de5633b" + } + Frame { + msec: 4272 + hash: "667b9286f32fe43a0cb5d65cdfa965cd" + } + Frame { + msec: 4288 + hash: "51bcca29caecbd92264f271818c400b8" + } + Frame { + msec: 4304 + hash: "4487366ee7ec1e0fdafc88cfa82e7977" + } + Frame { + msec: 4320 + hash: "f3cafcdab8b47c44dcc2222b9021f253" + } + Frame { + msec: 4336 + hash: "e8d25d1b5ea3f580cb46be911ea73556" + } + Frame { + msec: 4352 + hash: "f6926e493dfd7deee613cf9bb7529f5e" + } + Frame { + msec: 4368 + hash: "44e2f675f37feb23b53e58fc356a17aa" + } + Frame { + msec: 4384 + hash: "384478653302b604590c137d1e7289fe" + } + Frame { + msec: 4400 + hash: "fccc582ba920db36e797bdd7c4c329e5" + } + Frame { + msec: 4416 + hash: "92855bf2208369f361b677bc66e9c79d" + } + Frame { + msec: 4432 + hash: "9fc85a4e179b73bb5e92ed982ee13ee7" + } + Frame { + msec: 4448 + hash: "46e199e3311bf5643e4da28c1f1c687a" + } + Frame { + msec: 4464 + hash: "9d8a56893bf62535654fadd8b8a04977" + } + Frame { + msec: 4480 + hash: "b97e5629f4e9e2617e69361a0ca7f84a" + } + Frame { + msec: 4496 + hash: "eea82c42aa4eb22b2a3c5f1eb5a78d53" + } + Frame { + msec: 4512 + hash: "49d9c74894e3f1a5b03c126963296ecb" + } + Frame { + msec: 4528 + hash: "e78af45d2042130a9d34b654157a9ada" + } + Frame { + msec: 4544 + hash: "831fbf842a9107100ed7c91d664edaff" + } + Frame { + msec: 4560 + hash: "d1af7a53eef0b7dcb3da095bba7cdc12" + } + Frame { + msec: 4576 + hash: "8a02f7d3d53e98384d1f05dc7fc5fd37" + } + Frame { + msec: 4592 + hash: "6af3a8305b25a9a769b8cf00479c6ab3" + } + Frame { + msec: 4608 + hash: "f91c42910b17cb19be33a277b03e1cd2" + } + Frame { + msec: 4624 + hash: "67ff11e6143718c95418f4851265081e" + } + Frame { + msec: 4640 + hash: "e8dc4593c974902337ea7d58f26bae4c" + } + Frame { + msec: 4656 + hash: "9176a3f857d73d626bfba01878c5f213" + } + Frame { + msec: 4672 + hash: "08c7f417093c9e9da70c027ee12b0840" + } + Frame { + msec: 4688 + hash: "48fb5685e63e81f1790f5481bc06dac4" + } + Frame { + msec: 4704 + hash: "71e51c2b97140eb7810e489e6d809437" + } + Frame { + msec: 4720 + hash: "e8de71d4a2a253e366b2edf5d475824d" + } + Frame { + msec: 4736 + hash: "636335822b15f32861696439773e1794" + } + Frame { + msec: 4752 + hash: "ebd6d5f535f5356201aae297839777a6" + } + Frame { + msec: 4768 + hash: "ebc8a639c3ef849d47d79b6a91d940fd" + } + Frame { + msec: 4784 + hash: "2988cc8030891abd7493294fc2c6964c" + } + Frame { + msec: 4800 + image: "test-flipable.4.png" + } + Frame { + msec: 4816 + hash: "816d9d278fecde0867efadae2c4b5839" + } + Frame { + msec: 4832 + hash: "b40795c967d37d8cb6b73049a30f40cc" + } + Frame { + msec: 4848 + hash: "ec9892a5602892ba5a2075b61672d91b" + } + Frame { + msec: 4864 + hash: "38bd188beb6633cfe979f6881820c15d" + } + Frame { + msec: 4880 + hash: "8ee67f06977858444a775ca8c5109411" + } + Frame { + msec: 4896 + hash: "d3603c86488b02dc0136cc2588d00d7b" + } + Frame { + msec: 4912 + hash: "539ccebf96da504f0c5dfe5496ed95ce" + } + Frame { + msec: 4928 + hash: "b60450e46a2566d1feaf9749e897fa8b" + } + Frame { + msec: 4944 + hash: "daf19227a7e51e437d0a13fdf8b1a26f" + } + Frame { + msec: 4960 + hash: "09371a634d7801742075aadc131b5fb6" + } + Frame { + msec: 4976 + hash: "40b2a59c83f1223025eca6e2e19a87d8" + } + Frame { + msec: 4992 + hash: "4818f99e2f71c0ec7636aa777f4df875" + } + Frame { + msec: 5008 + hash: "7c9895dae776c2a4a6d5e1dd50d86336" + } + Frame { + msec: 5024 + hash: "b69f034a71b53c885cd177da422d5fc7" + } + Frame { + msec: 5040 + hash: "b12cbf8e97bc48e12d9543ffc1c578a2" + } + Frame { + msec: 5056 + hash: "9fd5a0f023f89511bdd4b7e429f940ab" + } + Frame { + msec: 5072 + hash: "39ed52571b12a9cea5409d5efc80c283" + } + Frame { + msec: 5088 + hash: "2dc05cabc6eb3e73e9946ebafed99fd4" + } + Frame { + msec: 5104 + hash: "599b244ff9b4ddceb682a059338f6f97" + } + Frame { + msec: 5120 + hash: "d54b5b295a9ca2bc65131a0775d8d009" + } + Frame { + msec: 5136 + hash: "b075ae21dbd3acef5c4d0f11cadce3c9" + } + Frame { + msec: 5152 + hash: "57d989f52d8bee06694166bf8bdffef0" + } + Frame { + msec: 5168 + hash: "9f87d4d33942d32a4048ca2b785a1fed" + } + Frame { + msec: 5184 + hash: "dc02f4f6b0ff1572a64fd133819fd794" + } + Frame { + msec: 5200 + hash: "c1b1056ef06a0454680f2146bb87a56b" + } + Frame { + msec: 5216 + hash: "e92daff761c739f231ba2c05785c44fb" + } + Frame { + msec: 5232 + hash: "96773abcace99ba692a5be096df85a54" + } + Frame { + msec: 5248 + hash: "31ca6f5b62fd8c08fa17b1008c4e6a22" + } + Frame { + msec: 5264 + hash: "8e44d6cf4c29313352ad0118db003958" + } + Frame { + msec: 5280 + hash: "cf8ffc1132935b5df49da90953009fa0" + } + Frame { + msec: 5296 + hash: "f9c919f45316d93d2c8693b62930850f" + } + Frame { + msec: 5312 + hash: "395863cffd5440b0a4805975b766a3cf" + } + Frame { + msec: 5328 + hash: "967f7e4f58a8e29b5d76eac011af643d" + } + Frame { + msec: 5344 + hash: "80529f6b8d12838b58c4af73c1985792" + } + Frame { + msec: 5360 + hash: "80529f6b8d12838b58c4af73c1985792" + } + Frame { + msec: 5376 + hash: "8beee45f26f9f7b94b84a807a0c42217" + } + Frame { + msec: 5392 + hash: "b6936d72cbaff0c6bb64fc08152e8680" + } + Frame { + msec: 5408 + hash: "3aace4dc5bc503ed0df1b00b444780f0" + } + Frame { + msec: 5424 + hash: "30692e6658ac730670a489c880fd4485" + } + Frame { + msec: 5440 + hash: "30692e6658ac730670a489c880fd4485" + } + Frame { + msec: 5456 + hash: "d36e1a56078d7cfa246b57f886c230b4" + } + Frame { + msec: 5472 + hash: "0374aae76f8cfd75f119ff4b86dba817" + } + Frame { + msec: 5488 + hash: "d75e53f2cea8e9b61a5e50f95060552e" + } + Frame { + msec: 5504 + hash: "d75e53f2cea8e9b61a5e50f95060552e" + } + Frame { + msec: 5520 + hash: "af5f794f73e16a5c3b9e437418c873ee" + } + Frame { + msec: 5536 + hash: "af5f794f73e16a5c3b9e437418c873ee" + } + Frame { + msec: 5552 + hash: "8532ee7ce3488f9e038643e4fa48751d" + } + Frame { + msec: 5568 + hash: "136fb272f4d806927b46a1269b18f63d" + } + Frame { + msec: 5584 + hash: "136fb272f4d806927b46a1269b18f63d" + } + Frame { + msec: 5600 + hash: "845581f8d03f4fe9323fc282e84f919b" + } + Frame { + msec: 5616 + hash: "845581f8d03f4fe9323fc282e84f919b" + } + Frame { + msec: 5632 + hash: "e64fa5eba05f81e6f263dc8543f21b1a" + } + Frame { + msec: 5648 + hash: "e64fa5eba05f81e6f263dc8543f21b1a" + } + Frame { + msec: 5664 + hash: "1c25b3d65e8590f8c213afa76b722e97" + } + Frame { + msec: 5680 + hash: "1c25b3d65e8590f8c213afa76b722e97" + } + Frame { + msec: 5696 + hash: "451a9408b04826ab35749d9120efd6bb" + } + Frame { + msec: 5712 + hash: "451a9408b04826ab35749d9120efd6bb" + } + Frame { + msec: 5728 + hash: "451a9408b04826ab35749d9120efd6bb" + } + Frame { + msec: 5744 + hash: "73c06997014af4e008b546b53fe349fb" + } + Frame { + msec: 5760 + image: "test-flipable.5.png" + } + Frame { + msec: 5776 + hash: "90fb4e4ba04ac32b52c10b3258431c04" + } + Frame { + msec: 5792 + hash: "90fb4e4ba04ac32b52c10b3258431c04" + } + Frame { + msec: 5808 + hash: "90fb4e4ba04ac32b52c10b3258431c04" + } + Frame { + msec: 5824 + hash: "90fb4e4ba04ac32b52c10b3258431c04" + } + Frame { + msec: 5840 + hash: "9becb90d9f8a61f5afacdc53d137ebcb" + } + Frame { + msec: 5856 + hash: "9becb90d9f8a61f5afacdc53d137ebcb" + } + Frame { + msec: 5872 + hash: "9becb90d9f8a61f5afacdc53d137ebcb" + } + Frame { + msec: 5888 + hash: "9becb90d9f8a61f5afacdc53d137ebcb" + } + Frame { + msec: 5904 + hash: "9becb90d9f8a61f5afacdc53d137ebcb" + } + Frame { + msec: 5920 + hash: "7e16e6360fc2e9db67dbf11d58042745" + } + Frame { + msec: 5936 + hash: "7e16e6360fc2e9db67dbf11d58042745" + } + Frame { + msec: 5952 + hash: "7e16e6360fc2e9db67dbf11d58042745" + } + Frame { + msec: 5968 + hash: "7e16e6360fc2e9db67dbf11d58042745" + } + Frame { + msec: 5984 + hash: "7e16e6360fc2e9db67dbf11d58042745" + } + Frame { + msec: 6000 + hash: "7e16e6360fc2e9db67dbf11d58042745" + } + Frame { + msec: 6016 + hash: "7e16e6360fc2e9db67dbf11d58042745" + } + Frame { + msec: 6032 + hash: "7e16e6360fc2e9db67dbf11d58042745" + } + Frame { + msec: 6048 + hash: "7e16e6360fc2e9db67dbf11d58042745" + } + Frame { + msec: 6064 + hash: "7e16e6360fc2e9db67dbf11d58042745" + } + Frame { + msec: 6080 + hash: "7e16e6360fc2e9db67dbf11d58042745" + } + Frame { + msec: 6096 + hash: "7e16e6360fc2e9db67dbf11d58042745" + } + Frame { + msec: 6112 + hash: "7e16e6360fc2e9db67dbf11d58042745" + } + Frame { + msec: 6128 + hash: "9becb90d9f8a61f5afacdc53d137ebcb" + } + Frame { + msec: 6144 + hash: "9becb90d9f8a61f5afacdc53d137ebcb" + } + Frame { + msec: 6160 + hash: "9becb90d9f8a61f5afacdc53d137ebcb" + } + Frame { + msec: 6176 + hash: "9becb90d9f8a61f5afacdc53d137ebcb" + } + Frame { + msec: 6192 + hash: "9becb90d9f8a61f5afacdc53d137ebcb" + } + Frame { + msec: 6208 + hash: "9becb90d9f8a61f5afacdc53d137ebcb" + } + Key { + type: 6 + key: 16777249 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 6224 + hash: "90fb4e4ba04ac32b52c10b3258431c04" + } + Frame { + msec: 6240 + hash: "90fb4e4ba04ac32b52c10b3258431c04" + } + Frame { + msec: 6256 + hash: "90fb4e4ba04ac32b52c10b3258431c04" + } + Frame { + msec: 6272 + hash: "73c06997014af4e008b546b53fe349fb" + } + Frame { + msec: 6288 + hash: "73c06997014af4e008b546b53fe349fb" + } + Frame { + msec: 6304 + hash: "73c06997014af4e008b546b53fe349fb" + } + Frame { + msec: 6320 + hash: "451a9408b04826ab35749d9120efd6bb" + } + Frame { + msec: 6336 + hash: "451a9408b04826ab35749d9120efd6bb" + } + Frame { + msec: 6352 + hash: "1c25b3d65e8590f8c213afa76b722e97" + } + Frame { + msec: 6368 + hash: "1c25b3d65e8590f8c213afa76b722e97" + } + Frame { + msec: 6384 + hash: "1c25b3d65e8590f8c213afa76b722e97" + } + Frame { + msec: 6400 + hash: "e64fa5eba05f81e6f263dc8543f21b1a" + } + Frame { + msec: 6416 + hash: "e64fa5eba05f81e6f263dc8543f21b1a" + } + Frame { + msec: 6432 + hash: "845581f8d03f4fe9323fc282e84f919b" + } +} diff --git a/tests/auto/declarative/visual/qmlgraphicsflipable/test-flipable.qml b/tests/auto/declarative/visual/qmlgraphicsflipable/test-flipable.qml new file mode 100644 index 0000000..ba2e93f --- /dev/null +++ b/tests/auto/declarative/visual/qmlgraphicsflipable/test-flipable.qml @@ -0,0 +1,83 @@ +import Qt 4.6 + +Rectangle { + width: 400; height: 240 + color: "white" + + Timer { + interval: 3000; running: true; repeat: true; triggeredOnStart: true + onTriggered: { + if (flipable.state == '') flipable.state = 'back'; else flipable.state = '' + if (flipable2.state == '') flipable2.state = 'back'; else flipable2.state = '' + } + } + + Flipable { + id: flipable + width: 200; height: 200 + + property int angle: 0 + + transform: Rotation { + origin.x: 100; origin.y: 100 + axis.x: 0; axis.y: 1; axis.z: 0 + angle: flipable.angle + } + + front: Rectangle { + color: "steelblue"; width: 200; height: 200 + } + + back: Rectangle { + color: "deeppink"; width: 200; height: 200 + } + + states: State { + name: "back" + PropertyChanges { target: flipable; angle: 180 } + } + + transitions: Transition { + NumberAnimation { easing: "easeInOutQuad"; matchProperties: "angle"; duration: 3000 } + } + } + + Flipable { + id: flipable2 + x: 200; width: 200; height: 200 + + property int angle: 0 + + transform: Rotation { + origin.x: 100; origin.y: 100 + axis.x: 1; axis.z: 0 + angle: flipable2.angle + } + + front: Rectangle { + color: "deeppink"; width: 200; height: 200 + } + + back: Rectangle { + color: "steelblue"; width: 200; height: 200 + } + + states: State { + name: "back" + PropertyChanges { target: flipable2; angle: 180 } + } + + transitions: Transition { + NumberAnimation { easing: "easeInOutQuad"; matchProperties: "angle"; duration: 3000 } + } + } + + Rectangle { + x: 25; width: 150; y: 210; height: 20; color: "black" + visible: flipable.side == Flipable.Front + } + Rectangle { + x: 225; width: 150; y: 210; height: 20; color: "black" + visible: flipable2.side == Flipable.Back + } +} diff --git a/tests/auto/declarative/visual/qmlgraphicsparticles/data/particles.0.png b/tests/auto/declarative/visual/qmlgraphicsparticles/data/particles.0.png Binary files differindex 30bdefd..4cc937d 100644 --- a/tests/auto/declarative/visual/qmlgraphicsparticles/data/particles.0.png +++ b/tests/auto/declarative/visual/qmlgraphicsparticles/data/particles.0.png diff --git a/tests/auto/declarative/visual/qmlgraphicsparticles/data/particles.1.png b/tests/auto/declarative/visual/qmlgraphicsparticles/data/particles.1.png Binary files differindex 799e028..ea04224 100644 --- a/tests/auto/declarative/visual/qmlgraphicsparticles/data/particles.1.png +++ b/tests/auto/declarative/visual/qmlgraphicsparticles/data/particles.1.png diff --git a/tests/auto/declarative/visual/qmlgraphicsparticles/data/particles.2.png b/tests/auto/declarative/visual/qmlgraphicsparticles/data/particles.2.png Binary files differindex ed267c2..241fd20 100644 --- a/tests/auto/declarative/visual/qmlgraphicsparticles/data/particles.2.png +++ b/tests/auto/declarative/visual/qmlgraphicsparticles/data/particles.2.png diff --git a/tests/auto/declarative/visual/qmlgraphicsparticles/data/particles.qml b/tests/auto/declarative/visual/qmlgraphicsparticles/data/particles.qml index 3199f31..a4339f8 100644 --- a/tests/auto/declarative/visual/qmlgraphicsparticles/data/particles.qml +++ b/tests/auto/declarative/visual/qmlgraphicsparticles/data/particles.qml @@ -10,235 +10,235 @@ VisualTest { } Frame { msec: 32 - hash: "1c129b1c4a39412bed2f23d712f2bc90" + hash: "71e690f8339f1829efc113d88d1a9023" } Frame { msec: 48 - hash: "fbcc4bc3fea46a43453aa39b032264c6" + hash: "856a757f3e83e1ede00854d2dacd856a" } Frame { msec: 64 - hash: "2cb13275faca414b7c8ba9d70067fd1f" + hash: "2a7926b693b9950aabc4e3a1ebe4b2d0" } Frame { msec: 80 - hash: "b017afb05f96085ee3395d62e62e457b" + hash: "0564ce95b47a7c3314a56921855b9244" } Frame { msec: 96 - hash: "642851d10c549c8ae72c057563e99e64" + hash: "bf207596dd69e7a872a23448621100cc" } Frame { msec: 112 - hash: "494c0942f7410d455a4b113fb908e570" + hash: "a0bb920166e777ea96afb811353a3488" } Frame { msec: 128 - hash: "cb0a2f9980f27757c0c1d62ef3dcfde0" + hash: "3d6297c684562d099fdb9c413b3e93a3" } Frame { msec: 144 - hash: "2fb9cf782ea106006af8bcd66c62869c" + hash: "29139f93cbd55faa0ea18f11db364d56" } Frame { msec: 160 - hash: "bf68518323f03e4f407831e8b34f247b" + hash: "f3637e44bf1b6c3fd030898e14a15443" } Frame { msec: 176 - hash: "c99abe9c0384ae339fdfa0c75dc8047d" + hash: "d687ef38c1d0e8d12c03a2e7b462a5e5" } Frame { msec: 192 - hash: "96f2eb402633c1aca8a1a2b0d60af5fb" + hash: "0f1f227bbce76122d081759752edf47e" } Frame { msec: 208 - hash: "6cba51a856f1ba54ee702761f196b915" + hash: "1112e4f9ec18958caa4efadbf8b369bd" } Frame { msec: 224 - hash: "9188926caa6c6ba8cb3aee04de635b96" + hash: "5bb7fd7dc06d79aa5ca35fa551753a38" } Frame { msec: 240 - hash: "81132a5e8768de0630311813170f166e" + hash: "c59e159877613eb09ba353bc0ef46086" } Frame { msec: 256 - hash: "a638698d7ccb73f20f6eeba3857f417c" + hash: "b7c583f85d89c833861324b3d06a6c8b" } Frame { msec: 272 - hash: "4761ba6847f6f0769b916106c5f3245b" + hash: "147641f03d92a48f49e0cfb4972bc1c7" } Frame { msec: 288 - hash: "13bc0c681962bada7fcb3b722895ffaa" + hash: "1627827cd3733d1177f111c6c347ab49" } Frame { msec: 304 - hash: "505c5824be16d812b7c339f1f9b8a10b" + hash: "0edccffd718ef10a0ea476201fc00c39" } Frame { msec: 320 - hash: "d191d502d9c685f8497583669147ee73" + hash: "4b7f426aaa31bdabc6c065b298e59c9e" } Frame { msec: 336 - hash: "c17f55cc5d7bf541e235791a157aa8b9" + hash: "4814f77f57bbae8d3c20995e37ec95fb" } Frame { msec: 352 - hash: "3ef401f87830c53b9b277d4420a9a742" + hash: "030092297087df89ab40e894a01f0ee2" } Frame { msec: 368 - hash: "d04816400e66ebbf797f9985a53f7cfb" + hash: "30b0d547b580daee9b1c49f5069570c5" } Frame { msec: 384 - hash: "d7a7df7c2a92449f42d61c0572e7dbac" + hash: "eaee106eaa1505e7d79ed21c36f381fd" } Frame { msec: 400 - hash: "f49a3bcf3842f554136ff9bd5bb470ef" + hash: "6527d1d44a75015d7eb163a660e15b0b" } Frame { msec: 416 - hash: "27bccc5933d7bfaad6d5f6a10efd283b" + hash: "3a3a7b7b36ede4aa1261b5f28c99984c" } Frame { msec: 432 - hash: "3067ac00a4d58c67bb96d813c344871d" + hash: "d2349319b0feeceaa7ef9301ae87d348" } Frame { msec: 448 - hash: "d38d7192688feecc38fd63285d37ce49" + hash: "f483ae316491e367922f6ef7ebfa0298" } Frame { msec: 464 - hash: "4172d1b74cdd6ea89be718977775a9e0" + hash: "3d94b3e9b409a4ca2200df226a25b2d5" } Frame { msec: 480 - hash: "2761a7e58cbfa46fc6d306c8270e4f10" + hash: "ce289f478dafd295ba82ef0c9e13ff3d" } Frame { msec: 496 - hash: "58a851b9fbcb98afc7c1bc58c2f45e4a" + hash: "6d618658faa9403ff9909f6c6a677cb2" } Frame { msec: 512 - hash: "0f7789f04bf20708d9d6f1e818b6b88a" + hash: "9e12eda314483bc5ef5a14a1b1ac26d7" } Frame { msec: 528 - hash: "8d8b8d109dce4c7b05ecb603b4718859" + hash: "ed34b0d26a18145028a5ec4c99e9b569" } Frame { msec: 544 - hash: "0fc6fde589932ac41787e8ebfe3fcbe3" + hash: "ea91dc7e837fa540af260f75c0f8ba49" } Frame { msec: 560 - hash: "e08bffd5a56795488f090a475513e5db" + hash: "a5b277747454ddeda3d66f3702f45a53" } Frame { msec: 576 - hash: "e089ab7c5feefd3d745bb665e2ff49ee" + hash: "7601784afb80a79267ade99961122186" } Frame { msec: 592 - hash: "e7b787fb1b21e991c19ec88b3d985b69" + hash: "e52696c37cc3a245a555c98038b51e76" } Frame { msec: 608 - hash: "a6f4f32287bd926e0eeff68717b80512" + hash: "7d94071d225e0105c794a238eaa8117e" } Frame { msec: 624 - hash: "3344ca9c97473bd922bd8efd5d6ab212" + hash: "60ebfb611c6f7515568574aecdfdcb57" } Frame { msec: 640 - hash: "a330510a9f62acb4f2163728939d0bb5" + hash: "0ea41ef8a82e97e62ed7507606ab6bf4" } Frame { msec: 656 - hash: "1ec473936f2279f13675b6b5fe2ee392" + hash: "009a12491a5f6e4b30942062f93a3f8c" } Frame { msec: 672 - hash: "b193b7d2917ee00c4cb29bf244186bef" + hash: "2fa053880413fc76b53b26b733b2168f" } Frame { msec: 688 - hash: "75137e977941e357bad2ad9af2cbc898" + hash: "fb53a57559de18a5b6f13f21d1daf098" } Frame { msec: 704 - hash: "31773ba8979a31b1691860b7dafe28dc" + hash: "f65a62bf7d5e8fbd996f7151398109a6" } Frame { msec: 720 - hash: "d8922452edbba4f1092b83e87c0330ea" + hash: "b0802484661f6fe4606f4ff915c03f81" } Frame { msec: 736 - hash: "982c80305b54236d1259f5672098652d" + hash: "b63c61e63cb23147a8377d3428d5a4fa" } Frame { msec: 752 - hash: "d8b23fb0867fb75558960216c8d0f2aa" + hash: "a320dcfa3907c85fa983035953b79ba3" } Frame { msec: 768 - hash: "daf7833f93a216d1e025c9129b3a7caa" + hash: "6b94696073ab8e1ef6be1f0b5cb22720" } Frame { msec: 784 - hash: "bb08e8fe2ce74018fc702e5dad8927fe" + hash: "5ed4ff5011c421e40bd0e1d021974efc" } Frame { msec: 800 - hash: "22a30051c87d4de7e734d9de6ce7eed8" + hash: "b183261aca9e8f887f4d489d8c81f583" } Frame { msec: 816 - hash: "d8625628587feace367fc97c1f11aff8" + hash: "c4672d92bb4f0e8cb8e10fcef11a36e2" } Frame { msec: 832 - hash: "e9dbbf715fc094cb22ecd5c6df602f95" + hash: "beb2c18162ea197b486b217f15f784e7" } Frame { msec: 848 - hash: "ca69b2b9f8e6b16e3bc6d93598b6c75a" + hash: "9f5198e08dc16e80f500804ba8ae7afb" } Frame { msec: 864 - hash: "87e09752e39df5042aef163fe4ed0b47" + hash: "d892706fd28d55adcdacdf72a2f7ad83" } Frame { msec: 880 - hash: "80adfaf02838c8bd372e53d0483fbac5" + hash: "1ed182b5b27ed7ed59c56c450a73975d" } Frame { msec: 896 - hash: "9934a1aece14ba7369b00cf2620cd207" + hash: "74756064676c5d5c9eacaea31a7b357d" } Frame { msec: 912 - hash: "954a70a949fdcca4e4412174f30653c3" + hash: "64f79b420b38bda6e102163b90be5f4f" } Frame { msec: 928 - hash: "850fa936516f8b145465eac39c9a74a6" + hash: "0d1f92cafc507af799953771cee7c265" } Frame { msec: 944 - hash: "1d844e8a7c710ccbf31f47470cc9abf2" + hash: "887ef63951fb56fd50f4de9afe8db1a8" } Frame { msec: 960 @@ -246,239 +246,239 @@ VisualTest { } Frame { msec: 976 - hash: "33f4eee3f6e3fb715463254d727ef898" + hash: "f09fc1e1ebc8c627c89c741ac263e3f4" } Frame { msec: 992 - hash: "68648a3f75f58b34dd9770a9edc2caea" + hash: "30bb26df58c83ff70d767e01f0df5140" } Frame { msec: 1008 - hash: "ad0d431ab7e6cfbb43053050a1cf5e40" + hash: "dbd83b1749a42edd6d26097ade1c67ba" } Frame { msec: 1024 - hash: "d1ae74c9bf3826d30fb461ca2fd8e36a" + hash: "7fa50f111158dc6a3e245eb23e57a3f3" } Frame { msec: 1040 - hash: "bda9d77c68a30d491abdfbfcf854c5ea" + hash: "267ef8b555a62abb44e8b5cf88c83110" } Frame { msec: 1056 - hash: "386ea303f8102339f8cd5ae88fd5f6bc" + hash: "78b2d13be078f2e7e94d685994b6488e" } Frame { msec: 1072 - hash: "8c81d3992851ebeb3cb820bc4510af66" + hash: "1d47caf40c85bc1e23bf8d22160d333d" } Frame { msec: 1088 - hash: "566813e312ffdde4a7d3af4276bc8cdd" + hash: "abeaf0a9bedfd62e56f12fa612bf287f" } Frame { msec: 1104 - hash: "d9c8b391b12ee40aa393f4fb39c12a16" + hash: "0f66d12b082398c9f43ef868632529ab" } Frame { msec: 1120 - hash: "f2bf70bda626089437f0ab67ad62d8f6" + hash: "957340efea7ce168889c2ae1b867c6d0" } Frame { msec: 1136 - hash: "88b2d1ecd7d51d0bf8c947a3433b7013" + hash: "4d83e6160f5d9097a4b73bf4104fa11b" } Frame { msec: 1152 - hash: "e93e0553c5dcc6dcd21dad0932d1e3fa" + hash: "d2811de76d3c0cc8ebd67583e50deaae" } Frame { msec: 1168 - hash: "c1ec148772d399ea4934cdfc514f6980" + hash: "cb13f2d6985e841b2da453860d7ddd65" } Frame { msec: 1184 - hash: "14f286793de5452f4677e8b6fd5c1e7e" + hash: "1e48b355ff1e136bcd982a749ba49089" } Frame { msec: 1200 - hash: "220a7df0af53fc9a2442956128091ad8" + hash: "9f9abd7b167a834449510a02d368155b" } Frame { msec: 1216 - hash: "84c49512f5e9f138901b3833a5adbcab" + hash: "6a75c81527b3bb85f70c08f669d46139" } Frame { msec: 1232 - hash: "b05410caa120f5a4191a44b84aa17a8c" + hash: "eafd6f87fb88f6f51cf27d5dd4faa7c8" } Frame { msec: 1248 - hash: "e1f6db204f62394205c1d4d56bbf9f52" + hash: "ba43e681c7f2677b81fa4fe87a5e612c" } Frame { msec: 1264 - hash: "f45033d1350009e09f62e81aeec297a5" + hash: "f83f06320c3e7c2352dd8e8839d63063" } Frame { msec: 1280 - hash: "dfd88b1dba38ab8260e00b3810b89318" + hash: "713afe22640941e9ea4925158099c514" } Frame { msec: 1296 - hash: "17503276f68e365cde03607d66fe4c8e" + hash: "53766caa0ab92bbd2e3d69e6ab9a8fe7" } Frame { msec: 1312 - hash: "28f03c5c0fe5c4647c5b9d3b72a07c76" + hash: "af98650b68d48fd3776d0334904b9e75" } Frame { msec: 1328 - hash: "ea2082529b50543fab22497e01938102" + hash: "62439fba28fbc0d4a129ccd5edf81b8b" } Frame { msec: 1344 - hash: "a700a2f3721625b1ec68107884d1ce67" + hash: "75c67b227f23a3ef5c01aca285f3617c" } Frame { msec: 1360 - hash: "ce717f1f1d98158aeef1cc6a9485dc80" + hash: "3a5e1fe4a9454e9636fbebdfb005e3ac" } Frame { msec: 1376 - hash: "7febe7c67e1c159881de72f62800a505" + hash: "2e4cdc140a9faedc8fbc9a0ec20b1a4c" } Frame { msec: 1392 - hash: "474931cb44a8e18426b9c2cc9f6df482" + hash: "f937d5b14fb0360afb14dbcce1b0ad9a" } Frame { msec: 1408 - hash: "1085b4873b9a4934882a163be72a2710" + hash: "20cb9e30c1a89bae3081427328887361" } Frame { msec: 1424 - hash: "59e7911800e915e6f159cb111ce61a54" + hash: "67f19061f97630a35b59357dcba9c5f0" } Frame { msec: 1440 - hash: "6d0d780ffc726b04f9885c25b08d1009" + hash: "f1b4041797873b7ff9e318542186eaf8" } Frame { msec: 1456 - hash: "bf896d6403dc1ad26536cc1165e71e9e" + hash: "ecbdc77e1b58decad29a6dfc654fba20" } Frame { msec: 1472 - hash: "86397c7dcf5ed34edbbaa465ae6eab43" + hash: "6d0b821c08b024aa8fc71ec5c0e98c53" } Frame { msec: 1488 - hash: "ed1b4967bf14eead9cb4d2dcfbdb46c2" + hash: "5137c7ee6879b98478a4edb1b5a0d79c" } Frame { msec: 1504 - hash: "67b7e59c8f945d1f3bdb1944fa736ecf" + hash: "17c80c758e9d0721a3b791dbabe0d34f" } Frame { msec: 1520 - hash: "b5f95e89f39d1c4821ba38547b0f2e3b" + hash: "abc1fe8d97b87f891ac53673fe64bf0d" } Frame { msec: 1536 - hash: "5bc91c9e35afa255a2dda28db9802b1e" + hash: "fe8c8ce5f0cf676310e4ce85c1755f0f" } Frame { msec: 1552 - hash: "84fab4042e0ff891ca1998cbfbb60e5a" + hash: "40eff7ab7370e7a3de28a55e200812ca" } Frame { msec: 1568 - hash: "7c5ef5025a06e990171dac3e8fd93977" + hash: "8ff86cc730f4b7877ed7890f62dd8f17" } Frame { msec: 1584 - hash: "ab4cd0e103d71a35250668ad850a5213" + hash: "a87e34b8d9e75d03493c94a96ef97c25" } Frame { msec: 1600 - hash: "aa974c4b2290f7febb121344623de86d" + hash: "807a4b4652ed228084660bfdf98efd50" } Frame { msec: 1616 - hash: "ff6ee1b50ca356dc98038a459e318b32" + hash: "ca245fcf490c3bc17bef1a38d793f573" } Frame { msec: 1632 - hash: "022fe9c391514fdd98bc1c38bc383df2" + hash: "6662d0e4e7778f560c8956e9fe4aa079" } Frame { msec: 1648 - hash: "b1a33c9c9cbdcc1c8c9c982eef041ccd" + hash: "c47d90df3dbb1656ef425209f1b528b1" } Frame { msec: 1664 - hash: "0945e66ab5aa81beacf662eb82ec39ed" + hash: "c9dbf06207cf9b8d03cf20f4e4131979" } Frame { msec: 1680 - hash: "ae293f675dbdd88dec8f924140033cc9" + hash: "dfab00fee3cf9f0f76d66f64eed6de84" } Frame { msec: 1696 - hash: "5ace5013e3d51a8db338f65011dd10f8" + hash: "b38a29a29bf30c197e5434a942e805cf" } Frame { msec: 1712 - hash: "9466a4e96d647f2bd8845697fce89399" + hash: "589496ebac7f7ea699b869291db7ed45" } Frame { msec: 1728 - hash: "73bbbfc57e020c6a0acbd5fdfa711c30" + hash: "c7a037e3e755c1c8fecd17db7596a9cd" } Frame { msec: 1744 - hash: "d71d7182107c3d6b004a57a321caee96" + hash: "faca2e1e88556ffd1f71bbc5ceae5cb1" } Frame { msec: 1760 - hash: "0902867c89e536cffcde69bde2eb1994" + hash: "5837a888d83513fb4c0bce11a34fc3df" } Frame { msec: 1776 - hash: "39fc26943f6077272c36e93b7cbf6994" + hash: "07f8fe9ded8271396db503c3927244bb" } Frame { msec: 1792 - hash: "92931d5a6e57fb9df60785a64d3a6f78" + hash: "345fffbc210b55a4bd78cb8a4e12d025" } Frame { msec: 1808 - hash: "fffd632552f88f2979ef85de0ce585c2" + hash: "7b9aa96eb9a1fe77fbb8b607140885b7" } Frame { msec: 1824 - hash: "9f97bfcffbb5d127c5eee852b30a13c4" + hash: "d66748cc52a364231ac8a6a677d9bdc6" } Frame { msec: 1840 - hash: "ea9ee0293fbc45d3467e29c09e42adcd" + hash: "40cf9aece08870358aef6c9836013472" } Frame { msec: 1856 - hash: "b5b75c50f8fae3fb3b88efad536c911b" + hash: "2015ab3c133862222b1375c775af743b" } Frame { msec: 1872 - hash: "25dcd3fa30c057d1a42c19cee1ce444b" + hash: "41e519acb18ed9f7cda2d3cd88fddd2c" } Frame { msec: 1888 - hash: "862d42abe7abd49d4a38e38a8c33a657" + hash: "8e583b74b2b90d7f5c78357f66801358" } Frame { msec: 1904 - hash: "a335f3c8c797c1bb5537b57f952c19d1" + hash: "3a6755e25045d937743371a98792a546" } Frame { msec: 1920 @@ -486,239 +486,239 @@ VisualTest { } Frame { msec: 1936 - hash: "da1cf98fdfe5acbe30cfbe66389aa240" + hash: "f80a8f65def55d556732bfefe3debe72" } Frame { msec: 1952 - hash: "088f3209c0363c06cf0607c58d00ca2d" + hash: "308cbe6344b9aea4c6b7ad2ef606de59" } Frame { msec: 1968 - hash: "47ba3bf2604b21f331a2e00f05926aaf" + hash: "fd2d31f6f4a3b4ce1aec1e309c48ae94" } Frame { msec: 1984 - hash: "5ff0de383abdefad76380af144bd9d80" + hash: "a02ed4aa3783049ffbf7ef6dfb4e8926" } Frame { msec: 2000 - hash: "b972d1c85d3d8777f84b54dc118172fd" + hash: "dde64769b3affc776fe0e747a4d621ef" } Frame { msec: 2016 - hash: "37581c3fbef2088b7d14b6c7bbf3cdc3" + hash: "3fa830b629939520c071b3e6fe94156e" } Frame { msec: 2032 - hash: "4ad6a06ac6de9dea66e9ce873a6618c1" + hash: "ae582350cba12ce47306f2a967e396fd" } Frame { msec: 2048 - hash: "3a0379ad966235044508c144ffbc336b" + hash: "a4483eadd2bf3e3e9fae51279b50e18a" } Frame { msec: 2064 - hash: "cb5a9510400943d77c9a296066f037e2" + hash: "742fc008fab89087b1bceee33889db19" } Frame { msec: 2080 - hash: "7bd5673a1d2ad8079df2569149e5811e" + hash: "5da9546b147737dd671813725cb196f7" } Frame { msec: 2096 - hash: "bd327ff6b8a4081b3a41cb0035403037" + hash: "c979bccf2603c400b4c93d1be6f698d1" } Frame { msec: 2112 - hash: "f0f9f559251f7648cd60e66ac745962d" + hash: "b7c6391ce59e054ae53e3731788dfc05" } Frame { msec: 2128 - hash: "18827630a859b0ce497f682e33558fae" + hash: "0371e17fdaa7be7af0cff132f164d6b4" } Frame { msec: 2144 - hash: "e22d8110cbe34acddba799942872645d" + hash: "6973ce2af671f4d500da3c5a37534693" } Frame { msec: 2160 - hash: "11564e7221524cc3655c2c5f1d7e42b6" + hash: "f9128da47afa801c6b3670752847a8d1" } Frame { msec: 2176 - hash: "6468721ee38209aaf2c82a320bcd122e" + hash: "2e4a7001c3c1bb7153f631da1b273aa1" } Frame { msec: 2192 - hash: "19772d0f422fd206645ae6cf0be30b59" + hash: "65d41139c27a4a94a817e1b5c8aa765d" } Frame { msec: 2208 - hash: "48b6c7e1317b9a66238c17afceb5121f" + hash: "36652e407957b59bad2e0e9b2fa5a8fe" } Frame { msec: 2224 - hash: "82a1af78709b78cce2d9b4eed7f8477c" + hash: "c0fe78ff8fc3119b30a1d9e5b98fafbb" } Frame { msec: 2240 - hash: "36e2366eccbdd2d16c19829c34fbff87" + hash: "41b798eac11e696e5e690d13e8ce88b1" } Frame { msec: 2256 - hash: "271db39ca46c59ddc279fb41a9d191af" + hash: "20efbef05b6eed5a916e55ba25c10a59" } Frame { msec: 2272 - hash: "ee279a90e86aa89b1c3d745ab030180d" + hash: "dc897fb0d232a39215d5d004e322cb2a" } Frame { msec: 2288 - hash: "14e8c72d770644f4cec99e65aeff0d75" + hash: "33c1f9bb344a31a1a0973a527c22edac" } Frame { msec: 2304 - hash: "56fa1756eb11a30f07f8f31c22c99973" + hash: "0b54b02eedc60e8d7b147092b9bd6bca" } Frame { msec: 2320 - hash: "165af677ff3921f06b89b2c8d76a7924" + hash: "02cb9a222c9b109cbff956238a61b31b" } Frame { msec: 2336 - hash: "d64aa248d9b207b87e5ba14bdabf2f6c" + hash: "bfb067d4519861b22e20847083447a22" } Frame { msec: 2352 - hash: "33e9716eb9ca62fe5c5cb1b1ee0e9e68" + hash: "86f599f6844c2046148c682abfe6c417" } Frame { msec: 2368 - hash: "cff2316820c469b84c3bacabfcf1a551" + hash: "fa07ac104183fe94fd3a381595582d76" } Frame { msec: 2384 - hash: "9f1359c4bab95244602254ca3954e2b7" + hash: "8ee792f06fa7e877ce0b160bcf170e70" } Frame { msec: 2400 - hash: "d6246d2aaea895755eab4c839c35ca9d" + hash: "bb39f4374215e9b4eafbc3320d4144b6" } Frame { msec: 2416 - hash: "d446e1ac91fec10482b0c6d38ce86d17" + hash: "d91f778ced58466dd6b79f50cdbfe1a8" } Frame { msec: 2432 - hash: "99f443af76a9e0d2d03638bc9927fda3" + hash: "0fd47896c9d9d74e40c38d0f532aa537" } Frame { msec: 2448 - hash: "a9169e293b8154947332d9754fd23af3" + hash: "0b7ec227fc884616bd17439bf0d40ac1" } Frame { msec: 2464 - hash: "cc6851cc5864615c000fbc8d552eb593" + hash: "e88d4e76d353701c738120e169ccf2a8" } Frame { msec: 2480 - hash: "58a3a6edb5842c88cb73b79a8a187717" + hash: "1564432d4aea1826e543f41dfc9a8113" } Frame { msec: 2496 - hash: "42bcf77c98c9a80508446bd8c66e935b" + hash: "02825fa9174c0a45e19c564030ba9ad0" } Frame { msec: 2512 - hash: "0f99350ae151591fbda95158c046e072" + hash: "c7671a2bb3f0dcb2be48805ef1970dbd" } Frame { msec: 2528 - hash: "9e817e2fd8377b7117f908c4e87d4d57" + hash: "2fa407b026edbb8b9e0edc263fd9ecc5" } Frame { msec: 2544 - hash: "72c105bce75feeeb7a86f823945b4ff9" + hash: "211f3c82cff939cd1ed324180d40aab2" } Frame { msec: 2560 - hash: "653b858445bdd8afdf8abd27f5e53fb8" + hash: "0fb3de6e1865e49ac281ac12e2032f07" } Frame { msec: 2576 - hash: "18bf39154fbf4b42c4d3303e018a2f27" + hash: "a08e0127a0b6172715aa6a10d6e0799e" } Frame { msec: 2592 - hash: "5ed5d52ab7da7ae77e97f3ace09b3b8d" + hash: "57a3d1530042f0d6a6dbf84059a8d730" } Frame { msec: 2608 - hash: "1d382462e5746ee9b6df980364b1c96b" + hash: "9aae6364941f988409b8db63db72fccb" } Frame { msec: 2624 - hash: "2a0a561f38c113a0f177b1c2b99ee5e1" + hash: "9e466ce9c8b54dc95960d21b0b41fdd1" } Frame { msec: 2640 - hash: "0605d3e2dd9132d9c1d25b75a870d647" + hash: "189e0f3c60cd521a6bf52054fa6039c6" } Frame { msec: 2656 - hash: "a1def1576f386c90bb80d46e254bd384" + hash: "1020f18d41a4d83e0b5ae387b486b5ff" } Frame { msec: 2672 - hash: "cf38d4ae577047048d2bd0a4005abfe2" + hash: "26fcea12cc2de8c8cb8caf049937d7c6" } Frame { msec: 2688 - hash: "d7cb6715cd89978bbca5ce4c93b488e5" + hash: "e5b9e752dc668cd4f6803ea772bbb7b0" } Frame { msec: 2704 - hash: "9a5075ee794af14d4f17a52bdbc47f1e" + hash: "a0df9360ed11207076fc77810c1d8605" } Frame { msec: 2720 - hash: "fd3d803a1e5e9e3eeae7d5edcddd0072" + hash: "56dea4551a9532e80dfd6c79031ec08b" } Frame { msec: 2736 - hash: "445114e7d10581a475989e469323d83d" + hash: "900c62773477b2843464b75f67d50c90" } Frame { msec: 2752 - hash: "58328c1d4c0ee7fca78b684697f1922c" + hash: "177de9647549a276256a5e74d5ef7134" } Frame { msec: 2768 - hash: "433df4d872b9565b43af5afce1b42e15" + hash: "cb3eb956096de4f6b51ab249d184a6dd" } Frame { msec: 2784 - hash: "3b694f15722a087c2c9a860cad8bb6de" + hash: "6671e46d013f72bef5e3d0d95ba70301" } Frame { msec: 2800 - hash: "1986c8036bd548ca06a32aa98ab4fc83" + hash: "33910dc69eff13f9c144b7ff84187a59" } Frame { msec: 2816 - hash: "7845dbb0e38145f54a9e4e0bfbd608db" + hash: "dfa20711b0821b66cb2bdd2806e34d03" } Frame { msec: 2832 - hash: "caed393910ae7467c307a314bdf459ef" + hash: "16e2674c2449bf059aa2a0add077e040" } Frame { msec: 2848 - hash: "f3f6b41b7ed04dbc1693c169bdae3b13" + hash: "cdd2a820076cfa9529d93787de61267e" } Frame { msec: 2864 - hash: "b9a87d15d48f951b0a1d6962fb1d5995" + hash: "a851a1e017e90877d6d8027633401bcc" } Frame { msec: 2880 @@ -726,58 +726,50 @@ VisualTest { } Frame { msec: 2896 - hash: "954300274b6a5785e03a6cdae67238e9" + hash: "f159f17caa8df7ae09141462cd9b75ab" } Frame { msec: 2912 - hash: "5b7f51afad796107289369c7d3494843" + hash: "f6a8787008d24bffa6813799042a0d69" } Frame { msec: 2928 - hash: "41164f28cbb94528eda719d590d1cf75" + hash: "18e79f454a628098c41ff8882b663a53" } Frame { msec: 2944 - hash: "5953d4c9a4b4c83ba1dfd83a57ec2742" + hash: "74676f4f2d8612bc02f72e3bf855c060" } Frame { msec: 2960 - hash: "0be7c6187a26b44f12bf71587372a6c7" + hash: "8276c61e080635dd37954837998a14a6" } Frame { msec: 2976 - hash: "a7cab1faf0cdd5649c8ea3c26d2e80d0" + hash: "4cceb2274ce5584315109ac45ef8fce7" } Frame { msec: 2992 - hash: "5f91bef1865623030aea20805993319a" + hash: "c4e87037c2265f85fef3b681b840c6f9" } Frame { msec: 3008 - hash: "69d34e2a27c471ad44f8aba8d906a961" + hash: "aed160bb820dc5cdf1ee320b019436c4" } Frame { msec: 3024 - hash: "5a987879aff30d6c6712c0631bc2f43d" + hash: "593acf3e67bc3428f61b723996093d8d" } Frame { msec: 3040 - hash: "62b9132c58cd5fdcfe7f1bc5e64885cf" + hash: "694d197caff9144204a82a682d47724c" } Frame { msec: 3056 - hash: "d394ef9b504abf94c1d28a9fb7f3c28b" + hash: "12519eda928f8aef0e2a21e9fc0f8756" } Frame { msec: 3072 - hash: "a559cc25af950227fa5fdf70be7fd94c" - } - Frame { - msec: 3088 - hash: "318dde40fc72c5f8ee45b865a68922b1" - } - Frame { - msec: 3104 - hash: "3cbfd55773e52f48f01fe66c28c0b992" + hash: "ae8cba17b25e9567211f4cd20080cb09" } } diff --git a/tests/auto/declarative/visual/qmlgraphicsparticles/particles.qml b/tests/auto/declarative/visual/qmlgraphicsparticles/particles.qml index 8fb793f..a7a8143 100644 --- a/tests/auto/declarative/visual/qmlgraphicsparticles/particles.qml +++ b/tests/auto/declarative/visual/qmlgraphicsparticles/particles.qml @@ -3,11 +3,12 @@ import Qt 4.6 Rectangle { width: 640; height: 480; color: "black" + Particles { emitting: false } Particles { id:particlesA y:0; width: 260; height:30; source: "star.png"; lifeSpan:1000; count: 50; angle:70; angleDeviation:36; velocity:30; velocityDeviation:10; emissionRate: 10 - ParticleMotionWander { xvariance:30; pace:100 } + ParticleMotionWander { yvariance:5; xvariance:30; pace:100 } } Particles { id:particlesB diff --git a/tests/auto/declarative/visual/qfxtext/elide/data-X11/elide.0.png b/tests/auto/declarative/visual/qmlgraphicstext/elide/data-X11/elide.0.png Binary files differindex 5631a46..5631a46 100644 --- a/tests/auto/declarative/visual/qfxtext/elide/data-X11/elide.0.png +++ b/tests/auto/declarative/visual/qmlgraphicstext/elide/data-X11/elide.0.png diff --git a/tests/auto/declarative/visual/qfxtext/elide/data-X11/elide.qml b/tests/auto/declarative/visual/qmlgraphicstext/elide/data-X11/elide.qml index cfd832e..cfd832e 100644 --- a/tests/auto/declarative/visual/qfxtext/elide/data-X11/elide.qml +++ b/tests/auto/declarative/visual/qmlgraphicstext/elide/data-X11/elide.qml diff --git a/tests/auto/declarative/visual/qfxtext/elide/data-X11/multilength.0.png b/tests/auto/declarative/visual/qmlgraphicstext/elide/data-X11/multilength.0.png Binary files differindex 6e2b625..6e2b625 100644 --- a/tests/auto/declarative/visual/qfxtext/elide/data-X11/multilength.0.png +++ b/tests/auto/declarative/visual/qmlgraphicstext/elide/data-X11/multilength.0.png diff --git a/tests/auto/declarative/visual/qfxtext/elide/data-X11/multilength.qml b/tests/auto/declarative/visual/qmlgraphicstext/elide/data-X11/multilength.qml index 0c06196..0c06196 100644 --- a/tests/auto/declarative/visual/qfxtext/elide/data-X11/multilength.qml +++ b/tests/auto/declarative/visual/qmlgraphicstext/elide/data-X11/multilength.qml diff --git a/tests/auto/declarative/visual/qfxtext/elide/data/elide.0.png b/tests/auto/declarative/visual/qmlgraphicstext/elide/data/elide.0.png Binary files differindex 1a8c89b..1a8c89b 100644 --- a/tests/auto/declarative/visual/qfxtext/elide/data/elide.0.png +++ b/tests/auto/declarative/visual/qmlgraphicstext/elide/data/elide.0.png diff --git a/tests/auto/declarative/visual/qfxtext/elide/data/elide.qml b/tests/auto/declarative/visual/qmlgraphicstext/elide/data/elide.qml index 59f17f7..59f17f7 100644 --- a/tests/auto/declarative/visual/qfxtext/elide/data/elide.qml +++ b/tests/auto/declarative/visual/qmlgraphicstext/elide/data/elide.qml diff --git a/tests/auto/declarative/visual/qfxtext/elide/elide.qml b/tests/auto/declarative/visual/qmlgraphicstext/elide/elide.qml index 3c9ea5b..3c9ea5b 100644 --- a/tests/auto/declarative/visual/qfxtext/elide/elide.qml +++ b/tests/auto/declarative/visual/qmlgraphicstext/elide/elide.qml diff --git a/tests/auto/declarative/visual/qfxtext/elide/multilength.qml b/tests/auto/declarative/visual/qmlgraphicstext/elide/multilength.qml index fa74cc4..fa74cc4 100644 --- a/tests/auto/declarative/visual/qfxtext/elide/multilength.qml +++ b/tests/auto/declarative/visual/qmlgraphicstext/elide/multilength.qml diff --git a/tests/auto/declarative/visual/qfxtext/font/data-MAC/plaintext.0.png b/tests/auto/declarative/visual/qmlgraphicstext/font/data-MAC/plaintext.0.png Binary files differindex a54a327..05a6e51 100644 --- a/tests/auto/declarative/visual/qfxtext/font/data-MAC/plaintext.0.png +++ b/tests/auto/declarative/visual/qmlgraphicstext/font/data-MAC/plaintext.0.png diff --git a/tests/auto/declarative/visual/qmlgraphicstext/font/data-MAC/plaintext.qml b/tests/auto/declarative/visual/qmlgraphicstext/font/data-MAC/plaintext.qml new file mode 100644 index 0000000..7e591c8 --- /dev/null +++ b/tests/auto/declarative/visual/qmlgraphicstext/font/data-MAC/plaintext.qml @@ -0,0 +1,351 @@ +import Qt.VisualTest 4.6 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 32 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 48 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 64 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 80 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 96 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 112 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 128 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 144 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 160 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 176 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 192 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 208 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 224 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 240 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 256 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 272 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 288 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 304 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 320 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 336 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 352 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 368 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 384 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 400 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 416 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 432 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 448 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 464 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 480 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 496 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 512 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 528 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 544 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 560 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 576 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 592 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 608 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 624 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 640 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 656 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 672 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 688 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 704 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 720 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 736 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 752 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 768 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 784 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 800 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 816 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 832 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 848 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 864 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 880 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 896 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 912 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 928 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 944 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 960 + image: "plaintext.0.png" + } + Frame { + msec: 976 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 992 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 1008 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 1024 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 1040 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 1056 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 1072 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 1088 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 1104 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 1120 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 1136 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 1152 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 1168 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 1184 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Key { + type: 6 + key: 16777249 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1200 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 1216 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 1232 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 1248 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 1264 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 1280 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 1296 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 1312 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 1328 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } + Frame { + msec: 1344 + hash: "d6479cc04d67055c2fd8f4ed2fca829b" + } +} diff --git a/tests/auto/declarative/visual/qfxtext/font/data-MAC/richtext.0.png b/tests/auto/declarative/visual/qmlgraphicstext/font/data-MAC/richtext.0.png Binary files differindex c2ddee1..6379942 100644 --- a/tests/auto/declarative/visual/qfxtext/font/data-MAC/richtext.0.png +++ b/tests/auto/declarative/visual/qmlgraphicstext/font/data-MAC/richtext.0.png diff --git a/tests/auto/declarative/visual/qmlgraphicstext/font/data-MAC/richtext.qml b/tests/auto/declarative/visual/qmlgraphicstext/font/data-MAC/richtext.qml new file mode 100644 index 0000000..4414c1c --- /dev/null +++ b/tests/auto/declarative/visual/qmlgraphicstext/font/data-MAC/richtext.qml @@ -0,0 +1,359 @@ +import Qt.VisualTest 4.6 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 32 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 48 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 64 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 80 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 96 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 112 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 128 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 144 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 160 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 176 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 192 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 208 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 224 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 240 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 256 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 272 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 288 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 304 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 320 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 336 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 352 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 368 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 384 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 400 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 416 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 432 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 448 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 464 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 480 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 496 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 512 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 528 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 544 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 560 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 576 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 592 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 608 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 624 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 640 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 656 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 672 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 688 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 704 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 720 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 736 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 752 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 768 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 784 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 800 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 816 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 832 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 848 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 864 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 880 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 896 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 912 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 928 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 944 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 960 + image: "richtext.0.png" + } + Frame { + msec: 976 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 992 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 1008 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 1024 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 1040 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 1056 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 1072 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 1088 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 1104 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 1120 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 1136 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 1152 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Key { + type: 6 + key: 16777249 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1168 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 1184 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 1200 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 1216 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 1232 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 1248 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 1264 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 1280 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 1296 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 1312 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 1328 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 1344 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 1360 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } + Frame { + msec: 1376 + hash: "b902ff73e7c943bb09b5d2ae6c7a760e" + } +} diff --git a/tests/auto/declarative/visual/qfxtext/font/data/plaintext.0.png b/tests/auto/declarative/visual/qmlgraphicstext/font/data/plaintext.0.png Binary files differindex 50d56dc..50d56dc 100644 --- a/tests/auto/declarative/visual/qfxtext/font/data/plaintext.0.png +++ b/tests/auto/declarative/visual/qmlgraphicstext/font/data/plaintext.0.png diff --git a/tests/auto/declarative/visual/qfxtext/font/data/plaintext.qml b/tests/auto/declarative/visual/qmlgraphicstext/font/data/plaintext.qml index f4cbcbd..f4cbcbd 100644 --- a/tests/auto/declarative/visual/qfxtext/font/data/plaintext.qml +++ b/tests/auto/declarative/visual/qmlgraphicstext/font/data/plaintext.qml diff --git a/tests/auto/declarative/visual/qfxtext/font/data/richtext.0.png b/tests/auto/declarative/visual/qmlgraphicstext/font/data/richtext.0.png Binary files differindex 2910670..2910670 100644 --- a/tests/auto/declarative/visual/qfxtext/font/data/richtext.0.png +++ b/tests/auto/declarative/visual/qmlgraphicstext/font/data/richtext.0.png diff --git a/tests/auto/declarative/visual/qfxtext/font/data/richtext.qml b/tests/auto/declarative/visual/qmlgraphicstext/font/data/richtext.qml index 9f396c2..9f396c2 100644 --- a/tests/auto/declarative/visual/qfxtext/font/data/richtext.qml +++ b/tests/auto/declarative/visual/qmlgraphicstext/font/data/richtext.qml diff --git a/tests/auto/declarative/visual/qfxtext/font/plaintext.qml b/tests/auto/declarative/visual/qmlgraphicstext/font/plaintext.qml index f219e09..a3aa929 100644 --- a/tests/auto/declarative/visual/qfxtext/font/plaintext.qml +++ b/tests/auto/declarative/visual/qmlgraphicstext/font/plaintext.qml @@ -55,10 +55,10 @@ Rectangle { text: s.text; horizontalAlignment: Text.AlignLeft; width: 800 } Text { - text: s.text; horizontalAlignment: Text.AlignHCenter; width: 800 + text: s.text; horizontalAlignment: Text.AlignHCenter; verticalAlignment: Text.AlignVCenter; width: 800; height: 20 } Text { - text: s.text; horizontalAlignment: Text.AlignRight; width: 800 + text: s.text; horizontalAlignment: Text.AlignRight; verticalAlignment: Text.AlignBottom; width: 800; height: 20 } Text { text: s.text; font.pixelSize: 18; style: Text.Outline; styleColor: "white"; wrap: true; width: 200 diff --git a/tests/auto/declarative/visual/qfxtext/font/richtext.qml b/tests/auto/declarative/visual/qmlgraphicstext/font/richtext.qml index 00a9749..35aa232 100644 --- a/tests/auto/declarative/visual/qfxtext/font/richtext.qml +++ b/tests/auto/declarative/visual/qmlgraphicstext/font/richtext.qml @@ -55,10 +55,10 @@ Rectangle { text: s.text; horizontalAlignment: Text.AlignLeft; width: 800 } Text { - text: s.text; horizontalAlignment: Text.AlignHCenter; width: 800 + text: s.text; horizontalAlignment: Text.AlignHCenter; verticalAlignment: Text.AlignVCenter; width: 800; height: 20 } Text { - text: s.text; horizontalAlignment: Text.AlignRight; width: 800 + text: s.text; horizontalAlignment: Text.AlignRight; verticalAlignment: Text.AlignBottom; width: 800; height: 20 } Text { text: s.text; font.pixelSize: 18; style: Text.Outline; styleColor: "white"; wrap: true; width: 200 diff --git a/tests/auto/declarative/visual/qmlspringfollow/data-MAC/follow.0.png b/tests/auto/declarative/visual/qmlspringfollow/data-MAC/follow.0.png Binary files differnew file mode 100644 index 0000000..d753c97 --- /dev/null +++ b/tests/auto/declarative/visual/qmlspringfollow/data-MAC/follow.0.png diff --git a/tests/auto/declarative/visual/qmlspringfollow/data-MAC/follow.1.png b/tests/auto/declarative/visual/qmlspringfollow/data-MAC/follow.1.png Binary files differnew file mode 100644 index 0000000..98fc111 --- /dev/null +++ b/tests/auto/declarative/visual/qmlspringfollow/data-MAC/follow.1.png diff --git a/tests/auto/declarative/visual/qmlspringfollow/data-MAC/follow.2.png b/tests/auto/declarative/visual/qmlspringfollow/data-MAC/follow.2.png Binary files differnew file mode 100644 index 0000000..b1d109e --- /dev/null +++ b/tests/auto/declarative/visual/qmlspringfollow/data-MAC/follow.2.png diff --git a/tests/auto/declarative/visual/qmlspringfollow/data-MAC/follow.3.png b/tests/auto/declarative/visual/qmlspringfollow/data-MAC/follow.3.png Binary files differnew file mode 100644 index 0000000..595d92e --- /dev/null +++ b/tests/auto/declarative/visual/qmlspringfollow/data-MAC/follow.3.png diff --git a/tests/auto/declarative/visual/qmlspringfollow/data-MAC/follow.4.png b/tests/auto/declarative/visual/qmlspringfollow/data-MAC/follow.4.png Binary files differnew file mode 100644 index 0000000..93e1536 --- /dev/null +++ b/tests/auto/declarative/visual/qmlspringfollow/data-MAC/follow.4.png diff --git a/tests/auto/declarative/visual/qmlspringfollow/data-MAC/follow.5.png b/tests/auto/declarative/visual/qmlspringfollow/data-MAC/follow.5.png Binary files differnew file mode 100644 index 0000000..b27cc9f --- /dev/null +++ b/tests/auto/declarative/visual/qmlspringfollow/data-MAC/follow.5.png diff --git a/tests/auto/declarative/visual/qmlspringfollow/data-MAC/follow.qml b/tests/auto/declarative/visual/qmlspringfollow/data-MAC/follow.qml new file mode 100644 index 0000000..3c0dad8 --- /dev/null +++ b/tests/auto/declarative/visual/qmlspringfollow/data-MAC/follow.qml @@ -0,0 +1,1691 @@ +import Qt.VisualTest 4.6 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + hash: "ea677d128f47343d81a081c438aa2f6c" + } + Frame { + msec: 32 + hash: "ea677d128f47343d81a081c438aa2f6c" + } + Frame { + msec: 48 + hash: "403e130b7cf0a41d8348a227293d98d1" + } + Frame { + msec: 64 + hash: "d2250ca93235b6a087b5e582f7e941d6" + } + Frame { + msec: 80 + hash: "3e95bdb5546de8ed7bb33de704d2890e" + } + Frame { + msec: 96 + hash: "438612a44780d6587f99a44c943eb60f" + } + Frame { + msec: 112 + hash: "057d47c73edcd149c0b1e6274f98deae" + } + Frame { + msec: 128 + hash: "c15ca80f3efb55d067e38bd92f360b14" + } + Frame { + msec: 144 + hash: "9f1b15db2eb172d97eef4f7c78d11e4f" + } + Frame { + msec: 160 + hash: "a81514d058846ae1c60575534ad47b21" + } + Frame { + msec: 176 + hash: "48d0f3971ed369d6a82b06ca9febc435" + } + Frame { + msec: 192 + hash: "8277eb954d0ca9293f3d05b979db3fe3" + } + Frame { + msec: 208 + hash: "edb64bdcb13f67813fcd3cbedb608cf3" + } + Frame { + msec: 224 + hash: "3a51a89e15b0709fcf6591ce4096c52d" + } + Frame { + msec: 240 + hash: "ffe486e038988cea3ff2ec6b2fcc516f" + } + Frame { + msec: 256 + hash: "1267aa3970ac861827e84c5da93523c7" + } + Frame { + msec: 272 + hash: "c5c0d501f102876a0b06f6d100f19a77" + } + Frame { + msec: 288 + hash: "b78207cb082771fc608a084c69c38399" + } + Frame { + msec: 304 + hash: "86cc014a4601ddf84478c8a0f44de7ed" + } + Frame { + msec: 320 + hash: "fbe34a8c894aa1c1ddb26171069c92f6" + } + Frame { + msec: 336 + hash: "c916a45687baa73e1023cdb03be42669" + } + Frame { + msec: 352 + hash: "1157f5c96e49fdc0afeb126453e19260" + } + Frame { + msec: 368 + hash: "c7528a6f57f4241dc2f5867436c44fd9" + } + Frame { + msec: 384 + hash: "054ac7e1cd4448fdd12f0175b3bdff90" + } + Frame { + msec: 400 + hash: "4ccf29d6ce92332683f6b49b89357579" + } + Frame { + msec: 416 + hash: "c46e42accdeba8b32bd4d6d43894c61c" + } + Frame { + msec: 432 + hash: "2ab2e8d8a3d58ac1c17932b9485cbc67" + } + Frame { + msec: 448 + hash: "347092c3876535e41e8368be2cd19aed" + } + Frame { + msec: 464 + hash: "311b1c44074b0e55a990e971f877c898" + } + Frame { + msec: 480 + hash: "198908af8468b4500fac85262eb82596" + } + Frame { + msec: 496 + hash: "202c33e301ad850a888223d3abdd06e6" + } + Frame { + msec: 512 + hash: "f3e0ce1386571c9e6be2656d402b4960" + } + Frame { + msec: 528 + hash: "b9c900bfedc7159ee2c0b0af6e66fc92" + } + Frame { + msec: 544 + hash: "f978850a8977c3c32e4ae9a43b7a3a8b" + } + Frame { + msec: 560 + hash: "637e5d9580d783864134b403e49cb47b" + } + Frame { + msec: 576 + hash: "8082c1e1eccb8588ebdbb739e31bda49" + } + Frame { + msec: 592 + hash: "c513f544df3d94223bb4fbf06befa2d7" + } + Frame { + msec: 608 + hash: "e7f589e64d3cd054349161971d4ef42e" + } + Frame { + msec: 624 + hash: "bb375339d4155f13c353bc90eb9b9cbf" + } + Frame { + msec: 640 + hash: "924368c60be4be048a19af942a8e402c" + } + Frame { + msec: 656 + hash: "c0142a6872bf5a445302952aaa6daa0d" + } + Frame { + msec: 672 + hash: "fab2a7e79b235f6432cd4c48740e3020" + } + Frame { + msec: 688 + hash: "fda751a9b20100007c33669bdb6f7f23" + } + Frame { + msec: 704 + hash: "d97d2d108dba9aefd36b0f6b2f160f23" + } + Frame { + msec: 720 + hash: "bf3683eb4308904de61fb3fb59802e37" + } + Frame { + msec: 736 + hash: "908f34ec52d59027f65c673c17077ca6" + } + Frame { + msec: 752 + hash: "19ae0ec52c077eff92451c9924be2c23" + } + Frame { + msec: 768 + hash: "898277481841e4c4f8992fd755784e5a" + } + Frame { + msec: 784 + hash: "9613da2dcdf470561d20a982777f50f6" + } + Frame { + msec: 800 + hash: "fdfc54fa3657be02c2ee65d787e8c7a5" + } + Frame { + msec: 816 + hash: "1d3b6cff6e62890db90213ebab88dca3" + } + Frame { + msec: 832 + hash: "713e9c0f768f6cc8cc6c78c72b41b47c" + } + Frame { + msec: 848 + hash: "9068d912a8d3e6e0b5b458c12ddad126" + } + Frame { + msec: 864 + hash: "e85192393e4911dbaf9c734d2e386bbf" + } + Frame { + msec: 880 + hash: "4f2374e6c8763e1e5b3b7cebdf5b8ebc" + } + Frame { + msec: 896 + hash: "986a32decb18065294356fb85953891e" + } + Frame { + msec: 912 + hash: "faa36d337589c59761814e3065874aa3" + } + Frame { + msec: 928 + hash: "9c823d92cd71932f0ad1d247fdd8c66e" + } + Frame { + msec: 944 + hash: "3ebcf592e427bcbc8a92dc1bee903845" + } + Frame { + msec: 960 + image: "follow.0.png" + } + Frame { + msec: 976 + hash: "b1a205f75f5ab7b69f4d9bd0582d7896" + } + Frame { + msec: 992 + hash: "0cf4ce09fd895a174271e3cb37c72de6" + } + Frame { + msec: 1008 + hash: "e6487b45fc20afc4c1a24c8669919611" + } + Frame { + msec: 1024 + hash: "fe2a4eb899611495fa5ad88b7c5f4c7e" + } + Frame { + msec: 1040 + hash: "07b880170d1ba41e4d1a1277e8184089" + } + Frame { + msec: 1056 + hash: "27afbfb4b961570f8844e05595b11d4f" + } + Frame { + msec: 1072 + hash: "1b6cfd4c2c2c007837cfb9746f44ec20" + } + Frame { + msec: 1088 + hash: "8f82c7f1cb2ded469a7cb3a0827e919e" + } + Frame { + msec: 1104 + hash: "d8581781550c21bc0fa6b75fc6de3f57" + } + Frame { + msec: 1120 + hash: "104a6c18b4a16732de9dba9bfb92eb5a" + } + Frame { + msec: 1136 + hash: "ebbdeb2de19644aeb41c03f852d1fc15" + } + Frame { + msec: 1152 + hash: "a8cc1328eb65fed5ca75d79c6e628ec1" + } + Frame { + msec: 1168 + hash: "a1192d371ffd3e9f8a23abca6a8b4d98" + } + Frame { + msec: 1184 + hash: "06b7749eace5d149bd35f668c4df9811" + } + Frame { + msec: 1200 + hash: "de1f7eb2c3224754a75d0a953ee24a76" + } + Frame { + msec: 1216 + hash: "1bc3c2cf2058ab5f8d491ad35605c6d7" + } + Frame { + msec: 1232 + hash: "4c2b7e3f7cad28a424f3fdb574d732b6" + } + Frame { + msec: 1248 + hash: "ebb9c07b34f4acd9ee2652324c81e5d1" + } + Frame { + msec: 1264 + hash: "fef63629bdae6f1d744633916c6b0852" + } + Frame { + msec: 1280 + hash: "aacb966d803ed6986db40e51d2a63dff" + } + Frame { + msec: 1296 + hash: "796bb7137a909d524b1cec022c1be6ea" + } + Frame { + msec: 1312 + hash: "d88526b472d9ba58b93f868a150154f3" + } + Frame { + msec: 1328 + hash: "d6a24e9f446565c0d0d0bf25db80e88e" + } + Frame { + msec: 1344 + hash: "08902af1f5ba7566f2fef79200ac0362" + } + Frame { + msec: 1360 + hash: "b655edf8bd25f5e05fcb1cce64aaad89" + } + Frame { + msec: 1376 + hash: "5f526a0e92c1846ca7099c5640208dd0" + } + Frame { + msec: 1392 + hash: "c354f31e4e75d6ccf4c284113c54377b" + } + Frame { + msec: 1408 + hash: "2f8143ead16b7c65c8f43469754c09dd" + } + Frame { + msec: 1424 + hash: "b486f4056d300e22860fa995b6f09f92" + } + Frame { + msec: 1440 + hash: "4a24f651b8ad911b04426a07b4663a3d" + } + Frame { + msec: 1456 + hash: "aad02861a66647d27ea3746d9b455e91" + } + Frame { + msec: 1472 + hash: "ce4225df7a187919c91cc2dd950e11f0" + } + Frame { + msec: 1488 + hash: "5479a97041b64406883100567df4b9b7" + } + Frame { + msec: 1504 + hash: "76e67f9c5b552f1ff47c3c7b23eb1b76" + } + Frame { + msec: 1520 + hash: "8c3e1d2fd58eaf2a8da16bb0349b1e5e" + } + Frame { + msec: 1536 + hash: "4642a396f4a4bb3b97845782e1d1ce93" + } + Frame { + msec: 1552 + hash: "4d3e8c9ea7c8c1407db564a3a6e430ff" + } + Frame { + msec: 1568 + hash: "e041300f1d2956f35baebed6c7c9c750" + } + Frame { + msec: 1584 + hash: "b20e241906a2b9e38b03c0991d21160e" + } + Frame { + msec: 1600 + hash: "cb5c32ad57d1931a69c20328f8f2d060" + } + Frame { + msec: 1616 + hash: "021ba4fc38e1652afeab73047e126a17" + } + Frame { + msec: 1632 + hash: "d27728f36491ba432e3655850402ee6b" + } + Frame { + msec: 1648 + hash: "20a87f4d9afd2039e44c2b5b539d0298" + } + Frame { + msec: 1664 + hash: "46c4016acfe390495307d3d64b93902d" + } + Frame { + msec: 1680 + hash: "a356b011266d901d7148e662393e5f72" + } + Frame { + msec: 1696 + hash: "43b4a8e0d73ab2c6be5db2b48c3e7013" + } + Frame { + msec: 1712 + hash: "b7a5bfbecabbf0f20b0e2c0959051b66" + } + Frame { + msec: 1728 + hash: "8eff269aeb6f3bc540dd8cf6491d53b8" + } + Frame { + msec: 1744 + hash: "9c524c30ef7cd6dbfb911ec1c75d0e32" + } + Frame { + msec: 1760 + hash: "a064e420983d68f2f2baca9ea9119236" + } + Frame { + msec: 1776 + hash: "99739628a95e72704e503ed6d1dea712" + } + Frame { + msec: 1792 + hash: "1f0f916ed7382f10c23eb63052377fe1" + } + Frame { + msec: 1808 + hash: "d99f731943018a50e8738bf638ca3b31" + } + Frame { + msec: 1824 + hash: "10182c1206e73d5a59b377f5d6061bef" + } + Frame { + msec: 1840 + hash: "a272abb9905b17e4bdd717db87514c11" + } + Frame { + msec: 1856 + hash: "81ffae766d85d829d7e16071ac44fcc1" + } + Frame { + msec: 1872 + hash: "4e2402d3eafa149d0b8ad9238c3b985d" + } + Frame { + msec: 1888 + hash: "70ad42fd0824ce00181514bac4b6b0f4" + } + Frame { + msec: 1904 + hash: "6d1ff46bd1606662fec47f14152bfd4a" + } + Frame { + msec: 1920 + image: "follow.1.png" + } + Frame { + msec: 1936 + hash: "9a37d437b9476375b3a34ac293a0789a" + } + Frame { + msec: 1952 + hash: "0a5fa0cd8bc22d274b00d32383ffc486" + } + Frame { + msec: 1968 + hash: "1a284b36906f0adcef2ed66c0cfb5a9d" + } + Frame { + msec: 1984 + hash: "049ca635405f3f88f85629f559919569" + } + Frame { + msec: 2000 + hash: "d8d3d7b55f2a04dbf187d2296e8da84a" + } + Frame { + msec: 2016 + hash: "57a04352e211d888d8182449b8f970e0" + } + Frame { + msec: 2032 + hash: "48229fc62e5ea19c54f961d3b0bb5b26" + } + Frame { + msec: 2048 + hash: "8c5d645cdbbb343789fc6ac27482b76e" + } + Frame { + msec: 2064 + hash: "3c4d50a07778ae5105f2e7514bff37ca" + } + Frame { + msec: 2080 + hash: "ce97d094ede43b3e74e81fa63e04dad7" + } + Frame { + msec: 2096 + hash: "2b2e4e9681bbc672b51148c10b183ec8" + } + Frame { + msec: 2112 + hash: "0421ac4f53c050bfffb2c8de16aafd46" + } + Frame { + msec: 2128 + hash: "953bdaacefe42a841bf1cdd7da3b442a" + } + Frame { + msec: 2144 + hash: "7209f7d812af5bdbca4b15f303cb5ff7" + } + Frame { + msec: 2160 + hash: "3f64635e9c43b8b6a402c5d6fe26e648" + } + Frame { + msec: 2176 + hash: "92926b4cf66b15cd0ddb468f2bd8bd62" + } + Frame { + msec: 2192 + hash: "ee0810fe7509d2d61d9306908816bba4" + } + Frame { + msec: 2208 + hash: "55249aae2bb6db6c363ecb4b89f56270" + } + Frame { + msec: 2224 + hash: "73ea66c3c61e8105ac61d26c8cfdbba3" + } + Frame { + msec: 2240 + hash: "f75b56ced71167a1bc1800b0d2f0f249" + } + Frame { + msec: 2256 + hash: "e0d09e7a8007bfbc1efd4bd89f49847a" + } + Frame { + msec: 2272 + hash: "159e98e8340375c6700015288660cbf8" + } + Frame { + msec: 2288 + hash: "b7aa76fced5c78eb8e55ce9f36d081e2" + } + Frame { + msec: 2304 + hash: "ac87e65a58914c1984b2dc95cf6de76d" + } + Frame { + msec: 2320 + hash: "7a0131b0a9ec395a2286438625881bee" + } + Frame { + msec: 2336 + hash: "84da8fd2b435b3ac9bad3350cd3a9ec0" + } + Frame { + msec: 2352 + hash: "1ed376000e60129b4bcf06ea73cb5819" + } + Frame { + msec: 2368 + hash: "8c713e210143ab5f19bdddd918f86ef3" + } + Frame { + msec: 2384 + hash: "269b595c5691747b56be58d5b92ae497" + } + Frame { + msec: 2400 + hash: "486d80316c88da4adc736df72fc86f45" + } + Frame { + msec: 2416 + hash: "b67cc78a3bfcd026264cfb9b7146c4d5" + } + Frame { + msec: 2432 + hash: "9d2cdecf3e9f067e68b81b202c8f62b2" + } + Frame { + msec: 2448 + hash: "02748271316f8382f4788322fda807c1" + } + Frame { + msec: 2464 + hash: "669986c581c162b8d3160336b92b2479" + } + Frame { + msec: 2480 + hash: "5dc604aaa95f45eba0dfc7aa3a73bca4" + } + Frame { + msec: 2496 + hash: "2199d6e809fc1e1879861fbbd63974e8" + } + Frame { + msec: 2512 + hash: "335a5561620f779a4fd0c1f33da2fc05" + } + Frame { + msec: 2528 + hash: "3e312b8de56c902ca20aba259c8559b2" + } + Frame { + msec: 2544 + hash: "37634addfe0cb2efdd9d6a1a134fae1e" + } + Frame { + msec: 2560 + hash: "a3cdb1d331845e268e393dd493a71613" + } + Frame { + msec: 2576 + hash: "ccfb90a921e74f4e172ea1fba8c38eb5" + } + Frame { + msec: 2592 + hash: "370f60a35849b7a8221f9474cbdaa201" + } + Frame { + msec: 2608 + hash: "e1b8d1d7298a3d3ade82493fb6f99909" + } + Frame { + msec: 2624 + hash: "e1b8d1d7298a3d3ade82493fb6f99909" + } + Frame { + msec: 2640 + hash: "74ecfaced66f630d1863c04000fa7f01" + } + Frame { + msec: 2656 + hash: "74ecfaced66f630d1863c04000fa7f01" + } + Frame { + msec: 2672 + hash: "c803b3258d0e1d8e6c1292ea2a00f76b" + } + Frame { + msec: 2688 + hash: "c803b3258d0e1d8e6c1292ea2a00f76b" + } + Frame { + msec: 2704 + hash: "c803b3258d0e1d8e6c1292ea2a00f76b" + } + Frame { + msec: 2720 + hash: "9f3f4fe1be7bd4511a0408fd5ab1b11f" + } + Frame { + msec: 2736 + hash: "9f3f4fe1be7bd4511a0408fd5ab1b11f" + } + Frame { + msec: 2752 + hash: "cd2c4e1a288d09f46dd557973c22e1be" + } + Frame { + msec: 2768 + hash: "cd2c4e1a288d09f46dd557973c22e1be" + } + Frame { + msec: 2784 + hash: "cd2c4e1a288d09f46dd557973c22e1be" + } + Frame { + msec: 2800 + hash: "8109005d7e21d16b77f88efce2b530e4" + } + Frame { + msec: 2816 + hash: "8109005d7e21d16b77f88efce2b530e4" + } + Frame { + msec: 2832 + hash: "8109005d7e21d16b77f88efce2b530e4" + } + Frame { + msec: 2848 + hash: "8109005d7e21d16b77f88efce2b530e4" + } + Frame { + msec: 2864 + hash: "8109005d7e21d16b77f88efce2b530e4" + } + Frame { + msec: 2880 + image: "follow.2.png" + } + Frame { + msec: 2896 + hash: "e009f65ae035fb8a9c27a1d57f10c35f" + } + Frame { + msec: 2912 + hash: "e009f65ae035fb8a9c27a1d57f10c35f" + } + Frame { + msec: 2928 + hash: "e009f65ae035fb8a9c27a1d57f10c35f" + } + Frame { + msec: 2944 + hash: "e009f65ae035fb8a9c27a1d57f10c35f" + } + Frame { + msec: 2960 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 2976 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 2992 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 3008 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 3024 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 3040 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 3056 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 3072 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 3088 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 3104 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 3120 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 3136 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 3152 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 3168 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 3184 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 3200 + hash: "20dd4407adca55737dd4231405c38cff" + } + Frame { + msec: 3216 + hash: "20dd4407adca55737dd4231405c38cff" + } + Frame { + msec: 3232 + hash: "20dd4407adca55737dd4231405c38cff" + } + Frame { + msec: 3248 + hash: "20dd4407adca55737dd4231405c38cff" + } + Frame { + msec: 3264 + hash: "20dd4407adca55737dd4231405c38cff" + } + Frame { + msec: 3280 + hash: "20dd4407adca55737dd4231405c38cff" + } + Frame { + msec: 3296 + hash: "20dd4407adca55737dd4231405c38cff" + } + Frame { + msec: 3312 + hash: "20dd4407adca55737dd4231405c38cff" + } + Frame { + msec: 3328 + hash: "8109005d7e21d16b77f88efce2b530e4" + } + Frame { + msec: 3344 + hash: "cd2c4e1a288d09f46dd557973c22e1be" + } + Frame { + msec: 3360 + hash: "cd2c4e1a288d09f46dd557973c22e1be" + } + Frame { + msec: 3376 + hash: "cd2c4e1a288d09f46dd557973c22e1be" + } + Frame { + msec: 3392 + hash: "cd2c4e1a288d09f46dd557973c22e1be" + } + Frame { + msec: 3408 + hash: "cd2c4e1a288d09f46dd557973c22e1be" + } + Frame { + msec: 3424 + hash: "cd2c4e1a288d09f46dd557973c22e1be" + } + Frame { + msec: 3440 + hash: "cd2c4e1a288d09f46dd557973c22e1be" + } + Frame { + msec: 3456 + hash: "cd2c4e1a288d09f46dd557973c22e1be" + } + Frame { + msec: 3472 + hash: "cd2c4e1a288d09f46dd557973c22e1be" + } + Frame { + msec: 3488 + hash: "cd2c4e1a288d09f46dd557973c22e1be" + } + Frame { + msec: 3504 + hash: "cd2c4e1a288d09f46dd557973c22e1be" + } + Frame { + msec: 3520 + hash: "9f3f4fe1be7bd4511a0408fd5ab1b11f" + } + Frame { + msec: 3536 + hash: "9f3f4fe1be7bd4511a0408fd5ab1b11f" + } + Frame { + msec: 3552 + hash: "60b86cce6d76291148c7c49a5eabcf55" + } + Frame { + msec: 3568 + hash: "b0dadf051b5b328f56fab390a2c33052" + } + Frame { + msec: 3584 + hash: "b6b75a9723b46aa072bf7c779dc84e64" + } + Frame { + msec: 3600 + hash: "ef4e8b36b5afc762e1f8f714eee61240" + } + Frame { + msec: 3616 + hash: "a322a2446fd3506c243766233ec9303e" + } + Frame { + msec: 3632 + hash: "5723527da987b29f74502e5abd25a5f7" + } + Frame { + msec: 3648 + hash: "d9f98fa248099936c6307457c935326f" + } + Frame { + msec: 3664 + hash: "54224ce16b717d0accb9cca7dc5e94d3" + } + Frame { + msec: 3680 + hash: "cb036f8c7e3c464d0210fca8b21b2d5f" + } + Frame { + msec: 3696 + hash: "729ff15f4b129e1bd7a522007c96d49b" + } + Frame { + msec: 3712 + hash: "6c3791f76fbed468ce6e23938d321874" + } + Frame { + msec: 3728 + hash: "970eebc8fa4fd8d92db49450ed3474a7" + } + Frame { + msec: 3744 + hash: "4c97641854bb6997fc5106d7981e4ac9" + } + Frame { + msec: 3760 + hash: "adb4c29247d0bf785be36ccdf74f4293" + } + Frame { + msec: 3776 + hash: "5133846ed6886846426495aba011ab6f" + } + Frame { + msec: 3792 + hash: "010771e4dea5c93de852bead35fc6a1e" + } + Frame { + msec: 3808 + hash: "6115a50835cbc196ae322ad2727d1b68" + } + Frame { + msec: 3824 + hash: "4e37fde35f4f577c3b62881fa526e369" + } + Frame { + msec: 3840 + image: "follow.3.png" + } + Frame { + msec: 3856 + hash: "1ea7000fd392a0799775b6783ffe332c" + } + Frame { + msec: 3872 + hash: "40e69b98954b40ce8dc78d60eac882d7" + } + Frame { + msec: 3888 + hash: "690b93596e7fb7c1f7de4ca81b96ce48" + } + Frame { + msec: 3904 + hash: "6e8910061829e1111227a9854e18e742" + } + Frame { + msec: 3920 + hash: "f6f60ef03e3f2829510c325effde9f39" + } + Frame { + msec: 3936 + hash: "6c3d2d3903cd20969f8f2994f6a22592" + } + Frame { + msec: 3952 + hash: "10febc71c9120a591510e123955424c1" + } + Frame { + msec: 3968 + hash: "c06b52a3814791a56fc2cefa1544a693" + } + Frame { + msec: 3984 + hash: "ca3a6e577490b5e88cf0c3d63bd69b76" + } + Frame { + msec: 4000 + hash: "a4ebd4f687d38bd803aa61fc247e88e9" + } + Frame { + msec: 4016 + hash: "099b8d7fea937bba6092a5c8ad1cc395" + } + Frame { + msec: 4032 + hash: "c04384eb7d5c172a529d682ae7e916bf" + } + Frame { + msec: 4048 + hash: "d0131c92bd3a2a7fa8cd83e3818370ed" + } + Frame { + msec: 4064 + hash: "62e721f0344142fb7742675f644748f8" + } + Frame { + msec: 4080 + hash: "5bddfcb4cb01efa0dc8603f3c4f4f553" + } + Frame { + msec: 4096 + hash: "d31e44ad6cdfbd4076c66d41bb1d957e" + } + Frame { + msec: 4112 + hash: "35126d01091d50a41dd073d2a5ae974a" + } + Frame { + msec: 4128 + hash: "2c876aaf36e4d2a8d94bf3c3f4b934eb" + } + Frame { + msec: 4144 + hash: "f75683d97c9d1f33a918c68f4651f31b" + } + Frame { + msec: 4160 + hash: "f372de89a29d19b5c234f39a8ce85ed2" + } + Frame { + msec: 4176 + hash: "fe2cd973de16bf92c552829d89332048" + } + Frame { + msec: 4192 + hash: "bbcb60bd8b845e8fd2c885d3f42d9a91" + } + Frame { + msec: 4208 + hash: "28addd32d7c28198425d41f42f1f7f38" + } + Frame { + msec: 4224 + hash: "82cee6bac4d343adb86d02836728ccd7" + } + Frame { + msec: 4240 + hash: "b0eeb40c5f7e7e5bb17566772686c8df" + } + Frame { + msec: 4256 + hash: "e5372f9fe3dbe6b111da81de6e2088b8" + } + Frame { + msec: 4272 + hash: "d6e476458ad03a13c7f14bdb2b530394" + } + Frame { + msec: 4288 + hash: "4a5185a2cf033ca6f9250ab9e995dc7a" + } + Frame { + msec: 4304 + hash: "6fd086e35b33ca714f31c1a50f64ccba" + } + Frame { + msec: 4320 + hash: "ae8cae69a702811a897e7d5790c806cc" + } + Frame { + msec: 4336 + hash: "073e2e1af434447c3000b03e3a89925a" + } + Frame { + msec: 4352 + hash: "3c75c7586c1dca2fd21266395ccc8ac4" + } + Frame { + msec: 4368 + hash: "aa36ac379ac9953bd165b5164cd047da" + } + Frame { + msec: 4384 + hash: "09d6ab311429cfe29a68c428669b5d5a" + } + Frame { + msec: 4400 + hash: "11ebcb0a744bc3faa746560d9c1a824d" + } + Frame { + msec: 4416 + hash: "aa01ba99122f89bff8fc45ef88326f6a" + } + Frame { + msec: 4432 + hash: "6980292ba8a4bf8ead3581e5899f5d78" + } + Frame { + msec: 4448 + hash: "65fa1a0fe53b9a0580c14e96d42fe993" + } + Frame { + msec: 4464 + hash: "7837c0a533839f94629be4e64294b89f" + } + Frame { + msec: 4480 + hash: "5edbf632047ae4130f580e4a0ece8e57" + } + Frame { + msec: 4496 + hash: "0a5fdc57898cb56f00a76ecaa3a6b9e0" + } + Frame { + msec: 4512 + hash: "58d1b36e738042af44dab04a8c842259" + } + Frame { + msec: 4528 + hash: "2efb1f742d7f823d13b9724c1c10ce1a" + } + Frame { + msec: 4544 + hash: "e0286eb0b3fbb17e422554a8ef25489c" + } + Frame { + msec: 4560 + hash: "8252caa2841f07d29802a7b822388253" + } + Frame { + msec: 4576 + hash: "eaabd4b3610c0bcbbdc113f86bc52e6c" + } + Frame { + msec: 4592 + hash: "55b17d049e1c791d33094f64717bca06" + } + Frame { + msec: 4608 + hash: "1bd607f6d0658f46b1f0df51e8a9a9fe" + } + Frame { + msec: 4624 + hash: "4a52ea4de14098978931155f11168f68" + } + Frame { + msec: 4640 + hash: "343df8fb45e1e70183bb61a1111909a5" + } + Frame { + msec: 4656 + hash: "bcf1363d9912a3d626ef933387b4e01b" + } + Frame { + msec: 4672 + hash: "67709ea579481537e532120de35619b2" + } + Frame { + msec: 4688 + hash: "a7542255a10a120812880b1243bd573d" + } + Frame { + msec: 4704 + hash: "b4f3e597e489d32a473bb2ad6bb92fc4" + } + Frame { + msec: 4720 + hash: "f0df46d1b819edda5a616e858ed9171c" + } + Frame { + msec: 4736 + hash: "2416564198b4b853d9c4f5ad55ee5db5" + } + Frame { + msec: 4752 + hash: "342e5adcd2fca99c88c33cd8b56b8650" + } + Frame { + msec: 4768 + hash: "01806799adce1d0069cfdd739f383a7f" + } + Frame { + msec: 4784 + hash: "c045fdefdd4606d2c68c8cde2a7a40f4" + } + Frame { + msec: 4800 + image: "follow.4.png" + } + Frame { + msec: 4816 + hash: "c7371c0594fb9f4de0a7f8a3cdce061a" + } + Frame { + msec: 4832 + hash: "6df0c2a27c672e36a3d7eb5b4e0c46bf" + } + Frame { + msec: 4848 + hash: "97fa050a5790b1f722d25dbee9efba95" + } + Frame { + msec: 4864 + hash: "85c26ed45e79793fc5b7521a8157d3a2" + } + Frame { + msec: 4880 + hash: "9ff5d272ec8deed3e70164b78bc425c6" + } + Frame { + msec: 4896 + hash: "d1e3f6d51d6b8e96261b902e6f88576d" + } + Frame { + msec: 4912 + hash: "02c12e50ed6b7111f301e142a2fbc5db" + } + Frame { + msec: 4928 + hash: "5177873aa73342ada32d7ebfe3f26e0e" + } + Frame { + msec: 4944 + hash: "05d0364f67f317ee617f1a64d9543fe2" + } + Frame { + msec: 4960 + hash: "20e50922d7763c7572776fc98d0e007b" + } + Frame { + msec: 4976 + hash: "f449eb14e0c0e08a79a220cb13551c4f" + } + Frame { + msec: 4992 + hash: "defe5fa356688a25ed2b8174d9baf2ce" + } + Frame { + msec: 5008 + hash: "f1697f95d67a0a15088c3f934dfc466f" + } + Frame { + msec: 5024 + hash: "7a962dad8227d367b4af7dee6ea09c20" + } + Frame { + msec: 5040 + hash: "49a806b0bee9e3145395fb68cb85dbaf" + } + Frame { + msec: 5056 + hash: "d0e4ffd3e12dd4b8e5553e613119ef86" + } + Frame { + msec: 5072 + hash: "41270d843d00eaabf2f95f051541013e" + } + Frame { + msec: 5088 + hash: "e8fd158c923d389a2d87db0023522934" + } + Frame { + msec: 5104 + hash: "9cfa7783d37010c10271d680d205ebc4" + } + Frame { + msec: 5120 + hash: "5e81c936f9627cf537f96a1674c920be" + } + Frame { + msec: 5136 + hash: "28679a61a44bf0d81d6a93d8ea301b97" + } + Frame { + msec: 5152 + hash: "ef41d71b99f078abe8a2a8326ed236c9" + } + Frame { + msec: 5168 + hash: "b0c77c16e9d13360992d3781d389a773" + } + Frame { + msec: 5184 + hash: "fe053081bc92e2a16322e6839749c49c" + } + Frame { + msec: 5200 + hash: "fdde556b8d7b31510b9b07686e3bf81f" + } + Frame { + msec: 5216 + hash: "f3f9c7ad55f4cabdcc9ff4a515163523" + } + Frame { + msec: 5232 + hash: "8ae1b429bcb1d7698efaca4abbe91d3f" + } + Frame { + msec: 5248 + hash: "c741a05290271260b8b916faa480e3aa" + } + Frame { + msec: 5264 + hash: "eebc4a70e557084577fb93f4b71da41c" + } + Frame { + msec: 5280 + hash: "4926f2fa2728d80f0799e67f06ae8be3" + } + Frame { + msec: 5296 + hash: "cf8ea67beade2f31d6ddd257578ef191" + } + Frame { + msec: 5312 + hash: "d041cad9a659449da739470ce03d6152" + } + Frame { + msec: 5328 + hash: "eae75c3364a13697c79aec42c221181d" + } + Frame { + msec: 5344 + hash: "2db70310d6a3b4900e749975e52d5f78" + } + Frame { + msec: 5360 + hash: "609838796118ab89566fe2fe664dfcb4" + } + Frame { + msec: 5376 + hash: "ae66ff91af5924e99231a811d0d00549" + } + Frame { + msec: 5392 + hash: "2b5ba8d8c340a92d4d6ef76dbd88c4b8" + } + Frame { + msec: 5408 + hash: "6b4ce7512194d65b7c8679822cb58274" + } + Frame { + msec: 5424 + hash: "36a58e3b3a057969c8a6b1ba4e704ec7" + } + Frame { + msec: 5440 + hash: "a2164ae8f60b27534392077358e057e2" + } + Frame { + msec: 5456 + hash: "9ceb838f32b76cc267283ef829a64f95" + } + Frame { + msec: 5472 + hash: "a372e42839d42e9f7dac83ae3b845be4" + } + Frame { + msec: 5488 + hash: "9e1226a6cb6585694a0b44b356f0b6d2" + } + Frame { + msec: 5504 + hash: "7bdfe1d332fdd3b8b241a3fb9dafa584" + } + Frame { + msec: 5520 + hash: "e7f3ef39c35f7bca75ae049a25790509" + } + Frame { + msec: 5536 + hash: "5bfcd4c96095d66825df5d94f8936659" + } + Frame { + msec: 5552 + hash: "d47fc61cedde2748d1c35d65c4278ce9" + } + Frame { + msec: 5568 + hash: "ee86ff1ea3a447ebf749a5b31ff147c9" + } + Frame { + msec: 5584 + hash: "05a3b141e33596e88ff3a6a3e09b13b9" + } + Frame { + msec: 5600 + hash: "2294c4c9f84c4398918524c41fe08317" + } + Frame { + msec: 5616 + hash: "2e19dc61944aa7671ac18303949e1c9e" + } + Frame { + msec: 5632 + hash: "37b4864ed528a3be221d7abb4106ec3a" + } + Frame { + msec: 5648 + hash: "c2bf99e089bc984abea63b8b43270859" + } + Frame { + msec: 5664 + hash: "c2bf99e089bc984abea63b8b43270859" + } + Frame { + msec: 5680 + hash: "d8de63e15f1f6e9c0cf0dd43afa03c42" + } + Frame { + msec: 5696 + hash: "3643a50c30b6d6f9b724155e49db7276" + } + Frame { + msec: 5712 + hash: "582e871460fe3056f7f3df97d5939d69" + } + Frame { + msec: 5728 + hash: "e46da1072974efc1c4df89d9c6243609" + } + Frame { + msec: 5744 + hash: "705ac82bb7a03eb5843aae7292739851" + } + Frame { + msec: 5760 + image: "follow.5.png" + } + Frame { + msec: 5776 + hash: "b2949af515524933f740057cae6d8c40" + } + Frame { + msec: 5792 + hash: "72a3526dbfeb42935a737f7876c86499" + } + Frame { + msec: 5808 + hash: "43907b91dec1412d0e6c8b53cec8e06f" + } + Frame { + msec: 5824 + hash: "66db45ca42d42e8a6eb279b892493af9" + } + Frame { + msec: 5840 + hash: "1f2d69898b90d344f337ac37a000e797" + } + Frame { + msec: 5856 + hash: "9c09edc9541d69e7565ef05fbe58fadf" + } + Frame { + msec: 5872 + hash: "0d68b6d05150981eff443cd7437b3d95" + } + Frame { + msec: 5888 + hash: "85558e393a1e0483ba27844cf409af47" + } + Frame { + msec: 5904 + hash: "83a73b6b3eb1052a9b1a12fb78326b26" + } + Frame { + msec: 5920 + hash: "4839882ecc497916b4ac964a5cc71d1b" + } + Frame { + msec: 5936 + hash: "28d6f5066f186a0d9ab7f4781374d3eb" + } + Frame { + msec: 5952 + hash: "d89148926c6dd636de953a55082e50f1" + } + Frame { + msec: 5968 + hash: "dbab902e252561849dba5551fc8f07d3" + } + Frame { + msec: 5984 + hash: "84a3a891fbbb1a0fca24324a3ea10c6a" + } + Frame { + msec: 6000 + hash: "64563bb68129f527b1c33c0d9a543f09" + } + Frame { + msec: 6016 + hash: "64563bb68129f527b1c33c0d9a543f09" + } + Frame { + msec: 6032 + hash: "7f3ae8ac99bf202414b03e9b33473044" + } + Frame { + msec: 6048 + hash: "7f3ae8ac99bf202414b03e9b33473044" + } + Frame { + msec: 6064 + hash: "7fbdf6396050da5b8945f1111c2ca973" + } + Frame { + msec: 6080 + hash: "5bf4fa18f24fc221685234a92c4cafb6" + } + Frame { + msec: 6096 + hash: "5bf4fa18f24fc221685234a92c4cafb6" + } + Frame { + msec: 6112 + hash: "e1b8d1d7298a3d3ade82493fb6f99909" + } + Frame { + msec: 6128 + hash: "6320b7b0bd1926c625f914d30f1f1fd9" + } + Frame { + msec: 6144 + hash: "74ecfaced66f630d1863c04000fa7f01" + } + Frame { + msec: 6160 + hash: "74ecfaced66f630d1863c04000fa7f01" + } + Frame { + msec: 6176 + hash: "c803b3258d0e1d8e6c1292ea2a00f76b" + } + Frame { + msec: 6192 + hash: "c803b3258d0e1d8e6c1292ea2a00f76b" + } + Frame { + msec: 6208 + hash: "8d359f95ee869714bb3972986637642d" + } + Frame { + msec: 6224 + hash: "9f3f4fe1be7bd4511a0408fd5ab1b11f" + } + Frame { + msec: 6240 + hash: "9f3f4fe1be7bd4511a0408fd5ab1b11f" + } + Frame { + msec: 6256 + hash: "cd2c4e1a288d09f46dd557973c22e1be" + } + Frame { + msec: 6272 + hash: "cd2c4e1a288d09f46dd557973c22e1be" + } + Frame { + msec: 6288 + hash: "cd2c4e1a288d09f46dd557973c22e1be" + } + Frame { + msec: 6304 + hash: "8109005d7e21d16b77f88efce2b530e4" + } + Frame { + msec: 6320 + hash: "8109005d7e21d16b77f88efce2b530e4" + } + Frame { + msec: 6336 + hash: "8109005d7e21d16b77f88efce2b530e4" + } + Frame { + msec: 6352 + hash: "8109005d7e21d16b77f88efce2b530e4" + } + Frame { + msec: 6368 + hash: "8109005d7e21d16b77f88efce2b530e4" + } + Frame { + msec: 6384 + hash: "e009f65ae035fb8a9c27a1d57f10c35f" + } + Frame { + msec: 6400 + hash: "e009f65ae035fb8a9c27a1d57f10c35f" + } + Frame { + msec: 6416 + hash: "e009f65ae035fb8a9c27a1d57f10c35f" + } + Frame { + msec: 6432 + hash: "e009f65ae035fb8a9c27a1d57f10c35f" + } + Frame { + msec: 6448 + hash: "e009f65ae035fb8a9c27a1d57f10c35f" + } + Frame { + msec: 6464 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 6480 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 6496 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 6512 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 6528 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 6544 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 6560 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Key { + type: 6 + key: 16777249 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 6576 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 6592 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 6608 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 6624 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 6640 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 6656 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 6672 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 6688 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 6704 + hash: "20dd4407adca55737dd4231405c38cff" + } +} diff --git a/tests/auto/declarative/visual/qmlspringfollow/data/follow.0.png b/tests/auto/declarative/visual/qmlspringfollow/data/follow.0.png Binary files differnew file mode 100644 index 0000000..d173ee9 --- /dev/null +++ b/tests/auto/declarative/visual/qmlspringfollow/data/follow.0.png diff --git a/tests/auto/declarative/visual/qmlspringfollow/data/follow.1.png b/tests/auto/declarative/visual/qmlspringfollow/data/follow.1.png Binary files differnew file mode 100644 index 0000000..09b7bda --- /dev/null +++ b/tests/auto/declarative/visual/qmlspringfollow/data/follow.1.png diff --git a/tests/auto/declarative/visual/qmlspringfollow/data/follow.2.png b/tests/auto/declarative/visual/qmlspringfollow/data/follow.2.png Binary files differnew file mode 100644 index 0000000..b1d109e --- /dev/null +++ b/tests/auto/declarative/visual/qmlspringfollow/data/follow.2.png diff --git a/tests/auto/declarative/visual/qmlspringfollow/data/follow.3.png b/tests/auto/declarative/visual/qmlspringfollow/data/follow.3.png Binary files differnew file mode 100644 index 0000000..5cdcafb --- /dev/null +++ b/tests/auto/declarative/visual/qmlspringfollow/data/follow.3.png diff --git a/tests/auto/declarative/visual/qmlspringfollow/data/follow.4.png b/tests/auto/declarative/visual/qmlspringfollow/data/follow.4.png Binary files differnew file mode 100644 index 0000000..93e1536 --- /dev/null +++ b/tests/auto/declarative/visual/qmlspringfollow/data/follow.4.png diff --git a/tests/auto/declarative/visual/qmlspringfollow/data/follow.5.png b/tests/auto/declarative/visual/qmlspringfollow/data/follow.5.png Binary files differnew file mode 100644 index 0000000..b27cc9f --- /dev/null +++ b/tests/auto/declarative/visual/qmlspringfollow/data/follow.5.png diff --git a/tests/auto/declarative/visual/qmlspringfollow/data/follow.qml b/tests/auto/declarative/visual/qmlspringfollow/data/follow.qml new file mode 100644 index 0000000..f87372a --- /dev/null +++ b/tests/auto/declarative/visual/qmlspringfollow/data/follow.qml @@ -0,0 +1,1691 @@ +import Qt.VisualTest 4.6 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + hash: "ea677d128f47343d81a081c438aa2f6c" + } + Frame { + msec: 32 + hash: "ea677d128f47343d81a081c438aa2f6c" + } + Frame { + msec: 48 + hash: "403e130b7cf0a41d8348a227293d98d1" + } + Frame { + msec: 64 + hash: "d2250ca93235b6a087b5e582f7e941d6" + } + Frame { + msec: 80 + hash: "3e95bdb5546de8ed7bb33de704d2890e" + } + Frame { + msec: 96 + hash: "438612a44780d6587f99a44c943eb60f" + } + Frame { + msec: 112 + hash: "6e840f3afd93a11034e128d70f76e642" + } + Frame { + msec: 128 + hash: "abbb1839aa7989e89d72368c501c5a12" + } + Frame { + msec: 144 + hash: "eefe846a36bf21929d83241b117d98b5" + } + Frame { + msec: 160 + hash: "ab39c7386555dc0a0edbd1e021fa3d93" + } + Frame { + msec: 176 + hash: "8cd9ac8226579bfd1d653ad5b9ff3302" + } + Frame { + msec: 192 + hash: "976c950140ce9f793884daa8d032c8fb" + } + Frame { + msec: 208 + hash: "c49ea9cb59a4ced0572a251c1ed53011" + } + Frame { + msec: 224 + hash: "d84a156021c5f61cb49f60cba5c0b7b7" + } + Frame { + msec: 240 + hash: "d47f16922533e186844448ad4540cc9d" + } + Frame { + msec: 256 + hash: "be16f676e94426dedc747de959f41658" + } + Frame { + msec: 272 + hash: "abe13e483ca63c485f8c66f6edbbc368" + } + Frame { + msec: 288 + hash: "71294e92418a4a586328a510916942e2" + } + Frame { + msec: 304 + hash: "2f201846d62d8885c8d4659c9622e711" + } + Frame { + msec: 320 + hash: "bfeb1da5c3ab5bda2def25682ae7f113" + } + Frame { + msec: 336 + hash: "00767a8b29a0de270f2485e430332c0b" + } + Frame { + msec: 352 + hash: "df1bac2a1f24ab2669c156f86ff3949a" + } + Frame { + msec: 368 + hash: "755a39579c403923c93a4a962e135374" + } + Frame { + msec: 384 + hash: "e176ba5703d6bd80f0de1a88f02ac678" + } + Frame { + msec: 400 + hash: "51d44c2913947f44708615b5e38b2bd3" + } + Frame { + msec: 416 + hash: "72a6d96e70ffd20c12139306103b4f4e" + } + Frame { + msec: 432 + hash: "96f82039287cbf4b403298436421c778" + } + Frame { + msec: 448 + hash: "0e86e386afdf7649dfdcd489137ad4ea" + } + Frame { + msec: 464 + hash: "8e78f10e410638680810c65e5bddd665" + } + Frame { + msec: 480 + hash: "765d52574fa75873e97f2e9b2a44e7a0" + } + Frame { + msec: 496 + hash: "a72e4be872da024c8af9b914d8baabc2" + } + Frame { + msec: 512 + hash: "3689c9af15bb91d4ae5b570ecffecfdd" + } + Frame { + msec: 528 + hash: "8147683fb527fdb2f71356e85abae6e9" + } + Frame { + msec: 544 + hash: "853f9220075a3782cf7fcc0bb8715263" + } + Frame { + msec: 560 + hash: "61b08b1ac4a0f8edcaa9984db4c2ba26" + } + Frame { + msec: 576 + hash: "9656cb5164be56f449f1f82b1555e6de" + } + Frame { + msec: 592 + hash: "17290bf0cb6f35ee421286e01bd47e98" + } + Frame { + msec: 608 + hash: "6f0d0cec511f59ff1e96cdbd9444eaf6" + } + Frame { + msec: 624 + hash: "d4bcf568361214c0eb8fa3998bbf1480" + } + Frame { + msec: 640 + hash: "41adf355d26d44b157f59d9fcb2e1c69" + } + Frame { + msec: 656 + hash: "e5e19a9529a4e7fc1f680fec3505e78f" + } + Frame { + msec: 672 + hash: "c5340333b27b030404dfb7f84c885f5a" + } + Frame { + msec: 688 + hash: "0d78d4df108698cbf01f85b543240a23" + } + Frame { + msec: 704 + hash: "3100a83fa0217e229bfe5b1014c85bd0" + } + Frame { + msec: 720 + hash: "d48a5e885a7ffe2164561a5e8db49af2" + } + Frame { + msec: 736 + hash: "f53ff65dde7676e467569cb4046c6151" + } + Frame { + msec: 752 + hash: "dfe16b338d9afba04ba20fe27e2f3871" + } + Frame { + msec: 768 + hash: "da60124324209ccb2bd0e025d0484ca5" + } + Frame { + msec: 784 + hash: "bb7c9e645bead664dfbb3b0b2d6350a5" + } + Frame { + msec: 800 + hash: "b4229201bd33515da83605b3e8c61f3e" + } + Frame { + msec: 816 + hash: "65d73e930b2117714e6020f3580b9c5f" + } + Frame { + msec: 832 + hash: "7635a572c1cedd66c27da128de4596aa" + } + Frame { + msec: 848 + hash: "9068d912a8d3e6e0b5b458c12ddad126" + } + Frame { + msec: 864 + hash: "e935bc3503eefd745f0086417322ccd0" + } + Frame { + msec: 880 + hash: "fad1a3e6f64818638e6d866af9554f72" + } + Frame { + msec: 896 + hash: "c80cd40121ad2b365a58b919db910fdb" + } + Frame { + msec: 912 + hash: "e9c7e153a429fc2b7a7afcbe69f48291" + } + Frame { + msec: 928 + hash: "f848e529d7ed9170c107556ffff2c7da" + } + Frame { + msec: 944 + hash: "5176b37586cd38607f7324ea5fe4a84e" + } + Frame { + msec: 960 + image: "follow.0.png" + } + Frame { + msec: 976 + hash: "13db39c0f6b2d2633fc6e9e25363649c" + } + Frame { + msec: 992 + hash: "709b27d74b5d63173dcc47315b6a98ad" + } + Frame { + msec: 1008 + hash: "3f1a3ec8c35f18109b00f596dddb2dee" + } + Frame { + msec: 1024 + hash: "7b5a87922adf288a3479c5772b87dc05" + } + Frame { + msec: 1040 + hash: "389a4ceae2a2c2b65d8b8f4a14e302fe" + } + Frame { + msec: 1056 + hash: "5e734ba84842d9ebacedea131c2cea43" + } + Frame { + msec: 1072 + hash: "2ca1665bc6e8fcc79fa3ed27d063ef2d" + } + Frame { + msec: 1088 + hash: "a133bcf3571762dac5ed8093835d0f32" + } + Frame { + msec: 1104 + hash: "100e33528137240152983158c89831c2" + } + Frame { + msec: 1120 + hash: "1b327165fcce6d61577e2c1715a77efe" + } + Frame { + msec: 1136 + hash: "724352ffdfa1a7e8aa0ffaa138706b14" + } + Frame { + msec: 1152 + hash: "c13dbf3fdd202d6fdb007622e2f3c9ee" + } + Frame { + msec: 1168 + hash: "50517cf68a3f6f8c84fc6520500ccf00" + } + Frame { + msec: 1184 + hash: "8fd426597afbc940a3778870118e2541" + } + Frame { + msec: 1200 + hash: "67434d0c791fc4c2761c1869a6cee081" + } + Frame { + msec: 1216 + hash: "3397a81fa89f46f55b7716325a722c82" + } + Frame { + msec: 1232 + hash: "7207230d6be72411aadc3064af25dcc6" + } + Frame { + msec: 1248 + hash: "709bc2b0d2ca7fa5e8b33e4a17a130bd" + } + Frame { + msec: 1264 + hash: "0b721aaffded67b507e896c2c2d9c6f2" + } + Frame { + msec: 1280 + hash: "a473144a3d3af4dfd27dd17eed95e050" + } + Frame { + msec: 1296 + hash: "264760a5a9ce988ce880084161dbc983" + } + Frame { + msec: 1312 + hash: "ea1ebaa56e24e0ca23723539ad8a18cf" + } + Frame { + msec: 1328 + hash: "d85e695424a7883354b9e807d0dca75a" + } + Frame { + msec: 1344 + hash: "2a5beec661122970528b4589c6a30184" + } + Frame { + msec: 1360 + hash: "c6b398270707e794cb41ac6dfc413559" + } + Frame { + msec: 1376 + hash: "5f0496a3db352ac7d68d37d0b40821de" + } + Frame { + msec: 1392 + hash: "60b6cf54208fe05cad90a5475ba44b6f" + } + Frame { + msec: 1408 + hash: "b375733a02dba8d856e6a54962701728" + } + Frame { + msec: 1424 + hash: "dca9a423a2b43c9edf294f707ffeb3e9" + } + Frame { + msec: 1440 + hash: "43d04fee9d2fbe1807f4d6b599a227fd" + } + Frame { + msec: 1456 + hash: "169446930a064cabd9dfc8cce5669967" + } + Frame { + msec: 1472 + hash: "3dc4b0e80ae663022ae9acda781cdb10" + } + Frame { + msec: 1488 + hash: "fc7b862abfc6f1694cbbe00ede57d883" + } + Frame { + msec: 1504 + hash: "76e67f9c5b552f1ff47c3c7b23eb1b76" + } + Frame { + msec: 1520 + hash: "8c3e1d2fd58eaf2a8da16bb0349b1e5e" + } + Frame { + msec: 1536 + hash: "4642a396f4a4bb3b97845782e1d1ce93" + } + Frame { + msec: 1552 + hash: "4d3e8c9ea7c8c1407db564a3a6e430ff" + } + Frame { + msec: 1568 + hash: "e041300f1d2956f35baebed6c7c9c750" + } + Frame { + msec: 1584 + hash: "a900c3551c5d3bbaf1ce6e0372e69a70" + } + Frame { + msec: 1600 + hash: "cb5c32ad57d1931a69c20328f8f2d060" + } + Frame { + msec: 1616 + hash: "021ba4fc38e1652afeab73047e126a17" + } + Frame { + msec: 1632 + hash: "d27728f36491ba432e3655850402ee6b" + } + Frame { + msec: 1648 + hash: "20a87f4d9afd2039e44c2b5b539d0298" + } + Frame { + msec: 1664 + hash: "e03dfc3f89c5e4f6a31bc4b624b249f4" + } + Frame { + msec: 1680 + hash: "e52c42cbc1c362bd77f72b71dedc34da" + } + Frame { + msec: 1696 + hash: "b3e15bd0354fa84d13f1f9163be12b73" + } + Frame { + msec: 1712 + hash: "eb6517d72b7943654215ad46e8b165a9" + } + Frame { + msec: 1728 + hash: "1be17ea113f704b1a3a1fda63d10c23a" + } + Frame { + msec: 1744 + hash: "f288d004dd459b90acf9e70045de51bc" + } + Frame { + msec: 1760 + hash: "750d6c78b8e3e3311935faacfe37c44f" + } + Frame { + msec: 1776 + hash: "08a12d133eab365b639204e6b327143b" + } + Frame { + msec: 1792 + hash: "4641237f37091b2aebfb17255999f8e1" + } + Frame { + msec: 1808 + hash: "389c3a75932dc695f3aa323569cf0ebe" + } + Frame { + msec: 1824 + hash: "4f03b3b47db131f4604b1f2487303012" + } + Frame { + msec: 1840 + hash: "b29afbba738730b089f257a133874540" + } + Frame { + msec: 1856 + hash: "04b3014bf60cc25920724d0c18424830" + } + Frame { + msec: 1872 + hash: "1f09172690083f6051d4807c287d64a4" + } + Frame { + msec: 1888 + hash: "fb32eec375d5f1abd7f651f022df8d20" + } + Frame { + msec: 1904 + hash: "251e61f514db494cb47ae18234abd9a4" + } + Frame { + msec: 1920 + image: "follow.1.png" + } + Frame { + msec: 1936 + hash: "8acec26bf4ab5f93ccc5d77d4866826a" + } + Frame { + msec: 1952 + hash: "2490ddc2c74c525ecc51ffc83357611e" + } + Frame { + msec: 1968 + hash: "f7f67dc93d3ff7aad6df8917f7f6f285" + } + Frame { + msec: 1984 + hash: "d034044a9e2f2712aa1f0c10a5e4355f" + } + Frame { + msec: 2000 + hash: "7760794170cfbb7ca93aebf12874a603" + } + Frame { + msec: 2016 + hash: "a680699dda95e5a59dcf310cf5671d6e" + } + Frame { + msec: 2032 + hash: "df3a0ffa7089defb0f3db08f4f34cba6" + } + Frame { + msec: 2048 + hash: "4e0ce20d81cd4acad3270bfe5a650d18" + } + Frame { + msec: 2064 + hash: "1f46926406a5f0bb33159bba6ef740f3" + } + Frame { + msec: 2080 + hash: "321e4cbbb7f4fbe748a2fe45db13d184" + } + Frame { + msec: 2096 + hash: "185c0357a585aafabe5dbc3573ea135d" + } + Frame { + msec: 2112 + hash: "0421ac4f53c050bfffb2c8de16aafd46" + } + Frame { + msec: 2128 + hash: "953bdaacefe42a841bf1cdd7da3b442a" + } + Frame { + msec: 2144 + hash: "3f64635e9c43b8b6a402c5d6fe26e648" + } + Frame { + msec: 2160 + hash: "3f64635e9c43b8b6a402c5d6fe26e648" + } + Frame { + msec: 2176 + hash: "92926b4cf66b15cd0ddb468f2bd8bd62" + } + Frame { + msec: 2192 + hash: "fe78f7f7ecd3242aa75f3590884e0f44" + } + Frame { + msec: 2208 + hash: "55249aae2bb6db6c363ecb4b89f56270" + } + Frame { + msec: 2224 + hash: "73ea66c3c61e8105ac61d26c8cfdbba3" + } + Frame { + msec: 2240 + hash: "ac77e83366b34b7375ad7c150ccebd01" + } + Frame { + msec: 2256 + hash: "b0a94b3ab562b469c622c4c7438f2c04" + } + Frame { + msec: 2272 + hash: "73ab6f0a829f92533bbabef8b8097d5d" + } + Frame { + msec: 2288 + hash: "0c2301bd28a080f113bd786b6875bf53" + } + Frame { + msec: 2304 + hash: "026811ab3517257daf6a597d96bf2b20" + } + Frame { + msec: 2320 + hash: "5740c6aacc1d1a5a402974bb977d9b13" + } + Frame { + msec: 2336 + hash: "41f0a093fc87c4d519a9b72bac518514" + } + Frame { + msec: 2352 + hash: "1ed376000e60129b4bcf06ea73cb5819" + } + Frame { + msec: 2368 + hash: "8c713e210143ab5f19bdddd918f86ef3" + } + Frame { + msec: 2384 + hash: "269b595c5691747b56be58d5b92ae497" + } + Frame { + msec: 2400 + hash: "486d80316c88da4adc736df72fc86f45" + } + Frame { + msec: 2416 + hash: "f76e6c0a9e7957730ac646b73d1373d1" + } + Frame { + msec: 2432 + hash: "e0a6765306f92e32b7a778f882ba5c15" + } + Frame { + msec: 2448 + hash: "b01834ca90ee836643083593a558d2ef" + } + Frame { + msec: 2464 + hash: "02748271316f8382f4788322fda807c1" + } + Frame { + msec: 2480 + hash: "ce5adbd1a713777476d2468f67e531f3" + } + Frame { + msec: 2496 + hash: "840be99d6372f9ebf3c580765b71be74" + } + Frame { + msec: 2512 + hash: "dd1cfa3fcec2fba91b0120a8aab3c137" + } + Frame { + msec: 2528 + hash: "023843739f78eb77767aa1cacae824e9" + } + Frame { + msec: 2544 + hash: "3e312b8de56c902ca20aba259c8559b2" + } + Frame { + msec: 2560 + hash: "23fe7c60751c2e3a57a418ad57d290f1" + } + Frame { + msec: 2576 + hash: "0cec0db315715c41c4086bdeb72af721" + } + Frame { + msec: 2592 + hash: "1b633a8efad433e7dbf159d49ebd00e8" + } + Frame { + msec: 2608 + hash: "35e46ea3f3a46297c403aa177ee66ede" + } + Frame { + msec: 2624 + hash: "e1b8d1d7298a3d3ade82493fb6f99909" + } + Frame { + msec: 2640 + hash: "74ecfaced66f630d1863c04000fa7f01" + } + Frame { + msec: 2656 + hash: "74ecfaced66f630d1863c04000fa7f01" + } + Frame { + msec: 2672 + hash: "c803b3258d0e1d8e6c1292ea2a00f76b" + } + Frame { + msec: 2688 + hash: "c803b3258d0e1d8e6c1292ea2a00f76b" + } + Frame { + msec: 2704 + hash: "c803b3258d0e1d8e6c1292ea2a00f76b" + } + Frame { + msec: 2720 + hash: "9f3f4fe1be7bd4511a0408fd5ab1b11f" + } + Frame { + msec: 2736 + hash: "9f3f4fe1be7bd4511a0408fd5ab1b11f" + } + Frame { + msec: 2752 + hash: "cd2c4e1a288d09f46dd557973c22e1be" + } + Frame { + msec: 2768 + hash: "cd2c4e1a288d09f46dd557973c22e1be" + } + Frame { + msec: 2784 + hash: "cd2c4e1a288d09f46dd557973c22e1be" + } + Frame { + msec: 2800 + hash: "8109005d7e21d16b77f88efce2b530e4" + } + Frame { + msec: 2816 + hash: "8109005d7e21d16b77f88efce2b530e4" + } + Frame { + msec: 2832 + hash: "8109005d7e21d16b77f88efce2b530e4" + } + Frame { + msec: 2848 + hash: "8109005d7e21d16b77f88efce2b530e4" + } + Frame { + msec: 2864 + hash: "8109005d7e21d16b77f88efce2b530e4" + } + Frame { + msec: 2880 + image: "follow.2.png" + } + Frame { + msec: 2896 + hash: "e009f65ae035fb8a9c27a1d57f10c35f" + } + Frame { + msec: 2912 + hash: "e009f65ae035fb8a9c27a1d57f10c35f" + } + Frame { + msec: 2928 + hash: "e009f65ae035fb8a9c27a1d57f10c35f" + } + Frame { + msec: 2944 + hash: "e009f65ae035fb8a9c27a1d57f10c35f" + } + Frame { + msec: 2960 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 2976 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 2992 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 3008 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 3024 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 3040 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 3056 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 3072 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 3088 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 3104 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 3120 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 3136 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 3152 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 3168 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 3184 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 3200 + hash: "20dd4407adca55737dd4231405c38cff" + } + Frame { + msec: 3216 + hash: "20dd4407adca55737dd4231405c38cff" + } + Frame { + msec: 3232 + hash: "20dd4407adca55737dd4231405c38cff" + } + Frame { + msec: 3248 + hash: "20dd4407adca55737dd4231405c38cff" + } + Frame { + msec: 3264 + hash: "20dd4407adca55737dd4231405c38cff" + } + Frame { + msec: 3280 + hash: "20dd4407adca55737dd4231405c38cff" + } + Frame { + msec: 3296 + hash: "20dd4407adca55737dd4231405c38cff" + } + Frame { + msec: 3312 + hash: "20dd4407adca55737dd4231405c38cff" + } + Frame { + msec: 3328 + hash: "8109005d7e21d16b77f88efce2b530e4" + } + Frame { + msec: 3344 + hash: "cd2c4e1a288d09f46dd557973c22e1be" + } + Frame { + msec: 3360 + hash: "cd2c4e1a288d09f46dd557973c22e1be" + } + Frame { + msec: 3376 + hash: "cd2c4e1a288d09f46dd557973c22e1be" + } + Frame { + msec: 3392 + hash: "cd2c4e1a288d09f46dd557973c22e1be" + } + Frame { + msec: 3408 + hash: "cd2c4e1a288d09f46dd557973c22e1be" + } + Frame { + msec: 3424 + hash: "cd2c4e1a288d09f46dd557973c22e1be" + } + Frame { + msec: 3440 + hash: "cd2c4e1a288d09f46dd557973c22e1be" + } + Frame { + msec: 3456 + hash: "cd2c4e1a288d09f46dd557973c22e1be" + } + Frame { + msec: 3472 + hash: "cd2c4e1a288d09f46dd557973c22e1be" + } + Frame { + msec: 3488 + hash: "cd2c4e1a288d09f46dd557973c22e1be" + } + Frame { + msec: 3504 + hash: "cd2c4e1a288d09f46dd557973c22e1be" + } + Frame { + msec: 3520 + hash: "9f3f4fe1be7bd4511a0408fd5ab1b11f" + } + Frame { + msec: 3536 + hash: "9f3f4fe1be7bd4511a0408fd5ab1b11f" + } + Frame { + msec: 3552 + hash: "080910b835e134dfd06b83f1e92c92e8" + } + Frame { + msec: 3568 + hash: "317c01c691f0b46d5d809c3ccc1e78e6" + } + Frame { + msec: 3584 + hash: "475f4da1be823b57b58aecbb5a853892" + } + Frame { + msec: 3600 + hash: "b60a6387e955cd8e5e907a6b22a2aecc" + } + Frame { + msec: 3616 + hash: "4674eae7d8db1bf7eb35c7798948f7c4" + } + Frame { + msec: 3632 + hash: "7b4a143d0bf44ddf87d3bfd03c143025" + } + Frame { + msec: 3648 + hash: "e794d7ee32bcec9e0790ee95d89c9e06" + } + Frame { + msec: 3664 + hash: "0581724e928d25f276dd4ad19a9ffd4e" + } + Frame { + msec: 3680 + hash: "d8ef5e95454db4fd40fe51bcd9cf57b2" + } + Frame { + msec: 3696 + hash: "22ca96df911b74025fc771e945850adf" + } + Frame { + msec: 3712 + hash: "e0a88fb75e9193322fd5f925e89d7828" + } + Frame { + msec: 3728 + hash: "ee82a5192ea9af94d1a6ab169b438c34" + } + Frame { + msec: 3744 + hash: "c9d0d8514a783f3a9d0da651439990e2" + } + Frame { + msec: 3760 + hash: "9378795141098714f3ab5b2f28d219af" + } + Frame { + msec: 3776 + hash: "d61c4a67039e5a56ccd59df8afa24d38" + } + Frame { + msec: 3792 + hash: "62be79759a2a15ac73355457fa515b0a" + } + Frame { + msec: 3808 + hash: "d8f09c05c188fe3d09b8409a62bee29c" + } + Frame { + msec: 3824 + hash: "0285dead7580a8064116cf32bd31b40d" + } + Frame { + msec: 3840 + image: "follow.3.png" + } + Frame { + msec: 3856 + hash: "1921975bdfbe8a9817808919c97d2bac" + } + Frame { + msec: 3872 + hash: "9c58d55cc025dd022451971ba6735a79" + } + Frame { + msec: 3888 + hash: "c2163f3ab875bdb5728b16abcb65dfa4" + } + Frame { + msec: 3904 + hash: "48bd0e85564e411c4ae6d042487cb0d5" + } + Frame { + msec: 3920 + hash: "2e2c9f62acdc703fff7c28e7b7a59d47" + } + Frame { + msec: 3936 + hash: "d749acc91c1b271aac00c00a6088e9ac" + } + Frame { + msec: 3952 + hash: "cfa2c65f6f1a9bf242e073166a6e7b97" + } + Frame { + msec: 3968 + hash: "bb6f98350cbb89cf96c2f159659b944e" + } + Frame { + msec: 3984 + hash: "b7f087705eb7e2c7c4bd197aa08c1509" + } + Frame { + msec: 4000 + hash: "57f217985d1850bfa3d21c2cdd164d99" + } + Frame { + msec: 4016 + hash: "ded1e29fb83d6ec1d888fbd610c8a875" + } + Frame { + msec: 4032 + hash: "c2a9f250bca3e1f7906a577c0ae6b724" + } + Frame { + msec: 4048 + hash: "9cb2ca74308f519da85389ae959980ce" + } + Frame { + msec: 4064 + hash: "5b0d50ee5f7d077deec51159cebfd767" + } + Frame { + msec: 4080 + hash: "c41d847a89ece0dc9cfa1d0a0a8a16b1" + } + Frame { + msec: 4096 + hash: "d372cb387ad3f01614aaaf720f133d6e" + } + Frame { + msec: 4112 + hash: "9458ad068c95ff80e1dc4b1efd52683e" + } + Frame { + msec: 4128 + hash: "2e976c4a780503c6a71c4e9f8bd14178" + } + Frame { + msec: 4144 + hash: "b2f36762c85fcdbb0e1be545a3c49936" + } + Frame { + msec: 4160 + hash: "c29fdeb241221a29d0ad928f6401a2d4" + } + Frame { + msec: 4176 + hash: "bdbaaa347e20d21cc02b4c98953255ea" + } + Frame { + msec: 4192 + hash: "34e9b69f851e1d719467d08962d8a657" + } + Frame { + msec: 4208 + hash: "140a90804138dadb42e08b75fc1eed67" + } + Frame { + msec: 4224 + hash: "67418a2069d491022c28232b392b1631" + } + Frame { + msec: 4240 + hash: "df39748a385186ee0bdffa87485c2746" + } + Frame { + msec: 4256 + hash: "c3276e48ede008a43baf350a79b3443b" + } + Frame { + msec: 4272 + hash: "85473441e2560d8000640deecedef3bf" + } + Frame { + msec: 4288 + hash: "4d3d07ed1acec99052ebf530cb2c20da" + } + Frame { + msec: 4304 + hash: "3fb8ec07500be6d951f30121bcbcba13" + } + Frame { + msec: 4320 + hash: "ae8cae69a702811a897e7d5790c806cc" + } + Frame { + msec: 4336 + hash: "073e2e1af434447c3000b03e3a89925a" + } + Frame { + msec: 4352 + hash: "3c75c7586c1dca2fd21266395ccc8ac4" + } + Frame { + msec: 4368 + hash: "aa36ac379ac9953bd165b5164cd047da" + } + Frame { + msec: 4384 + hash: "09d6ab311429cfe29a68c428669b5d5a" + } + Frame { + msec: 4400 + hash: "11ebcb0a744bc3faa746560d9c1a824d" + } + Frame { + msec: 4416 + hash: "aa01ba99122f89bff8fc45ef88326f6a" + } + Frame { + msec: 4432 + hash: "6980292ba8a4bf8ead3581e5899f5d78" + } + Frame { + msec: 4448 + hash: "65fa1a0fe53b9a0580c14e96d42fe993" + } + Frame { + msec: 4464 + hash: "7837c0a533839f94629be4e64294b89f" + } + Frame { + msec: 4480 + hash: "5edbf632047ae4130f580e4a0ece8e57" + } + Frame { + msec: 4496 + hash: "0a5fdc57898cb56f00a76ecaa3a6b9e0" + } + Frame { + msec: 4512 + hash: "58d1b36e738042af44dab04a8c842259" + } + Frame { + msec: 4528 + hash: "2efb1f742d7f823d13b9724c1c10ce1a" + } + Frame { + msec: 4544 + hash: "e0286eb0b3fbb17e422554a8ef25489c" + } + Frame { + msec: 4560 + hash: "8252caa2841f07d29802a7b822388253" + } + Frame { + msec: 4576 + hash: "eaabd4b3610c0bcbbdc113f86bc52e6c" + } + Frame { + msec: 4592 + hash: "55b17d049e1c791d33094f64717bca06" + } + Frame { + msec: 4608 + hash: "1bd607f6d0658f46b1f0df51e8a9a9fe" + } + Frame { + msec: 4624 + hash: "4a52ea4de14098978931155f11168f68" + } + Frame { + msec: 4640 + hash: "343df8fb45e1e70183bb61a1111909a5" + } + Frame { + msec: 4656 + hash: "bcf1363d9912a3d626ef933387b4e01b" + } + Frame { + msec: 4672 + hash: "67709ea579481537e532120de35619b2" + } + Frame { + msec: 4688 + hash: "a7542255a10a120812880b1243bd573d" + } + Frame { + msec: 4704 + hash: "b4f3e597e489d32a473bb2ad6bb92fc4" + } + Frame { + msec: 4720 + hash: "f0df46d1b819edda5a616e858ed9171c" + } + Frame { + msec: 4736 + hash: "2416564198b4b853d9c4f5ad55ee5db5" + } + Frame { + msec: 4752 + hash: "342e5adcd2fca99c88c33cd8b56b8650" + } + Frame { + msec: 4768 + hash: "01806799adce1d0069cfdd739f383a7f" + } + Frame { + msec: 4784 + hash: "c045fdefdd4606d2c68c8cde2a7a40f4" + } + Frame { + msec: 4800 + image: "follow.4.png" + } + Frame { + msec: 4816 + hash: "c7371c0594fb9f4de0a7f8a3cdce061a" + } + Frame { + msec: 4832 + hash: "6df0c2a27c672e36a3d7eb5b4e0c46bf" + } + Frame { + msec: 4848 + hash: "97fa050a5790b1f722d25dbee9efba95" + } + Frame { + msec: 4864 + hash: "85c26ed45e79793fc5b7521a8157d3a2" + } + Frame { + msec: 4880 + hash: "9ff5d272ec8deed3e70164b78bc425c6" + } + Frame { + msec: 4896 + hash: "d1e3f6d51d6b8e96261b902e6f88576d" + } + Frame { + msec: 4912 + hash: "02c12e50ed6b7111f301e142a2fbc5db" + } + Frame { + msec: 4928 + hash: "5177873aa73342ada32d7ebfe3f26e0e" + } + Frame { + msec: 4944 + hash: "05d0364f67f317ee617f1a64d9543fe2" + } + Frame { + msec: 4960 + hash: "0b93625274bf1e3585664e56aff0197c" + } + Frame { + msec: 4976 + hash: "988083e19b15662ec09247c381bfaef5" + } + Frame { + msec: 4992 + hash: "6caa6b74ba935c2c9a6bf75ef94afedf" + } + Frame { + msec: 5008 + hash: "541ecf2b40931f8009a15c9c981e09aa" + } + Frame { + msec: 5024 + hash: "7a962dad8227d367b4af7dee6ea09c20" + } + Frame { + msec: 5040 + hash: "0c175618366090b8f21334e94a865464" + } + Frame { + msec: 5056 + hash: "f8e32badd5a839892ee4982ca37933db" + } + Frame { + msec: 5072 + hash: "3a91f3a25b245e79ddeb72778075ba8f" + } + Frame { + msec: 5088 + hash: "e8fd158c923d389a2d87db0023522934" + } + Frame { + msec: 5104 + hash: "9cfa7783d37010c10271d680d205ebc4" + } + Frame { + msec: 5120 + hash: "5e81c936f9627cf537f96a1674c920be" + } + Frame { + msec: 5136 + hash: "28679a61a44bf0d81d6a93d8ea301b97" + } + Frame { + msec: 5152 + hash: "ef41d71b99f078abe8a2a8326ed236c9" + } + Frame { + msec: 5168 + hash: "753da9af5dd15cbb6c9df83460f32631" + } + Frame { + msec: 5184 + hash: "49bbb9f30cf72a64b64ab19f0c2d5b9e" + } + Frame { + msec: 5200 + hash: "03d829cdb7da915da606dc1475debae8" + } + Frame { + msec: 5216 + hash: "1ee5d8c3c868e2f7d7f034f9bdc91c8f" + } + Frame { + msec: 5232 + hash: "0f497c52a8b4a7bbd9246c466182644c" + } + Frame { + msec: 5248 + hash: "1574e08a7db9c9a164147ca329d48dbd" + } + Frame { + msec: 5264 + hash: "bff3837578fd069d2b9000ad60123be3" + } + Frame { + msec: 5280 + hash: "99ce71c69566b92715a27014548d7346" + } + Frame { + msec: 5296 + hash: "78a78f00e598405d4e906a930ace9cb5" + } + Frame { + msec: 5312 + hash: "a0f44f1a8772d4dd8d70795811fdd4ab" + } + Frame { + msec: 5328 + hash: "3d5fd500d5c771b437a999659ea57dd7" + } + Frame { + msec: 5344 + hash: "53fbb22689627f55af20b3cb15a7a8cf" + } + Frame { + msec: 5360 + hash: "609838796118ab89566fe2fe664dfcb4" + } + Frame { + msec: 5376 + hash: "c2d7d5cb7cf470ed4d84f705c187f768" + } + Frame { + msec: 5392 + hash: "63c6de2754a0b9c23e5b652aa331716f" + } + Frame { + msec: 5408 + hash: "8cacae37981ebd8c0a6772f97d8e9342" + } + Frame { + msec: 5424 + hash: "b8ab40dbd1bb086eae5b80f2e751efe4" + } + Frame { + msec: 5440 + hash: "fb4211ee009b224b64092d106369f6a0" + } + Frame { + msec: 5456 + hash: "b59dd1dcbb128b6f7df51bd30ac0af31" + } + Frame { + msec: 5472 + hash: "075ff90195b6a0d37944aaf32eb560e7" + } + Frame { + msec: 5488 + hash: "26cb5dda92cfec934e4068322eb0c792" + } + Frame { + msec: 5504 + hash: "0938c360b6c8911074cda8fd58de5650" + } + Frame { + msec: 5520 + hash: "6491ba15d6566ab6f17ee6eb9c5472ab" + } + Frame { + msec: 5536 + hash: "83518cf990f5050d68bf1f09c774ae74" + } + Frame { + msec: 5552 + hash: "4ce84b0d70bc3ebf970e9161ffb7dc21" + } + Frame { + msec: 5568 + hash: "57270cebd25e5c6dd7fb204232e18eb3" + } + Frame { + msec: 5584 + hash: "d93f26948e6deb4bf074139468d12c27" + } + Frame { + msec: 5600 + hash: "581fe059cd632e242dd308b11ef8288a" + } + Frame { + msec: 5616 + hash: "2e19dc61944aa7671ac18303949e1c9e" + } + Frame { + msec: 5632 + hash: "37b4864ed528a3be221d7abb4106ec3a" + } + Frame { + msec: 5648 + hash: "4261fe6049e5dff81b33e503a4d1825d" + } + Frame { + msec: 5664 + hash: "c2bf99e089bc984abea63b8b43270859" + } + Frame { + msec: 5680 + hash: "d8de63e15f1f6e9c0cf0dd43afa03c42" + } + Frame { + msec: 5696 + hash: "3643a50c30b6d6f9b724155e49db7276" + } + Frame { + msec: 5712 + hash: "582e871460fe3056f7f3df97d5939d69" + } + Frame { + msec: 5728 + hash: "e46da1072974efc1c4df89d9c6243609" + } + Frame { + msec: 5744 + hash: "705ac82bb7a03eb5843aae7292739851" + } + Frame { + msec: 5760 + image: "follow.5.png" + } + Frame { + msec: 5776 + hash: "b2949af515524933f740057cae6d8c40" + } + Frame { + msec: 5792 + hash: "72a3526dbfeb42935a737f7876c86499" + } + Frame { + msec: 5808 + hash: "43907b91dec1412d0e6c8b53cec8e06f" + } + Frame { + msec: 5824 + hash: "66db45ca42d42e8a6eb279b892493af9" + } + Frame { + msec: 5840 + hash: "1f2d69898b90d344f337ac37a000e797" + } + Frame { + msec: 5856 + hash: "9c09edc9541d69e7565ef05fbe58fadf" + } + Frame { + msec: 5872 + hash: "0d68b6d05150981eff443cd7437b3d95" + } + Frame { + msec: 5888 + hash: "85558e393a1e0483ba27844cf409af47" + } + Frame { + msec: 5904 + hash: "83a73b6b3eb1052a9b1a12fb78326b26" + } + Frame { + msec: 5920 + hash: "4839882ecc497916b4ac964a5cc71d1b" + } + Frame { + msec: 5936 + hash: "28d6f5066f186a0d9ab7f4781374d3eb" + } + Frame { + msec: 5952 + hash: "d89148926c6dd636de953a55082e50f1" + } + Frame { + msec: 5968 + hash: "dbab902e252561849dba5551fc8f07d3" + } + Frame { + msec: 5984 + hash: "84a3a891fbbb1a0fca24324a3ea10c6a" + } + Frame { + msec: 6000 + hash: "64563bb68129f527b1c33c0d9a543f09" + } + Frame { + msec: 6016 + hash: "64563bb68129f527b1c33c0d9a543f09" + } + Frame { + msec: 6032 + hash: "7f3ae8ac99bf202414b03e9b33473044" + } + Frame { + msec: 6048 + hash: "7f3ae8ac99bf202414b03e9b33473044" + } + Frame { + msec: 6064 + hash: "7fbdf6396050da5b8945f1111c2ca973" + } + Frame { + msec: 6080 + hash: "5bf4fa18f24fc221685234a92c4cafb6" + } + Frame { + msec: 6096 + hash: "5bf4fa18f24fc221685234a92c4cafb6" + } + Frame { + msec: 6112 + hash: "e1b8d1d7298a3d3ade82493fb6f99909" + } + Frame { + msec: 6128 + hash: "6320b7b0bd1926c625f914d30f1f1fd9" + } + Frame { + msec: 6144 + hash: "74ecfaced66f630d1863c04000fa7f01" + } + Frame { + msec: 6160 + hash: "74ecfaced66f630d1863c04000fa7f01" + } + Frame { + msec: 6176 + hash: "c803b3258d0e1d8e6c1292ea2a00f76b" + } + Frame { + msec: 6192 + hash: "c803b3258d0e1d8e6c1292ea2a00f76b" + } + Frame { + msec: 6208 + hash: "8d359f95ee869714bb3972986637642d" + } + Frame { + msec: 6224 + hash: "9f3f4fe1be7bd4511a0408fd5ab1b11f" + } + Frame { + msec: 6240 + hash: "9f3f4fe1be7bd4511a0408fd5ab1b11f" + } + Frame { + msec: 6256 + hash: "cd2c4e1a288d09f46dd557973c22e1be" + } + Frame { + msec: 6272 + hash: "cd2c4e1a288d09f46dd557973c22e1be" + } + Frame { + msec: 6288 + hash: "cd2c4e1a288d09f46dd557973c22e1be" + } + Frame { + msec: 6304 + hash: "8109005d7e21d16b77f88efce2b530e4" + } + Frame { + msec: 6320 + hash: "8109005d7e21d16b77f88efce2b530e4" + } + Frame { + msec: 6336 + hash: "8109005d7e21d16b77f88efce2b530e4" + } + Frame { + msec: 6352 + hash: "8109005d7e21d16b77f88efce2b530e4" + } + Frame { + msec: 6368 + hash: "8109005d7e21d16b77f88efce2b530e4" + } + Frame { + msec: 6384 + hash: "e009f65ae035fb8a9c27a1d57f10c35f" + } + Frame { + msec: 6400 + hash: "e009f65ae035fb8a9c27a1d57f10c35f" + } + Frame { + msec: 6416 + hash: "e009f65ae035fb8a9c27a1d57f10c35f" + } + Frame { + msec: 6432 + hash: "e009f65ae035fb8a9c27a1d57f10c35f" + } + Frame { + msec: 6448 + hash: "e009f65ae035fb8a9c27a1d57f10c35f" + } + Frame { + msec: 6464 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 6480 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 6496 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 6512 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 6528 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 6544 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 6560 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Key { + type: 6 + key: 16777249 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 6576 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 6592 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 6608 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 6624 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 6640 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 6656 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 6672 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 6688 + hash: "31a446fab3c9a92f20fbb065b62d4357" + } + Frame { + msec: 6704 + hash: "20dd4407adca55737dd4231405c38cff" + } +} diff --git a/examples/declarative/follow/follow.qml b/tests/auto/declarative/visual/qmlspringfollow/follow.qml index 3e164f9..3e164f9 100644 --- a/examples/declarative/follow/follow.qml +++ b/tests/auto/declarative/visual/qmlspringfollow/follow.qml diff --git a/tests/auto/declarative/visual/tst_visual.cpp b/tests/auto/declarative/visual/tst_visual.cpp index e40dec7..5a5318a 100644 --- a/tests/auto/declarative/visual/tst_visual.cpp +++ b/tests/auto/declarative/visual/tst_visual.cpp @@ -59,13 +59,13 @@ public: static QString toTestScript(const QString &, Mode=Test); static QString viewer(); + static QStringList findQmlFiles(const QDir &d); private slots: void visual_data(); void visual(); private: QString qmlviewer; - QStringList findQmlFiles(const QDir &d); }; @@ -257,6 +257,7 @@ void usage() { fprintf(stderr, "\n"); fprintf(stderr, "QML related options\n"); + fprintf(stderr, " -listtests : list all the tests seen by tst_visual, and then exit immediately\n"); fprintf(stderr, " -record file : record new test data for file\n"); fprintf(stderr, " -recordnovisuals file : record new test data for file, but ignore visuals\n"); fprintf(stderr, " -play file : playback test data for file, printing errors\n"); @@ -267,12 +268,12 @@ void usage() "Visual tests are recordings of manual interactions with a QML test,\n" "that can then be run automatically. To record a new test, run:\n" "\n" - " tst_visuals -record yourtestdir/yourtest # Note, no .qml extension\n" + " tst_visual -record yourtestdir/yourtest.qml\n" "\n" "This records everything you do (try to keep it short).\n" "To play back a test, run:\n" "\n" - " tst_visuals -play yourtestdir/yourtest\n" + " tst_visual -play yourtestdir/yourtest.qml\n" "\n" "Your test may include QML code to test itself, reporting any error to an\n" "'error' property on the root object - the test will fail if this property\n" @@ -281,7 +282,7 @@ void usage() "If your test changes slightly but is still correct (check with -play), you\n" "can update the visuals by running:\n" "\n" - " tst_visuals -updatevisuals yourtestdir/yourtest\n" + " tst_visual -updatevisuals yourtestdir/yourtest.qml\n" "\n" "If your test includes platform-sensitive visuals (eg. text in system fonts),\n" "you should create platform-specific visuals, using -updateplatformvisuals\n" @@ -332,10 +333,18 @@ int main(int argc, char **argv) newArgv[newArgc++] = argv[ii]; } - if (arg == "-help" || arg == "-?") { + if (arg == "-help" || arg == "-?" || arg == "--help") { atexit(usage); showHelp = true; } + + if (arg == "-listtests") { + QStringList list = tst_visual::findQmlFiles(QDir(QT_TEST_SOURCE_DIR)); + foreach (QString test, list) { + qWarning() << qPrintable(test); + } + return 0; + } } if (mode == Test || showHelp) { diff --git a/tools/qdoc3/cppcodemarker.cpp b/tools/qdoc3/cppcodemarker.cpp index f3188bd..a8f6a02 100644 --- a/tools/qdoc3/cppcodemarker.cpp +++ b/tools/qdoc3/cppcodemarker.cpp @@ -194,6 +194,8 @@ QString CppCodeMarker::markedUpSynopsis(const Node *node, synopsis = "class " + name; break; case Node::Function: + case Node::QmlSignal: + case Node::QmlMethod: func = (const FunctionNode *) node; if (style != SeparateList && !func->returnType().isEmpty()) synopsis = typified(func->returnType()) + " "; diff --git a/tools/qdoc3/htmlgenerator.cpp b/tools/qdoc3/htmlgenerator.cpp index ae47fc0..f0ddade 100644 --- a/tools/qdoc3/htmlgenerator.cpp +++ b/tools/qdoc3/htmlgenerator.cpp @@ -4224,7 +4224,8 @@ void HtmlGenerator::generateDetailedQmlMember(const Node *node, out() << "<table class=\"qmlname\">"; out() << "<tr><td>"; out() << "<a name=\"" + refForNode(qsn) + "\"></a>"; - generateQmlItem(qsn,relative,marker,false); + generateSynopsis(qsn,relative,marker,CodeMarker::Detailed,false); + //generateQmlItem(qsn,relative,marker,false); out() << "</td></tr>"; out() << "</table>"; out() << "</div>"; @@ -4235,7 +4236,7 @@ void HtmlGenerator::generateDetailedQmlMember(const Node *node, out() << "<table class=\"qmlname\">"; out() << "<tr><td>"; out() << "<a name=\"" + refForNode(qmn) + "\"></a>"; - generateQmlItem(qmn,relative,marker,false); + generateSynopsis(qmn,relative,marker,CodeMarker::Detailed,false); out() << "</td></tr>"; out() << "</table>"; out() << "</div>"; |