From 6e6cc55e66537ad062165d16e798ebc3cc78a76d Mon Sep 17 00:00:00 2001 From: Alan Alpert Date: Wed, 26 Oct 2011 15:36:36 +1000 Subject: [PATCH] Add state changing properties to QQuickSpriteImage Also adds a manual test for them. Change-Id: I5f7effe43f5784eccf7221f2bd72da480792bf89 Reviewed-by: Damian Jansen --- src/declarative/items/qquickspriteengine_p.h | 9 +- src/declarative/items/qquickspriteimage.cpp | 34 ++++ src/declarative/items/qquickspriteimage_p.h | 35 +++-- .../elements/content/GridViewElement.qml | 1 + .../elements/content/SpriteImageElement.qml | 145 ++++++++++++++++++ .../content/pics/squarefacesprite.png | Bin 0 -> 496 bytes .../content/pics/squarefacesprite2.png | Bin 0 -> 459 bytes .../content/pics/squarefacesprite3.png | Bin 0 -> 476 bytes .../content/pics/squarefacesprite4.png | Bin 0 -> 553 bytes .../content/pics/squarefacesprite5.png | Bin 0 -> 623 bytes .../content/pics/squarefacesprite6.png | Bin 0 -> 615 bytes .../content/pics/squarefacesprite7.png | Bin 0 -> 581 bytes .../content/pics/squarefacespriteX.png | Bin 0 -> 474 bytes .../content/pics/squarefacespriteXX.png | Bin 0 -> 255 bytes 14 files changed, 210 insertions(+), 14 deletions(-) create mode 100644 tests/testapplications/elements/content/SpriteImageElement.qml create mode 100644 tests/testapplications/elements/content/pics/squarefacesprite.png create mode 100644 tests/testapplications/elements/content/pics/squarefacesprite2.png create mode 100644 tests/testapplications/elements/content/pics/squarefacesprite3.png create mode 100644 tests/testapplications/elements/content/pics/squarefacesprite4.png create mode 100644 tests/testapplications/elements/content/pics/squarefacesprite5.png create mode 100644 tests/testapplications/elements/content/pics/squarefacesprite6.png create mode 100644 tests/testapplications/elements/content/pics/squarefacesprite7.png create mode 100644 tests/testapplications/elements/content/pics/squarefacespriteX.png create mode 100644 tests/testapplications/elements/content/pics/squarefacespriteXX.png diff --git a/src/declarative/items/qquickspriteengine_p.h b/src/declarative/items/qquickspriteengine_p.h index 44f82044da..1040140a28 100644 --- a/src/declarative/items/qquickspriteengine_p.h +++ b/src/declarative/items/qquickspriteengine_p.h @@ -212,8 +212,6 @@ class Q_AUTOTEST_EXPORT QQuickStochasticEngine : public QObject int count() const {return m_things.count();} void setCount(int c); - - void setGoal(int state, int sprite=0, bool jump=false); void start(int index=0, int state=0); void stop(int index=0); @@ -221,6 +219,13 @@ class Q_AUTOTEST_EXPORT QQuickStochasticEngine : public QObject QQuickStochasticState* state(int idx){return m_states[idx];} int stateIndex(QQuickStochasticState* s){return m_states.indexOf(s);} + int stateIndex(const QString& s) { + for (int i=0; iname() == s) + return i; + return -1; + } + int stateCount() {return m_states.count();} private: signals: diff --git a/src/declarative/items/qquickspriteimage.cpp b/src/declarative/items/qquickspriteimage.cpp index 36ab73490c..098db67f3a 100644 --- a/src/declarative/items/qquickspriteimage.cpp +++ b/src/declarative/items/qquickspriteimage.cpp @@ -249,6 +249,24 @@ struct SpriteVertices { Default is true. */ +/*! + \qmlproperty string QtQuick2::SpriteImage::goalState + + The name of the Sprite which the animation should move to. + + Sprite states have defined durations and transitions between them, setting goalState + will cause it to disregard any path weightings (including 0) and head down the path + which will reach the goalState quickest (fewest animations). It will pass through + intermediate states on that path, and animate them for their duration. + + If it is possible to return to the goalState from the starting point of the goalState + it will continue to do so until goalState is set to "" or an unreachable state. +*/ +/*! \qmlmethod void QtQuick2::SpriteImage::jumpTo(string sprite) + + This function causes the sprite to jump to the specified state immediately, intermediate + states are not played. +*/ /*! \qmlproperty list QtQuick2::SpriteImage::sprites @@ -270,6 +288,22 @@ QQuickSpriteImage::QQuickSpriteImage(QQuickItem *parent) : this, SLOT(update())); } +void QQuickSpriteImage::jumpTo(const QString &sprite) +{ + if (!m_spriteEngine) + return; + m_spriteEngine->setGoal(m_spriteEngine->stateIndex(sprite), 0, true); +} + +void QQuickSpriteImage::setGoalState(const QString &sprite) +{ + if (m_goalState != sprite){ + m_goalState = sprite; + emit goalStateChanged(sprite); + m_spriteEngine->setGoal(m_spriteEngine->stateIndex(sprite)); + } +} + QDeclarativeListProperty QQuickSpriteImage::sprites() { return QDeclarativeListProperty(this, &m_sprites, spriteAppend, spriteCount, spriteAt, spriteClear); diff --git a/src/declarative/items/qquickspriteimage_p.h b/src/declarative/items/qquickspriteimage_p.h index 1ffc95d952..969ff101d7 100644 --- a/src/declarative/items/qquickspriteimage_p.h +++ b/src/declarative/items/qquickspriteimage_p.h @@ -61,6 +61,7 @@ class QQuickSpriteImage : public QQuickItem Q_OBJECT Q_PROPERTY(bool running READ running WRITE setRunning NOTIFY runningChanged) Q_PROPERTY(bool interpolate READ interpolate WRITE setInterpolate NOTIFY interpolateChanged) + Q_PROPERTY(QString goalState READ goalState WRITE setGoalState NOTIFY goalStateChanged) //###try to share similar spriteEngines for less overhead? Q_PROPERTY(QDeclarativeListProperty sprites READ sprites) Q_CLASSINFO("DefaultProperty", "sprites") @@ -80,28 +81,37 @@ class QQuickSpriteImage : public QQuickItem return m_interpolate; } + QString goalState() const + { + return m_goalState; + } + signals: void runningChanged(bool arg); void interpolateChanged(bool arg); + void goalStateChanged(QString arg); public slots: -void setRunning(bool arg) -{ - if (m_running != arg) { - m_running = arg; - emit runningChanged(arg); + void jumpTo(const QString &sprite); + void setGoalState(const QString &sprite); + + void setRunning(bool arg) + { + if (m_running != arg) { + m_running = arg; + emit runningChanged(arg); + } } -} -void setInterpolate(bool arg) -{ - if (m_interpolate != arg) { - m_interpolate = arg; - emit interpolateChanged(arg); + void setInterpolate(bool arg) + { + if (m_interpolate != arg) { + m_interpolate = arg; + emit interpolateChanged(arg); + } } -} private slots: void createEngine(); @@ -120,6 +130,7 @@ private slots: bool m_pleaseReset; bool m_running; bool m_interpolate; + QString m_goalState; }; QT_END_NAMESPACE diff --git a/tests/testapplications/elements/content/GridViewElement.qml b/tests/testapplications/elements/content/GridViewElement.qml index 2b9884d4a9..79b48d55c3 100644 --- a/tests/testapplications/elements/content/GridViewElement.qml +++ b/tests/testapplications/elements/content/GridViewElement.qml @@ -123,5 +123,6 @@ Rectangle { ListElement { label: "Shape"; help: "The Shape element allows you to specify an area for affectors and emitter." } ListElement { label: "TrailEmitter"; help: "The TrailEmitter element allows you to emit logical particles from other logical particles." } ListElement { label: "Direction"; help: "The Direction elements allow you to specify a vector space." } + ListElement { label: "SpriteImage"; help: "The SpriteImage element plays stochastic sprite animations." } } } diff --git a/tests/testapplications/elements/content/SpriteImageElement.qml b/tests/testapplications/elements/content/SpriteImageElement.qml new file mode 100644 index 0000000000..2015eabe8a --- /dev/null +++ b/tests/testapplications/elements/content/SpriteImageElement.qml @@ -0,0 +1,145 @@ +/**************************************************************************** +** +** Copyright (C) 2011 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 + +Item { + id: spriteimageelementtest + anchors.fill: parent + property string testtext: "" + SpriteImage { + id: spriteimage + sprites: [Sprite { + name: "happy" + source: "pics/squarefacesprite2.png" + frames: 6 + duration: 120 + to: {"silly": 1, "sad":0} + }, Sprite { + name: "silly" + source: "pics/squarefacesprite.png" + frames: 6 + duration: 120 + to: {"happy": 1, "sad": 0} + }, Sprite { + name: "sad" + source: "pics/squarefacesprite3.png" + frames: 6 + duration: 120 + to: {"evil": 0.5, "sad": 1, "cyclops" : 0} + }, Sprite { + name: "cyclops" + source: "pics/squarefacesprite4.png" + frames: 6 + duration: 120 + to: {"love": 0.1, "boggled": 0.1, "cyclops" : 0.1} + }, Sprite { + name: "evil" + source: "pics/squarefacesprite5.png" + frames: 6 + duration: 120 + to: {"sad": 1.0, "cyclops" : 0} + }, Sprite { + name: "love" + source: "pics/squarefacesprite6.png" + frames: 6 + duration: 120 + to: {"love": 0.1, "boggled": 0.1, "cyclops" : 0.1} + }, Sprite { + name: "boggled" + source: "pics/squarefacesprite7.png" + frames: 6 + duration: 120 + to: {"love": 0.1, "boggled": 0.1, "cyclops" : 0.1, "dying":0} + }, Sprite { + name: "dying" + source: "pics/squarefacespriteX.png" + frames: 4 + duration: 120 + to: {"dead":1.0} + }, Sprite { + name: "dead" + source: "pics/squarefacespriteXX.png" + frames: 1 + duration: 10000 + }] + + width: 300 + height: 300 + anchors.horizontalCenter: parent.horizontalCenter + anchors.bottom: parent.bottom + } + + + SystemTestHelp { id: helpbubble; visible: statenum != 0 + anchors { top: parent.top; horizontalCenter: parent.horizontalCenter; topMargin: 50 } + } + BugPanel { id: bugpanel } + + states: [ + State { name: "start"; when: statenum == 1 + StateChangeScript { script: spriteimage.jumpTo("happy"); } + PropertyChanges { target: spriteimageelementtest + testtext: "This is a SpriteImage element. It should be animating currently."+ + "It should alternate between winking and sticking out its tongue." } + }, + State { name: "stochastic2"; when: statenum == 2 + StateChangeScript { script: spriteimage.jumpTo("sad"); } + PropertyChanges { target: spriteimageelementtest + testtext: "The sprite should now be animating between frowning and being evil."+ + "This should not be alternating, but mostly frowning with the occasional evil eyes."+ + "After an evil eyes animation, it should return to frowning at least once." } + }, + State { name: "stochastic3"; when: statenum == 3 + StateChangeScript { script: spriteimage.jumpTo("cyclops"); } + PropertyChanges { target: spriteimageelementtest + testtext: "The sprite should now be animating fairly randomly between three animations where it does silly things with its eyes.\n"+ + "Next the sprite will animate into a static 'dead' state."+ + "When it does, it should first animate to and play through the 'big eyes' animation (if it is not currently playing that animation) before it enters the dying animation."} + }, + State { name: "dead"; when: statenum == 4 + PropertyChanges { target: spriteimage; goalState: "dead" } + PropertyChanges { target: spriteimageelementtest + testtext: "After a brief dying animation, the image should now be static.\n"+ + "Advance to restart the test." } + } + ] +} diff --git a/tests/testapplications/elements/content/pics/squarefacesprite.png b/tests/testapplications/elements/content/pics/squarefacesprite.png new file mode 100644 index 0000000000000000000000000000000000000000..f9a5d5fccebbabbf83c5a36b67752bd1234846d3 GIT binary patch literal 496 zcmVj-Ki4wqJn88@zlQhjD`j9Tl zM{JUFvcxAf%CWJ->|-NVz%>^eJKWwIuo6Bs02_OSosMu`(1g?&$gr^^?Vos#ko!YN zC$9({oxCEyno8w7t2V#V)UgB`+rz$mqSqD^WtpaqCD_9ZRsWXKfav>1?*6u#hdn3bsOjE}aY-~^aa_UmM zKv|}#V+l64m#vz*Xf71>?gBQphppO2ADxO>&cVixwAK6Q+6Gw8!N!iZ)w?bu4TuOf z_DsyXE}BHG!m+VO&%b=4=WM&XyjJ0*y;bU!Ws&yQ`5a|$#qUm@h97!-**z>e?~{_&*2(> z1Lw`!pUU}K|H<}DPP;NfM}Lfc*G+b}Z4DhA`*k+2>5^Au@AC`pFKq1l?Bl?)vH|6Q mhK(I+-_d~9Zag-2nEeG?V91at6Cb$%0000)$tk8Y52tAQ8nVH=f zj%>kCy!ae9Zksy|qKEj*iyODyy$8@!d#Vc-N?GFqH|`R}L_cdLVmxlHtf@h1WL$0q+-=>?^Ufyvl{np8SyRJ* zb%)?}E6jM`?(>#Pmk>hOUc1DMOY7|WA@7T4g$?Q~}oJ>5VJpynFfxZQ4f>T)Ll2e@&6L-vXOZ5`&G0N}>0 zUSF)yYXj)jh2zHEeCndSPFi>4xN)~|->T7nZKQ-7_YVK-0!u)m!xE6_ummJJEWzH} zj%Yh@58hd4b0cpo0&#%*=TJ&6fYgx?kwj#YUR{`0*$ej zcUtkM-WGZMI~kmAPe=Kcjvj!Py= S(&)$l0000ksc}dBA5EF3R zsdvH_-Drq>WW0?{=`b zE1nD{;vdCj@>%hoPV|{c`wVGgmG%0a0YJT2lP>BZix@XE-cagNN-3}3J)%xrkv3M% zyqVk)$BWtHM{zyJy*u7|8I@89UeS@KhxwGxyuDVpBgb<^jaJ0CcgK6WqR-xF+h<4{ ztE|_1R3jo(YkeP26f@qJsY}n~d=6=2)yTUYEbgiw>*2ccjpDNStawAI3u4AxMVY$> z%8#t0kN8nsHlGpi%Zc6wx&p9V^Vivk-!67fUg=omxS8>W>*$uc>YY?FEBow;)X^DV z&OPm(!&R4+4ltCBy&Cvh_pka-y65Jq3!*#MXJtp~$@kn;b=d)Cdi-~`#V3lplh0%? zRb7zngjH_J#%`Y3#?4|c<>--Hve;tZk$&qUrI04NltP;5QVMCJODUB04{gNG#Xc5s rJUehM9*HeBl^xN6QH4}&v1#ldO8g*c4wt1d00000NkvXXu0mjf850ZD literal 0 HcmV?d00001 diff --git a/tests/testapplications/elements/content/pics/squarefacesprite5.png b/tests/testapplications/elements/content/pics/squarefacesprite5.png new file mode 100644 index 0000000000000000000000000000000000000000..1cfc5c7f8c2078601c10cc3f78a111ec1f3ae1ce GIT binary patch literal 623 zcmV-#0+9WQP)i_>TeM%M(gn@W~Ei+Q3Zen~)Odwpm zOBEbnzH(h`v1#l$h#BA#S8TEA>??qo;3NRC#h$_TF*r;J!B++{vBhSxfB3lXl=t-{ zS(Xudj?~Z_LKDbH^r>uy)X*!6ht^gyPI%8`)wy^GU}Xj9vGJpn-L*i8RU33t>z!G>CrV2Om^}B z-P?`^Z@`Lr=e{j$Vm2APhuNr~m)U^d(A&%Vj059`9y49@0ezjA9J7 zgm1+#UsCviHvNrXR?3h<0xvs znCR3a#6+)1r@qqkYxSW_{mYfDK5rY+W3TT7{UWAoM{@U9h{vN{Y>^ORh(Sa?#{wJi zS(u-){4Yn`*VBfT{l3OcHEO(@SM=PkHFtGE>RF{R;_Fjm*E}As#!8PlHsZ4~Rk^ao z*VBeo{l3Q4Sfj_gn&`Cv$h6hd@w7v#YsU}|bq~!RZ}=WP#u#E_jzByVwL`}*MkRTu zCWWWTi05?0*lxQ7G5PMOS>p{Sx`+g6%nyjiBYAy#JyvF|Z1o|kC2^X(sL!Jv{m#W6 zJ>Jzsubr^;qEZUG}Y zf!!KJ)MsU)bj9dEwtaxhy29K?q2ZvCFYZay%2Z|N8s=BY!r zKaM^`+QIhLS=A6!J^Iea%4Cz>qvPLop{NmJqEn9$6P_0bAo^Iqg*mwW{002ovPDHLkV1lPI BC8+=a literal 0 HcmV?d00001 diff --git a/tests/testapplications/elements/content/pics/squarefacesprite7.png b/tests/testapplications/elements/content/pics/squarefacesprite7.png new file mode 100644 index 0000000000000000000000000000000000000000..b1e5e4e3393d2f1b70f1d64d7a996f5a8d4a7a0f GIT binary patch literal 581 zcmV-L0=oT)P)O5Sd9%a#l+}!0|%W zySol&FQ3>BHrQrt-iZ<57#D1?&Dqp}k>Fbgzy^B++jH>5MJ9Jf<{X8=;GY{R-uVmQND1- zmiBA761F8@v;RpF8+~U!niGzHF|FTXrCme zMbws0ApIY*b1^Hi&(dMqFjsl89Mj6D96TT2x9XgWJ^|=i+pK*hyd%5!3!_!WZOO*B zE)QkTG+R$Sg TRmK)?00000NkvXXu0mjfdI1XM literal 0 HcmV?d00001 diff --git a/tests/testapplications/elements/content/pics/squarefacespriteX.png b/tests/testapplications/elements/content/pics/squarefacespriteX.png new file mode 100644 index 0000000000000000000000000000000000000000..93a0181dd05e280365d72e92d074af0dbfcc50e5 GIT binary patch literal 474 zcmV<00VV#4P)Wl`BOwgPZKdAcu*g=r$^M z)v{jH8BewYn+M?me&QzEk$nZ=3BCo8Y+p8UaCHcQI)yFSKJ3qWTA~30 zIefN6Szo@S>@-Zc>R|75>-E+)s^BiY6#vE4ZXSzHd6s#}szk41tGjfo08W*5bFaEm zwwkBv(h;rd(!JQb^mfBY^P!S{Eg%w%^_6*bV?6288 z=$xs9r+lQ@Jm{SK@+6ot;lY#%52mm`$dAhAhn-M=xrxf&5kT)mooom84~z8mOMyKmrD-7AP7XE>HV)vS6WnzgQ=gS&dQj9M=O}fluBs4 zxL8aAC)@y^362G@2FrvJSpDm3Jg%+-H^rQuk+qL_y5KsIwf1_77;1ETEs^#j9?RSO zaw|c;hj=XQ+i*nnX7YO6aGgNJK4-+!1=mTfwbzsD-0e$rBPR65()wi1d%$QMJZd8f z*!Rpu-s(MLh{iM