| 1 | /**************************************************************************** | 
|---|
| 2 | ** | 
|---|
| 3 | ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). | 
|---|
| 4 | ** All rights reserved. | 
|---|
| 5 | ** Contact: Nokia Corporation (qt-info@nokia.com) | 
|---|
| 6 | ** | 
|---|
| 7 | ** This file is part of the documentation of the Qt Toolkit. | 
|---|
| 8 | ** | 
|---|
| 9 | ** $QT_BEGIN_LICENSE:FDL$ | 
|---|
| 10 | ** Commercial Usage | 
|---|
| 11 | ** Licensees holding valid Qt Commercial licenses may use this file in | 
|---|
| 12 | ** accordance with the Qt Commercial License Agreement provided with the | 
|---|
| 13 | ** Software or, alternatively, in accordance with the terms contained in a | 
|---|
| 14 | ** written agreement between you and Nokia. | 
|---|
| 15 | ** | 
|---|
| 16 | ** GNU Free Documentation License | 
|---|
| 17 | ** Alternatively, this file may be used under the terms of the GNU Free | 
|---|
| 18 | ** Documentation License version 1.3 as published by the Free Software | 
|---|
| 19 | ** Foundation and appearing in the file included in the packaging of this | 
|---|
| 20 | ** file. | 
|---|
| 21 | ** | 
|---|
| 22 | ** If you have questions regarding the use of this file, please contact | 
|---|
| 23 | ** Nokia at qt-info@nokia.com. | 
|---|
| 24 | ** $QT_END_LICENSE$ | 
|---|
| 25 | ** | 
|---|
| 26 | ****************************************************************************/ | 
|---|
| 27 |  | 
|---|
| 28 | /*! | 
|---|
| 29 | \page qdeclarativestates.html | 
|---|
| 30 | \target qmlstates | 
|---|
| 31 | \title QML States | 
|---|
| 32 |  | 
|---|
| 33 | \section1 Overview | 
|---|
| 34 |  | 
|---|
| 35 | User interfaces are designed to present different interface configurations in | 
|---|
| 36 | different scenarios, or to modify their appearances in response to user | 
|---|
| 37 | interaction. Often, there are a set of changes that are made concurrently, such | 
|---|
| 38 | that the interface could be seen to be internally changing from one \e state to | 
|---|
| 39 | another. | 
|---|
| 40 |  | 
|---|
| 41 | This applies generally to interface elements regardless of their complexity. | 
|---|
| 42 | A photo viewer may initially present images in a grid, and when an image is | 
|---|
| 43 | clicked, change to a "detailed" state where the individual image is expanded | 
|---|
| 44 | and the interface is changed to present new options for image editing. On the | 
|---|
| 45 | other end of the scale, when a simple button is pressed, it may change to a | 
|---|
| 46 | "pressed" state in which its color and position is modified to give a pressed | 
|---|
| 47 | appearance. | 
|---|
| 48 |  | 
|---|
| 49 | In QML, any object can change between different \e states to apply sets of | 
|---|
| 50 | changes that modify the properties of relevant items. Each \e state could | 
|---|
| 51 | present a different configuration that could, for example: | 
|---|
| 52 |  | 
|---|
| 53 | \list | 
|---|
| 54 | \o Show some UI elements and hide others | 
|---|
| 55 | \o Present different available actions to the user | 
|---|
| 56 | \o Start, stop or pause animations | 
|---|
| 57 | \o Execute some script required in the new state | 
|---|
| 58 | \o Change a property value for a particular item | 
|---|
| 59 | \o Show a different view or "screen" | 
|---|
| 60 | \endlist | 
|---|
| 61 |  | 
|---|
| 62 | Changes between states can be animated using \l {Transitions}{transitions}, as | 
|---|
| 63 | discussed further below. | 
|---|
| 64 |  | 
|---|
| 65 | All \l {Item}-based objects have a \e {default state}, and can specify additional | 
|---|
| 66 | states by adding new \l State objects to the item's \l {Item::}{states} | 
|---|
| 67 | property. Each state has a \e name that is unique for all states within that | 
|---|
| 68 | item; the default state's name is an empty string. To change the current state | 
|---|
| 69 | of an item, set the \l {Item::}{state} property to the name of the state. | 
|---|
| 70 |  | 
|---|
| 71 | Non-Item objects can use states through the StateGroup element. | 
|---|
| 72 |  | 
|---|
| 73 |  | 
|---|
| 74 | \section1 Creating states | 
|---|
| 75 |  | 
|---|
| 76 | To create a state, add a \l State object to the item's \l {Item::}{states} property, | 
|---|
| 77 | which holds a list of states for that item. | 
|---|
| 78 |  | 
|---|
| 79 | Following is an example. Here, the \l Rectangle is initially placed in the | 
|---|
| 80 | default (0, 0) position. It has defined an additional state named "moved", in | 
|---|
| 81 | which a PropertyChanges object repositions the rectangle to (50, 50). Clicking | 
|---|
| 82 | within the MouseArea changes the state to the "moved" state, thus moving the \l | 
|---|
| 83 | Rectangle. | 
|---|
| 84 |  | 
|---|
| 85 | \snippet doc/src/snippets/declarative/states.qml 0 | 
|---|
| 86 |  | 
|---|
| 87 | The \l State item defines all the changes to be made in the new state. It | 
|---|
| 88 | could specify additional properties to be changed, or create additional | 
|---|
| 89 | PropertyChanges for other objects. It can also modify the properties of other | 
|---|
| 90 | objects, not just the object that owns the state. For example: | 
|---|
| 91 |  | 
|---|
| 92 | \qml | 
|---|
| 93 | Rectangle { | 
|---|
| 94 | ... | 
|---|
| 95 | states: [ | 
|---|
| 96 | State { | 
|---|
| 97 | name: "moved" | 
|---|
| 98 | PropertyChanges { target: myRect; x: 50; y: 50; color: "blue" } | 
|---|
| 99 | PropertyChanges { target: someOtherItem; width: 1000 } | 
|---|
| 100 | } | 
|---|
| 101 | ] | 
|---|
| 102 | } | 
|---|
| 103 | \endqml | 
|---|
| 104 |  | 
|---|
| 105 | As a convenience, if an item only has one state, its \l {Item::}{states} | 
|---|
| 106 | property can be defined as a single \l State, without the square-brace list | 
|---|
| 107 | syntax: | 
|---|
| 108 |  | 
|---|
| 109 | \qml | 
|---|
| 110 | Item { | 
|---|
| 111 | ... | 
|---|
| 112 | states: State { | 
|---|
| 113 | ... | 
|---|
| 114 | } | 
|---|
| 115 | } | 
|---|
| 116 | \endqml | 
|---|
| 117 |  | 
|---|
| 118 | A \l State is not limited to performing modifications on property values. It | 
|---|
| 119 | can also: | 
|---|
| 120 |  | 
|---|
| 121 | \list | 
|---|
| 122 | \o Run some script using StateChangeScript | 
|---|
| 123 | \o Override an existing signal handler for an object using PropertyChanges | 
|---|
| 124 | \o Re-parent an \l Item using ParentChanges | 
|---|
| 125 | \o Modify anchor values using AnchorChanges | 
|---|
| 126 | \endlist | 
|---|
| 127 |  | 
|---|
| 128 | The \l {declarative/animation/states}{States and Transitions example} | 
|---|
| 129 | demonstrates how to declare a basic set of states and apply animated | 
|---|
| 130 | transitions between them. | 
|---|
| 131 |  | 
|---|
| 132 |  | 
|---|
| 133 | \section1 The default state | 
|---|
| 134 |  | 
|---|
| 135 | Of course, the \l Rectangle in the example above could have simply been moved | 
|---|
| 136 | by setting its position to (50, 50) in the mouse area's \c onClicked handler. | 
|---|
| 137 | However, aside from enabling batched property changes, one of the features of | 
|---|
| 138 | QML states is the ability of an item to revert to its \e {default state}. | 
|---|
| 139 | The default state contains all of an item's initial property values before | 
|---|
| 140 | they were modified in a state change. | 
|---|
| 141 |  | 
|---|
| 142 | For example, suppose the \l Rectangle should move to (50,50) when the mouse is | 
|---|
| 143 | pressed, and then move back to its original position when the mouse is | 
|---|
| 144 | released. This can be achieved by using the \l {State::}{when} property, | 
|---|
| 145 | like this: | 
|---|
| 146 |  | 
|---|
| 147 | \qml | 
|---|
| 148 | Rectangle { | 
|---|
| 149 | ... | 
|---|
| 150 |  | 
|---|
| 151 | MouseArea { | 
|---|
| 152 | id: mouseArea | 
|---|
| 153 | anchors.fill: parent | 
|---|
| 154 | } | 
|---|
| 155 |  | 
|---|
| 156 | states: State { | 
|---|
| 157 | name: "moved"; when: mouseArea.pressed | 
|---|
| 158 | ... | 
|---|
| 159 | } | 
|---|
| 160 | } | 
|---|
| 161 | \endqml | 
|---|
| 162 |  | 
|---|
| 163 | The \l {State::}{when} property is set to an expression that evaluates to | 
|---|
| 164 | \c true when the item should be set to that state. When the mouse is pressed, | 
|---|
| 165 | the state is changed to \e moved. When it is released, the item reverts to its | 
|---|
| 166 | \e default state, which defines all of the item's original property values. | 
|---|
| 167 |  | 
|---|
| 168 | Alternatively, an item can be explicitly set to its default state by setting its | 
|---|
| 169 | \l {Item::}{state} property to an empty string (""). For example, instead of | 
|---|
| 170 | using the \l {State::}{when} property, the above code could be changed to: | 
|---|
| 171 |  | 
|---|
| 172 | \qml | 
|---|
| 173 | Rectangle { | 
|---|
| 174 | ... | 
|---|
| 175 |  | 
|---|
| 176 | MouseArea { | 
|---|
| 177 | anchors.fill: parent | 
|---|
| 178 | onPressed: myRect.state = 'moved'; | 
|---|
| 179 | onReleased: myRect.state = ''; | 
|---|
| 180 | } | 
|---|
| 181 |  | 
|---|
| 182 | states: State { | 
|---|
| 183 | name: "moved" | 
|---|
| 184 | ... | 
|---|
| 185 | } | 
|---|
| 186 | } | 
|---|
| 187 | \endqml | 
|---|
| 188 |  | 
|---|
| 189 | Obviously it makes sense to use the \l {State::}{when} property when possible | 
|---|
| 190 | as it provides a simpler (and a better, more declarative) solution than | 
|---|
| 191 | assigning the state from signal handlers. | 
|---|
| 192 |  | 
|---|
| 193 |  | 
|---|
| 194 | \section1 Animating state changes | 
|---|
| 195 |  | 
|---|
| 196 |  | 
|---|
| 197 | State changes can be easily animated through \l {Transitions}{transitions}. A | 
|---|
| 198 | \l Transition defines the animations that should be applied when an item | 
|---|
| 199 | changes from one state to another. | 
|---|
| 200 |  | 
|---|
| 201 | If the above example was modified to include the following \l Transition, the | 
|---|
| 202 | movement of the \l Rectangle would be animated: | 
|---|
| 203 |  | 
|---|
| 204 | \qml | 
|---|
| 205 | Rectangle { | 
|---|
| 206 | ... | 
|---|
| 207 |  | 
|---|
| 208 | MouseArea { ... } | 
|---|
| 209 |  | 
|---|
| 210 | states: [ | 
|---|
| 211 | ... | 
|---|
| 212 | ] | 
|---|
| 213 |  | 
|---|
| 214 | transitions: [ | 
|---|
| 215 | Transition { | 
|---|
| 216 | NumberAnimation { properties: "x,y"; duration: 500 } | 
|---|
| 217 | } | 
|---|
| 218 | ] | 
|---|
| 219 | } | 
|---|
| 220 | \endqml | 
|---|
| 221 |  | 
|---|
| 222 | This \l Transition defines that if any \c x or \c y properties have changed | 
|---|
| 223 | during a state change within this item, their values should be animated over 500 | 
|---|
| 224 | milliseconds. | 
|---|
| 225 |  | 
|---|
| 226 | See the \l Transitions documentation for more information. | 
|---|
| 227 |  | 
|---|
| 228 | */ | 
|---|