From a735038376e1c229c293c36bd67800851323baf1 Mon Sep 17 00:00:00 2001 From: Karsten Heimrich Date: Tue, 18 Aug 2020 14:26:50 +0200 Subject: [PATCH] Move QStateMachine from QtCore to QtScxml Task-number: QTBUG-80316 Change-Id: I2ee74110fd55e94d86321d3b3dc5bb8297424ed4 Reviewed-by: Maurice Kalinowski --- doc/global/manifest-meta.qdocconf | 5 - doc/src/images/animatedtiles-example.png | Bin 158209 -> 0 bytes doc/src/images/moveblocks-example.png | Bin 4532 -> 0 bytes doc/src/images/padnavigator-example.png | Bin 219818 -> 0 bytes doc/src/images/rogue-example.png | Bin 10364 -> 0 bytes doc/src/images/states-example.png | Bin 34844 -> 0 bytes doc/src/images/stickman-example.png | Bin 18867 -> 0 bytes doc/src/images/stickman-example1.png | Bin 64543 -> 0 bytes doc/src/images/stickman-example2.png | Bin 37412 -> 0 bytes doc/src/images/stickman-example3.png | Bin 23591 -> 0 bytes doc/src/images/sub-attaq-demo.png | Bin 51552 -> 0 bytes doc/src/images/trafficlight-example.png | Bin 5325 -> 0 bytes doc/src/images/transitions.png | Bin 4314 -> 0 bytes examples/widgets/.prev_CMakeLists.txt | 1 - examples/widgets/CMakeLists.txt | 1 - examples/widgets/animation/CMakeLists.txt | 5 - .../animation/animatedtiles/CMakeLists.txt | 54 - .../animation/animatedtiles/animatedtiles.pro | 8 - .../animation/animatedtiles/animatedtiles.qrc | 11 - .../animatedtiles/images/Time-For-Lunch-2.jpg | Bin 32471 -> 0 bytes .../animatedtiles/images/centered.png | Bin 892 -> 0 bytes .../animatedtiles/images/ellipse.png | Bin 10767 -> 0 bytes .../animatedtiles/images/figure8.png | Bin 14050 -> 0 bytes .../animatedtiles/images/kinetic.png | Bin 5055 -> 0 bytes .../animation/animatedtiles/images/random.png | Bin 14969 -> 0 bytes .../animation/animatedtiles/images/tile.png | Bin 16337 -> 0 bytes .../widgets/animation/animatedtiles/main.cpp | 268 - examples/widgets/animation/animation.pro | 8 +- .../animation/moveblocks/CMakeLists.txt | 35 - .../widgets/animation/moveblocks/main.cpp | 330 - .../animation/moveblocks/moveblocks.pro | 7 - .../widgets/animation/states/CMakeLists.txt | 53 - .../states/accessories-dictionary.png | Bin 5396 -> 0 bytes .../widgets/animation/states/akregator.png | Bin 4873 -> 0 bytes examples/widgets/animation/states/digikam.png | Bin 3334 -> 0 bytes .../widgets/animation/states/help-browser.png | Bin 6984 -> 0 bytes examples/widgets/animation/states/k3b.png | Bin 8220 -> 0 bytes examples/widgets/animation/states/kchart.png | Bin 4887 -> 0 bytes examples/widgets/animation/states/main.cpp | 295 - examples/widgets/animation/states/states.pro | 8 - examples/widgets/animation/states/states.qrc | 10 - .../widgets/animation/stickman/CMakeLists.txt | 57 - .../widgets/animation/stickman/animation.cpp | 193 - .../widgets/animation/stickman/animation.h | 92 - .../stickman/animations/chilling.bin | Bin 6508 -> 0 bytes .../animation/stickman/animations/dancing.bin | Bin 2348 -> 0 bytes .../animation/stickman/animations/dead.bin | Bin 268 -> 0 bytes .../animation/stickman/animations/jumping.bin | Bin 1308 -> 0 bytes .../animation/stickman/graphicsview.cpp | 68 - .../widgets/animation/stickman/graphicsview.h | 70 - .../widgets/animation/stickman/lifecycle.cpp | 234 - .../widgets/animation/stickman/lifecycle.h | 91 - examples/widgets/animation/stickman/main.cpp | 116 - examples/widgets/animation/stickman/node.cpp | 102 - examples/widgets/animation/stickman/node.h | 80 - .../widgets/animation/stickman/rectbutton.cpp | 78 - .../widgets/animation/stickman/rectbutton.h | 75 - .../widgets/animation/stickman/stickman.cpp | 329 - .../widgets/animation/stickman/stickman.h | 108 - .../widgets/animation/stickman/stickman.pro | 21 - .../widgets/animation/stickman/stickman.qrc | 8 - .../animation/sub-attaq/.prev_CMakeLists.txt | 196 - .../animation/sub-attaq/CMakeLists.txt | 197 - .../animation/sub-attaq/animationmanager.cpp | 98 - .../animation/sub-attaq/animationmanager.h | 82 - examples/widgets/animation/sub-attaq/boat.cpp | 281 - examples/widgets/animation/sub-attaq/boat.h | 103 - examples/widgets/animation/sub-attaq/boat_p.h | 246 - examples/widgets/animation/sub-attaq/bomb.cpp | 128 - examples/widgets/animation/sub-attaq/bomb.h | 76 - examples/widgets/animation/sub-attaq/data.xml | 39 - .../animation/sub-attaq/graphicsscene.cpp | 301 - .../animation/sub-attaq/graphicsscene.h | 130 - examples/widgets/animation/sub-attaq/main.cpp | 64 - .../animation/sub-attaq/mainwindow.cpp | 84 - .../widgets/animation/sub-attaq/mainwindow.h | 72 - .../sub-attaq/pics/big/background.png | Bin 48858 -> 0 bytes .../animation/sub-attaq/pics/big/boat.png | Bin 5198 -> 0 bytes .../animation/sub-attaq/pics/big/bomb.png | Bin 760 -> 0 bytes .../pics/big/explosion/boat/step1.png | Bin 5760 -> 0 bytes .../pics/big/explosion/boat/step2.png | Bin 9976 -> 0 bytes .../pics/big/explosion/boat/step3.png | Bin 12411 -> 0 bytes .../pics/big/explosion/boat/step4.png | Bin 15438 -> 0 bytes .../pics/big/explosion/submarine/step1.png | Bin 3354 -> 0 bytes .../pics/big/explosion/submarine/step2.png | Bin 6205 -> 0 bytes .../pics/big/explosion/submarine/step3.png | Bin 6678 -> 0 bytes .../pics/big/explosion/submarine/step4.png | Bin 6666 -> 0 bytes .../sub-attaq/pics/big/submarine.png | Bin 3202 -> 0 bytes .../animation/sub-attaq/pics/big/surface.png | Bin 575 -> 0 bytes .../animation/sub-attaq/pics/big/torpedo.png | Bin 951 -> 0 bytes .../pics/scalable/background-n810.svg | 171 - .../sub-attaq/pics/scalable/background.svg | 171 - .../sub-attaq/pics/scalable/boat.svg | 279 - .../sub-attaq/pics/scalable/bomb.svg | 138 - .../sub-attaq/pics/scalable/sand.svg | 103 - .../animation/sub-attaq/pics/scalable/see.svg | 44 - .../animation/sub-attaq/pics/scalable/sky.svg | 45 - .../sub-attaq/pics/scalable/sub-attaq.svg | 1473 ---- .../sub-attaq/pics/scalable/submarine.svg | 214 - .../sub-attaq/pics/scalable/surface.svg | 49 - .../sub-attaq/pics/scalable/torpedo.svg | 127 - .../sub-attaq/pics/small/background.png | Bin 34634 -> 0 bytes .../animation/sub-attaq/pics/small/boat.png | Bin 2394 -> 0 bytes .../animation/sub-attaq/pics/small/bomb.png | Bin 760 -> 0 bytes .../sub-attaq/pics/small/submarine.png | Bin 1338 -> 0 bytes .../sub-attaq/pics/small/surface.png | Bin 502 -> 0 bytes .../sub-attaq/pics/small/torpedo.png | Bin 951 -> 0 bytes .../sub-attaq/pics/welcome/logo-a.png | Bin 5972 -> 0 bytes .../sub-attaq/pics/welcome/logo-a2.png | Bin 5969 -> 0 bytes .../sub-attaq/pics/welcome/logo-b.png | Bin 6869 -> 0 bytes .../sub-attaq/pics/welcome/logo-dash.png | Bin 2255 -> 0 bytes .../sub-attaq/pics/welcome/logo-excl.png | Bin 2740 -> 0 bytes .../sub-attaq/pics/welcome/logo-q.png | Bin 7016 -> 0 bytes .../sub-attaq/pics/welcome/logo-s.png | Bin 5817 -> 0 bytes .../sub-attaq/pics/welcome/logo-t.png | Bin 3717 -> 0 bytes .../sub-attaq/pics/welcome/logo-t2.png | Bin 3688 -> 0 bytes .../sub-attaq/pics/welcome/logo-u.png | Bin 5374 -> 0 bytes .../animation/sub-attaq/pixmapitem.cpp | 87 - .../widgets/animation/sub-attaq/pixmapitem.h | 72 - .../animation/sub-attaq/progressitem.cpp | 77 - .../animation/sub-attaq/progressitem.h | 70 - .../animation/sub-attaq/qanimationstate.cpp | 154 - .../animation/sub-attaq/qanimationstate.h | 85 - .../widgets/animation/sub-attaq/states.cpp | 335 - examples/widgets/animation/sub-attaq/states.h | 180 - .../widgets/animation/sub-attaq/sub-attaq.pro | 33 - .../widgets/animation/sub-attaq/subattaq.qrc | 39 - .../widgets/animation/sub-attaq/submarine.cpp | 187 - .../widgets/animation/sub-attaq/submarine.h | 99 - .../widgets/animation/sub-attaq/submarine_p.h | 147 - .../sub-attaq/textinformationitem.cpp | 64 - .../animation/sub-attaq/textinformationitem.h | 64 - .../widgets/animation/sub-attaq/torpedo.cpp | 124 - .../widgets/animation/sub-attaq/torpedo.h | 76 - .../widgets/doc/images/factorial-example.png | Bin 4032 -> 0 bytes .../widgets/doc/images/pingpong-example.png | Bin 7843 -> 0 bytes .../doc/images/trafficlight-example1.png | Bin 3694 -> 0 bytes .../doc/images/trafficlight-example2.png | Bin 7257 -> 0 bytes examples/widgets/doc/src/animatedtiles.qdoc | 36 - .../widgets/doc/src/eventtransitions.qdoc | 85 - examples/widgets/doc/src/factorial.qdoc | 88 - examples/widgets/doc/src/moveblocks.qdoc | 214 - examples/widgets/doc/src/padnavigator.qdoc | 586 -- examples/widgets/doc/src/pingpong.qdoc | 93 - examples/widgets/doc/src/rogue.qdoc | 208 - examples/widgets/doc/src/states.qdoc | 36 - examples/widgets/doc/src/stickman.qdoc | 102 - examples/widgets/doc/src/sub-attaq.qdoc | 41 - examples/widgets/doc/src/trafficlight.qdoc | 85 - examples/widgets/doc/src/twowaybutton.qdoc | 68 - examples/widgets/graphicsview/CMakeLists.txt | 1 - .../widgets/graphicsview/graphicsview.pro | 1 - .../padnavigator/.prev_CMakeLists.txt | 68 - .../graphicsview/padnavigator/CMakeLists.txt | 69 - .../padnavigator/flippablepad.cpp | 108 - .../graphicsview/padnavigator/flippablepad.h | 71 - .../widgets/graphicsview/padnavigator/form.ui | 208 - .../padnavigator/images/artsfftscope.png | Bin 1291 -> 0 bytes .../padnavigator/images/blue_angle_swirl.jpg | Bin 11826 -> 0 bytes .../padnavigator/images/kontact_contacts.png | Bin 4382 -> 0 bytes .../padnavigator/images/kontact_journal.png | Bin 3261 -> 0 bytes .../padnavigator/images/kontact_mail.png | Bin 3202 -> 0 bytes .../padnavigator/images/kontact_notes.png | Bin 3893 -> 0 bytes .../padnavigator/images/kopeteavailable.png | Bin 2380 -> 0 bytes .../images/metacontact_online.png | Bin 2545 -> 0 bytes .../padnavigator/images/minitools.png | Bin 2087 -> 0 bytes .../graphicsview/padnavigator/main.cpp | 65 - .../padnavigator/padnavigator.cpp | 318 - .../graphicsview/padnavigator/padnavigator.h | 72 - .../padnavigator/padnavigator.pro | 27 - .../padnavigator/padnavigator.qrc | 13 - .../padnavigator/roundrectitem.cpp | 125 - .../graphicsview/padnavigator/roundrectitem.h | 85 - .../graphicsview/padnavigator/splashitem.cpp | 93 - .../graphicsview/padnavigator/splashitem.h | 71 - examples/widgets/statemachine/CMakeLists.txt | 10 - examples/widgets/statemachine/README | 6 - .../eventtransitions/CMakeLists.txt | 35 - .../eventtransitions/eventtransitions.pro | 7 - .../statemachine/eventtransitions/main.cpp | 130 - .../statemachine/factorial/CMakeLists.txt | 31 - .../statemachine/factorial/factorial.pro | 10 - .../widgets/statemachine/factorial/main.cpp | 181 - .../statemachine/pingpong/CMakeLists.txt | 31 - .../widgets/statemachine/pingpong/main.cpp | 149 - .../statemachine/pingpong/pingpong.pro | 10 - .../widgets/statemachine/rogue/CMakeLists.txt | 37 - examples/widgets/statemachine/rogue/main.cpp | 64 - .../statemachine/rogue/movementtransition.h | 122 - examples/widgets/statemachine/rogue/rogue.pro | 10 - .../widgets/statemachine/rogue/window.cpp | 261 - examples/widgets/statemachine/rogue/window.h | 100 - .../widgets/statemachine/statemachine.pro | 12 - .../statemachine/trafficlight/CMakeLists.txt | 35 - .../statemachine/trafficlight/main.cpp | 200 - .../trafficlight/trafficlight.pro | 9 - .../statemachine/twowaybutton/CMakeLists.txt | 35 - .../statemachine/twowaybutton/main.cpp | 91 - .../twowaybutton/twowaybutton.pro | 9 - examples/widgets/widgets.pro | 1 - src/corelib/.prev_CMakeLists.txt | 13 - src/corelib/.prev_configure.cmake | 11 - src/corelib/CMakeLists.txt | 13 - src/corelib/configure.cmake | 11 - src/corelib/configure.json | 12 - src/corelib/corelib.pro | 1 - .../images/statemachine-button-history.png | Bin 8493 -> 0 bytes .../doc/images/statemachine-button-nested.png | Bin 7051 -> 0 bytes .../doc/images/statemachine-button.png | Bin 4233 -> 0 bytes .../doc/images/statemachine-customevents.png | Bin 2544 -> 0 bytes .../doc/images/statemachine-customevents2.png | Bin 6713 -> 0 bytes .../doc/images/statemachine-examples.png | Bin 3326 -> 0 bytes .../doc/images/statemachine-finished.png | Bin 5518 -> 0 bytes .../doc/images/statemachine-nonparallel.png | Bin 5350 -> 0 bytes .../doc/images/statemachine-parallel.png | Bin 8631 -> 0 bytes ...src_corelib_statemachine_qstatemachine.cpp | 65 - .../doc/snippets/statemachine/eventtest.cpp | 83 - .../doc/snippets/statemachine/main.cpp | 98 - .../doc/snippets/statemachine/main2.cpp | 103 - .../doc/snippets/statemachine/main3.cpp | 70 - .../doc/snippets/statemachine/main4.cpp | 122 - .../doc/snippets/statemachine/main5.cpp | 182 - src/corelib/doc/src/animation.qdoc | 43 - src/corelib/doc/src/statemachine.qdoc | 577 -- src/corelib/kernel/qcoreapplication.cpp | 16 + src/corelib/kernel/qcoreapplication_p.h | 8 + src/corelib/statemachine/qabstractstate.cpp | 239 - src/corelib/statemachine/qabstractstate.h | 88 - src/corelib/statemachine/qabstractstate_p.h | 99 - .../statemachine/qabstracttransition.cpp | 435 -- .../statemachine/qabstracttransition.h | 117 - .../statemachine/qabstracttransition_p.h | 94 - src/corelib/statemachine/qeventtransition.cpp | 256 - src/corelib/statemachine/qeventtransition.h | 85 - src/corelib/statemachine/qeventtransition_p.h | 81 - src/corelib/statemachine/qfinalstate.cpp | 141 - src/corelib/statemachine/qfinalstate.h | 73 - src/corelib/statemachine/qfinalstate_p.h | 72 - src/corelib/statemachine/qhistorystate.cpp | 334 - src/corelib/statemachine/qhistorystate.h | 95 - src/corelib/statemachine/qhistorystate_p.h | 80 - .../statemachine/qsignaleventgenerator_p.h | 78 - .../statemachine/qsignaltransition.cpp | 287 - src/corelib/statemachine/qsignaltransition.h | 99 - .../statemachine/qsignaltransition_p.h | 83 - src/corelib/statemachine/qstate.cpp | 603 -- src/corelib/statemachine/qstate.h | 134 - src/corelib/statemachine/qstate_p.h | 127 - src/corelib/statemachine/qstatemachine.cpp | 3208 -------- src/corelib/statemachine/qstatemachine.h | 199 - src/corelib/statemachine/qstatemachine_p.h | 333 - src/corelib/statemachine/statemachine.pri | 33 - src/gui/.prev_CMakeLists.txt | 1 + src/gui/CMakeLists.txt | 1 + src/gui/kernel/kernel.pri | 3 +- src/gui/kernel/qguiapplication_p.h | 1 + .../kernel}/qguistatemachine.cpp | 140 +- src/tools/uic/qclass_lib_map.h | 10 - src/widgets/.prev_CMakeLists.txt | 14 +- src/widgets/CMakeLists.txt | 14 +- src/widgets/kernel/kernel.pri | 3 +- src/widgets/kernel/qapplication.cpp | 13 - src/widgets/kernel/qapplication_p.h | 3 + src/widgets/kernel/qwidgetstatemachine.cpp | 166 + .../statemachine/qbasickeyeventtransition.cpp | 204 - .../statemachine/qbasickeyeventtransition_p.h | 93 - .../qbasicmouseeventtransition.cpp | 208 - .../qbasicmouseeventtransition_p.h | 96 - .../statemachine/qkeyeventtransition.cpp | 174 - .../statemachine/qkeyeventtransition.h | 79 - .../statemachine/qmouseeventtransition.cpp | 202 - .../statemachine/qmouseeventtransition.h | 83 - src/widgets/statemachine/statemachine.pri | 16 - src/widgets/widgets.pro | 1 - tests/auto/corelib/.prev_CMakeLists.txt | 1 - tests/auto/corelib/CMakeLists.txt | 1 - tests/auto/corelib/corelib.pro | 1 - .../auto/corelib/statemachine/CMakeLists.txt | 4 - .../statemachine/qstate/CMakeLists.txt | 10 - .../corelib/statemachine/qstate/qstate.pro | 4 - .../statemachine/qstate/tst_qstate.cpp | 374 - .../statemachine/qstatemachine/CMakeLists.txt | 20 - .../qstatemachine/qstatemachine.pro | 5 - .../qstatemachine/tst_qstatemachine.cpp | 6868 ----------------- .../corelib/statemachine/statemachine.pro | 4 - tests/auto/guiapplauncher/examples.txt | 10 - 286 files changed, 209 insertions(+), 31767 deletions(-) delete mode 100644 doc/src/images/animatedtiles-example.png delete mode 100644 doc/src/images/moveblocks-example.png delete mode 100644 doc/src/images/padnavigator-example.png delete mode 100644 doc/src/images/rogue-example.png delete mode 100644 doc/src/images/states-example.png delete mode 100644 doc/src/images/stickman-example.png delete mode 100644 doc/src/images/stickman-example1.png delete mode 100644 doc/src/images/stickman-example2.png delete mode 100644 doc/src/images/stickman-example3.png delete mode 100644 doc/src/images/sub-attaq-demo.png delete mode 100644 doc/src/images/trafficlight-example.png delete mode 100644 doc/src/images/transitions.png delete mode 100644 examples/widgets/animation/animatedtiles/CMakeLists.txt delete mode 100644 examples/widgets/animation/animatedtiles/animatedtiles.pro delete mode 100644 examples/widgets/animation/animatedtiles/animatedtiles.qrc delete mode 100644 examples/widgets/animation/animatedtiles/images/Time-For-Lunch-2.jpg delete mode 100644 examples/widgets/animation/animatedtiles/images/centered.png delete mode 100644 examples/widgets/animation/animatedtiles/images/ellipse.png delete mode 100644 examples/widgets/animation/animatedtiles/images/figure8.png delete mode 100644 examples/widgets/animation/animatedtiles/images/kinetic.png delete mode 100644 examples/widgets/animation/animatedtiles/images/random.png delete mode 100644 examples/widgets/animation/animatedtiles/images/tile.png delete mode 100644 examples/widgets/animation/animatedtiles/main.cpp delete mode 100644 examples/widgets/animation/moveblocks/CMakeLists.txt delete mode 100644 examples/widgets/animation/moveblocks/main.cpp delete mode 100644 examples/widgets/animation/moveblocks/moveblocks.pro delete mode 100644 examples/widgets/animation/states/CMakeLists.txt delete mode 100644 examples/widgets/animation/states/accessories-dictionary.png delete mode 100644 examples/widgets/animation/states/akregator.png delete mode 100644 examples/widgets/animation/states/digikam.png delete mode 100644 examples/widgets/animation/states/help-browser.png delete mode 100644 examples/widgets/animation/states/k3b.png delete mode 100644 examples/widgets/animation/states/kchart.png delete mode 100644 examples/widgets/animation/states/main.cpp delete mode 100644 examples/widgets/animation/states/states.pro delete mode 100644 examples/widgets/animation/states/states.qrc delete mode 100644 examples/widgets/animation/stickman/CMakeLists.txt delete mode 100644 examples/widgets/animation/stickman/animation.cpp delete mode 100644 examples/widgets/animation/stickman/animation.h delete mode 100644 examples/widgets/animation/stickman/animations/chilling.bin delete mode 100644 examples/widgets/animation/stickman/animations/dancing.bin delete mode 100644 examples/widgets/animation/stickman/animations/dead.bin delete mode 100644 examples/widgets/animation/stickman/animations/jumping.bin delete mode 100644 examples/widgets/animation/stickman/graphicsview.cpp delete mode 100644 examples/widgets/animation/stickman/graphicsview.h delete mode 100644 examples/widgets/animation/stickman/lifecycle.cpp delete mode 100644 examples/widgets/animation/stickman/lifecycle.h delete mode 100644 examples/widgets/animation/stickman/main.cpp delete mode 100644 examples/widgets/animation/stickman/node.cpp delete mode 100644 examples/widgets/animation/stickman/node.h delete mode 100644 examples/widgets/animation/stickman/rectbutton.cpp delete mode 100644 examples/widgets/animation/stickman/rectbutton.h delete mode 100644 examples/widgets/animation/stickman/stickman.cpp delete mode 100644 examples/widgets/animation/stickman/stickman.h delete mode 100644 examples/widgets/animation/stickman/stickman.pro delete mode 100644 examples/widgets/animation/stickman/stickman.qrc delete mode 100644 examples/widgets/animation/sub-attaq/.prev_CMakeLists.txt delete mode 100644 examples/widgets/animation/sub-attaq/CMakeLists.txt delete mode 100644 examples/widgets/animation/sub-attaq/animationmanager.cpp delete mode 100644 examples/widgets/animation/sub-attaq/animationmanager.h delete mode 100644 examples/widgets/animation/sub-attaq/boat.cpp delete mode 100644 examples/widgets/animation/sub-attaq/boat.h delete mode 100644 examples/widgets/animation/sub-attaq/boat_p.h delete mode 100644 examples/widgets/animation/sub-attaq/bomb.cpp delete mode 100644 examples/widgets/animation/sub-attaq/bomb.h delete mode 100644 examples/widgets/animation/sub-attaq/data.xml delete mode 100644 examples/widgets/animation/sub-attaq/graphicsscene.cpp delete mode 100644 examples/widgets/animation/sub-attaq/graphicsscene.h delete mode 100644 examples/widgets/animation/sub-attaq/main.cpp delete mode 100644 examples/widgets/animation/sub-attaq/mainwindow.cpp delete mode 100644 examples/widgets/animation/sub-attaq/mainwindow.h delete mode 100644 examples/widgets/animation/sub-attaq/pics/big/background.png delete mode 100644 examples/widgets/animation/sub-attaq/pics/big/boat.png delete mode 100644 examples/widgets/animation/sub-attaq/pics/big/bomb.png delete mode 100644 examples/widgets/animation/sub-attaq/pics/big/explosion/boat/step1.png delete mode 100644 examples/widgets/animation/sub-attaq/pics/big/explosion/boat/step2.png delete mode 100644 examples/widgets/animation/sub-attaq/pics/big/explosion/boat/step3.png delete mode 100644 examples/widgets/animation/sub-attaq/pics/big/explosion/boat/step4.png delete mode 100644 examples/widgets/animation/sub-attaq/pics/big/explosion/submarine/step1.png delete mode 100644 examples/widgets/animation/sub-attaq/pics/big/explosion/submarine/step2.png delete mode 100644 examples/widgets/animation/sub-attaq/pics/big/explosion/submarine/step3.png delete mode 100644 examples/widgets/animation/sub-attaq/pics/big/explosion/submarine/step4.png delete mode 100644 examples/widgets/animation/sub-attaq/pics/big/submarine.png delete mode 100644 examples/widgets/animation/sub-attaq/pics/big/surface.png delete mode 100644 examples/widgets/animation/sub-attaq/pics/big/torpedo.png delete mode 100644 examples/widgets/animation/sub-attaq/pics/scalable/background-n810.svg delete mode 100644 examples/widgets/animation/sub-attaq/pics/scalable/background.svg delete mode 100644 examples/widgets/animation/sub-attaq/pics/scalable/boat.svg delete mode 100644 examples/widgets/animation/sub-attaq/pics/scalable/bomb.svg delete mode 100644 examples/widgets/animation/sub-attaq/pics/scalable/sand.svg delete mode 100644 examples/widgets/animation/sub-attaq/pics/scalable/see.svg delete mode 100644 examples/widgets/animation/sub-attaq/pics/scalable/sky.svg delete mode 100644 examples/widgets/animation/sub-attaq/pics/scalable/sub-attaq.svg delete mode 100644 examples/widgets/animation/sub-attaq/pics/scalable/submarine.svg delete mode 100644 examples/widgets/animation/sub-attaq/pics/scalable/surface.svg delete mode 100644 examples/widgets/animation/sub-attaq/pics/scalable/torpedo.svg delete mode 100644 examples/widgets/animation/sub-attaq/pics/small/background.png delete mode 100644 examples/widgets/animation/sub-attaq/pics/small/boat.png delete mode 100644 examples/widgets/animation/sub-attaq/pics/small/bomb.png delete mode 100644 examples/widgets/animation/sub-attaq/pics/small/submarine.png delete mode 100644 examples/widgets/animation/sub-attaq/pics/small/surface.png delete mode 100644 examples/widgets/animation/sub-attaq/pics/small/torpedo.png delete mode 100644 examples/widgets/animation/sub-attaq/pics/welcome/logo-a.png delete mode 100644 examples/widgets/animation/sub-attaq/pics/welcome/logo-a2.png delete mode 100644 examples/widgets/animation/sub-attaq/pics/welcome/logo-b.png delete mode 100644 examples/widgets/animation/sub-attaq/pics/welcome/logo-dash.png delete mode 100644 examples/widgets/animation/sub-attaq/pics/welcome/logo-excl.png delete mode 100644 examples/widgets/animation/sub-attaq/pics/welcome/logo-q.png delete mode 100644 examples/widgets/animation/sub-attaq/pics/welcome/logo-s.png delete mode 100644 examples/widgets/animation/sub-attaq/pics/welcome/logo-t.png delete mode 100644 examples/widgets/animation/sub-attaq/pics/welcome/logo-t2.png delete mode 100644 examples/widgets/animation/sub-attaq/pics/welcome/logo-u.png delete mode 100644 examples/widgets/animation/sub-attaq/pixmapitem.cpp delete mode 100644 examples/widgets/animation/sub-attaq/pixmapitem.h delete mode 100644 examples/widgets/animation/sub-attaq/progressitem.cpp delete mode 100644 examples/widgets/animation/sub-attaq/progressitem.h delete mode 100644 examples/widgets/animation/sub-attaq/qanimationstate.cpp delete mode 100644 examples/widgets/animation/sub-attaq/qanimationstate.h delete mode 100644 examples/widgets/animation/sub-attaq/states.cpp delete mode 100644 examples/widgets/animation/sub-attaq/states.h delete mode 100644 examples/widgets/animation/sub-attaq/sub-attaq.pro delete mode 100644 examples/widgets/animation/sub-attaq/subattaq.qrc delete mode 100644 examples/widgets/animation/sub-attaq/submarine.cpp delete mode 100644 examples/widgets/animation/sub-attaq/submarine.h delete mode 100644 examples/widgets/animation/sub-attaq/submarine_p.h delete mode 100644 examples/widgets/animation/sub-attaq/textinformationitem.cpp delete mode 100644 examples/widgets/animation/sub-attaq/textinformationitem.h delete mode 100644 examples/widgets/animation/sub-attaq/torpedo.cpp delete mode 100644 examples/widgets/animation/sub-attaq/torpedo.h delete mode 100644 examples/widgets/doc/images/factorial-example.png delete mode 100644 examples/widgets/doc/images/pingpong-example.png delete mode 100644 examples/widgets/doc/images/trafficlight-example1.png delete mode 100644 examples/widgets/doc/images/trafficlight-example2.png delete mode 100644 examples/widgets/doc/src/animatedtiles.qdoc delete mode 100644 examples/widgets/doc/src/eventtransitions.qdoc delete mode 100644 examples/widgets/doc/src/factorial.qdoc delete mode 100644 examples/widgets/doc/src/moveblocks.qdoc delete mode 100644 examples/widgets/doc/src/padnavigator.qdoc delete mode 100644 examples/widgets/doc/src/pingpong.qdoc delete mode 100644 examples/widgets/doc/src/rogue.qdoc delete mode 100644 examples/widgets/doc/src/states.qdoc delete mode 100644 examples/widgets/doc/src/stickman.qdoc delete mode 100644 examples/widgets/doc/src/sub-attaq.qdoc delete mode 100644 examples/widgets/doc/src/trafficlight.qdoc delete mode 100644 examples/widgets/doc/src/twowaybutton.qdoc delete mode 100644 examples/widgets/graphicsview/padnavigator/.prev_CMakeLists.txt delete mode 100644 examples/widgets/graphicsview/padnavigator/CMakeLists.txt delete mode 100644 examples/widgets/graphicsview/padnavigator/flippablepad.cpp delete mode 100644 examples/widgets/graphicsview/padnavigator/flippablepad.h delete mode 100644 examples/widgets/graphicsview/padnavigator/form.ui delete mode 100644 examples/widgets/graphicsview/padnavigator/images/artsfftscope.png delete mode 100644 examples/widgets/graphicsview/padnavigator/images/blue_angle_swirl.jpg delete mode 100644 examples/widgets/graphicsview/padnavigator/images/kontact_contacts.png delete mode 100644 examples/widgets/graphicsview/padnavigator/images/kontact_journal.png delete mode 100644 examples/widgets/graphicsview/padnavigator/images/kontact_mail.png delete mode 100644 examples/widgets/graphicsview/padnavigator/images/kontact_notes.png delete mode 100644 examples/widgets/graphicsview/padnavigator/images/kopeteavailable.png delete mode 100644 examples/widgets/graphicsview/padnavigator/images/metacontact_online.png delete mode 100644 examples/widgets/graphicsview/padnavigator/images/minitools.png delete mode 100644 examples/widgets/graphicsview/padnavigator/main.cpp delete mode 100644 examples/widgets/graphicsview/padnavigator/padnavigator.cpp delete mode 100644 examples/widgets/graphicsview/padnavigator/padnavigator.h delete mode 100644 examples/widgets/graphicsview/padnavigator/padnavigator.pro delete mode 100644 examples/widgets/graphicsview/padnavigator/padnavigator.qrc delete mode 100644 examples/widgets/graphicsview/padnavigator/roundrectitem.cpp delete mode 100644 examples/widgets/graphicsview/padnavigator/roundrectitem.h delete mode 100644 examples/widgets/graphicsview/padnavigator/splashitem.cpp delete mode 100644 examples/widgets/graphicsview/padnavigator/splashitem.h delete mode 100644 examples/widgets/statemachine/CMakeLists.txt delete mode 100644 examples/widgets/statemachine/README delete mode 100644 examples/widgets/statemachine/eventtransitions/CMakeLists.txt delete mode 100644 examples/widgets/statemachine/eventtransitions/eventtransitions.pro delete mode 100644 examples/widgets/statemachine/eventtransitions/main.cpp delete mode 100644 examples/widgets/statemachine/factorial/CMakeLists.txt delete mode 100644 examples/widgets/statemachine/factorial/factorial.pro delete mode 100644 examples/widgets/statemachine/factorial/main.cpp delete mode 100644 examples/widgets/statemachine/pingpong/CMakeLists.txt delete mode 100644 examples/widgets/statemachine/pingpong/main.cpp delete mode 100644 examples/widgets/statemachine/pingpong/pingpong.pro delete mode 100644 examples/widgets/statemachine/rogue/CMakeLists.txt delete mode 100644 examples/widgets/statemachine/rogue/main.cpp delete mode 100644 examples/widgets/statemachine/rogue/movementtransition.h delete mode 100644 examples/widgets/statemachine/rogue/rogue.pro delete mode 100644 examples/widgets/statemachine/rogue/window.cpp delete mode 100644 examples/widgets/statemachine/rogue/window.h delete mode 100644 examples/widgets/statemachine/statemachine.pro delete mode 100644 examples/widgets/statemachine/trafficlight/CMakeLists.txt delete mode 100644 examples/widgets/statemachine/trafficlight/main.cpp delete mode 100644 examples/widgets/statemachine/trafficlight/trafficlight.pro delete mode 100644 examples/widgets/statemachine/twowaybutton/CMakeLists.txt delete mode 100644 examples/widgets/statemachine/twowaybutton/main.cpp delete mode 100644 examples/widgets/statemachine/twowaybutton/twowaybutton.pro delete mode 100644 src/corelib/doc/images/statemachine-button-history.png delete mode 100644 src/corelib/doc/images/statemachine-button-nested.png delete mode 100644 src/corelib/doc/images/statemachine-button.png delete mode 100644 src/corelib/doc/images/statemachine-customevents.png delete mode 100644 src/corelib/doc/images/statemachine-customevents2.png delete mode 100644 src/corelib/doc/images/statemachine-examples.png delete mode 100644 src/corelib/doc/images/statemachine-finished.png delete mode 100644 src/corelib/doc/images/statemachine-nonparallel.png delete mode 100644 src/corelib/doc/images/statemachine-parallel.png delete mode 100644 src/corelib/doc/snippets/code/src_corelib_statemachine_qstatemachine.cpp delete mode 100644 src/corelib/doc/snippets/statemachine/eventtest.cpp delete mode 100644 src/corelib/doc/snippets/statemachine/main.cpp delete mode 100644 src/corelib/doc/snippets/statemachine/main2.cpp delete mode 100644 src/corelib/doc/snippets/statemachine/main3.cpp delete mode 100644 src/corelib/doc/snippets/statemachine/main4.cpp delete mode 100644 src/corelib/doc/snippets/statemachine/main5.cpp delete mode 100644 src/corelib/doc/src/statemachine.qdoc delete mode 100644 src/corelib/statemachine/qabstractstate.cpp delete mode 100644 src/corelib/statemachine/qabstractstate.h delete mode 100644 src/corelib/statemachine/qabstractstate_p.h delete mode 100644 src/corelib/statemachine/qabstracttransition.cpp delete mode 100644 src/corelib/statemachine/qabstracttransition.h delete mode 100644 src/corelib/statemachine/qabstracttransition_p.h delete mode 100644 src/corelib/statemachine/qeventtransition.cpp delete mode 100644 src/corelib/statemachine/qeventtransition.h delete mode 100644 src/corelib/statemachine/qeventtransition_p.h delete mode 100644 src/corelib/statemachine/qfinalstate.cpp delete mode 100644 src/corelib/statemachine/qfinalstate.h delete mode 100644 src/corelib/statemachine/qfinalstate_p.h delete mode 100644 src/corelib/statemachine/qhistorystate.cpp delete mode 100644 src/corelib/statemachine/qhistorystate.h delete mode 100644 src/corelib/statemachine/qhistorystate_p.h delete mode 100644 src/corelib/statemachine/qsignaleventgenerator_p.h delete mode 100644 src/corelib/statemachine/qsignaltransition.cpp delete mode 100644 src/corelib/statemachine/qsignaltransition.h delete mode 100644 src/corelib/statemachine/qsignaltransition_p.h delete mode 100644 src/corelib/statemachine/qstate.cpp delete mode 100644 src/corelib/statemachine/qstate.h delete mode 100644 src/corelib/statemachine/qstate_p.h delete mode 100644 src/corelib/statemachine/qstatemachine.cpp delete mode 100644 src/corelib/statemachine/qstatemachine.h delete mode 100644 src/corelib/statemachine/qstatemachine_p.h delete mode 100644 src/corelib/statemachine/statemachine.pri rename src/{widgets/statemachine => gui/kernel}/qguistatemachine.cpp (67%) create mode 100644 src/widgets/kernel/qwidgetstatemachine.cpp delete mode 100644 src/widgets/statemachine/qbasickeyeventtransition.cpp delete mode 100644 src/widgets/statemachine/qbasickeyeventtransition_p.h delete mode 100644 src/widgets/statemachine/qbasicmouseeventtransition.cpp delete mode 100644 src/widgets/statemachine/qbasicmouseeventtransition_p.h delete mode 100644 src/widgets/statemachine/qkeyeventtransition.cpp delete mode 100644 src/widgets/statemachine/qkeyeventtransition.h delete mode 100644 src/widgets/statemachine/qmouseeventtransition.cpp delete mode 100644 src/widgets/statemachine/qmouseeventtransition.h delete mode 100644 src/widgets/statemachine/statemachine.pri delete mode 100644 tests/auto/corelib/statemachine/CMakeLists.txt delete mode 100644 tests/auto/corelib/statemachine/qstate/CMakeLists.txt delete mode 100644 tests/auto/corelib/statemachine/qstate/qstate.pro delete mode 100644 tests/auto/corelib/statemachine/qstate/tst_qstate.cpp delete mode 100644 tests/auto/corelib/statemachine/qstatemachine/CMakeLists.txt delete mode 100644 tests/auto/corelib/statemachine/qstatemachine/qstatemachine.pro delete mode 100644 tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp delete mode 100644 tests/auto/corelib/statemachine/statemachine.pro diff --git a/doc/global/manifest-meta.qdocconf b/doc/global/manifest-meta.qdocconf index f5e5dbf8db0..7eb4ca7be12 100644 --- a/doc/global/manifest-meta.qdocconf +++ b/doc/global/manifest-meta.qdocconf @@ -103,7 +103,6 @@ manifestmeta.android.names = "Qt3D/Qt 3D: Basic Shapes C++ Example" \ "QtWidgets/Easing Curves Example" \ "QtWidgets/Editable Tree Model Example" \ "QtWidgets/Elided Label Example" \ - "QtWidgets/Event Transitions Example" \ "QtWidgets/Fade Message Effect Example" \ "QtWidgets/Flow Layout Example" \ "QtWidgets/Font Sampler Example" \ @@ -193,8 +192,6 @@ manifestmeta.ios.names = "QtCore/Contiguous Cache Example" \ "QtWidgets/Order Form Example" \ "QtWidgets/Syntax Highlighter Example" \ "QtWidgets/Text Edit" \ - "QtWidgets/Traffic Light Example" \ - "QtWidgets/Two-way Button Example" \ "QtWidgets/Completer Example" \ "QtWidgets/Custom Completer Example" \ "QtWidgets/Undo Framework" \ @@ -242,8 +239,6 @@ manifestmeta.thumbnail.names = "QtCore/Contiguous Cache Example" \ "QtGui/Raster Window Example" \ "QtNetwork/Network Download*" \ "QtWidgets/Dynamic Layouts Example" \ - "QtWidgets/Event Transitions Example" \ - "QtWidgets/Two-way Button Example" \ "QtWidgets/Validators Example" \ "QtDbus/*" \ "QtHelp/*" \ diff --git a/doc/src/images/animatedtiles-example.png b/doc/src/images/animatedtiles-example.png deleted file mode 100644 index 79e5313d8e2c947d23f0e012e762d6009e7e9a26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158209 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

sOovJ}+putyiEKLZ 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

Bx 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 z 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 diff --git a/doc/src/images/padnavigator-example.png b/doc/src/images/padnavigator-example.png deleted file mode 100644 index d766557cec793ca4d227381b520ef34bf81268e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 219818 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ÒWhX zWQvHh2fNt_20Lc7v(LA0*AXS4DWDGnqp>5&Rx_}eF(d)w=tO7&a)M%qnfwX82zCDsqf{krcuMoXwq}Cgp@<`@#c+C_ys;b6EQLD&6ef)^l486qgj-VD5Hql(r0Yu?$E(8*-YGR8d4jx zZZc<@#xM4-$UqshnAGRbXK%iK)2A* z9)OJ;cbnGxrmdNO*48#-#HN8{KN>y&Vq;B>k+hpEC-Xm?UHsJ#$GzbY_WpZd5+p(y ziK(eC>*`YESJh%#=GV*ox~%7=E|d{2W=siXEFvtTG$Ax1Tqh$*y2A8xK`)--YBg1t zuU_r&w7QqR{_-z=`};3H|KyX8wzkLla`pPj%joNu=IxbA{JLzC~^#4(RkMv<`OzjyBoLeNo3R8>W&Ekx#oF_s`T z29-2go7!ll3?bMuC5oit{IWop(F zz3y1?z9nW*zB$k*iFgD&h6?FQpwhMVdYp=@`wujjrkcsIl_LD|7SQv<(qq6d|9I(Q z4MI_>DPxRrqm|R-*V=V^pi#a#&)%XYrw2`b-%AcV!~U~@7yz4-xWTYC8*DG3fM`n1 zXt*e=)6+>Zc^W07v|kT9ql_{_iCfs*=h;>`E!9PPsXTcC@LKZ~*1m*UVtBNyvcchgNrK}f_UzYhrwYskIdAVE^ zt9f27i+WWU%Z`oQN|SL)6HXK-h7m!a@L{pC5;G7N{7S=jEI;Y8&S_d;XJij}N*G(XxRS<>xT<_Jy+B@Gd?M&q-2u(PwvquBNC zBQ~}2o7zy8)SI}lFX?v22C3A#uBBCtq?~ZZC?^0qsuEt7T*~SfN*>^6OOGAjrspLh zo>aapt0>Y@6emfdrE6!Ezp@9qVeOMre*W2CfBmQb@bCU70xh0z9k^B-Tn5Lxh=?2c zeTUc&9zHN;ZVXULg%Dw+fYvHRJ$win{g0svdeQDRAd&(5NlI<0Lq8Q;-T7>G@rQ4F z5y|e}Ls|fR4XU=|l6jw(a6k^oKy$mtA?(GqjC93S6~EtWu4*DnC03hjVj{GG7vG_WJ~JMCU&oyp z>TFD?I`d^>J`ab=TB%!qX)6iF4cPII76MR9=>?hmfI!pY5!X(81?@+O0Z)UB4G^P; zB@E@xZ6I#dk_P~4196jXL4U5%))I+XF8I|6zWiU*_|dKXFOSn<9CwIQDi1z#z~YV9 zoBYM$_ua%|_Zn0(lvJ`-lb4gp(~Gk|JvGyBhuQbzQ865HO4~9U=)tg+k0D63Qp7S# zx3ci=&qeeNjcXw~2sUL0iN*0vTQfgvYtNoM{q0}=K0v%53hvPR>}$fd8Mj_j2z4``|CPTbvuEgO)MhTz$1g5!T`dy##fCu~?pd{}b%p zihgsKXZt{gU{;_R00)STj*NP@GcB1GOjYl8u4}F;sw=7rs&Y_;R28a9Dq(abRaNNv z-JTm=B8rq71j8t1AY(Hl)zhS`PjZ+~POh)Igyw1StY@yaNBqvg@Zr4xVnCh0qgzLN z!(qS7t9-U7Urn>~1%U;2fjeX~V8UWp8X|$5U6gN5ia(w%r^619qc~KKH5a~_;XFLv z26zlVyO|qr{JPKm`cM7z{p-6AcLV1B`Jsu;`ly>cL#Fj+Kp>Mw!t_`Bdza+W%;xpt zaZ%?*cX!y`?M2-r%3>??K?vQ5RKQKwxVff{N_4%3V$(utyj-3w=5J=x=WmL$ zmkE47-g0aS4(YK0>T? z<9ciFms9E=h_dATSvQ@`7hhdnls`qCKkoC}2Qd0Kz)Mg7fITQJ! zF6OIZURCp2tSXgDBdkY=)INMl7-5{!h`ig$yPY$x2^ZKiAO#NcsyChV7UxD>u3-Nn z9qSklNA3b_-=g#fD{hc_Dm(#`d+2!KN#o*<%E+(spP=Y~|4BTt2bS3nY ztL1m+%Zn_@``vCD+hthbG4^?P-5&RZlCzUjTb*EjuBq3MbsQNHKCE)X5dYDRo7hq9 z5Mq3`*MFW^-8{Fj1J8^VENr8}57$w$rdr&YrfFr13}Oq2aTCHfqNr^nYtW6DG!^&m zUk&>C)1OvvpU+?YxAXp;!_k9-;hnACem@?hETNPmq2P&-0XMo78uV{&>smm}*K$ZL zYbi@vEvtI5Dz9hd#bt4Eu4X5hI^EuWySo&jE4s&L*iP2AZy>p$Xka$R>ot zy1sK==;B=If8N#}eSB-NSa>1e@VNBaO%6%FHB~1;H15lu!R`tWS;CXUQC-PpErk$T z8IF)RR$fZoP$CX~-J&RPwmZYW@yx=C!Tn)Mm6fT=d0DNlCaa>lOfS>La!R9BoMN0L zkrmAfjU1k8j8f|=H#8+d5C{XhpuJofg$ps^Af&!;%3g%J>~42tZyG9lk87z&Eh!qt zDGlHldC;Pep*Pi;i2(c)AfVRR)Nb0tre$BGBpPQ6#?_i`xO|ufO_J zt2Gr{%x@o*OyH(JgzIix)u=`{DDL2;UGW1NR0v8K6|!|6Rea|zwIjh*RZvPu8m%ID z1_hp6cm8-jUi9&B8xm=Rl9iGxtY)IPR^>!jGnvn-d{ySFs#q3PUW%g9wKSj+kT4{S zl86DPB%)Muq9{s+%=7CSt(DZZkV~Q_aZ!*Hs+LLBGmv(&D2aOnS>tLLQwe!`ef8}8 zQZ8~*R-9S8LNpmQur&ey>yh>II4A z>#v+yf92HrOQfFqPPg{l%Iw(#`<}hzHEV}2TpT_;tggj}FMkmbkWCZFdhMRG=F?1|bX7dG%$rc- zQ;JLm1V4ZpLpF6wr0HnlIju62>ab=jd3ALZXWJLn7SEqv;~BXBP+8$No3HS#a4wiV z>ARum6xF}NYX}=5K1W05hrHyn%fP>l(ju4h7@Fgnv&rM0Q8V}?YFRXOqSzg0;zV4C z4y1uNs=PnJ7rqeq#k7GKIMBcn9!+PHX#mNSy4kIJWVW5p`F(d(2inJ9szKj{o9!ic zzn9v0p_q0U5^OgP7+DuZrawqWLK&xp5UY;3^SW@kjIh+%Y)a;vg(VV+Z!xaC69DeZ z^1OZHwHJS5Er08ghxb3mfT5$vTjk7RNkv~s?L`_0_TDbtQe2E^qs;SoC>5&GUiQ!@ zM7UwTa<}nAEz6Srt(VTs>+Y2>OXWbf9A8R{m-d}nNz3#0&#zgTuhJ`?rrVu9ed^R1 zdRVH+`2346e&hKUUp-A^c^oo?El?)@oy}0r`mloo$!M$d*&Y%GNmxVOf(wk78hPfadPG??V{F_g%LOYYmg{Nb%$|+4JsqX5 zKeck`)V_VE4;(zR|G>C!f1!d3T&mlahD`}^Dc^eP#lz=aht5arzBwF??ub<9V{B88 za&x|GTdWn<8lAlK^7HUGNMoHUK0NAN2*}Jv&V2xnoeY|tWSO6H0wg|kMRP)V&G0e+ z(P|}tT{XszFRgom5DzgoSm5kfBTR~jJkI#GSrP#!1~sjkHknhUhfGDE)#D4zstL|q zunq z!)|4%hy`nH_T)*ruHxnWbMD6;MgCcRy5pMs*bpxeyQoS*eh+}h?%i_4%oB+9DQht` z%6nU6{EN;}og%=Vz}==#uH9AD2aFd@p+w7qi<%Ug`|iM=JRe?u>GX5YzTCgKqzL4J z6MmQVaXdu@0jP&(Y2<7`J$=J@8G=_*oEF`oR_yqT;KTaK)HmdUb$%8#3Yf5rKD4UP~)I@aSmD; z<^!ufahNTQygVc^8@sN8uLk12G`M<~gijBC`*>;USD!YD_)*VAsncPAb#y>E524qx zw&y08DR79vG}Vsa&%an zTrAT1B5jaY>Z`+YNv@;)IL;)&?vP=quy-4nygk+; zpbj9i@6r8gIgREzV$`O{U}}WFv-H&+D!|cynOkYh{F4UE4MU_FU2WCS8?`2%-UzX< zp7bLLr}zeC-icM328(Ugy#g?jQtE=OPb6KElU8^HaAqo|Bl+6v-f-u>{Rfc!RT2bC z)?9+r0 zH~B2RQkga8*$e7#;rNx^+3wINE5&s;Tx&OD>JVw_W9@O>p@ugvM|s9R z$*f6a{l!A)A*ZkusID0Fhz5jr3-~<=S;*OP8ECU|5%G4J*Up?;Tdbe{&Wq1KKY#AI zXZG(ukCy42#}{9EX6&exH=%kjm5yCe>X}?j4s05`gc>kaV4K_eWUDXE*$QzN9dwH1 zfrhm(k@=OJAx#EQK3E$3kw?)F$x;n+jA|6@^N$=?B+VZ^cI=CP{PA*5W1aR`7;UoM zuOc6taKt*p&4({&bIWzvzP`^Zd+1*}z&tJ`)XZnj(5gFz?rZ9^bHHSXEGlYB89N8bqCoDfe`6aG2XpPza91-ddso2VXHr!}n8 z&rXd?c>kSY?OpfWTe|0k5Cb{k9*(4M;RR`_)tL~R7SM%`tP3BeU=PBb;q05@A)O^| z)ca@oO=C6nj*9gaL2SH8S&^pP_skf`(^wDB?dEEVy?gc>m4&8BS*lPOrr;5nBQ|w|L-5f@ zzIE*lmkTY^;l<S7}rE)Gy?>tkGsp39CzeZoFr2&B0p|$YQ=FFa~kt3BA1X* zuC8s_g_S^p96(Bj1qPLF) zza&~r0n?<$piI*TnSIfWqE7+q2Ar2qD#%A?rUw-8F z*S&!@_8-_UK5MzFF$o5+d4GkQ+XJzCCs@OwAN$=e|I9CZ-F{FT5H&(&t7ksfGAIe-tQX_5DQRo3)-!2 zi7R;qUK`_JQX#k_-3305_nD$V)nYvl*mBH33uZqMX~H+31xA|?yX$4&#@Jn&wQNqD0 zm+uEL9rbFdM|cJB6E%!OItpj;ZLtPIM%7?H^U0OtkA3@+%MJxM-7yL<$%{EyWM69Y z=<=2m;^2rSs>}#+Hq}I^AK$>YV;Sp6dEHW)q%#9bYbC^9 zg%$C2R8!ZP4&B;>K`36$8{GMHN z?Xkzc@vTcQJ47xesi@DI>x*%6a;;i6m7*8uGfTxB8vjx_&ax~?~fAa7B+kf+GKlbzGoO#6}G!Xf}Q%oA|mlw&Wiha~Vy!i&aexnoj9MD^i4<&Um#Ep78s=|N9=e|99bt zMotdUYL)PU)CNLK=XlXCC&Up506h6a29S!D(8PQ+paiiWOs*T`rf{8b{V^bAEOQ+& z=J)iy*=|oKmmxtJX-oaAn+sGl38MeE>DG$&rjCwon1mGr2@au1+fSoj_DD{PVKML= zt*c&*xUQndfgHYW0?iQueU}2bjF7&UQU{{{F&`Z!%J<%P-^YIU_doKB@89??2T}sP zF#xjRXoq}b&n|du>1k;d0oZnW=V}YEW0;RVhg%QY6kQjp2Z;LK&%qHlgxK^|SP*U4 z5=gN<#3Zs#KbJ^lS5#y+uZ1Q>m>@G2qDf_?rhy&a0&B|eX7JqQuDkC0;%EQU+wQqV ztJXuyAlOl*Z}!K>hV_ZDFzO6zCcRoP2z^4UngAFlggDkR|D0p?RZ%8@AC~i|Akiw2 z%*}pedN`(DFY|~0?u!>*bk*&5yq>dt}USGrd z2SSRmY%Tm!bFa>CnIP+_LWcO_hd%rdKSC4b{KJR)M9S!uaRjO2n#DHc;UZ?LE3nCp zMF2RT4d(NofSlaZ52P@LC-cspN%guLuK(oydp`bqUw+%W$N)BWL=Qv*+0{dpA{0xZyjT{}?U0Fp9^Mnmh{cY@IzO z`tLtyO)-ZfAHIMaA(_7sN@qo2YgkQYuYlK6PP5-iJ~!5Yp04m;VC~p-*L~~hlb?Iw zYwy1A4)CyMUjZRjPm76a0vc8I0L$v5n{Bf94ih716V*f*FEhFj%I!uS)JDvbEpCnVo19`{o+G!_?|a{30SNzNGcn8E}tP|lywppog!XSzF*p z2$(g7tmLSSWSVwD3}dCVfO54_2iq-U;q(`aVMM$_7#oAfO`6q%Z6#dcID^nk{D|Gc zl%9F&g+KrD!>_sM$m?GJMmmqAW^)^$i?|<9kfEs?J|3yS*b?+TlUwcV5>G&j!ZDGOhGbMe!6FM z6ue1qQJf;n%w|wobRYVKpZgd83U zJrQEUFwqF%X2(=<#K~1KHuehCSa8)m&eG>H!v9;WA?U^(`vhzAz}h|Uz3fzv*o?8NbB5QC>=y5@hwYL}jT;`vF4vk!fDlD?ff zkhe9#o<8}4oyiu?`XX_twTmyg)b`Q#Ww+dV*F_gy!i00aa^VFR9y}yVPyg}o+(WkY3|3EQ<40qqsX%$y?_#IOXWk*FiE`S=kFD0XI0(lD{KZt4Esh zDoGpvBL%T2aK@kdnV&BitJt33VG z^Q4`4{|7!G6th47f(y8lxGjY_Vr1rV!?bE$%NmEa#=Xr#ah$U#CJHP}ram%~LVGz3 z0oHsCQ6;aK5C6ko`1ODK&))Uk+wZ>bc3w{+>@L9XBNnV}AlP}=I)XcuiMqU5OIr;S zuG4@yJi>j<&2__!IIV*U5MLboWJM2-+$@lmyxOc@P!vr zR61gr2?lOJH-%LS65Og@Go10Q;)y5Ltg&YMQ=bfLv$L^w&hu z@%s-x_w2WcB0u@~a}9xu_>YK>uXX95lGc}XU6efl)}@zSjxYTHUW9JD9+${D(-r*6 z2;zr21=dR>Srij@qaWw@x4Qd#_wK3UGc{O{5@%8U59;C6a~gQ?e1b?$pfM8)>e`$> zv#pP|ZE!J|3RnsPaB>V`!y}}N`EK*Y$1a=q0Nnz$_qiI=p82>jL_SC$&d$#JI+Z<`Y0n#xV~w`r9_^o5F48QbM( ztV=EaHdhF-w^nOrup9soPd*vOz9u7L3D#@j6hpkLRoy!@*NJn8p?L0h|F6&gzz2Tl zvMU%TmtAoM-NPIeH(;t;nX`Xg;nHe-RwEv>vEp{4vRkDq41Z~5gw^yb-uPoOJtZS% zpuM6&My7A14Y=mmHUGo^@;^QB@%umes}CGKcJbZsy$xbn>73sUuZigR8uYk<2?E0XRjFg!#vW$4sf`Cw~st*CeKhZ$0_E0Wt^?TC$rzjbq%}RdTH=edg&GX`6&) z+Iia@cU^iZhu9rHOuX6!&@-!ZuW=WxV#O|FQ!pco0u;pZ<9dl2YuQ7el3}gi6l-sJ z+dKd2J5(w-z5Mb^^h$5O3uz=Wqg`aEfm))^xHVJ7s;)}ESK^5~rHjRUq6Z)gDd-GK z+^I;~i?PQW5zVaDQ7r@7TYwckJ}F+i!mJ*yq6(FaZCE?bVctxYn>@#Kl_FvR7po(+ zC)5JKAeLRa5wpgj@q#yslC8yv9* zX-rjJPzdUFMPIefaioh?+Laqh($z-)_WEVaG%-vK*?VOp=AfM(jAJ<2R!Ol3y?7{G zQ_(m6@|V8;)DtiNtsnfs%P+r-P9x@v;`$1cNp_%-Rdca2=P{5Xoyri5L6;Yn5S8+EYwM(I5z4>Jtwn1Kkr()Ebs-wbohe92M!!y$v-c}=BF&N4k@ncIE3ol z{18BeK@t&mDlp?;c4h>B56Q6BZ-cc%ht5xl%2OStlh@aof^gM3@xeND@I0OsJbgxD z^+;r`VwZd87D1yb-)DGerIx8F5-eSCiqc|fSisOkFwf{ujXCa!YV;fftrR#(1S#s| z!Y942gZLXabLnV4X36>i>J9O=C-BMS9|kz)^&H8)GA`EYILV|NrKR#os6YILlrGb6 z+L!djW|UN(pd?iB45d9Gp9;<;w4hMww9M;-uUWt1hC4Unoo%C&0KeVY?#`?&z!ytS zA5NYDILud8JyQfDx#v9iE4(z#Is{A(3ee&=2H z-Eq(Ny-rqC0Xhh=me_&Ifz~v2{>u4Punf74)Jn~lK<*gANb^pKr z`X+U@6z)KN$imT9YU3KDX%KJhx#9Y&-0lc@^WsY{)gq~BaN=09qZY%;3*>yhLR73{ zxMl==o~8GsRC{tTPeJ&gQSk}7(wQ@-=`{hI)xE2ZWKNaEIcZ2<9?U?Ek`1t0^McqY zS0cJU)w!8Q(RV^>^dy_Xr6!BT-~lnLrCnf+5VUXKDxEo>^Qt_|1~@5kurCvD!W;x9 zb@Gjz_rZ-?*|X69>#Im@gJMrSf(tR$%6)J8A_lH1i*;UdsxGpIts%0!5=|99@VJi&rO__v5%unbz_K5lUerMpjy|I50|YGA705S@!QcSR@4! z@sVm3!X&S>y^(`W8r^{7KR8um>3go^PipG}2Pk>^sg-fYJo&hhI!^J>6)u-SX9$C{ zbfN+K6j4mP!cO^OBL8ZUOf#oi4?q0%n{K@=N+i;qk@hcq_%rQ8ydB&8#v;@J-1DGS zT2U#oAIPWT#+z^aL;{%1u6R#Jk;g`yH>n?X@qy@WScSXDA@3ltvBX zPK>FG^f!4d0QlZLdmG+?m$XL0jRUYNHSU{|M|{6=wvALvy&`#+X2cApUKIjP>S|vA zS=GvD?q7sbVtAzh<(kmdxL@&ZtW~rF9hMJ}Bx&&V-lLk}FrUk$ z3O@>z_s^qlV`oeoTkUpgyF*|fa0~7B_1C|#qpF)77ldA4Kf}-!Tcsy^wrWT;$YrSt zu)0`|hvFoXP3H0vH{Nv9&9~nC@jv_z|Kb1n$_=l5hR|^2*u_VWT_Pr+AjCKeKT*A{ zCB!F=KkF+`*xTbTpY{YD(}V?J@ef_($rI0es^qpXTF~~VU@VT-%DHj*AQtEx+PM76 zD{}@t-)~7lQ?UeqS6p>f5)SpUOKzfFfBOSh`V`;0Z}t2OFQA?eOLv4Dmc9(EHO>f= z!+kuZtAVyuizvHx+j`rc;fhcOD)~%0IDLj!> z<^szrrsAtw+?4$27oLN&`(BYik>9B=1nomiICkHf} zbSk_K?)|>|?tafbU;R&i`QX5FXl)fDV zY1ISN4`Q(w^ud2;A<(Mrj;J1nta^F3UL5l|W?B!97%N`{WP)*p!wA4HgfAx{2kQKv zGyvIJ@~B~MN*~}J(0k$Luth}q$naVdQb?rOk(t~HF{0C~73n($%wH30GLaR=P>GP? zYedh-P2<&kSCdJwq*|Ov+`@FDj72!`beM|H8q@sdxyXBqScusaM$bn6RKz0_)WBoX zKqXlv`VKyrLm3onAj++hm-dM;E5fI^W)=bw`5ME9IUD8(0qA=~f`sY+Tu#249X}aA ziyI?Pf**`LqjYtQH9a=4Cggad4#vyU+WMpzS4G^;XmOe;74G%Y*WYmG@e^NYB$-}+ z)Ded}u%jNZiidFeDy}u}hs3y;Q;)Mk4VOWe5zl|aO*h_f)6Hb|rL@gwPO*gh?6;p` z*O}zu$>A7pwW1~9%fu^XQF@CXNG*elqq6+U9XZCB3apqL3Pi%uO5KyGbk*`$4s@tw zlFnf5sO@D-acCx!K2OL_WJ+de4ryhDxsvq-yQEP0Tad5i2IJ9#TZe%s;sEQoc~npf zjf}nzTXtaD_nLSXH>IA!qyvPQJex_nwUOZ`WOJkiTZSq+EO*&VM4>_ua-87{35`c( zLea9YRs>S^a<^!i13jL8>nVJ5)A99qKhCI~Gq_GCKo0%ZfjqUQk0xNGZBTcFmjwtT zB`OsyVOcsM4xc-nnx>ivFE&g%VLch!UW46`9E>A|JPnLJxOD~#3H&JZ6O1}YI+I6> zQ&rWJoi+_mDu%WGuZcBkjy2i<+^FlVkW)_XU+k#X5H^T8(_wSbtn7R2<#`Z(T%jAOCVKZhoP}JkW<%ZdvuDxgJ3LwY0 zmb)3!#HL+Ji&fUv)YcGtOUEx&S6qksHs?&*D-vg9on&qZ$MN-ZAGv@W-x{RvTve2` z3#iBvVp03CN?Ftp-PbrHRv+-2^9Z4Ey+37AI$kH+NY3Qk_aw1Q{gYlwS9a=T+Q!KG% zblvD+!8j$E9HWHT11o47S3}6wMAAavI*TCKwdAg0?r+_&va}6ZfGLjatg0(DacK#$ zL9zTbu|}=N8hssb({)st8}HRR=SpM<6Yev7LA^n7qyl)GRYr4B5!U)54xUh?vc6TZ zHZayq2*{}D#q@}+pS{@b7;6aY@6!OR)n4AIp;w#2t#i1IXNmsdWL@xW--rkyV#atO z@#)A7Zviy-M2_(c8yna!!FbDpovwMeO6TJa`C^E(rJ4?*qli~W(QmW9B2>uoEMdg5 za?e9I8zdOPIARdBQEFd7-;F6vr-RAg!}9s6y@So0u4s`WKEneHfVCgT^FKR8sR^SK>mp4v#w7S7s&=|7QtpK z%+e6lsqx%MWpvKR>1Pe&esnMj>VOTg_c|Yf(=n59AvH9^p^YmgrEx=2h@143+?OJR zQEkDh!DkA-tI0aNh{umcD``X?4+n6q5@<>A4XTB>zVu6B=oo&2bnysU2f3iBRzTST@7(rv0gzeC-PA$%UG>2%gXY!Q{Ar5w5ZDgST*w7}slZ z7zqJ|Qi7U%?^@Wn+VpL#{WY;ht;HJSzlB>}3$a=YCy{kx+X@AJ%d{&|w9vJ{8W1}4 z4c5BdVogOa#hRmxH+KTJ>~Le-CK?5LBx|Al=T)G9X@T-Tu~;)&0{A-n&uBz4WJj6j z%D@qGjLXjEJu=!hC6}!2RA20dOCfEr-BDw{xGOI!L-#7)|Qgm z4iYv{0-Iq-nk@%}?d*>F%Ck&cE5k<0Q_(qwQ8X2agHWreVW78@MiVzNDwB`tp1{V(hmjI1jUoGXJ=-3b|OHjjE2Mr#lWOPT^YuX@S5;bCd7j#i0WGkGD-q+ zCdGX=>ozk+P=Vvh;*y_)p(`ar7r;wJ)-ZXcIcci0m{5q=TVhM^0%mwN0NzCZN_N*7 zz*r@Oj0_sN%@Jg4UKR`vqG*;#hMLzcFfe2-LN>EC(k;K?0Ers9&RV3wqgaD;Ez&`! zoxn|0VU;30J$3TLU3dQ2H0isIeawH1j@X38TsE2-zIGx_HOgr$OiNZFj2CifS2Rxr zSSQ4xh>Obx(7$uOSfKz0$4BVluYc|6HP@J)TMsRogiKcsa1&BjxaTE$PQM4l2PYHr zm(m0VgTSNpMV-zMv+APytZPege-)-8k|Rvy-kF-^_HCktGCC#lV3m6N*@3`_+*1jIY3`J<{p9M&g>omRs%M_HOQO^{=w z#0bC2n8Y(xOCULeIYwl9Wp_IZj+lknk%7^T$bo_Pm2(J7E0E7Hb&&Q2-8=MFC0@=H zs~FM{HYq-6+eGH2#9y$mj1VTV=?<;!s4{^m{c1Bg>>g_=of~Vwh~aEIxS^=M!_B_j z0&bDJ1=Odjum%I@uCP{0p8{*50?r-uzdM23(&4srxIwc_e! z%11m?0E%eqdE!O9LY4_}aTB8@d3MqTFg*%SgAD}Q7}4jB-8n7RLOw9xDQjG6rPA3I zZ0jt*{h*TrHVyEyV#0;CmHsty=k&qqZ=-TdxT8mKaeSW?cO@AO_CocOEF^$|g{5`w zIS&^W;pTeL3y=JT%y`~Lrw-AT_4*KNWu z#f)~5il`ENoPAY>O+DeKOHg=)q@Jx?G?zKQ4ne}e0-~r~Ks$!frBFJjK0{YL77;GV zOKgDJ+1|}XAeX1^XDEUx8$ehzT}E&jV#Dm_bnmsrnn}ftO(_=>#?#Pa znB*h&d(c5Pb6g0oKwI=LouaN2ssxlK<30_)PT1e4T6T>1G_{ZOMy=l+C4<3o6tizq zu{=!)F~ody5k@2suzRePZfmTeZ3j1t(GIYnZ2>o<%2h%Bz*^ZY)^b^lfi>PESfk7B z2yR^N9dPSvxEb)LZ-gc;Lo#d2Fq-#&Z~U^#e2z8nI@tEAh9J{W%|W>B2i@8F8t<^i z64oOItXde|*h)Hzl-vLv4yu+)6Cz$G8as%J7-fks5^ow^*h3Ue_OYKlM~(neC&$s9 zrA=swt}M2{`K~q6XBX=bAY}FpuiXujfoSv+j7#YNdzLp#W&j9r%94g8gH6^t=h<|i zbviUzq6e&v7V}mUVH>^Dr1X;0tzdJlSH?itF!Uk;jV3VGsz6OlL7+vQGc7DNL#m40 zifaM4s5+Q6PY7ls;a;4U`1m?Kxs);y$_>6sdP5D=NNO>lx&^?HCEDJ})+h=%ErPMi zLEfc~rf`uv+`gg}dL;PW=5`2DOoZ^MR!gHCZOWJ^L*?cNvxQdAjB|UKe364KI9X7B z%ZD|B9bUqkj!Vdmk{Q8*(~M&D#yuD&c8j&rZGklxFSdglm|a_YoLSfcZj&UK4c59{ zVvRStz*;t}!G5?M+^{$RZW|TcAWQ90xV70K+%FAc0P3;GKzCu{!+elgoI0lQc5YvE z4HzL$&R2$&cMncDiXWf9gC;ZgL zavcty0_yNz1R>sB;fn!}z)Y<}5I&+2ffJoue0?rK(drf%;YR}o)-y&XJtK@Qm?b2V z7jA5nRo5e_(Z^An1ug-|LNW(*$ILNBBKsmyo3k*zMO#4v8?e-6F_MM5NB#P-x8U5) zR7S#33^ws5$}g{IQL@_x5fTQy8y1zW=jmq2vQm>{-g61pYLm=O*Q96EJ01FUUK1YDSbNAyxQ(lxb& z;mZQBs>U|*-co~y(A06lwXNZX=Q8>jaMRFN zj$b`w3gRgb($__Eip*8Vwl))A?XD#HBJ1J4MLh^l(5=@4Sfb1UH5 zkYgA-T^yD3v!<-4+G1r8HC`D9dQ(Rr(h{h7zybj96*yMjpGptKD??BN)^bib04AIe z2gXLe-WbQ!yP_}fF9QgH9kJD)*03aOtb@iz7^cE!wnA!xM36+YgZk)Q95tg*3ZY2CnLgUZpkV48P_4( zz(kY70~6LYjFF6^1llBVdjQs;gn^5s4?*5tjU^;8_Z;;PKlHWtr@s@2WoYPo=@-V5 z#U!ZYl1q`vu`FmnNYNZ$F4~^!0VbbQvQ@h2k2;z;XQWOT z$~sA=iB>z;#@$Vw*i%E#j-#6X5IlzPCoFLwri2S2LwuYBi3n6QN6dh_4x47U)AW|gT+3e)hZ$0 zgmdShbVXw~#4R8XB@+_(rF~$`-xV6iY#d_|$Qh?vOkKFt)RMq_>Tz4XNAV-+SB&7O z6hFJZAD#viafusjLa1XT;l0avQCu*CsaJE zj*L=@?9*Na9p`^Bj>WxWw#8a0TVjoyVr>hi7&9@H8eVdR+9q(55mdPGGBc(cYh|}s zThh+JT5niewpgRD&J8z?H3Zz2HQc(hA|W|B+#z_)IGNHE(o1F(*aw{Pg+(-ID@@IO z3gT9A)^5s+U{PQ#%966jnB)vvEbW+nx3oAiayoZMVHk_WX{88+jwG?WR(n-;n}J?) zn0NuEglU$GX@Ymy-22b23%S5oCR7Tjm1~&M(Q6839(Aw$8S~UZ%iG@j9a%(-nPPb5 zT!b^?K7~e((5G&=V=-Qm;Etr-R%;{A$C>!rb24bu$$%2J)b{X3L6NhvaLP9MiWNpb z(;&0p=Fz7fL|`)!A7PCRn>b`c*=v2$vOYEYQ!v-Ev+%vgOJteFQVM|Hl;lA#Rupy2 zjO%3Nbb33G#e)4{9~gM1eNYc-^#=y%aWDh2iARfte^T%+;lzdzm+WVxDX5&G1Xg9` z(d5%`Pq5;3Ae!MefyicYA|9bkM>A1l+bG+=yI7Bz zOganj#Y`$CbLd^kq8`cs9Alp2+$9)xWzT%=%vj)%n#Umz2~kjkMoe2FdlO`0t)8}8 zI!gsSRzh$pM5CNqwV`)kac3*63lhut77)I|wj#hRqS{Wy?{iSU3l zwRD-q#sbwz3R}VQD8yRVa0sdh1Y4Q2c5B&>^k1+vASp-BNT$GfYEU;oNFKA+IB6M* zQp4A>Ru=ef8)mC~j(PDnFE2H$(_Vn9QY%xB+M>nPN%)CbekhGUPm? z#vw3>E5tB^RH=@PLs=7~{=pONqrjAmFTF`&4-9e90-S}I&<mRPjDO0hTGLgZ=z&GR62c_t$^>9e`%S^QpgrRfG_nnwP?di zzajC+Ohz9H2Rb{O1cqbW>6T{}9h#S{(*sEN?9Gxukr(eB(PFxva|+I-Uw{3b9(t#+ zENY#DOQ6J?&m=vv7yap4+;@Py+`j4LM$_2M^RP}|&M_`QPaIxTvwWUgy<7TT`ffB7PtCwPb zoD280$T;Duz=(PdqMqfMy$B2cmSiM4Ll|GKVd;A0`dKU%qrF%!Q1!d`L)H(56bFsL zAe`lc$9HsWhBaFL$`)8d+ZJnOlZf&y;MN7)!1XxXSVGz@)gxW;4v{-ZGg7w~vwGShIn1a}%h*Q)A+A~CTEMD{IYDIc z1W7p$yVFs44p3KVlUv)-W5>Ei@sk-o1VhPt$E0jQ>=6qJ^tml;<8RAI-VGscb!)|{ zx!Pq|M7O;2qYNM{R^ugSE%2Rg$pv8NT9`Dqy^O!G6GR~4LqTfKkpLu zlaFH7RWu01?XDkq?;x;HB&RyzfUn0r{R}$kOCFG{5R{JD-W5h32dzq?t)P0r5o)ds zq*ZH+*j14QZcZqhdt2Js)0PbhP#VgRhrI90Dx-ghhj7zpOi`H?kaDbUVVD4TK!?9* zgxK&eN=9S)JQyx4 zX04Yd3~Mf0HYq1c zaisU;xWA>$O}L&wQBb$ETS6Sdv+vDKsv-wbdrF^1SkVS`CY46ps=nZGvgCTh*^tCA zG-@onnrH?n@8KX*`Spb>m9!T^k_@@_?- z{CALSO@J&MGkaB0ckZ=(Z@EDw1U(TeM3NkeDn06qtF6lpm_j6?8N@s#ShTPT&apk0 zoCw`)-WfRtQ2mldkv(?182{c5aV~X{o81y(K|*mt>@I8mQh^W+meD@%Q{=+Kgn_-L zPHF*0enV6fAS4I{bdET9qCj%c_{wd?gN==23e4wHfafyB+LAR>TVZX2^R#4+f8z1u-+NbwKzSL6PB>!G zKDULjw{$Hl^%N3;AuC1yGF1PMiwj zu8{zqAv9*NaiEB;*FY0JkXm%4Ev5$+1q@A1$RObcyDEciR|2GqkwrO}(VpNr9$90O zxlAncVuKsJGKfVrSoEeI%F_p{7v^}GHY=<@Bn+6gxRx4gQVn)1tS$Kp+hA>bLOg|A z7jQGRa=@+Z7Hf%GU@diJ#OQ5bTy@`R$Mdqm^yH)T^mVv~oml-vv8Vv&N=S4sp+&m1$;r!Quw|%`z?pyF+Is z<8UbJFT9TTfXug^6cI0uYD2||0)mV+x)-u}60QbWDbh?dJ6Qjqe+(ug^i4bJ627H# zSYZ!wcg{K(HkwYMfV}+GTh1W9pN|d@)fIG=P(1*LoHn_i&P$G=nAv!dk@< z_rXa*4kgNA>Y1|ZA#x+A$>0xqnLQDQsp_0jp82#)^o0P4wMyHhcwf6AN&@mU<;>`qdtci?4j&mkbMVc%v z(T38lOXvaI&=a-S=m0!KTM^@IJ|t~1KXyilarbGqV331kwONph)@48FWxxe)ENDK{ zkLUV9LC>LG9Xz39jxdOB=9I+KcDXxa?g!UsdcSuvqek!8Onh8lm&g?-?(ClGJW@V8CkFX2FJ9S~kbj`n} zF=i1pv(@A%?JEmzk-m(7*CZZP8R1Ngu^vHftjp68pWxVU;+bJE;A&TwIVpJSq@dAa zePzBfSf)bMK~Vx}-H!U1%#KSg&H8EL=D@kHCJij&uc;=CVTna2^nmqe9OsFXoDd@m zt>Gjq?h7jx>GMKz5a*(~&y9yQRaC%L_4ZR^-A=IPiUl{$%RCs;mRQSaE3ECF5c_0w zxM8b-TW;aDJ=TykdQ_}=%KfrKtSxC1a9h@J6A$-*TSU^;a1-B(!-p@TTb(&`3PCt< zw$tPjP_~bovcpAMy~nJJkRyk1;?h`fj6!C>!@0Ay6YPc-w=$HyB&R+RIUz$wmIgt; z4H6zGqb%`!;4WJ(XB$g%?8wM<=d*3H)CA=S?}gCORGIzLxl;YPNREqpN)2JYASr?6 zU5ZXTaXmB+W=D7mfo(qLvb2I{DD`=S`hK3dK@h+?4&0QaPPmFDE#kL<(u7DKETH8i zv&jm&F(cEwwG+5%eww9XO9mc^(h(BK6(FgOhk`Q1jMGU9v?@AdqmL(oZ z)&05xLa%}NmxNRBo^)Z?`Q=RBp!33o{5U>nbq^I_Um|ojSVry@Tnef2djJF$5vvOy zt|_6qm2Xg9UdI6gZLgEKc_=foEGlk$n1F&KmaUBHs3gN8rq0&@WCtb1BDNtj!BtXS zYlCcrfhTHBw0V|yiM4{U8<*Q)t?RbO8hQ;6T0?9rxRrq0R5HsGxNU>A`Me(jYa52O zyhE(4L1(6Tb>O!@HzpvT+)!Py6UD=r%s=0|ku~rOj{?*xV z%K^9G;!iyOD3=W0d!Y6anu-pAwH>r}nsrGuONORsmmrhdqaY)K&#e`CRrb*!KQ_w&_NK4Qm-)d?-Xm`s-|LA!N7U= zW0v}oD6t`Bsb*5nF%Kz4jxGgk%`))i5iyBO8W0mBhaM(v3Z-FHsX96GFR2q)*XxsRGmk5^)dmlDICHpJaqt3FHmXvkSs zKsQx6rGns!Mb5@1d9=MIGwb!+*FHBoN;2QuvO|?p0DH1Wv4(q1u_i#+25T7fT(U z33z8ovDO>b$_}xH{Ge{Z?!0#~OB=X#E!=2x)NM}E)^+D?L)n~7iILiA*-(`xMqat_ zQtBT`AOP0vx36Zq;EOkVf=3>H@aVClEy)IZ7P@gnQm8zkHd+Zr#AFm`xZOjP0Vx)JkQwM}Z$_tl5A<){@qzKNmBW3g0dDre{{ zLAvKC{0V1bq>?I=sAxpl`i|nhVK5aMIaYU5bx=ZJH1FFp%!ZY2C3Q=bq=Ti+djuHq z?qre-GK`n9Tb6LtjZ*z+wV>_51{>-5xFH}oN8HPX@O4Nrfs!0N#0VuzeH)3AolpXY zH6g|kTa)1Jv4&0Gm|`uZ9bk?AYbLJ7uW>85m4KUA+Zwo~E#YSO4$M3zEv z0z{ZgE3Q1^|#`` z1@gCoTM%MMCk@>Ct>HGs+HzT0Ak%D^je@mwF04I%{L#sL)hFb7$D;IUBeNU0VJqNP zCQhy*03AGdxCwrlgt53Ld;+dbu-0Cu_D2AZtk^0^yqZE^v1?j9^>%xgyEXpj`~BNT1*; zPrD^LQwdh?H5-{h7aiv~iSj&S9(4);I3Yj@gfO8Z4#&l&(VvX+=h4Y$EZLSxdVVTh3&RjD`g9BaU;jrB^{cx z-)m=epv}D5M5F*KtfQc+cQ?b66u@=}(OAI;NYtjvCZP;IKnVK|yLV(u0~$20!IGzi z$D9ZI0}-1sB+Zl*Zj*rr64y|1+aCN7$B_-o^BMBGszIC%?GfiXCNs!8qo;;kWA94q zY!qG}$dp*?4a^K(<0i+r!@1Umy!PIo;xvq$dW-E^P~oXwq}c#M`GdHv!e0TC3&;gM zMEMy>Et$;_0A|^e&_*RfNlG&GST5YD%fiyMFf##_kWcSGh(t8$3I-KM3Q4NG!wF)QGsGi%@ zQ!_W(&GEa6+y%_*7w-YUQ19*lYjE!itkH*j@`)4Ec|kO>DLtm7vo+DC?#UA;Zo2iV z=5+hR)U(UZSikXYm$QMcXKX@md}q4wMmh#8OfJBSnEViOsTn`0-@T?7`hoT!eCY1? z-a(A^{eSr9pZoL!?|k>Y0XMX>;8p;))WS{l#cyLdO@o_qnW*(_Cht^=DO-!D*bqHT zvQQ~csj*}K;=vB2$(f|t+~dmpk39T^)c^3Fz5CbKPHQek`3-xeaT!34!KNQmA1hTA zvtMv#*z^mWoFb?|7la=3tZ)iL)$q9+Kf^nl2NFD83QK1Nu|S${Q~}0m5;~qJM2Kgw zs?JvCM6U^p6d#$FIZN1?oCUut5R?*bQzhoWFlY{JTa}Ek%H}k1tc+RUR|I381EF)9 z_>=~va9r}M)k6*%F`XH$gIAk`Cu@bTJ`LQd7SW&GvjXnC!%TwWmKk}Ak>eg#o8o@K zT9YDb=A+yl7-;2l#V5mj-FR{=1yba9wTD7N(sFHW6g4P>VH8HuTR6Rg*d9i@N)6Sg z5MKZ@#O)W8l!iWXYYY-DCr+PiWP}eQk>CwUK%NA@ASIO;Zxq&(R~UeCSkMN1(`c9U zQw*0$PdaMJlxY!=XoD9OZrpcZ8>~I~(M3jfn0*${Eizw^NGLw?ce<0e(GmF;&4On1>9_1o5BtM z_U}I^3++_-TS6_;F5{k?&2cvkmzk*Rf{PUoXsaeZq`u5dOk}uiON*hL>Al8G9dmNy zjodh~qdZnJk$-JDB89M{bm0{pC`ZqKJs~1;B4M zQU6bZS(ENh#y;2DEk1ra9~=x;JR4mtA1f!mZLs##lPA9L`Oh3UH2(O{zLltO6)yB9 zOhQ_0x;BQnWOgyMceIMlQbb`~F(dYiQs?;>lS}VL@@AH)uKV_H{mWnb;NSnSbVdueqA)!-+{#{t zTXMaB*$i&Z)wX+f7Bd`JtHnEbqxU6;`Dn*F3Rd%#I(eo)9AqLpOq_zy3+{IY2)Cf} zQ`{~;o!D_%zyJcRD&0Hy&kWS~13UrTXAttQEZ1X!0yktuS=bSmY+MYy(PiM;-p^4l z&nu6)N7SJEWs=l!`LHKLGH zA;sdefiXcWh7Bp;;q+1NH9-4x;`nhE^Os0PEG~_#%6uX+W|$y<*3FJweGP5A^&Rhu z{Vl*$MDW6T(aa;ajVjJoj>Erlt%bVN@rAa++L!+Lv)_5?vH$K@eiXBm9P-xJ&Pdsh zr31@oDVlA$i$zI(S6hrR#MzdD+W8cC3CF=mDW6aTJj$51b)i9xaf;nG3(FN~1P~3b zCG3Mok6qgJfBEDS$FDwmO{(EmLch8d+!zBz7KKgVwtZ{Q+S140jxX2&(>eC+G#|z3 z)2D-NYx9h(FV?Bj(qer*^((oY0)wo<$zdg!dfxey#dmFZXnbiF3r!l+o8ytH>g4*x z2=O@Lue6N$tp5Q=5Mqk@f(hPJ=k-<$GP3<@(fA=s(pxhr3W9xNqlx4+gPRltE@JOw zTWf;@DihW^tV zO?8@~?86Mt3B!YoOZd8FFFsn9QdZIvl7ld9whj@YJOKg18(W8<^o(-h=}AcCv0Osw z$vbbjDVPDpC{T5zm{!li2ec!{vO7(sqEY0B44V*nqU5C#NVs zU0g$%^-LwM;E_N0p?iP(*YE%PANu)#+o(v`3~t!BZ{MMyxtsX;PAVTd$=*KdqUE2a z-r|NeYK*C!>5G>ZyPC9)X&6hdy6Uw;tj`d9CE9WjDphO7qE5KCRC-qrv=5!9gc#@d z6&1z?9dBLagcvF+LUxpIa5&%>3BQ^>ng!A&WFd2ciFH@-2~-4f%phBlNgUbhAc7W) z(y^Gg<{-|45X8;NH#s00qKTVC3nXJZ`fE}HBG%_1$A<3B+BB?0c@zdXp1*6jI=%Xs5@S63qjcytjabm zTr)X#OZW_JhP8k5J0JatfAHp;Uwakt!fWemV1xmtmJsI&AvP<5T5LfQz0xmEoDkv> ztV+$+bH@p0LqKF?w)v>!V-?h)Jbj=`H@wb^&2V591^UfA^6Enme)XnXUfZE&4GKAI z0=Lr9GJO2%t8dn0tWBdirmS(jzaiXh49N80a|WDMJ{UWW^*~)IYGa9J6i`dDBV{V> zw=Dip9ROfaP=D$x+H^r}9)b8k*2_kG$qLG_%l8xHjkei=tx z4A{lA{YHpG^0$C!02M-}>S!8{7<;0UY*djCw7EhDC!jcGDcJ$~S#~*#< z$kD4IhGgk)1k2-aMX9Ofty7edYP>1A`9}}5NA`dq#Lg<@9FA+Mb`;cQ*fI2W8t=Oz z8N%4lp>zLH`3iAVG4F%TpjL_QlaT->Vh^7LuVfAUQ0^F3$3YXz`6K%|P45V}SgocJ%ni;1r=083GH@MroxlmA!k_!h{)6LB{OntAx$Ou@QC;m6 zS0ZYwyN$RkH%3`6xzss4!B4&NYS!7BaF_{dsZLxnCB$8DR<48f#6qgM?K|g9%ZL}s zbw&RvA$FdvA;hWF*2zQ^`Ew6^<&Qr5$#>lS9(5>?U!{bG*4F|rzLy)Bu$W8;oFdoE z=t`e+VvUqD7hk#fp&xl$DP?_q%?X=lXlYavsSPA9rlYeiLUdzvEW^r+{c{V_+_i)l zvjmt5C;vvc3-XQsij}&1GdA$-%KEvQ8-HX!n4o8#dHQwbjc~8t3~qwyz)UNuYZAB# zMGoF}>QTN~oXC{y;?}{iOo~+PFgH+`hI4zr_?^pqzG@eaf;RKn+~g2NhaQntD-h2R z162i}_fR;&|1Kg^0bCRk20I)%r^B3DxerO{Y)XD0`~7@A&EBSl@ihNVb~w6Xq)!7F za5onutz!hc)PQdgY?@H;qGXxiV^;#u#~*vlV{SaJ*yE2q+A49Q-Sgi2CdvBjkY=uJ zU(q!oePlZZO~y=P=S)G?@aZP(K!Y4Z`A47o^ouV(`V;@)tv3tjyCDj$wKHeHsDk`E z;A`_#&I&S4fS!7(#mo10C3!{DYqyLB)l*@sCB&e{++aF!LW~WWtBou_1xpZO!#M62 z2}g5z$33_GpTF^`_6HV9F)`&0O1a1v;OO@`r?vNvTS{!zZXmuR6E&ZL6 z(A;9pC`Q0-SF||tTl)iP2K%8$7B1EVfMm*;O7>#Ld`IvsDhPmKIe2{IBP89xhi|{6@={SXg>PQ zZ;AmBU7=+_9)0wim?2Q%;V_4=?7+@PUBB6qPVBr2^K110c97@%RSuYMJam%w{?`Bg zzkc)Kr-&lo^WOJOogyOy2n|}wb2UlTQoIUsvtk#J0&GKvjw4~jD+rhrGad7%wzQJb z?D*&Zh-Kst|Kg8!h08>dn7lN@{gh~C)O1gZ>9$y8wy6Qi%}@*-CghswH3iNS55Lk7 zVk;eAf)HbPRe8A;Ax3Knv0Iojz8dw^x4-+=&)xr-ANlbQ@-30@L;&M1+t~2utiwE1 zC@kpyn!7^2$vl>`v3BCIM}O!?-%7`cj(AjOwPb+MM-8ymYHEl&ep5Kph1vlR5vmEa z7=fUlf;-q2Q%Efs%K~;vo&5IdT8orP9>!q#IgGj?hO&h00vw~Dg%hm#GU6d=`O`f*uxxGx&wb#D>v2Q+d z?7ACQ=6jdp`Upo+&J#UY*~*M3QSZQpkHfb1Qq<^9oif4FKpq09+GLx5Ff$yQm`IvE zfDA#z5yKq<=m8`D&2M}o=WJQx%43f{raV`mjZsE^PW)N)n+_iTd-H3LV17XL1m}5l z&g|treVPPI?@MFSLNwq7FTuAr5?+5OrZ$I$|fA)`m=^wrO zUZTkFjU#cWLCD$`X^w+0n8twCSE&=kIC`eeh@b!5Xa4So-h9jLN7x&GZH+AWI7(qN zCBy}&#IRz6P?%!;!jq!jxhY4Ct2Ku>7!;yB!<ioEl_t5`d+w&rl4?;XqO@w2A@?%1Q41Sq?>BSabCEE_iO|{YSV&=sJFs91cJ@(DV0FXz&@lBB9 z$B%2gX1!cJA&yExJ#pO>gK+b0N1)|6??R0{x%Kv|=^Af(=WD{&(Dsb)N zpkihLcY~<_o^r8RfD`eTfj$(-J#+d@hq4{Gg$4sMBz>zxJ!|de6Pr9J|)|pKXiQ#vzuHDbgrUC|om>s=RK#I>zGn$DjYq8{cv{ z^*QZ$_0?C&h_A`N4MUapgas?8>r(51t3DW@muiyV5h1oC03qkpu&1ecAA}fsPYb-r z=)!5gPjP2UNWHHj#JJAe@45AX-~SxBzV6w(*HWO>!k}4_qD{4SfwqiNZfZpz18c+3 z&wGldyXm&?Azcveu63x|5No#(;{Xq$@|1#5668~hjh9ZZJ^ONgWsy%W#^uKBl0(C# z=grUGPd97JM>YM_cPPbCXJ%DpG3et|HDM5TLL78UNj_38=TI@{;-}+CH6!fZyH9!u z80?YEwj0BKkGtRwS6_Wg1BlibCKo_GI*7m8>|3mL+hQ$R&P%9&9BVB@qaSv~7q{eC z+I82z@x&8fVn?xl@OTjM9Y}jf{2x(Z2|@ilQeG(oXbU;1*NJ0sQc8%43g7>+Pwd^# zYDeO^4qsGmA?lgOx0Z`x+XW<`oeY#9N^oHIyhag#xE$H-19gDl(hr7x9f`LK={HX^ z&0LOv5QMK@o`)2mZfAx@*oZi8YlJH1IUt~(eINiJMRMFGgcvwaf%S$pkdV`N-go=8 zH@)yLf92PI`e#3M^w_nVxl3#ov4+?3@x<>||5r~t&-D{-SPlr{h%df;;{!kP7IA1@ zqb>?wq+$GxOG+)66;t|CqAv;#-6bIokvV!l^;1IJ1tD(7A~?MXp{%VE0bHCO&aZgc zqsJ~u-9z8~?#q|#+h^U|y2}I~x|yS4YNX_pbUqhkxf*E$2>_lr@i^f{mUjBla#7jT zu#GFGde5g&*sG~d^o*xBHlF+L##1l#Ctp60C=0;;bnrE=eCO1uQ!lPvHB0;V%vQ(@ zo`H*&5F@=b_5|Dr{i?fj#c*WKt2uyJp#UKaR_mSX^B)vBW7mnto-KKWdcy*2F%&kD zrfD}g8AZ3cdJsFO>}_4Y&S~)^Pu{L*vBo{u7oTLW?{~=;w>}(||G=VqLL5d<}I8qgG~b%L@dooc-~@(R?*e?LFrJq;6N2_{(P*;s$|JA2`@Oe+^f&&+Pyg(P!5#0shHK8@jBFcu zQb;^`!I8*Cug!c4Q~smReEMJi;V%DE!oy< zVxqf@D5umLN8B3g%#gSVAqI`D_Qa+!me^z0ajFi$@uz2>{q|z9&NC;@#-nTk;nMDm zj}_LszDR2Fyunzb${hp+68O|OsG@{`&6K~GM(zQEjnE8Ol-v6Aubh7Th5YDuF8uED z=zR6q>tA>N&9^MCKKiA9_0g|=<-upWL+OIOtLN=Gu)47_%kz2Zp*~VVOwIJ>8AZao z496xQ5wx`tB^p93tA`&G)`9|2D!}4|I8ML#(#uB4<)rmR;Dnr!WF)sk83R16^qQ>U zbg@$H5E#xBv4`+(E zZ{YBjRyxehax@{t@dO@Y6x2&9wQ04bsy>F|I(SH7$ym#VwIUwU&>)-p+BC23CWKhHkMY&@eDb9|kG^!tOXC$|xqMi^Z1M8y zY%Et@an0?odu}-J7vCCQIDO6dR|hXh-@fXimoGp6^q$o+3|0*VJTb5#BahO9SPnwB zkN~i-aI`w&R!UOsN@+%%G2BpV2s&gI;@5|(C?`X)Vqn3|c*2=IUE8K5rod&>c1=&K zVIOehgiqauB8R3JtsARC+Vh>z;^{48y4`TYo!Hv5_dx&3caS6p4hH09Lc8IQp0ipL zu;jSMjH>x7*pnIU*Z=9S{qRq|{qOwb+u?djwOXmUZxS{XzkzN?0PLx_LvjC242oII zQ=o}grNFoMcWql!(6)Alg3J4jn~h|b(@mA`gX2`RY)Xhr4x5vb4mUn0Ckl|(-tnH> zPCWL>2fy}}n{RpTM9wOD;|cts6f&%b2B$HQry))3NpTC1IeP~gZj}7XUO%*bGrvy& zp#HiK-*J6;%V4!LLQF=~a%S(i81lI2=ieO;bi-6Nkt-eXHXL!lq`7}vo&YP3#DJHO z9spB{Dts>8&1NNX*Fk@@>6Nz>URrK0*?D7vPXew5td0L4b^je}OPA$`VQcMO@uZvY zyZ6QL#n4}e={!B%Gvo|SOEhORq)5sVO@gvy8!!b}e<&ER{D)w`Fa_HpEYlWcNP<8~ zfFVIc1yURi$?loyp6==C++Pka=Xdi7mG)Y`w^r@FtIoOi;e7)cu=iJAy}EVk)Tyxd zZ?E-RiEROFL=?r#x{COdAhv-R0sRv+Svh;KAKcjAe3*T1slSeSKP=Mhk**F)HiK8* zScxxQxs$J~T-zu8^wH}5gO7{s;g#)i5-Sy=_T+>o#RYV+Znj>FJ;3{SS!DJ@twT+q zF!{ck;bQc38!lNXsfu84%+tGGHu8ZU{)?t9v=WiUV%_E_S`~#la&F52t}SZ7g52$H z&SDG_8S~u!#m`;({loX)xpetTL-N+w%1p+vF(Hvdpq8bQ!3A(G0`b57fBDPDCN%)A z@^UhrmSrXQOIA1&9~(Rkh{2_|_CSm^a*;O>DN%b^YBzSQFy!$G?Pjx$&eY!xBjp7` zv&KNjiPdArj(pkWC1N~7B6d=eW%|8HP5vKhsIg->{s;f{?;LxxCP|96iAhFQ&mf%a z`1GDCEM_cG^Thel4P76b-n8HU<~RS-|K?w3;4II8(Z!~A?BhcryspIyQ7J2B}*Bz z?b&kEv(w7kQ7v`b2>e(xjou*tcH-&;Sv)n-R!{t43^dMXA3eFYH+?ze^MPW zl%+vc#&M{%7DqqJp4te=ZdW`eh>yi#@okunr_*U>5y*3Mazma(Y=!Ol{Hj1M)JK4u z1eY06+h4Z`EPor@eI50IE=pKZj5*m2sO^^ymUwjF+eT-BOhd{t6m4ridSIeCAV#q9 zpTuMp>XzdaqH3-Nnc?aSTWRm-KmX~Ezx35#6v@`pmShl><-4&<^(&mOY(+WZM) z2#gvL8{?`Cm0%w)qUGD!EVEOS#W=UYG!I5DRfJ`r*?Q6tF?Z)dYM;|STj4-DSjAPu z#U|}t;>UonN4;dWpM`@eOb{(c+(?dYKw}$-+XhTO)pnGj2E!F7kK+O`^CCa{J&i#- zwhp+i0#G~G7Ixj*W%CrWf((gm+=rHJ01`U;gy=?>)VGbbs&B&I27n5|L71 zb=^iAHN?mQ#O=sB$IWq5-Io{$2zmK7{C1%KQY$Gzvu40d(~v48mYe>?4$f9bD&18P68S(d@GtmmDs zwJ6}6dIZmZv#as=9jEO-lOy)OdG^UW7ynF-c=04%#E=!WKlGrHWwYl^(DuB?@pB!{ z9Ts9yB0ig%=su6<_nPQpO~_SWWnoxB43I*I*&%1Qv za&GbO5a-{br>4sGNdn{+0Ag%gDW3_% z%;1jo@c^*S`!Cb&)#?yR0ESH%e-&^21jBdBB^4+i%!^$_!v%>LpzCP|L|8Thc3O`s)Y5rP+grYW)4pgmx9*)WK+FbGWi~b+Dm7wfWub!Z&Z8 zKbqbgq66c+vSMmSqmXU@ZG(^}i=Yeufc)GY|KE1=P?BW{^Ji9U6W0F*H$k+`qvE?ek1OJ{Boi>_S2 zb73)&W1#s|_qyXsO91<|Xq;rTDFP_etfYDlSC!GaQldL41Y!@wtq7rG$BAQh;`Ps5 z5q}AhW!gZ@v?$kNvuel*B|424&{`BI1Bp`Yvs4S#Hr>a%DzQOBy2`Z412T#$T@~6C z2!udVFo1MubVwMMIxK^vRB@$3K>bW0X5h0WVm=j!L98*f`Qa~7=ArW`p33o^*CW_;P$kRZz-dIP>ZIdbsTFp5c z2@v}mI5WhbjOU2aOO3a0eRTQqR|Lf7>~&RD3GLv<$nNbriGQyZnh* z>5~=;a*ELCTzebYj3oL)BdSjp>p=zpX)%Kl0>1z5TY!H-CICq)F8@eLw5l?J)+$h9 zo?&J@t#r*94QJU#*DcrC0J3tz(Hj2(XiZMRsLpU2(3vo(8tkn4HW|KzW!S z^|FJ=%mOOHY8IJXBa6jPDXer{>d>gDG-00WoWoK@)$yW}GDs*03G|%lojao+pKYx3 zqXhiOL0dg$A&%LF_%|E{x3h|Z5|+MRJccl{gb_Mp!eZV(*9)Z>CbVXpy+9iRim*aBkfkL2XJ-D2t8YHhZ0bv$_E=;+f4gadxEy!Xz9&8Jtlhp)f* zQW)ujgZ-oZeJGBmd-u*QCl@x-&%N=&H@|c9XgVH`_tc1xP$7Fa7!RN>1f0Be5j_xF zb6v~)=PNuDATCf74$K=MNRk9vO%wz?wWOI3fcD5H1aaG&EeL`*j$Pat+t#W|4s+%^ zd97qX(A>Jg83*?wI3wa>;Oq0|FJ?kO@|_rwol8@V_s5}kAKmzU!5UlBKs8R@V3>g_ zV*(?VJ+acvWj-UKV-JeI@~dC5d0OmS>-hY#rx9%PK-@~qhzu^Ohz%2yxMa#$#&*SX z66V1KRT0c4X*r3?qqv&&ph$xAV?eTs-|^?M~4fatr?DSSP)r2Q`cVyDS=jUNYKqGbEz zmZx*X*fyh|tYa>g;b^%$3UcBr=itH$C=Cw|@aOlgn7tX^yJgPr(Nc((M6uB66@GGi z5E17r`}1;`uK|y^0K_fs#q-q8e$*<$C>}h@c5nxeLhf1R(Up+EZeQt+H6@r~i7ZA2 zBxZEo46UkRftW2Qf=mi~dGFqMeO#?%GlAEBAp%elQ>BRM@Pl#`skQ%SzcNB z*-w9Z^X6@1U}f!v&%J*6yFa=zo9rDN?!_r+&8(Ph#1?h3O|>X^y9R2ZHh7;;55zwA ztxUZBO*kOFedE#Q);4sS&&ms+S`!#_n>!O%RYgQ|ScWbdx&bIq zi$KiA*l1$lESq)Q*I+K7gSy^6j?3wiVb)RAIGzrWTO*Lr3pL7^D4+DFPnO3IhUH;j z=V>oYdcAPa3wvq3Bp7J0sjZgS|;Onuen+9+lw$ zP`QB%-ai=6Hr9Eq+m2Y_5S8o6T_E=58|4qdO&5S<6N8~bU|VU+o}YXOA#1DTIDtu? ztd4BhiTq)P(%jDaKaskP7JX5BQXbF2lHYgTfXNdsovXp1eUfE>urA z*Kp}2`0VR-H~s+r=)om82x5Ff;9N-@CO3I`AVvgYw7D``75BLL zicc&Fi{(%SiG8pW+3*u~yTPFKmt#-px!@#hMSK7$Xyu4St5A`#S^#&%No;-#T8tlq zAw0^W{c$qgr%I1;X(t?LNM^CgG=)WBjwV^si=!x58jY@Ay&8t${RaolkSA6Mi5`q%!&HhNLr@;o=jNUcTd6k(jC*miVt04Rs4ZbQUojVQ+p*0)AYC|_)| z0?&!X{!n{YgsuVCD}L|Yw`51tMXYzexa5iCUsVPaXwdBn5f*6qB-amrrIC&->M}pe zYeJ(&1t{Ioiwic=lh}9{ZpGl!w24DJGKE#1On3Uzyy5XPf{9;~U} zib|GLlBzg@08tZQiCm@T5UPDFkFcCT5keV^cgM%e-s7X;Zgx;*2WEOi#iS~VsBd)2 z2wwdHJXIq0QAI@FbFXII7_sX$;ma$`QE5KWC6NT8s@jgw>NuT@g`q`Y7u)&nsF(n2 zh`tWJKMN2*`1gQ*x2K9FoMM?*Sk?9sA(}+RJ=Nt)fT|m)LoMeo?3nV=njN48#Fi=W zN491%?vQ>A;(-8!R@8UDg-$23Zta$`Xpz@4){aX)Z=45H33d>%t>tYGvvB9wFWKk8 zKoLddY`VJ(2#Qsbr9*wR!dW@Z4i4kta(;9)i6Y(W#pf@aM}?0bKR)j9K@P9KaN)tj z^N*fvPo_6?Xa-=yNLvNO^1hZ5X6d&6d3$3WDs;LpQ^%Cb++2RsRg909cy=NP_tF** z>GzkoZl-RIDHhK*uuULXK57qFSC-%5tWwI$$kG&Rg-B8&hZ|I`ZG&={#D+K|d=4z` z28}pyZhj8yT8%IM0yL~m@9?md0$Ridg>`r)D{TVOpnc??TNBaM>(}Jm9*DhKxKO`O z5LF|(s0z=DHO!;jyUXJv2PpZRrT$tJ{W z5DXzmAP7KJfHQysxI(Ic3{ZKpRJ%|j!3MH{aPk+?$T~s`zl}@}z%` zm10nfZUo%~6n+<3&aI&ih%L^FBt>kY8o^7matg`*>?=Jg#HQ|pvg#V3QubHSuxaAt zkmNLA&uK{!aK6dyvy1|~bk zid0pwI)uTC5PcRv!RY63r5_xabX;7(y-X$hv`#AYL%j>cj*s?nxguQIkK8-L&JA{f z*lJ^Q(RwyXw6THZh@fOD^x2D1S>3uhNxMLai^@^T$DcF!vBq<1H_2NU7j=&#vgLu; z-bfl|tG&Z9K^XN`)BJ^SvdXibQAfK^_eQ~1RZgdQl4SjU635Z%%Ic@z{PYih_`~UJ z|I1%}@!ZDt-3OQV5AOs)m4;Oi2BP?(4HufTA0oH3UT05mw7B=PLsT}JPV79*{UUiC z6OIEt0OEPF44wZ7w|91%x3iUH$;?6B1cHU5$g-@en*eCra3|Yh@spDXk30v;ZR4IC z32dBXt+ldv_6e~V6xR(sYLMqE-hKP$*Iu~ph!iGPjZ!Ry6rn0Bxk^x8$rbaX8x@6A zcqBWaxeA4zg_H|N8+YkUb)6c?hK$R>C}(I`3ZXuWkHe!eU6t4n&iQQqcq0B zLD3&)PpZf2FrOu>MKY{;2Ic9~InOUw_n)2g=;~hz4%*N`LtX`F*)lF)+XQ$=UbEIg z-7&=ER2a61S1kFx&w(z5HL5;Uviixb&W*C%_tk74lU3bGuKDBU-MAQjD zx0QTY-W)Z=qOIDnn2*>I{9TS%8e@Rf1$c6So&<$~^C`Tx1{(#yE|59?q<-H_D2M#`LUfGniabm=PfEo0UBzj5IJ}5JhKMRD9zF^~KP;U*L|%l6`_cyozLSmX(R4zzGW-0)ipX0aGW8(|bmGAa)|TcLw#A z6W7gUk3vVTiB(ns#l^HY+gYDH+$f%mR+ffatG)AAlg$^n{}S|Hfb=p%D>eERwXfb0 zzya_c@J_vP2rvPjA{+r905IqX`b&_$iuqHW-CatCqfu|PJ6YP91`l>%@9Ew$7#)#{ zOwHOlVCnD`f(e~b?9wqT#EklAk2b8(qlXV%z_f_7S~pfZQ%N8cs(OTi4Y|W6ohsVX z8$o2tQDQrffskOLySK8X00Fh>tZvpJ59$cs)+MoouGV@3OMs^s>ll4j^3KN)L3N&< zp0Az+vkHcvf|vg^EFr*m0QxYB;rjmu-u|s%@;euXM@RbT=TsR(^`P>ICg6FNUvmqH z1=0W&I-{QKks}*XST?MU0&J(NUD9QP@xW z{oeNWc9s>#VQd@QZ*DA)mX=>Et8)MFX%rKp3bb}JhWzVw2XrcL*H|ZT(GHkq_A{Wf zBZzbez~Z!K{V2R-#@@oq)*LI7AlqaVP9k;)i?($zTG|5W36~hp};a3Q$ZO9K0we$;_}sN zSKt2GZAnJH$Pv383Tz@_@1NCj4JQzCqG8;uUyD+b3kQ@bRFy9s-d{VowLXB=bE|`6 zAl}|q=RVKtU%>b>gj;|CV8y%(@Ra!pz!Tud0J}8`A0i*Y@d8K8V}vn42+#+$4EPkn z60lTD6Hwz+hf4SJlE_Szc>)K;Fb!8I_BTCt}e8t@~O7$B0@fW@^xzNOsByaPQ(Y@*2PoFaR&{ z+EY7~{MlX;i^-isHruqbUF_hLAo(&}_*Ve_F2FwlScde|kp8p0^p+m{!;#9D%E<^0 z0Ck~LH!C=O44)BT0v<1%eZ*BF?f|i%oZSZW;7W}F3S9~dB2V?TT)W9XAmt1n_QN)X zhc#KjJ~arp>Tmp3*>kMnQz;E#?VX5$|%3MeN>Id(_%QC_69mpYEYT}EQ7th zr$G=WCoP&xk}wQ~g(;we_vVVAZd>*Ye1WW{qSXV|F z6I7&4#l*89D8isrT0{vqPF)J1uDgwV-WX2EDhHOLY&5O&7cMN6Dwl3;Cjifc!IjIe z3ut(nxJxXwKU%Drv{?17`EK1z#YS3XNCO9`G$Eq32l^%_7r3{XhN9>3FK&qHFpiwU zMZU?2PRw^NzxsMBv|gdI+Mj6KGU94>Mrz|bV%ht?Fz6tt%E|+At0{CqJfBulFu?$^ z17bw$EaTI?gvBh*_Ls}OO*k4YtqiwUkekU~} zQ2>`G3zWbWKm}mxj~)Y?x+ATE-h$p3g1s1*LY1tRAyUMahm%|#jNk&cN2q-y+JUl@n z&|1~~$2d6Vh3Uc3Vb0`YKSw!-E7Z-Rbp~)3lc)@nkYfk}!_LD2mqB)?R(}wS$9$ zAP7JIsmnL+o*y6WWZ8o_BGM*6)K!&aMZYWul?m(EiKD{oR{V%d9R;Kj$pJBUgEQOu zp734V_^k+cY}=iik6(QyjKWxJZ4A{=<3I1tVtAZIUIL)ofC~V^1utUsLeh6nu5#Vl ztVNBv+C`4Ysn~vH&e1~lnCcVyQPilf>L)28HxkiY<-Y4Ld=B`44TM2jmN{YvM7f(v zx2lX%S}u$T-RNse_{W?Hs6r5KRGI2Q}BNl)BFSf3e*G&8wtc=u;_uDr0mnAyQQ zEqQyH7aj$QY(`L_UKevs%o*K%wf!ZWZ1K}%RzNR>SGHh#sn%c~0z3fN2fhP%A1+;n z@_!5uf4r3My{30^T6$mz6evwToGarLf@9RZoYn>iE zJ%D%I^eKp9q;U4*55E6s_lBvW^(CD|N;lvMct)-X zKRvTG(tGzlmd^=?gAuW*A+$7xKpHyTYOY^#+dINp*xGIt%+A+)(P2YK5&>f->jkP5 z3REI$V@%_BWTZ$SA+iogK;Lm10HsWsMD$!(90Xbi0u4g1K-(kQ@x{OMkN%eIXKz?& zmq)Wgk@Yp!O-Vdp-``IMVlgy1AZ|@1=!Op2T@u@(EQ^8GS5uihD6>I+u*`=`Y1CUE z#v9w}+{-w+47v|^#QYHW(a9QS2swa=z&Su|qvNUIvS2YnA<}WZSnpRVfGPk5pfD^M zI2tL<@$y*b)2Nyq<%jopc(Ky`xn!J8gth}>^y%U}LND}J2TyME^3_d1w0agRRD=c* z&?lJig+ygP8D<5F!IeQ#O85$~fO|!nkkK{(o=XP!?4&>7y|}!$m~;p05VA;3cpz?{ z(@i?-)xovwes414!G#w=58&I6`uz9`9p0?QI-dc@ z6o#k;h`Xht{bjqA^IH(wNcN%wVrQ2047jIR9F>VIXC_YzfO7(BO!EZr+Yg~OIbg{G!8c= zlaGx#Tw8mbB#x%Yj@Mxrj7CdaTU8iprfHcydHt0a?oJ*|?j+X+vuk~|w5ihdAY9^L zI8(hD1R+=bLcKit{zt>N-ktSR(kg^NH*jYuADRPVCQts_;JkL+V_j`B&+{PEb@~WU z%G7C+yzSW$(YJ1Y1Tb<;u>-L-HPMdv0DgATV2|t~BWsPSZuKXfUlCP`h_r2j$nI3n zg~jqkNd!e)Nj!=0%}UwS1fU&8*o2L;pfJXB1*>X55*3E%oHYFP;JkZN1H{@_?qSbc zqqBxPv$XQGk}rWC7L%o;M@!}YD4~8|r7KCewv8KaLUJAy)^zYq=10I!t;Ns)7(rfO zLE&k$!I_heg8hNR>eKgtGFQU;T-DrD8HFzsMY!Qf?r?bcr zBLH=B(a!Z8pSyu-QcILyZRb?ej6-A~Mam#)RHUra8v+m^ld#v?VHBdO7xv^SoStjK zk0qAlI-IOUbcZ)c3)I9SN9GZ^c*Y77$6vk0>@xrA$ckVrUc`Xxe7l#oN0!z7e)cf)yV`T z;i?9)1f53_0WK6+;x+@6XF*j}d0rUOK~NWB4MPSYQT@c{2(HVQUlq)qbDwYk&CI72 z?BF^4JvD?+K-o&ZVJ#q+&NrE8zOa*=Po&c4%9*LOS5!fQ96cZ7KayQxlt8P0I^EWt zOf=+%-!|l2ov**};yXXP1HfAA4sv_K!CnH*#hVIHknFeaL9z)pm$8Y8*~K)8XLfp0Ls%k;D34dA_c81L75?(uSfC(9A?7gu5n2n`{L(t7S?e!wJN06uGKEXiG@FQklixn_JGvwKzm=4OB zUN*3~1i_2-)cF0{?QLPU1PX z)-MMD?HCm7);aZ&I6lN$n$JPa!qB_GTz{uBP~;&>rJAi`wwpK@9&=^6wmVG)nt-oSz(L`qwwOz zi#otE9}nVuZDZ}+3om_mM31w33g3bJLzv!!>=23)riYO4K<{9CHGXk@J9~VnclL)z zla?NJOu8UWBdgW**oldAIxpmQ!2+(nN2+-^IltwaCmbJLZ z9EOqB0V1B7&OeU(?F2yW;JO8n?V_A*_DH{#gSt&fQ3*pxyrR;EDIL`I<^=E_v4Fwg-29B-eR zkJ!pj3KdX&vo0BCh(maTQ#tANhD+ueg%26S|ZL+u$W8W77$Ylh#6!9H9=eisfHf(dTNmHn6o(F zFHTtFz}X&&!IdC!b|gW?#nN5?>{EMse$&rD*>tuvTK3tb&_Ok-=6#%Oal==L{f3-F zCIPt=6*65*4^m1SQwc!Vb`m2n;A^FN@bwvVS}8)hn56_StnJ z>A`Y##3qK&wJ^tR~O_~(p?vrw3CosD1 zAcVNUs30Q=5c_0f79N@W+|enZXDzC()B4~XK(cbPL(49uPNK}|Kol1?#*h)!Qn$br z<$oi`##kEw1j3KN?ep!`_9i=pjQx(RjB2sCB{ma-p2Py}C!1NQ~dkBTq3~Vw-rW&0~fZ}A~93V%*WiEgX z2+vCnh!+6jX5Dm!88# z)v8=9W+2NPNo@tJ*4zEB4R*w*4vVXJ5%BR@N# zzKyN4E*}G$T`e9gmq(ydIR8aB{|4w=^;GKBEW2?V@B@f`0a62l-y3Cz+c1gq31en- zT__h9^AVFzRD$03l{*PT+=iQ7sGR}MTV!SJfY=MQ?Ru=un?ls+CDm4JN7wKs(Uhb> z8D!N0D7)&Ks?ZYjOeAI$W*1x7O%14sqRL#>v$er&5-shQOFNU%`PF4@)|k)j?Tw#2 zdAzc+X|Xs?l2~gUMd8}o+Tr2R2OqxusZTGfVB;Sh{le}0yW7i0ufHuk{9wQMb=y!Ss3-n8Z<%_j}EprKSupKH)(226xLWM@`e{P@7{W{ zv9U#l4M|vwD9}WxM8j98e3}mCV?T2%Q9frp>UMK+NXf?rNfn$UM+`i&S8^S)pD`mD=$Amh2Jl+|cWR-yQQGQ_ z82C2e+Yr2oOE1Fp)%bqa-!0bZXjcs<{T^9A3OX$@Jc4Jn=fa_h$zPuHxadxeE~mbs zRv!so9XzA0td*4lxovp3?B#F~BJzn>EaU6$n z9IUUeKYjZ2pixmK1)j;-hW3eYk z7{DWMH|Z^&WRyp=b5|#jm7#IIAp-31o@B_N0S$rD3cYoq8|m2@*p8{IPiWY3NlGqH zA+~^677D5?s%AlgK`&Ch1Y!+}Yw`9Y;P(L@BkwV2I9Zgf8T4n|6{af^|1 znB;qM_D>>Eia>-5YrP`xB;3iOarw&CR?u3P@Ab2b&q(Q1d}0E7Hl}$XW^zI8&en$t zsAs0j`C&TCg7qF;+lHk9;1Td!01q4xTm2>kxK&^AufRs2e(4(jUKZSbbUxY7g7hH` zxl#ccs5RoC#!SOXqEZM|p;f7ZfPu7{sn`fAyAVS^TRI>{St0w3^lT48#BL@~pay$b zD^&XAKUB~{1a6DQh}{{B0bL$l=DT-p36bbYY*ES`5PJt+Qj7taq$mbOG0gImX{gm8 z)k~=w4!FOR1*<&kk5&2fo<98WDNplZfWv-zemdDWJUYB}>-{*6d%eMImW;=!ZH zWOH-l?%lg}(KfTZ6o2V+*S__w7w}=7+Yb^!E%xR$K|r$Y z)R>ONooyz-!Rx|U^K=4AvypX9j+W-kde4u=)tuW?`g>0y3H^MUsufXy$1c@5lW|y^)po9S{Sv#6X7)ObdSr+y-Jx^E)8suB)jB z;!dNEDUUoM!W|5^sR5Zl1Ew zdUs%sUN5q@c3*k_Zg}s;MidPCIEdrRdH&J8dykiv9;Rv9>!s6aSi2iXaU320IT|fZ zr$?)6<5yo=`RUuQj&~n?|E-UH9c7$h})n0Ad#)Et;$bV9$FY0{ARC6bTg0xlb_jA{XHzIOYQF z+Huk@e8UC7%~|sr=*QD5=rfZGs(xO+7*RQohO=mjmtOq*`|rGUT=h=KEGA!W-&dv( zI5up15;~^BfV%#|3&*Y$ue@<_PEjRbv@8U9x(LK)#g;@y7kO?c%_jXcfkHN6KGmRA z7^x`5xQA$fXTT4EZ&{BBB`0y@oLvZ5KpDE0Ix7^D+mLnFjwdIqu^5nSh@inba~*qj z@Jt}~4FSOyT~kg>ZDme+{OG~ut5-WOexVr&$6{Fg(5ZAy2njZ!9daH!?{fzjo?Sdt zNPOy$%ZAB&?=`X1jKl#LjikvaFd>)(^O!3Qbi7VE4~$8QY&AbvnI5W&p!a3i_=}M2 z0{o=Dj0j+Ec2V_G0K5&!5+r|`w{Pexf4DY1#A+WIr~s4UBn!$?DPZJjzyZ~Yqamca zH-$_wQcrVSUq)a|iE2NH(QpOo$zbWj<*kSDkiggIZ|CIj%!Kz}W-Ac`VD0>`m8JE` zW@u3sh@agWW#Q%5E&_Kek2E+`t2j(?R-Bua7l~H~ywo>?VV;b#U?sqnkXK{s2ONWe zNd;q`RsohuWm?ZZ^}_wVox$I^eQ}%(`r-QO>g!LQ96WqofUkz- z40Npg=wrcR1+0tdtRx^Md1H~Shc~qh44a!<7J@`lkeVK<8?!2?hs=;90|%ELh`SAK zo2#)T8&VlhHr&A$Wbsr|fzBp{KUv(}GbG|u3GX=W<@uB~kZDICqCpvcV#MdR6M!Lt zs-#BLf*=UXvh<_6A&Om+GZZ44e2H~LM=Q@6y%-GYfJ{_OHKeFrk%Jks2Fih^fCi8j zVacw!gQ~QM#a>1}b!iB3EmQ!g#)-i&EAINSc_8*T;3_Ej`iC~%8M#@g3xQ&YvuS;3 zp*S9(7<1Z1ef*RO3cNxis+V@b1JZ2gcCT;&h}i?Nd?J-7S#Fekiit$$iOR`fgyk}h zdyt2!jJWJ^wvGn_m?^^v7k!*H%1H?j#e87{&b41wJOIL7sCr6`a`H~Eh|Sp2@cywYDLv%T1BOG;8NvDw!FExX=y&vVV;;qg^S(= z;Aj#+NG93#jeD=Z`0CZqT#jCPqE{ZO{v!)sa|Gpx$Q6xvisMl&r1$Xdk^l*jmsiWV*T1n zn@=BK`RMUWckbWoh2{B;3Jie6JLh|tOmS%tEnTPTPVso0Tn;0$*wrFs;tLmE2HPAEdqKEcjZ~eqz>2-@0H0UhL9?^b z8PgU?Q2w`LjTgbw$VKJV?s=V~_7yiLN_?sx&nCAtp-Np_?$#!Y{ZV3z}BEE9< z+IPSE_kR<<=B4R&0V~buo;WsYi|?Ki;vwWcck>%44NOr!(G;Mvv;$A;_gw*%jkJfS zW;wMG?BLh~aSMg%)Q?oN0RUaMCS*b;BJO6rA!eWU&;hZJIq>dlzWR)%Exadro@Lx{ zzBaR3-CRdo2psANy8;cigFaU||99WIbM57GizU|4;{qU~LQ+r#Tm`BMzyxeGR705d ztC_ASHpLQ85|f9<1g46pN+}DC0RuWPoB$*>2@wNqZNg{22p6u_ukr@KNA+F}r!);< zYAX32z#~|{2Jv6U@PCBUisLk*B&0OK6oM4v6!iy)Z$p|Q&G6tZ?%l`z$5fbNx61D2 zpaKRc?>sS2Cv->wg3R|bQgF_>kgAu0`^3W5N) zHr2Uv+xPFi_MM-Cc!t!VCeTz7Rn_srR6unIhHGPjg0@#aau;dPuNP%r z>LRk=o)ejoDkdXgb*vO15fFiHA)yFN)+1_BB5t^i(+YiBu0lbJVU;eS6bbwiH6r(^ zsizRyZk4SJd<=?^H4EWPjv%g2CXwmjBbj~WV;8FyaIpf1Yx-y{K2T6;Hhq|-m2BeZ|R6G zdUdLdS9Mb3w;_5F*1n2s;uw?H>&k+72}XliX0-}c2rE}%tKgClRwI+@Qel|G^ltil z|H<@6Z|@yKjIbX>za4Mi(#vI5){v_0Lu04rY@XW|S84>W3NRBY)LOYT2vVZA?U2XR zylQFQ$k|OlDjyxkKr8$Lc#lV7hgk$rnS5GtuLo%f;XS}7%n{QjnG2>G)&#idnMUY1 z;($!bCaQo234ZM}vz@00`v?8~!+spE4F{KkFnaR%JJXNuh^D3#7?a<+b^G9Oa^>2E zv_C?GB*x1ZSNC?WeCPLGdGKWV=y7&#om4~IDKNV_UP)g6+~JRZOi!>XArLI~%wAAq zamA>N!hjh>ibNOeWsvdS?Wb2RVWT2LJBujRU;^OEO8Cjp|LNhYD-jE@+PeDMDJyn_ zsw7FICX+MVxg0~z9LHykHSD-Be=;ogIWiF8Ia(a2c|NshA&6=T?{>ZpPg4MUX~IR- zDS-tPz(r_2Lpjt+vV;O89S3{>pibPaQ30u-4vH~cl~7eo8BhcSV3e1OJ7g%f;Mi@r z1v;bzoy}b^HnpfLn_RRZQmC!i3tW0aUnEI(nC73-0ucLmeEG`eTl)tsWM^YoYbCsp zwr-CWox4HzXZMUneW7`k?SmQFpT!&HA}BAK$CrbLn`&3p?=R&%#0tW?uayA3fVU!0 zDMUT)twH}B^v**RKrn#d>kz&SVFFR_WF4juq<|8bJ_G&%z#r8htLA8>g=^OUH-Y~n zfK`AY0NeN-Vo(4Zwa8t8BG3Uqbn??lSl^!kCdEgJrq#z!inl(@-rLO{At3%BUioRd zb~_oBaTG>@u94Li$@NdgRYh`ca8gOV9_$(w+PZAiea2npk)QQ05p_8vc2>ZM5- z4u*pZN`3KY{J{@?^rOd59^bg}-qyLz8#iwaS2n(U@x`>iL=1t3^IO9wPtS$@Hy`dk z`snW7*7~7MOcX%Ak9edvOFfMl(%DYgAH_;5APd%{frETj8B`T;Wb@zy0X0KT876^< zI8H?kcl?+ZJ#+*BZ17a(2szvP(5yLPf+u8+8U6zSCHrZ`2mOcH1 zx#U?rj~(Hqm%i{f|J}Eo$=-)b38zI)r51tK&G|l4_?0VH{?31NhYbZmP*xQa1JBjj zW`)X!HTX>HC=z6wO=}~a!JyIs86soYl*dc0kCi|gOaMr7ZS!W6W}lq2O&P<2bbKZd z3-ppoDCgoFXHvLce#3@mTh!ZuHV!(2Kc;6<%R6bD3KjYYadlVJ=xPH76jbmOP} zh<4kSD|VT5v0IT&$>n>n;8x5qqG66qc`<){!90$sL}0F1A#(t*1P~?=r?9pR>njj0 zL$U$Gi_klNvVmoN8J7VX45q`}gebRcTdjO9BdH|`#ZngsT zjRtn1vMyr;PymWAxnYxIUKYPUoBa3r`-@UC%93hY)jsjjCnwPIkc6JZ$-QS<)y;35-(8Lq8FMSf?8U)0s0gBKXia^e)k@Pv?S_ zk3qtt;PyhZb|9M$H22^;v zH~Q~}mk!gOj^d;r$4L~&fxIs!0`xA}jaNChPli23)_#0@TE)nlbxftKitWSrNg6s z90yA)gW>uso7-1+cHf)L9s*|PE`NIC{L6%KUP2r|6oOK)vYfo}>dJ#VFXi;$qgxLz zU7$gXU=YXvP7xo)%bVrFll=ArdI6XaodOCqU!0Ys6$`cz`vGn3CS?)S6I&q9((-F$ zj0_#NlB?s^AWesJyaWI^Qlcxjsf4&xOTZ@P4*v z{Q39ZdF!}}XsbIez_Eo58=W-Y-v0URmtQ+?AH8C3hx|IfF9hXs0QeGFz~qC8(S{%) zmQgZImU_U+tPIC_HJ+)Y)I9)9{CN?Eic~#7+EDLi? za@}Lqq&xD|1Y37C7wFyfBW|T@!v!GrOoc)>v9l%Rfrz^^GXY~8h0!(=>CS)Jf?*q{ z)-o$|=jZJ;Tbc-tRPTrSr9GYY!`Y~uMo@98U@(CGMOc0v23J5$Yl-znZC=ZPkAQap z4r=@@>-C|{hgSepU3>~J z^zxNo=#8S`acgLCuvsp>fp_P*QmP~e(ppy9WD2mZ$A0yK=tsTNqt6##! zi?0g!ws{Fb)j7G{j z%s2~hjGpNvU&zY0E46Q|P4t5TeAG%PO$2sYwC-6p-!}UDxA8ZCLR1?a=g}~uSy7bn zWKteJ)xDTU>lj4932@#Oj=CHLv^fg9hO_V&I(q=AB2$p5%yBDnlTG!km*l~aKr=&^ zns7kuf3)3`&XkC|ygMpY6nPZIF8+KmKpNQd&$d&dQW_DAA$g#6bCZORCg^x%FkiZI zZ8CdD2Z2o1o{C}#?og$U?$gFU9>4iA-v6|^i4Q7#`Vl|+Kf&c+hFAVoNOu9g1N`3t z{Ll)y+PVf~YXcW>Q_uvS4aCph=|2*Yi~w>Cr9u-xS(?Y$`0tLhA7pgMRS-N*d%r!r z^e`R9VVL$#fH;amrLgX;H23@Lz)@ft34pa$mW>o3mS*7(pOYhAJb*i@l|XS@mPYlo z7abO5@zeLi%NJo|1o%YgL+7$Ne`5BzkU|ZcE5*xK$G7kAWt0BlxF1IPc!?s-X^b2J zg?VPeK!sXGB}4^;0R#a=5iBo-Z@lr+clU0;{n4d2UziSK8m0iGp_-wd1y@$|&qu0U z$sWz3K!?KsD&Z(}o>lp*VjU>dQr;4Lu2lqNje7h1g)j_*P&H7gG=u>IWV75Fp}p{X z_s-2PeF3G|o$L9o&_)}G<yw2Je9xfB=vk=xtj1^VA#q+-kR#>{d7d3B-#?laKh38HxF4nO_E+EO zuOGz2D2{slB(6<%h(JuX&$WTrb(ppyEQ3%9UqND5Vw&S6YzjMCylB@;=7oJeJs+{F zAWa(c)lq(!@4ffI(l=g=$^oc7A=&5Y8OE;WfDBkxYIS5@xjg&%2T$+jz5Sy>KRsb) zf=~ql%JGSvEeur@VP0YuKv+UtfkFsFymTS{@Z9;Qk6wNE=KWq=4*PXnRhfg%)f$Dp zQ5bH_ZoM;D>%mZ2i&Bu!%6wLlQr0-3n-m8^T{7Id_0SkolzBGG1k1GeqG_cA&18rq zbI7SVfTa1jJBaGuv@>kN4kw`?%^|OIfYg_J6@%#C0zn1jJVbhM*&1lY$W`(**RP!+2CXB&$bJuBun>Sl72 z?ayY1)nsfAtKp$uDO5@-V0N4fdiOPp_^qlX?zr|KoD1LZ@fEG8(gz>I z{f{8~^U!-42Ipb$#hM!4Z2>W#3ZT!slb=ahxF(&eP%sH#7Gi)<6tI6d{+;~rTcwV0 zFG@d1Mn4^F-0rQ0q3)$onw(G*fFK$~7kuR}WU~7Z5D5W&xmWMsY5J{1Z}(vOy}hHa>?Z5u5v(jhc?4`);OmY@-@z| z?hL2dAkN|_HpPkbT86O>Vs*TZVx5O42S+6oB}5uRjY~tly0Xz9UitZrjSK7f#r30D zR9?y<`!L#CDvq|NH-ApAgD~nM7iY6-HZ4iT3R!8TYF`y1Fl0!0wAvIO1fg_kGIaRQ z>6M@+rZ^bur;mV#;ULuE5GVt#0O0vV<8FL&m%DHppDC%z%6wcDvubi=4tC9<>K~?C zdC;>GF?tGuedsFt6vf=GyJ=-x!9ZL9Vz_wa9KicBf^-ll)&Nj)WfPE#W1A)15KqG< zWG28lB~A8wO>gTZ^vadlo%@GRc6X<y-4&2ldag(P;-w2FWfo62Y%Czp+l zaJNzz8_8K5MUhCj(@7>sR*xGgSfWu`(qmz)5moZ<^ZQYdTtVB`)Asx@wq3ve*^h60 zo0+Wqs(fy3k%!x~CV~sIb*YYJk!sMUs@$Eo-PMq!^An4t4L(o}=L~%eattw=Ac1&! zqWeols57Gvr>GyY$xv;mL5dUumjHC8Si#%GLHg+ z0}RlbjO+d6Id-xIlbNWkGlNvgdcf=Z+z%9Ilx*@|Z+sX}ckze6%Mb6s>la`n1pE5c^Lr{ zPSQkII=^+hx|jqnUPKmAMYpT!b)OMBpG89$Xt=OhUAu6&vzOesxgJMpFNwogg_+Ld zGK_Q(S78)nNf3n)S2&yT;ZDB$boTMBqaVCKe(%GBo&C5nz$DmK(-gE9oQw3Wo({KW zyF1~iiqoWi4l2*9JS%Z2usQq5AhaxU&EL|gQRIJk1{>i7TfAM#)LYJCUJ4yOPCK~bY9vqCY}c~BSsLnh6DJa5@2VLPTO z-i_B4RcpmguzLhJ!GLt6f%`!e>i~hK0HwUyv%M+2n7k+pOCv*7R%J(dc9>1}%Y$9o z%SU_Z#yDE3Fyf|g(dh((?6%$`U5?m$Q=bOJ{%}94@t)i{7aTFf16=8x(;xCH_h93T`n|1cH!P0u?cc-OZ*lZ%K+CYU3i=RW z+Tw!XlVdJ-j^PEtnGiA!SpcO1g_r=`n^f;io_^Dq+dK&2$KmjM>BgPjN_k?W3)16N z64vo`>|BCfcpEZ!N}wCEEF`9gE}hg93`8z@mUFV73+QQZ-lhB|BI}&!r~j8;y$HV3 zcVqO}V?{WKHSvRYe%ia#+nR2Ju1(e)iGFD<@25X!xg!N|d8^pnKl>v$@5WorPVfjE4IBOa>re1=zkhu4M>2v#Q->y-<;!RLSg!bPlRQ)NG1) z7(*H=6`~TDo|({2jQn$$$Da7~KPW3s{3uf)QO{{Un&X_z?matX^=!OxPlN68YWX_`by8i!HP05Or*)dU0x$ro0^b`iOab6dS$YIR7o zK+Nn5V50+WoS$ACpRWL5E@y==G1-2<)Pkc{9}sv}X~^UJqrKgwr<1Mw2m0cegN%v{ zxCgAAQrMXS*n|~MHZBKWwPpMW)Al!_wMcP zPA2IPH_!L4U0CB`^e~(j@JEMvJc8U0oa}zsUyIk5kA6^^OG%kS7%M=10>psEW`Wn> z)ds1JA+mSrGhfR;0#LSWS}j7&^(wIPt3O=^G`t$~4w zK_NRK(briNRotZt>jWWS8Kg(3_lotfoQ-B?uGj&4xsKco8Sd1t9ju zy)4U;G_^K9pZ06MPV{1H{lxtIZV_a`or-Li_oi6uhHPD>9YN*AWSr^r4)i1_b42?~ z`Qh5^sDHD<{~r0$6t4E5UqWO+-UfFt_c;XQvu_j`W*YW25P&wQ5q5KU_vr8sc=8Sg z1ATum{DW})ak@O~4U-cf4r`YQ<#J8b+ZGTlE9R?}lAj-RBfRK#HGKCB(f1`UZCSlh z6i`boF;PQJEV?1%X&LeyuKI2gsG!j5Lxk(Q)9T{~`n=J>0jndT3j{spK!B)gsYZJW z6f;dfF&iuSE0_0w_WtfHA5N#knlcW;Oq;x#9b~idYHK)-;>Jvf2p|KKhv9HNTc<#j zpMc#e7y!zt`RttGNgy053`(tc<25Fx>S1`88#Y`KR|i#|mwgrWbPz)jwrf}8g0Jy{ zC#hjFWJ*(I)oed24ofanNNGQb45>+OVw%O~$N&})Li46vc$$3>ZUS=dZCyWNv?31p zu#d9@pfaQrFQB2Ima|57iA`*A9}i&Vo?cqzN9WCh&x8-d zy~FVKJNQz{vp!rfuvS4>zjb5J!e{vz@EKOU1p!$xR0suuVyqbMRr!0x;U6(Pg{mKX zJKcCYTD_kxVVd-MQQC`jpb^DsUksOuJbF3=_D*Enc4+b5#0|sjib!~4K|7AoG5hGV zk_$s@$kXz6pm!2Od(*bv@1znJ)>6c~?o;-Q@xW9k2bizv{VH^k5tlXK*cBc6gQ>ClPrSpReSNm7C(+kTH zqT0{laMHW~^K1Lr?Q;4!2*u6|kWKW83Ra_Na5+DGG~3CC+kyBOld2N~DP$$&ClD|b zNo4thyE|7dVVb6Gf6W#O`l3@p5na6Unz;5lEbd~ZA7b604>&cEkcDFiL!zFeRt-&sW@?mHG;5MOxV7e09R-DBDpz^4M5vs$>?e@c1B3}y>K0Ms2p z3uVR7K4_!05_z!cwT4jhsuaARHyD(|83BpntSaSSdEZGcvi!lPU}29-2fo zqex3d>BiZ7u@MnfRAyy4E%Ql{9~EXsoI?@}d*J|jNf=R<9nNN1UhcC26AVd(?Cc1x za+!l$>q60Tdt3xu2gEpMEV^`M1EjSoX8MM_h{f1Fgcn~u!>PT+yHYrz9nqJl?*eh7 z!zf2%H;`R00_nqW#Xz8o@F;k4ed%fPD8q*Zf0p1ifb9Sx1;ip9pN+GNe=bVUHWj&P z_%@z#`F1|}v6+4dd%g5#f9dDZ+LLrdy?&B}aS~z^&+6Ru78Mcf2*!2;5uAzJ`po!I zXMx>cr6ZKkbHrBJGHl2epr%%~D1Rj_cHY7+u^3|{?9%3diUPecdVF*D#=YuO4`0^X zkxD7%w-rBCyv?*}IA&7J#Gai1tUy!0KxU85WH60rW4XGreUN8+kDl)4MXxH7A}?+| zoII*%PlqcPmbWhr&tL8@uSQ8vg(3DrxUvpA`|(G?i%+L--P=hoZyQ9kE?SeIKN@`Y zQwMh+R}V{iT`SNhawzATLYkTXaR7&HPEWD*#jw*oDg{B>g!9(D`BL8 zm0*!u14u1>fu%Xvbq?Sf&T6ax8y?^9>-sF8K~VVi+*qt!samXWoSa0glp+SSt<5nK zkd=SjrF13-B2da-rIUHzd+Y9tFK^`lbJc}hVQuo2O_gYbl3hV^R-9~hB1dd|I5MaxO2aUXfKTb5SDp zH(R?>EU&EC{SNc_x#G_jH+gaP#tu^^kn26LNc5fs9!~JLRuNH7LWWtw;-@+-Fa*X- zg_#MrW(Vhs1N;#95aGIkEd%Q{3Yur&ES%}tw#ZR1fvx~`IfW-b;^HHS6Zm1e_WQ|J zk@j>F_tGd%LMIWE3|T~LGE=}^1hx_}+7Hks&{xW56?acjxZ+bI>zXm-L(qLl2zreI zoeXmvPWDAuElugBUVk=Z>*~S8hyX#T(qVePxIa9M-ngZCG*p9S#JiwM3^L>+4NEx> z3zIM_W+ZaHJRFui{6;O&6MP>fBSs%%ynr6^Fsd9{Jq z#gQolwpl08R&QlsrKM1#(r6lR0Qd-`ByJ`@+gBl;dVYf z#OWbrPtEL6k>$l?rUFm_qe5AvhFCK`N>k>QDGXICsp7*F!X8FL3bqVz6f!H=n1)K&&c5i0`5s`eYaxY^E zr(}#dwdWwBi|h!)sHzI;R1wAIjj=>bDNv5WHss6IBM?*=JdIcP%l@r$=`+!trEnHL zpy+YMV*@$DN{waW0{)31cp(LaVE_XJk}xs~APvAoani3I4*4*O zg*lMh-g{2AXw)?Wpz6mcvTa8qb|}j2B`8g|Iv7@9Ko#+vjWN@cb0vR-pDYW&s{(SXZ!$JW?1|s4IqwK`z+V`eZ|( z6kIx2-hX`X@ag0I!fpWa zzjSN%V6y)xO&}1*>haT{cP=^?X&Q1d%XZ7?g37XzQLz-+M^?lQ2wR(3S!m&Xh*^A9 z+77eEkdilUZSVtKy;#EVjk=L5XO>1+T+&~tkhC~3dZDhQ%KnOv;3CxS_u zC``VJFxuD^KH(@nc;}VZ-vp!@VeRxx(nBnMc(ky3MTgD6jxnTTQ}Rx%jOcrw@+d*n zkR}8!xR_iC7G&z@d)o&$w$p6m+U9U`DOw)k#+$JDjX;Gx;QZltvwOc^Jic2T+(T6X zR;W=0sGG^QBPQxtMSWJ`@j^NR9fAs=$v~|MaE38O4CUwBjt9LerLsF#VA6Vk5=@A=IIhK04SHK#`R<-kNKkcSx~k% zC@udfsr0Yi~iw3?(*9_y#69_HmRFZu<> zl~SeBGm6-tVdQ#2fF$Az8`;t2r$2iicaGv|u^#o$g%|-xS*fQ5j&nH5;4p$w1WWM= z9Ip)28yABQ-o19X|Ixd5lUJ_5D3)x}1>yvwaqs0<3;bw$KVQ12vO1Bxt)a`P#K+!i zC(ICqv31-;fd#b0MLW^Q-P<=VUw*CEANu%a#lZ7)ffJ3p!Ke!UztAjIMY8?`e6bu_ zl|mDX^#K(IO+M158M%uO-hW$ZOp-oT1u6kn0r7fm09CuJo42y5z-O!vg3!A{c_5x6 zfPq0QfuO`bVdK6uD^}RZ%ix0(6q|(drE-6h57v8nxUrgSY^k-&xcmzDUer1TAUKx< z{p;1n&#L{OREK-!Xdk#_sDLXVG3rx2)6fZh5mS(oj*SW>cAt@b%s0jchXwXSJyOeu zAqF~|jf?3~nLjxsGmVxAHDJdbbsGIUwX2oY{C8oi}N(T1VY9Q{E4s!QPsIoArP#>t?i?oYmQyEtb2wg1xW5cl>VmV<6 zQID$xvMK1I?3J0)i4J5iJBe8NYJUWb^FYkpj(tXOHO546C33;;7O%aUXh|PQRp3Q4 zGC;&+m{`V|s^QvsU6CM0{gsA3B!vvMa;iuOFK+Q#ZFlczsW+P*y#3(r>eJ7x>(s+lk^l095MFvFZ8W@@4bSZ%BnMRAa2+0t&ZlbM}-8?p=K zw3_vUX$I3ACOM3YdZ`m>4kEa+jOVs59vp4{^#1bI3kMuSeGdvkjRu3IwZkVLnF*7@ zVp@K0aXiB zx;kD|z{d+}Df29y1uYi>DrOZCmIY=i3{yoxHdQ4RMfQ{k3YC;WN+KmKP!sGO`&x)8 znR*2oN_GPlQ%&Lje?}t!+^3;H>0#i8YXWAz;h7 z_}YV7!vR-07oWd1gYyXIUV`#nfE-wh>#0_S#u8Am(m+aMrAAacV-F7|2{*YkF^TBv zc7A1Rdi$P!=Qe)-<6CBWp*&j2`|&Kr6D%&^L^>``mRe~iGdK@?IVH*;(PaYT-FkK=3-$DHR>R!H_2D7LHPPF z{W*(=qC`876SSm}1Rj72INjM0@vMBM{K-_S_0>!FfBy2$@rI4+s z5wZzP(J#lVW`8xFjaEnL`l?>p#?e(sUV?DD?(G@yjQJ+;I~d>AVWs+UxV6TU2_1!0 zW?W{dD#QY?1ms#RY{X%(>J%stav5yWRSXOS8DuJ&g&P}*!ZN$Nm(9#kyi#(6thwWU zfJ`l=!Gdu&dJW)oAm)pgHvrTEGyH5IZdrY77gkn$AYv=l%}@26jZUlqpa)`WiDDTo z1l%c#=7h3bKAlf`=AV#*8Fctc8sB-^B9Kdpa_VK;h#r5>Fp8>c7yl0*9RJ$Y%AVs8rNmM0Q zRLhz*t*Gwax(~lZ>+9Pc^^b@Mh>+^mt$H`ty$JxHEfM?ePmaYBTJpSdvGgG#5Nbj? z2e+L6mCbyj6dtDs(i;2y{`e@jHzT84a?L>y)YE=NwH2^5M&u1a8@_zyBn+D1%WkZm z1;o@YlFOi^^anOpJNY77YaxOe76+@v&Wg&G6CN(7>BbtYUV)_-Ah`^|3P4$R$GgBE zo-Aq?)f80$QN;nN6uDAh6q6KnHb@5809Sw_DWhfB?NhEkRnT>5kq*U#-dz4c)+TP+SY^1(3c1+$`| zDUM1QRWKw-0$xvyQc=mnd-oC!$~2$kd;3*6gJit=Ca%3a7%r!~Ps`b~5|=HP9hiaGFmRJB>^REfm@I}?v%n=r>4vVAKC7B`dTCFed-jtzwrvrM5%CjX zu{B)OlMpz+4J9XXp_)OU-+1Gz01)V)-ycpV2dDsS_p)WySi+D*l2%F?i5Vekfs9Z+ zK7?o%s8cFjz_<9m3!>NM8q)0M7uXz&Dw` zbG!zaAQS)wumW9TT0&~-SI1BpHWiTZ^s&_$8vqjnAFED|V*uz?s5r>t-dL?Kg$3|r zvRe?8IyJRWEd-a`b4Mx`@zy6-I$a`mdmcWxclFvecy_aMJ0HG$Sxa}QtKwuA$enV(_4lmq+d2i8gv0+~hu3)5H?=B=HNh7T`aysPlS5(ERN z_JH+5Au)%}5Nb0@r{S8(hruilcMjs+qbSc60QS>rdu_b==*Fzr+B>+IFU2RKafZ_v zCN)_xDPecUyL+?ycOSm})`z?Ay!E5K@A3J3bEU$Bqs?%*miE_{`=g!;!z`$T&*k~-&*;F z0gwcF&$gdEfAfT18;c!Ztn2n%SWE4cL|_u@Pavq2p09)^2I zIwwd{_436>v->yqj?Nc{8?!+;?T3>T#yRXw4Ck{Odr!uXk8^H5()sw>Hg0YAFTWnG zuYl5l4z*TFD_wVJU1WJSEqSFy+A=sGW^8suNyI3f78(mD0~zCUM>hn8>h+cYREr(P zMl|NinnPTH8>zI=CX4milrf#U{p{d6ZZ*Nx=aq{A1FNIhycpdi`B{7gTs1l0K)qCK0xRN)RbNDRwhk)H_DVb^8+1^kMYG}}4riN7hX>?%MguGHbUY-2p$-|9V@7i>YhtF&_SSrAm~;m z)s73c`^?!`ELK~?_EOvXZG4!WxnRlN{;n~+`y-2)f{f5`L}@VmedY=KLWh{$0vHgH@4mlmDP zLQUvyWoYt3v0oAZBz1&w2urcMn8nGRI7nLZsCILUu*j`~Nt{UC_O_ixbSx2p$ly>@x^%U^l(3%~Hj z<41eEvo|V|P={3xCI>2*GDC(6&hCA<^W7gm+8OnA93@)vFF7FgPjY>88vx~QgD_B_ z$TSbp5NS*L{?ae~xnqI?Sk=g@Ejb`&Fk&_~{(_x!+%2W3p2hQZn*i}5n?bhCiN;E4 zIqdoUi*?rs$ilqXB6>=6r6`I7ixJ`HKl|xtKKFUU;$CT}8-7nf$S%<(p#i0!Rtzu* z0QCSEiqZ}GERbpoA#m*=g^ft}~D}&mmy9(iz z8fwQ(Zv%fD_#yDVw{kPvB4`E$k=bg(Y~%okzkY*cV{vgl{k6!JaxjGDQdh0uo@jSzTK6lVulAT2$?(*kn`5U9`wKc+(bQ@_*2r@dt&o3za->e>JvqiX zt+}$C-AfnT7Q2-XBeE&~LSyKtk~o= zRZvi#nS)93Pd?sxo7H%2X}K3^)Qo^#-V5P`FTQpi;v_LurL+ol2#B>`mJx`OnG1Nt z%C6;C(Xoh=$)7pjDU#^^p!`o2*gB$AO%tz^^=I$_==fm zD9oxbA{YYmLNR{XGp(_>l;YDhDDS}JF--Qs6wpgybs69y@Fw68KuBjNq_*BL6QBl_ zfB{ftwULdBd^9H3${9<2USO0x4DD!i+30YB?2(zMlgLAWxX}#6eT{r7PN$Q&SZh>J ztJ{E$L=6oJTf?1=C=rlx?)HLOUY@lMGwr+tpcRgX$r0%BPj2b$Bsq5h@I5&mbPPIy zpa+2o=(j(XK$nD46DW6t+=aafe&iJ46(pK>*0ZPF7dmq!`&clUcwp8W7$`JUQ( zm<(S`K7QrRi@*5QFTV2X%j@f_lkw!k_dg!LeH$O|2NC8B8F6MP2bdY267R2!iYOZO ztsk+ddCKq--rC5u;47(^1SK?hoCE%KWWAF`^-Gl5v-0YX-x$yf885$5S~ zKkCOA0LIHOcp0LV+Hv9@&`*Fr1bF08%fm7Gg~_9tN7zL;Rtq~%TN1!!2*#LdSc-VH zDh{i?g7pMf3XGiM$?!>m*zMvjIm*;F8jygo%!4*fce~6)r~H0LDCR}WGLy)|It(i! zY(>^}QuTHTXHmE1N98{OV#O455mQ-JwVzcVpo7I$B0i{rxR8(ysAfR>fP2745Ec+H zU;#(FP)q>sz-S%9HGoy%K0wkXkxji008=msx}x=Bwrg@C&#D8lBk$RPxfcs$?>rF8 zwjmG72of8uP!Pe8G0u6raYnLv(EwdAE`SmwR)QKX5<#I-H$M6hfXkw=KiEQYAUj%G z^(GO0&UlsPi3%|zV%t-~p|ETStT~Lvx_vUa*mp7%ju^FW&JzSW z2vrmXlJr?_$$P>PJO6eBS;^hnz;f-nt%YEzx5JrGYfJtq#y9M;Sz;^($Q=*5hx!ghE0_~uH+%~#D zyNf!dhJS$2LyR$uV3^=aQSDYoM^!x40}LVtTTTX@ZwTP?0r6??l*!ee6W>b$-^s9D z`xJb{jkInUGvH}8S>L(WF<-Dg$9)p|i3k z6RN4kEI*u;^*bqg*b($DaFaUg>oIm*XKRFhP({yl5P&oOtt_Fw9!kV()!8+mhCstm(Q=i4T$K_-i&{H}VghJV0b7fm zCEgerT0zGCEx8zk4&XAIhLmwRe`?+e8wJDqW`M}h3V{)=2b)I^5o`tSiC__kTO1d< z`r$y{vrhH|agg=HyBCK4=!2WzeQ-ZaadI@<*`Gb!8}ClD{i+%R=L%J*^+*LeMVS(m zjk|8*Eigh%#6?`}iXhoSnJOF~8}DvEzV~2o-F)QD>ej$`2{ zr1=1{`UMKcHX?vHnA#XePzv9FTin`oRaH{tz$Tt`SN&`tM#ZLAO^4OE*VAz?)R9)n z0EZW$zYb`Cc7ZX}OvVt65XyECv9PxM~zWXs{78pna(JATKauHP-QsaPT1y-U-(p zhl3!{pauxT8+o>pOUk&O+|1PzgYxi5)TS}EEIp`D}Q-qWou*OA|g8LnT_d?wWo=@ZV!L_ zMnr8ab~uZzCLg(<`-JuGR6|!Q-CR8YhhdncQ5=T=WP?>uBActy2sDI2+We{)jzk@B zJGfoaRp>O(_`-`X-M#m&vtx+iM57{PQp7A$3U^V7=Mv2*ra?I#(IiP!Jcx9J7-)!A zAy}!w=K#z{K=*--7}UGu#HnzMoof7aDk!(830eg17GwiLtY9e!CskkbK${U3Lo+UD zSn7ySLkEZjt{hN%AnsPcgA12706q|asEB~U81nc@Xpt4ka03Te?`OdPH&+8Q2?Pib zE8QX*2oYF-SZh^>LEpJ}bxp=oTdKB7Pm|%rkYNU?LLfjRSMTmrGcB3f(994S0)Vha z;S6AUvS1F7gPB4;0W3fh7^UuU{~y5l8)`HS(~~|I22m2u!odx_O0#@vHfF6?^GPtv zR%X-XJev{BGN8w>ybQe+z?H@aBMhO8Pfl*~5~mr(Q6pq2qKW{TtO3-G7ZhWdn3e?K z2<%hnW_BkhCOImY5oL6lPCjS=Zc+s)1YoW7340pIk1MSa&{j5R7-t|_0Afcu$;Hh3 z#Gos@6ovr~d-{4%l;$8WO+^flBJ@R=cT|Z8_R7IJDv2R+)hun&S5%F%Bzz-<97JqN zFl0gsgyRjg4ubmB49qBlM@aRyU?owYb{3I6@Z&#v|1bP=UyGtBj$`3MZK)K}N`3DS zz6CU@p*E<~=~P8g*nke4tD$TGjZUpDs+3ohyLF@0sk}s0y0K&7iIo&h5Y31Q>qWxe z#ozgp@Wu5NBLHYcjR7}MVJJjABR2OVnCcXPW6}8X)$1Kh_v?0+cwUTYaetxr>v4{h zN-;4K%}c}rQJo54vB?JIQ98nCkYL21OHh5#OEuDr!Q2CS2yBEaIVDck&m&$m?rf0T zGsjw}c_Erkiv)=j3_&FrDeea_45|T-C)FXTB?8SIAeP>LmPG92S<4MrCFv9gW#;FM z4(f`(E+wXq3A8|LhYv9kd6m-UoUHw>);dngS-T7khD9#QJ zGlG2+no5r$KLCCT@c?=~=+|)~yA#l5Im&0H=`k^A6rz{J*T*9TxFT4#$Rc95*oP#q zv6H2h{Ow4#95Hrlk8+K+3V}hns9cvJ0kw8{g5)LJ9ov;pD8R~pB8aaf#{jk1AR!Xx{iUJ9+kZWR9gL{kp1sBkWo|m(; ziKQ|b;K$#8|Ft(h3jl-Rl1ro1DIUY4uYBbu$n-Gc?JrJl_J}>;q=NwgesJnG|SWeSI??5nQ`irEfLWLn&Z#e#+M7#vk5WW!-C z1wRHD1CCGDWd=nKsscq21#p{sf1kDfHnSkER;s-=Rwf(aHy6sS&FSO$S& zw1rr$U<~UU=UN(xyW!cdk7A~7 zeSUlCuqYafQt5zHfnp4xo&mHrqKKmJA2z!lyUd`LIss&oJ9k6Z#b=3OLl2O!3D}`)xE=ux#Y;FpPxjy_yfB1erO<(`iXP1^&i43@2L`~H4cmLp9U;FA` zHO8#1U1*oT5TZ!f9y`OKrHSb@GC-aZFIcd>*YIf(9A0)lbF9_vkB`NuSl)@!7}icF zVHg0A);b6R8{x+S#HMP7bCL|eHGeOzIBhqk)+ds|7hihu-~adS074i>rZSHAl;`d5 z2T80dr)X>H-cnXV{r*|P#f-Ypvng;b|=aC%H)3A5f}6D+F59k z%4mJvmFrRfF=C8qgiD#}mswm*R9GznvFvdP608E+uG~!WvA5xOs`{S_#Imz(SXijQ z<{N@#LK>dURuXOc<(#oj;&-GdBb%mRo7kE>Ui-em7O|)TBv4`Pb7+8PKr`SBxCE^5 zF~@f)y`hF51*6A$SVl>F0>fb(>6(1BbC!KcLcN$MD#LI_bQmTR3?2=Z-=9sl5BAPY zj#4Ved%V97u?8|w85mW?Rz5i}W=0ecyWUCM;4UI|ML9oM7vj-b3S6=z@yKlcGs)PkHhoOr#E*%^YNb@-e-L^oI z9lj!TX{AJUDsEAD#YY2O>3InAOgC2wBiMx>c58HZ@hrI* zV9|ni>Yww4{X+$*PG&R;POvyK(|}3`#0U%2ghkIeAZBhW8p<)?x7F$_OrtmmC$Wpx{=cRRk>2+s;bCvMWh>BmFI{3Mf=qLj-#kscOsPHbv~0HDC-T_0b=n)0wveW z!cJJBSc$^|IYYgXsvo?-5!)T;uFy-w9y-zWBiUeV4n{E_SkOgR8bHZtV`BDfp#Nzv zCpc&(FvwEl5F5j;_vx@kP%#_$dSccV>fm06%fov+fApP?zws-7nwf{Ar8YAr-V^uk z-b5aK<*UE3va-Foc}XmCHvgj%2o+vcYdi~xt?$Gsq=dvrewQ=n$eoeX0VeW+#Y% zL>cs`;EFXaO2-R)vGqP>JX1y{IruCf_E;Ro)lky_@}xS_lsh0^^qRoafY_&8v!CWC zK5g+?K)h%;Mr_UMi+Tcy6$O=UOdj%GsgG&T;eoi3h{?K_`+y#QDU00qh-Vw-D5Q!^ zt=Uvy7?6OqI^y768vPNiJyHGrpl5m$9(z9_3wW7@BQjO^@TjktnrZ9TV&cmZ2uBK zBsksjjUaf5A{i0*Bz&&ioB}Ys0K{xhgVxbc0NIWeOSW5Zm%H&wuIJo5-@=FuN1V@k z-}n&fIIB~8a^Y+ z+6BUTLase;3a4ZT9=oi{-TF1Gs7kA85}Tlxs7L`;pb&I&vgQh?HpY{r9csl+bsC;7 z9rLLSa@$x3i;P73i}NkO6D*FD4j_dhHV{zxobGExE?JGwHF5spdP^c+4B2?L`wsJB z|DeX?qiQitxun#!omNb>{@p3db=a;eSkhLX7pMuAjpb^(W%grJ3guc76oiEio?>!e z^?wX2Kjl@7;~)-`C=9|AQbJ7pZLARuyjwq8E~j-n3R!6)Wlo@X`Mq9xZ}a@h)2EjX z_THH84VeaXKuZN83r|jn{<|XNg90Ll zI-Z>HI7Id}h;f{$8NMWkIHD5J{o~>R3FWOlyub6{-qW%OS68lHzqTF6$=dokCt4DL zYv22W-~IBJ|5-#lP8;u>cBOMNvqN5yiPW^o*R_2(foqJu7g_8T z_sF_g3d0$A>z#@zr7VIf>?JyhSo9HAHE0!Jaxi0{3JBdzo{{Aj7o_87&=h`8cfb1- zPH9R8I%tJ~V#TDuoB_m(jt!ntb}F=_lOGO;64WyfyJ!sCqSO8e*Kxiu>q0$Jf+Y1vpZElg8aPh@`%GS!Gh%1Q+(HafvZmAC0@ z?S1_lf9l`=n}7FT_?P~q=ZGzz2Z&uD25*n@mR6*8wr8G$W=302m&m8!uxzhCO85(&#r{j!2Y|Wkz>wu1pjccoyHxSimw6wImLgfA8 zZC)$*?svZR#V`E13m0C#aN(7)|wbfL&Ul+mBba1Awblq@RirTBtI6%{XCxn zp!7C{t*(e|%Y2KEvnu7gZ{2zMwM*=Q&?!4jmv!`{t&;{!WT;`ILQ}+01xa5g5e7k{ ztRewaK(Yu&vA~=7KfEmL+agWjVfSp9es(jA#DKN@#RkbdLn4+Wa zr6+?BoZT^{VwoqAGKE%8DSiy;Eg1Y*uiRJtDomq>8V+?TxtR%&|XMilSI+6dheu10qnU z0pQ!e|BuP^FJ5|SZGF4f?=u()q0X|bs!AI*4wfLcI^3y^)tswCS(uim1h%Z9f;t9} z8&fN_#~Qn_rj-inmStI4RkaBKm?|cASHoZco&$^j*zJ{9zVz|KFI)#6`%&vr>2$9NT<{c#DNiYj;-w&sAqW5rn5^!fB`^aiAOz9?v~XqqZwI5N z`Wionj9jmu-H2gUK~4amCGr*cEFkt99*Da;|G14m`L4yb=wx{YHQ^+zjs_j+Y8dCp z^l+B^QMvL%-gsZH>IlO?p8#KCpwQ1Xa_`Ubuc=NLW5G4snd*&FxPxgj*Zuc+!@~{18|H*&A@Y7%ZwNG2b z?E*3IDgB2RA7E>b|I^>yom)>_#-ZD{9y8Ou+XB0AEW_Tr^Tch-?;L9eX>u6=zVg*C zg3a3e>T5cRLW!!4!^kipV87olD`SX)AS7d4{u`x`=uEG# z|8sjjxwvlivtw0L6Ie?I##B|wWm#4g)r9dgdXZ&`y-@68b?R-N6HW2@3om@@oBu8G zR|2h@x{BBaV)kcKGGP;w)X-xxOaLL5iJ1if>L>)IYMM9$LVyy8frF-+0CWvxh-Z{2 zIxQX=x)wRV)1&sYz|Rm&4eaJHE{mxd=X^l%EJ!PinC$H>O2pzdu_zI9Cw3^yve7c3 z^0DV)BLWl~5s1JipSm--tYqkHXqLMU!EF#Xo8zn{1nqDs2wPyAc_Ntzm=2C`D4MEd$0|}BC-%N@Pfsu5&e{|^Q@C& zb+LX;A{$ERKVt>t%9FIib6sJCW7n%c@oQfrW0E-Kxd{_-AxND?jJ2jwM;|*;4r_Z1 z7@K4hcpjDi`M>fn|Nggr=Ucz?({KFhn?BiZXU;kkhza2KjYls1;q9AG0JvUD<05Nd zVQZ_&Ke@5F)jt7QeEH?8D{Gqqme*fE7u&)BaU3dusNN$SZ?D%wR6(d&>b9X0ZH$4G z(mG&~c$tNm_r3$hbVj@+XgdaCrs0>r@;_N#-dtTh-*!PGqPa9|vT;_aBzLfU`s_Fk zb`97QP)MkxkQ%wMrj!JZ+fRk2;PzOn?C(Aw7DrJO1kLZs57@|#sw}BGX(GnAYg(#b z|Mh?6zxpr##{c%;`agDAYj2oq)xc>5_QJxP?6#?~<5EWswhw}lWs?;mkqQh3Tp6lN zQ<#8CFnP_)mB0WL2pqfLeU|MG+9-UwTZOFWKYg}1To63T;PH$O%E{C`&hV*;52N*5 z_vV1u+etjkbctgh;0p4GCDJ|P?n>-P(16WcX*|v9ZIx~u*V4KQbRZRWnT*Y`A`P1~ zF(1Br|H}1qz(meq$Y%htr6!2y9Uk7+=ih?uEGYBiC8@N=RO>Jbf=~y_C$nacpwc?9 z>m4Ksq@g_)y$S_{j?UVL2{`;T$%;ykcw6X#S zA|^By96(9Xfq%-#EE^I!6Ex5PNY0avh^@&^ptuvN=*Zq*`sH8!{cruFzy0t2lULqc zM~15}oMUc39KQAOV*t2yz^&{CZ)kFpL@y1%;NB^(rRSXSfmU`mfOyql>9YOot`PxaC#0OEyA1LrTSH-}qbML`keV!C90 zcGZEpDj;`chuX&#bpyoG2*AqMwn&n|(ldcr7=OY2c_0R0XJl81HU8GV1Yw}GO;2xC zEOLZ{$3kzzYtBRfi+qBcxWxts&r;IoBkTNt#O6l8k?G(#fn%CD&w87iTgQf`;cz4s z&Y68r_G2D=vjya_5vDX4=Z;Ol0>sj}<*GY=KkTIKV>mwMD?a?-?f2h(`zO2m2=L&+ zeGz8QZJ$r$6OeuN)ob-0X&fi9r}b(^C8^iqXO{MQ{u&Jlez>%X#*iTjIBqb`G}nfU zbeS&`!(>3*%H&N+CnO>iqYpAD28)I+F9Z=28Kv?5-P^|*C%*87-@JO|^_7*aV`_qk z7NFCCg->N9e|}ORo{MQ-+}|#gPIj!-HRqZ*xOTSU#dy3=T4M>VlfM=nj>yjVC+m#AR9dKc&B8$ZY z`95F)r~wLK1snqFdFaGN*zJDCa~SD-Qca znU^kK`QG<_`%nDo&vtoOuedlMhO>a!^Ddx59R&zn|FTBKipAN>rV~;OtcU^0NG8ip zl~n{Fa#>Hh(TnVz&m_3vd4QOm@*z%MLMO<>!sY{!od4c$eP?C$!l&N+G&3Aq{fW6@ zHmoFT6B9Bm^b#smNgk` zBo1axk)uGh3hT)Ma!x@mWAF62W1s<=;*?s22$F!#NMwhI#=ay$xBbR%oX`~i>c95C zuRrw+B6(^VyZ$BUQb@h<;){R#Z`~yTt#kz?0Pq4LJDagJ_xp!eVK@y2`$a!IDx)Wd z;UEe?!+8G$j-voV1xUaFu$IufML#zG=i+`|fZ#-M$B!Ny`&b}>z!@wa}{%r1#^^Y7o*X_SnDLk zo+C+>QWifQx=|~=8HhwIvs(~oLoAqTi>BH0dO`@>!=vdiB$;yMekB+PZSRvyaPp}f zgWvz&@7=%q@Gtzuf325}2E(;D?n~98_Vv5#bXfU}D7ZxmcrNvO`_oe~-HAJHtVx<_ zt#zBrB_d$4(ik~-PJVq}Ebhv@P?l9$nmWXziHmosSr_B4k6kH}q!-7%qL_e03c45s z;7PC?j5&U=*IOMXgeo#B0G2>$zXAv~ z1ofE3925fz7C(;(8@n6N6ok1(;jG5raS7v!#-*85)zlOf=LU`{bx7eO(|fFkd*Skd zUY_Y;fwBGeJP^yy(}0+vosEYHZH)+dFU}m)(zC=Vs{4LBe>Q0nYnfP*jgT|Qc~Qgq zIA6MS_1oVHKYIWE#zwzIIaq9w)x4SB{wvszK4G}S4eK|?PMSuR_hpMs%QtHonGG>I z{8tT$!5$D0kX%ec+tZ&(62qSX#N19yOsyHQPQ$cgh>sK2tgKx8)SI6Nz|r#3XtdN& zAPNy`-ho_wown%FW>#=fN|x6|rjkUX63v8*W39uJ`*WT>)_kU^cENd~287~`eiL#V@@OH(xuO=8{_&n_H=c($#sFR>`5JTDOm$hU#kS(2{3aQ(fv zZ(n=ioG~+p)ZS^7>Md8P7nQ`=60or3`|(Pp0+`*8_wJU{!em9V)Qd+6WQL)_pn#x+ z06+zen?6{XLoq1u!bg_{_E<~|27svEs2ABNY7w{~D6KeL7?V?$(=_LC&W9!JmvBgW z%<)dNu^(-Y^-`|;PEQB7(WNHb%VhHS=8kWNnVvhhjdG}RrC5CR2a+kyfYPU#D8bfh zP#Tq!j+lrSEs8 zSd;v~D5Q!-Yz3N$SSzwKcbA%Au+Fy3BpW{3mRK-a)T>2_`2HP932y@v>cj}L$5asj z9Q&?)?dyL=fbWepd;M&Sq^-n$&exiD0in& zBAz_Y+vJ-8hP!uf{NW$`;TOO3&m4zx9GmHmIpV6Sq9`iM(!t_c(ahL1i&V^K)#F%{ zm*vc7vBvJnJBU{b!%#QTa75kOqf%z{bg5j-w$Fvd?c=J7ioB{_pxY*EgfrT&|N3A5 zul|dF=U@HT|96icA1zFeD8Bc0)*938FHk>XHI}pa!EYCK3j2*uspE$o8v_*IXp+p;W39YSPBq~+^kYNKf z$1o7EI3<(pMFCj`faAafxj46{cJdFPiJjY)jm^z#^6AnmS2xa`w}l~8n)a%yO442& zCqWPpc~MK%gG^}!l|@ZI$Yt9Z0FhP0-z)n_4UwrDEQXe2%-N0QKQ?g2So4&(Je&4# zBO>i$N%XPOT8hlm>ytCai0?4z$v>BN_=C;j&IxAV&MsjkB6Y1jS@j zeRjEFt@Pd7H@@@x-`qO)+MoTif4$dVT3^2q$9-c=JFQPymT?>hK~UGSV*y-keIFME zVYID{m2*eB{aSnYW;Sj+2o({z2Pl!rVW{J}@~2#e$gEY>_=pP6?sE(Qx!QV4=`ajG zS*(XKY$`|MJa5FufBj#l$5~ca*GF{#9>bgr+}2#Yc;d_jRPzWs?1$ph}$%UNdI!53XLm4VUrXul-^?x$@ojZ z{3pKsyWc#9(aVnqskO8ah;>f`nK+qI7F9Ha2>{S)Ts z&;91VSsAmmbmBoQIO{TDwzFbN@?Iflwbl-ET_t=u()|PxEn4c_wyZ_G?FzyoL2zqN z6K)!wH0@?vW4N)f5H7wrPxUa_97goKSj;5-xT=kHOl0{$R?n)F%1T7z-})~_G`{5p zCG5;pq89rvGZ4YmYu7$__g-D*b`gkuDQNbl7*IC1iVMasL6cTb(yhaAdBD>l9gYr< zmUa$OEK?}MBnZ+dh{7OHp+>D5ahMD>`aUut2|KNrQ7BSkZa|sqgV_)l24{rRN*5ef ztR|!<6wWZrbvV(<43kWyIYuQ$Mjfw1(3;5lT9Z!^&<0`;&E1{SLp-K2IfVP+ci-FG z-cksHsdlnyjYkw2k{JXe9yMT1!qpTGbq2y0zL>j06MOIJs+>3D`24VZSQbf?K4Da+irJ8Hgr`{uWQ?;it4 zU;El$Joc1`!gM%V3&T{vQ?7>ztCDnpP6ZJ(%=5e~OL2r3ZC)zfNsixI&edn79(Ma> zyK4_@5!0&eLn#DcBNPXr0%9U00-MQQe#nvX-LZyfDkaxn6vcC4u{fF6>Of_TT&{1Q zTr>thuu)dF8`?CC9)P;3ZaYBSPRiBnk<19BZ1T3c^DDzp1pRR^n9}s9?CroXg_RJ> zh^yFC$)t*pikOSo%wj4ePb@PlL>&c)ShDyoyNDlE88D{Q9pwyho}tF5@K*Am_-Dj7IVsTC7(Sop8>@FAz!MO12aebr04 zwUkdp4v59$=O%#Aef(C@Wj}ZvBg2|CR6j-Z%e~|L1qFzS#fzuYSq` zG5GE+!@6ZAzjNb>`<*+tpCaJhTTdL41 z9mPqnK0Q`dp|mDr;y7_{FOE}Ndb}ek3V^nha~4n0vw@gfSPXIjS}8&zW`&O1Wio_K zaE+EijrNO-9uga$R97^TMAITBdOrR0?1P-N;t?Oaz7xcrg6ep=EyM>Bpz;XMWXgh+ zQguGL6DYI{vOE*<=u(ITbq!{c$=eC#Z9`%$NZ!5k(Q&#pgyd^q`%9NDzufB$S5~&; zxaSJi2}F9iSSeRcSr}xcl%$OmCpZCOV@wbPu1Nl({Ok6d7Gk$3Vj`j|xr-u?2cc5h zrd47osZm)V7G!^xI|mtHdM>$GV7scZSWewo+JW60Meq26v?v|7MC02om5Vg&uoTF( zxGr#i?3n!R-~W3AUk<{ss!AW=#6WC8x?3%jP&7ktZ%N3@j|-MbMu27urH-GA~Q{LOEseY$*g)7{AJ8;`-Z*+dBr zNlG(G7L$ZM0C?fWOUJTp8~ma;vPGsTii9YjUVk7dBl>B-4j=HfaSc^vS;bqFpM~cKWYG(Gx&6%!*joQ8q+K2n@#NN*Dg3A-{t_ zLIXhH%#iOL2)F=_?AI1O7LM^b%vf5 zw@*-jA`Y8MI))t@tlHRUWo_kzcY01Nu4A1`vC_{uLVa@4c&TBHZS7p;qzGWqqb1DK z^$cg+MhEcDGhB$mjw#P`sfa#2O!RDG=eCQLiU@-ouu(0( zaOWHl|KNM?9Ru-aKmYmFwbhl?m8Mq#8G}SXhJ204g#uSjL=c(Xi3^TY^sk$dT!&`s zoPZ9be8>9oSHJ$HuYCRRVE3aB-**^r_3HM<#yLR@Te%&RB$c19W57^&1Lx5gMzM4f zkfTx1LDDBzvOmjmR1$R>hJgmns4xlxRDcDFP$pVbmO!H@wU1T83uvj3!o!pjSqw8xsi)K8qO3E7P`fqg&L zM9lKTttF;5R&aUb#H^uR(a_@=vh0M~YzA64ezj!C5LIQRR1;!U&oW?;#IAmfzW{Jt z5~+sZPkr$Vzj?fo)D!BtbC*Y>RjtwSsx}q_Ye!vf3$wCzlJd#R4}!8RiD-^8o^xpH zlEuEwQ5J%g4u}!K`DyAv*U=n-QeYh?Ol6d*SgunL8}XDd6CY2gLsv=Txv;n>3c+|H zC2Tc%)kneewd3>@zjYk<@vr||C#d!MAyz zims;RGn)%?`2vyxl?0k?yp8MC1&2m!Rz4os01_yBtxjKSe%!ESd0UyZ(G}kyTaA&C z(Aptuka370z;`wf+f0Pycg>|UesFi^7>GAEE`RRxpI1t)uCCfR3<=i)BJj>aY?(@H za|6XbBFu){h(8mvm$o{7+@QKS+5Af+B8$c(<#0at`7Z%*p63oc;wWW?D2}^Wf`Wi@ zd+h*LYeKSQ2iWP6SuV&hLB*Ak9;8(WK^-F+VxUkNqa=$4gSV7=Vbg~o0iwXDjVM8X zgJ;Ibb0ZyVEq)UL)S_k`=7B&ggTChPu_;MK0NQsZg{T89<=?B5CIVoip0(Ne=LTY2 z_1P9I2ZfEfb5wye}0AHn_M!>eTb{A2B;YL){Tz@+i&0g`1Z{k49q45 zfG>UN&;0tI{Wk!qmkt^Dn2t!(fp89GSu!ihL8deqBRSx;(4=0?M-)E_nE(V^l~Qhd zasOid=0$++`YE^Lfx$UK1VK={uZ7|RMr7%k(wGY5G?IebVG*L3qS?A+pu~|oDf>A& z3ItGX1^J9<7Ij8$2Le{Fyz<5O-usom|KI-BFMj=NC!(>9qC#|JiYpXsksk5twd=>` zyGvKsD>DNEvT|2r;P-m8*TiHuHXpKK5_`Q=e{eDtxEKQlh056SoHgyB=Y0u%$iJmb z7cyb_A{EB@Xt~tv*v^G>SlkWl>DhUw!LvDZ-)0n7zhI`?~! zwK3v0FZ*4pWF=ynOLWA*3S>+uc}T=;Ohx8Ig=3;XK2=)TKo|KP$!Ww*sS!d@?YIVS zB|~2ZnV(JAvX_pDSZmN)OTrG_I0&NC?xl_rfD!6IPHv+bP$AYFn4q3ofL_-J`~W%Q zf>72iD(1AYW{f|l9d0&HWmCzJd`TfgO@nBf!7JBZ zzjgCtiPO4x>6NQj-?)1D+~o^j-r9b#D2g;00>JX}79geR5Nsnd7RVw*RE-Q|1V*L! zsdzHfQt*o=2IVHr!bDspDe&g5w*MH;R z`76g6jaOHOa*!zT_GOC*(WuEn@&C%N{_5ZVyMOPm|7*XQO{bNo(7bZqz$*JGt8U#y zI#NU2>gWyP*dq0o$52efDEoY4+FwJZ2ZO=(_BJBg*NoET43S(FlMfv8iFOorTnZft zVEGWw`6vbKe1N-v>!)EMW@MvVKz1=gp%Y+?Qr*(JpR$0soQ=qfq6o@c3Q@6S%?H*R zjnRfGLxu{)Ob7-;Db5E7q0&^9Kt?Pj^5UI~sAl0p-JPNve#neO1f6LV7KvK16loz5 zS(jzih+|kAmyD@rBW?(3W>ZyCvr5wAVT2s6+C0gbuVxzt9%s#cpOuVIYD1 zP8;IcSkmYGh-Fq`@gD*yIn$Iya2w)54DjY>KKCbo?bo$JrPb>CF-g2)sR_rHbnCu( z3Q+);7GJeIy+tB~ZAlRD5Zo?D?L~jikv(2F0IXU*9!3hD0CZV%_638v zRiGMGz{FKm8bf7e0F(}tsvi+@jetlXu{xG>XLd;*zTs4L*rk>*J8W{apv&Qi|w{OeD zdF;t6H+ARs%?6Mu65(`f>xCM5UplwG3V>T1pFQ3d5cuj>28hCs!_v|k01gIAP`5_T zMG8X|Mp~<|s#}eHfgoMYLhu|u0;}e-xk&jU5 zdYMEK(S7Q_YxQubrIs)ZB%8L4)Bqw`hzXhSR7&8~G;D~vd*#n37cVjrZf$#;Wg->3 z9CZNH2><@O=GcgL>{Ido`1k&=|I+{Re^rz-J0pK2%Eg#@K^t(fBFCRH~xeF z!{7XC`E1q#Vsu!`4m*5VMHU>8&$wO2o&<>6)q2_cUCJnv=4*xlVuzS^o~QmoSdblo zo#QhJ>_JJI|GdWt&)^{y8=@h;Vkr23T@EOx6D9LE)7c$|LcIHlN)Vj(idqywy} z;S5cZ`Gg@XQaOc0LaNkwJx(9Ti;>H=*hla(Y)>HBUtimVI?fR55mTk!Zk=MJws*`#y8T=qri-Gq;d}6whHy|5B<%b`TW1H zzVhY&@c#3U;TDBCga&Gn(gZY?WO{Pyp3{$=zwrF8e&NGE@g!{aM35*5(EFy){T&mfg9_k{q;+vL4;uq^K$E2*Ib`D^APGebN1nT?>T`He%$bE2q4=A zaRJ3UcX(`w)4D!o3WTZNM!8N-T69b`^i4|m= z!B6^MNMlyTYzD)NzZ4i7mfXR7@=nUsht&1JcDz=ZBMdBHTxMZmL>4m_(2Om&WUK1e`zoLqGG& zpM37d_7^Wc^%QRzIM!U@%rS;@&^2blG5!9>AOF3tx6gn2iy!{U4-mN~R-`JtS$G~H zDvl2`*t99Al(c@*3p?KvA1lC1Ghey#nnVq+nA6v*DbrVF4q%2!@iu7K6ZWNz6DLpN z=0gvkJNfpL<_V}qHd|YpGMoUy#anbqpim$F^~(5d5Ta?55GII6&CHw}P|If-D1v}O zjwN8OG-RIVEi${*JUkJ6oGI<^>m8Y&$*fDHCXEe&mG}Y-SemSm?Ohu|@>x zsgQUYF&f5`qnhEcHV$MKF%*bHCZoJ!WGpePQMJIl#H|mfbEKVr2-V(u@4L>Pz8fd! z-~SP++`?MgxUEh3hz=b(h9lzHlOF^<3$YETJYpF%L=mcq;6M&vyLO$3m_W^<5s-s- zlI_-+O)iLByiT$g$BoT33vn^=CNXr)5L#p$2FZ?T>YZ)s!o@+A@g!&;Q(KKKai-{AaKJ*~wF|Hf=gJPfgJTcAGsc4om}q;IRu& z{HL!spZNLDoqy`P&Oh~6MlPXn*&+!&J2JWDAW1)MT)F%jbU#FW$ohp_uUvjz z@P>0_u4TQzt#%#Q_G}f5rtd{-Po264N4YSeyI^CO?-*vYWPi5~Z_#LXb7RA>8-6vN z;y9sQ8bzrd1%KjHGV%qRZlm28BCfp!pCMw!3!zF;CCfmx+;&x%$SJ9+T8`H^!9<68 z#M7-}p^W{=tiqV8Lzm4qwE-)ACMZ39&5w< zeAf!;?lQR?Lq#d~rlOVMqVRYoAm-8I=q%)X)+vFT@OW#iL1XcV(LuC2eUt!J;SJ-v zX1cPP1l~ttk^SZMh@DItY!}ZTg_~z+G}u5Z$%3;jxvef6`QP~KAN|y?{5UKno_zW# zf+hV}LkBTcAuQ*FxQra_`HL4XJo$ldeC?~B_$Qx3xC5l~I(shA1>V2b!9aE8(reQA zzkKO+qc!C81%&$=aH}>gxYFX`yH7$ai)7&EOi+6=A~t$1TgU=UAV^m)5Uim__o z*)7{D(?*%{U&I|*loipuTCCBP5=;xFVET!9$4!jRXFt`(iuPI(6VIk)q=Ky4W>q#m zrGFD*aw!U#njv*=juhrP$yIskoi`xS^dwr?GC0InMIAe>l#i@4Ek*}_YD1kCVS_8? z1=bp>isBojZo)I+NSCciYXC1)Uyi;+?fmmwAnwAJ>k`*65N^c0uU=-G+v!@|%TK(6 z4%4U4ya&7TgAZId_m1znabuh26A%=j(OdyrTLH;Zn1BKgv;=FT1Z&NKV9h5S61L?L z%)$2d_Vw$5BIYwpn~5*z;lc(sXM;S=%fj$AM#G}HB-P3FLX;67rU2V6jw}Xdly!I> zTF8{zKNOPc5;{A9N$ZUw@PJ3Y9v!RkDhq)P_-sA6)m2EM%GS!%f}tRim{>t8MG@x( zjUBBl2gtF6?{O3|4wRXB1A%56h)s#qH5i)litQ8@$3ORvf8*bM{#U>Hr7u7E^wYSD zTF@=52~fnK7x6iIXAtJ8W500m$;U5T{KoHo<-h%xzxd3rfBD{b-0d;U%)D$V9N-m5 z3`oi1_~3(QF-=He8)oHvE#ChSyu8pC>&)iHCd6tcF&N?V6U(t^-Dh$xucryWDfPpF z0z={_DKyFYGGrG$LR*K66&t~iQ4vt8%LO=u0 zYUL?1XES48>HusNpmujQpy?H!d2A1?@C%nri<*ysv;nw06iiU9o)QrWq+hJ!xc-jL~k*JwPg#4kaRJ5Ix z=uEg+>6$Y^K_=V~X2ZF(i%p>7fs4t2232Hge}jgbF*w1mgth%TCu=$mkkwpv9#hTS12PBkMtrth1dW_jB=mj{(DA1}_2WRtPe1d_j&UydpV=s8(f+m3 z1Vr=C3K;nVc;>>zr*Qn%x8C^QfBxsFnG)OfLWD*I-{NFo?qd|hSqy`_xwS!|7^$3O zB#@Fy+Q&AVH3O1%Lf9_CXqfAxdFn;@sCjE@cSyD36d%Hg!BdO|O6+VzR%6f?1~xtx zi&qL8MmG4t!ZwpEWzLl7Y9@-ID!n;{S9?r?(HO}b@c=2{ zJO9aO4flDu(#f^Vn=`u@Mhxp#nbfz<@U@N4$ke>r#hjg!6rnbxvLc@v4!{x6_G%Cp zFahB7@=Je$j{wiIH>d7-XYgOJa?d^QwBv&(j^BZkN51DrJTPx=9_AN8&(iilw+#XL7qF%hZ>`uMJ&&?q zd9luTLf=H@*VBNC-Q;9&VPsZ*nmkH*C_nneU;Nz1KmH?Mc;SWbd;B~)NT`t*POw+* zFUTr}%g64xoy3lXYzluSww5Fia;@V z21@9Ie5h4Mup!JFC$E6$og1l31QwYu*{k{uTre;fWUrVMQrSc|tbw`a_hB`m%JhjW zE&sx8+*?^`H=2rwjM8mO778|wlz$OUo>GjmNH{3eAD^GLK9ZaY780eO(!BFrrqf2i z&UkW(RILcDcDl|aQb;F^d4q`d?CIlx=#$4EIdS5Cj{l?Yu0hgr?16AuC(tW?(vY_F zruBWv+-m6_hEN-5HjxqKlA7@WU=7!It-NU{7#L8vK$+x)c~{VJzRSdG{sC<*8U$ik zE_fhPp>?m_L91}W!0>xk*rcp->HU($VMXjIhqogAU3|;iW61kMP4$B&Te|tFG$4z1 zihL}GwUwlC*)X3b?cnysNgm&fL!nTKHFnuV*iZ9ZB)$MTV~Ri-28K~ig8VfM`p^FC zumARM|BKH)|F8enb3ay9GWm`Y0A(#>QP(`X1QK|f;t&?jx_*g7=Wt6mV9S@vGYO`{ zG(^KqYw$Fx7VCz$=lr}~jI&T5CW>M_Q_cBiusfJd(-SIcqLIdQjcw%GZ3)uKv{h`B zE2N5SeYEUDCLHuW#Ph4aT0Fll(KTx-LzJmz4XS*qWfjj6A{#?j4o!p{$I8a=8C4~; z%^Ka7X6NQ^OVEM|Egm<+gZK*YtmFoXuzeJFPu~3~XxlcG%|nOACV54CjH5@7;RGZt z^jDDKHq8bRho{|2-noRa3?0k0j25^+#Gr@)&pS7EjE^2CM8+|l4ghP2qXcpoZgmMF znkpq_s!dN-Dq~ejy9JbGE(oTBN7XguLd1r`bVQw!O4HWZr|cBY^@ZQ%?y_OdZxS5S zszHxQ)FWJsix>oAUWv9v%a>hXOI&~Xi57o$p21qnNprB)xbZ1V)Y1z(>=PF&L|AJ~ zJp&YR5NCAr*VxeuC8h1#@yw1&7)L9(i=|IS>4_&k46OJo|Lo&``?()Gd*6MEV-TpU zwlhijoI_xK&} zMyxMMEJ?R=9Drf@)6id#$%3}UIi;E8rm>d;QDRLVIT8po*cDLM?;*BiIX!AFi(C>& z5wm`r(}#DF5VO+U^$Kfd!_asYoU~!2qkZp6tmGr5m9B1@UlG_+qp^@7NcPArzG>FY zBSyRwsg4mN&MmFiJzdN;+q==&**CII)8;SY`OH1SPh~DON|rhD=|I8Jcb1CsIao_Y z^)G}bA5LtaGK$Db)7+4WPHlQR0galAz6fcEk>LZBrUno5YJ*-n(9ykVh12u&(|;ci z|J%<#|JeB_U^PMM?JUiA*3AMDv(NN?A@pmsg$OJ@F~tZx3B+z_nb~YGzXVWcjT46L z1f`(b!fPp*AZDdN#<(AyTpQFYm&%EuW6r6O8N$85?Z8{RED}x=p2NOO_SUD zC+C`%fjWPc6mi_Borm5+jI1h&bG-or;6iT7-od95-wZPL@=IwfVNm#|xQi>So7p@) zNsDxoCypO85$%t%f!t6-a06S4>+6U$9%z-#&7+(J7}Ay+e~L{RUpR%nMQhg$MMM?T z#0roy7AHAh9C=;nID=uGs|f5xJkrtzhred zb|bRwsMl)0N@N6X9+neq(Y8x(b0?(P%EgO+_o=7;-dDf+o4@z<-#vfv1I&t;6u1iw zYv}YWGDLnQi{g>7G0J!8%=kkV9F-_;n4;5-8Ter5j`icRQRQu|_}UsJu983+bKi=z zF&i0|27@ciB_Er2gsD9`&P3j*B<%%qdt-wY3~2!_rf4aMkEoET))CkK|gi{|L zxct(eirBq;33ztq{Bf&jMLUB1?7Q$G_%FQu?mKXD_nnUb=Ms!X&+42aT3QR>C%_eQ zAmNTZE0)TrVH79r0n2&Ai8qa+esp5KzeIMR$ao8QnTu2TAhJOyLmvpgctsq%9w-K7 zHXVR85xu(1Ixs>4w*g>HCSvk}BW}eNZxNv`t840}_6CV@vbg8+&Jb5Y7D3V*W=m?P zyC%>8jm&s{Be^V#;MG_uU?$~woK3W!!K?j-(Xv#nKFwRj22<{)`Xaf9ikWWMdo;JO zCKjv(QKZUBd2bGD`@+SHm&^|1gnCGddsv*Tux3-ZL;)|}V_oa-h81klIJPORFZ;=5 z@xc#%^b243wNHHP7ao7&$@ias!numo4mS}O@~8O0F4Vt=m#P!tPrP-vvhPqJVU2gW zGFwXeI$b9o<{{u%6CQ=<*aK%DK=o>4Pu2?h&lZ~-1-Ums7V`ZrOYOtOW zJKQ+vaFo@7XYmWKB+{5cCQlO-keI|!DD-Jh@}H^RQXvCNL7q?yT^5Cj==DGqJPD|h zhQgC8tjD~CEaj3L=;7flq6t|jX2i8>NXg=cfHgvj0%Bx(Klaq4FwwlC(0PRd5OrUK z#bmn6rD{=+NMd)E#h`Gg;D~I>grQHvEx#EM?MT(eP&*4F`y|e6Of?`!gSc3I@wRb( z77B2aBqYm^rx-?g8d;T6w(f2<1lybU^|0AhS}>H@GS3#VBQa1*@>Rt~g&uK$l#L4I zTW?&&ks<22{Mbq6rY5iP13&N&AhP)47ysoi|I)|KKk?-Gi%)8H)Jajq^J`^fAsVze zrnDhT`h;;DRsLgAVhf$idYQ0Rg4ZzjCM23Mw4p2(>yXG}>O#eOWS2xt;W29o4yIU4 z6cnBPJCII$wSqJ*M5anhmWBAvfIG`V zEep)7NIH~4D74J3CJSF*rwG7O#;vb=8L@b0+EaG)d(GM=YBG+Bt3_}d0M<~Ozzyh9 z!io~7sGB~pLkhiC3m3C_>OOR$Nv^GnoirBXpvt8SwA`V=9+~cWKJIX$URt(HD_7_h zqoQby^NzH_kO=^ym=fN=iHV89gk~~MQ!3bNOrpf6G2wRq+}?qC0A!iu>h-#9g@75 zvxH-~${iFfs!0p9xHz?xOH*7#gM}sO^cCgChN`@sjU=>qm(W<-gmA62)M_?-%j73* z2W(p}YS{nyoyRmcKvO9$tk>dzYD2f$yDV48R9yqNFn?x9o zP6sJE_^w15#MGIjLUQDet*(Oz#Wso7G=WEOL~Ah*7KNfwmusbqN|se?mc^2ubpyZ} z-p#;Gl(pmZof2{sqk>r2sR@1(?<24}ng*jzpU{ zAnv(#$zq@p&>%WMg;7>pfvUYs%jbabCTpYxXv>AaGiL%xd;HEvPMw12pwo7m2COpL z_BMVMq66F^o;57#nDJ4^!D-b>%DG$?CPiq6h4n75Fi*T?$Z~!!*IpW`3P+1V+?t8! zB!agY;fVwmu3S;S9?sD8GH6^a+ADN-EvYlu5rZP;SJKgYBFLs~#NZNwCaNihfi;yC zj>Rgp*q|*S9a)Jh5qE+$G*;$Q7U8dv#zx#8-J_-80cv5xY=fEv`SPAT=t4LOe_;O!gwp%48us(tgZ@!WDftWMP5L5d`=S)04PjonB_OmwEz{({MlQ8ZbhT#D7@Sm9 z#IUHV4yesilqY)%7PA9MNz{xjk@gm88DAnve&xz#JP9&Z-1BteMYIo^=-?3?@4n-a z`yY50Hl08^83%?ySNO+75Wz`I!UPl19^tkx31gXAAX|cbafQpK%6wHbUG{j*<6;p6 ztotBgUZb-(w?+lbEwx@MW%{y(y7H9{QKRy8U%w_Xdy?`^u4iE-N;BQ4c36Y^IwdfC zl2&&Ez#1M{4Q{3Fgisq1x*8^93ExNw+_P9t>KaR8oBUz7-FK_8#Ha>Irn8(FTG}Bbv`zs^!7j51ybzaVI2`&m)JD|K+K8_n3TYSH@ zG&ULn&B4T#uzyZkoh$7YNdc44wkG&rV}xc=3M|W(1qxEe{@@S(BxDyayzuE4|HuFO zt>1k9`yPM%9P;SB^PPANvt-1XkL^Eo0UqV25U$DP#YovE;8e?u(-{wuV&wZNS}kjA znW&qJ-KyfECwbeNEmsxk*(?0sD=%MRXC`}VG6Fe$4+vP`*>~d+n05u6d*-3g)ETY% zX~k8g3=6ZZL$_hXwhpbMwQ%DC+*xE%6L__YomO2277efT-zKx7884}i3gPR&0vQ}APvn7+wEOt?ZmAX3JCM|@^ zO&S&QMRb%aG)v3@8lUw`qzfENsZZumBT2wO7+dJ56;JA&z1m9a-*eAE#xk9A51Dv_@W*t-JG=J z`F4NcsgK~T3m2aI@8A5=pS<|`Z++%BU~Yjg-goZ)bMJV73}XiNxiN~8B$2a@)N9Pl zI%^yBNkRPame6ZT%u~Jk$`uQO%)ng`DO>^>%SIx&OcjpbjWK9~)xjgdx~r}&-$BTh z2xN-xqo0S5+zwREC^PK)k;8Xz7}b5Hp8+(58EMuHD%uQw)H|P+rVy%Di*eIT>7xon zytGKr=De^*^h0Pep~OD@_lq?U1M1ULLm60ncS+(>gSx=)N}#88c^MKd^SNn3-)GQ&&MVON$@x ziKNzW=|rBCC5T6(j~n{qMk)-7wpMmH1Hw`}#F81Zpxk-qsSiE-Q&?)xKKs+tN&CVJ zzxKy}@cP%j^dFn?9!xK|2=2WP*!h0blSnl$#2f{`hA8NvzmtysIXG^$>~Dk&`*C*My3*ROvIZTaRmzdV~Eqxc{F@gMx3uYKw3DaiL9;^e+_ z=On7QeCZ`%QlHrOvB!S+<(L2P%$fJ$J8!@Hy-3uE&yfnD1=8UoN3FLr#`#8M85mj_ zvm63?;SL8%-4QUO*J`s?SV>J}3(?;dx+zBnr8L)XXF2RG)8VR}{^Dw8-$&$H9U(gl z2v9C-kL;Y^7eQKIk&$mF0Z3jvGq2)bLI{`5Tb*WiG5Qwdduo@C&cJ$H(j>k_mWr<` ziBRc$=xG9>6Tod4Si5O(Q!Zx(nPlaDz}ZU~=X#`{=NR02g{+2Ltxlj?qJdQ{5C{l0Ti4+|94Q;_V(57?Ki2`gH!(Q?saJ4(IQHD zK`{`#Tl1o;%_{-B)FJ23?hq{>)51JIO#s>7XO_7rX6&L4i(CXSU&&i!Td1 zo7RJ-M$9{-xvK$lC_W0|t7W;nLgUT3E~XK&(Uu^xa~&oSiXh|a@>w!V{IXB?Zeb^n z0$2nBoKRv7<_bblE=JGd7@ymi{%Te^BGmk?H%U|i1;Y-FUVp>D8cuErxcP(^Uckj2 z0$El02@=!<1g0_(n6!2bo_NtXbxhWQu*R(y%bu`?tqSiF*6@0-;MO;+9T*qWa!`TY zvTm!!ER_p2`z&OsoS#oYr0A_w${?^AQz@=cN&{Z;gRYncvX*7K6flPR(B`Jr2TGiY zBzglG()CWsZcW0lrzY`)Jfk!WqCWh}P~Kd5WQo8LpDQTU3U={U#>u~+l{8toBfXbh zHXYKIlpC^d*lI}v$|4gk9t+Dbwq<2mB7I|gGD`3~5n;+zTMoLYKsn-h`OyQF5;wVC z@UK|NOlT!3l|)q8gb`X4 z3P64IVnJ9~iu}w5sx?XwAdG%v-=?=dQz1~s8cI9IZCN$mz^J8LeP*7??&HGh7}!f} z)N6iCPenHthdPV5%7qv`2zU5Y-F-YdGlv+y;fUzQJuUSUYem`3(F@<0PLZOW~j- z?>C}AujGoz)#iA20$V3Qk9Ae*y=nKjC}UY-b?z6q5+ zm=l$_Q`Y8O3N!3%$U z9O?II6NW3~ZAlTo`R27W^2nrg!;9Lp8GX2(k6ykwL#$8!4OYLiZkhBaE#oNsxiEF*csGsblAd9_v_ z$|xXt=#>ka@+SF!a=3${--_VS>u`Jx-t0z-1+U`BvO4V^XP}f?G7*5!w@omj3oyy9h3R(ORE6O!1rynOcCb1p?aukj0 zVwcE0)b+C5s|<1$E>d&NM8ZsUj_*t++4C|IV2kE>bCtF61~kiiwPi~*GDZHW(r;+_ z@}ef&8$2pLR#>cS%|d?7!;glP@5=7S5mQu3tou*{jw_tXJKhToeN@uS+H6(Yn3;l( zx?H0xOC+KzR?7~0bERJ0@>-5N-tbIB$!JqAG>v6qnvGVu23!KMnZBIm z*3-E(7+4%y0e~OU4thXLpZxcER{+er^4p0Lx~47nXPM~`dZoe8>#60Qq0XtiY%WUN z#px2JTPAQ^g7{?WkCU<#sgLB3?vyZ1VcW(B}ft+M;RfSMBB|YP79W zojWxcCcZ99MjER#xq#2eAgP&mrXo-^sc`ZT?H3Q5^JNVE#U%8ePQVZ`91OTOEIbq3 zO;a@0%31ADiW<}1OH3A{7SyE6xJDyOsK0FI4{bK@KSmSvnSpo|#jBq=7FPS4k=NC8 zvXX&no!q4{&WuPf$(RGd%uUNE{Oh!xBHbs`I!}fQ7hnZqf)5`)EF`NSjUdyQxGmw+ zDP2^s7A)7?wI~5#`)m9Qev?tsnFnh&wN=H?w!OmIFyJ--tl`)zxD5bnN`Jn;e0Oz> zGt`W_$X?{Cg!`SD%Np$vamZ2U+KnY;M@`G>AIgy{!70P8E*l4DVLy-)cX_WnzV{EH81uEYXgAWV6cXpy@J~S zu;wNxFU{K?_}=@!`}_amT5u$O*T$>Ij~{>i^+V_s2_kidYG29t6}|)(K9r-`a7;>@ zL6tI(i_feDc$RV#>SjG~$O;pA;fi+Ylxn%${PS=Jlfdx$goz^$iK&e>Yr{{6p+=;1 zxOt{n3oZYwf-wE1kAImtQAI}P9^jQ1y-+6jq!qFULPw&aS!P~nCST=URB2Yavc6Q_ zMp{00eau|!`AZE^0;w#K|4rjTL7j@!DRxjAh`J|q%pydV_J%od^?CI-w>D7NcD-)Q z^2}52bPkj&9ZrnY8#gtuQaEBp2vasw6^;a~2wPR}u*Q@Az-<^T+e&eps3Ue!7THKCUeT~@UcLUh^HVZnA=a-sR`XE5 zlr6eNEKur;q*y?4jCo$faDn6^kQktbD?$xaO>i(XAWWNIu5_9Y%I>wPtgz6C-nuex zgC(7QFC}v-^F7KCv0vV{wo$SgTA@EWchP-=>*rvSnx%^%$fDD?~O>?1hchw>gRPZNl zcLaN^u;3^=?-C`XNg=vhQ6g3evst?=?y<#6nc8_X&##y~&Tl)S49_j5gJa7~KUO#z zuyhP#Ig_{6#g2tv%#vElrW;lY_)DB=trz)*ETssLiYy@}8jqBMkri1&27t9bz-@R~ z>lNGvfVG>%#cUiqNtQ@MK<^`_)Kw4bI;X~0EIyyu5q0`REZk>kSVPv2yoQ(s4Vm6u z5ky?EIn1_Z#IJDwkJO*bg@gX#nyOmn*YB;(dG14bk-a5k;;5xSjqox!k#fUVZi=x< z6^l?+5P0De91~*pTo~0YLyKk3x;$;@t^1xI-f{ydDG!-& zty{qf0kWD0irOVo0~X$~;=+dUkmE$HoP|l32Y|Icz-?ey!?9Oz8vxeS{r$!-j$<^6 zx@Km699vNy>}31xV;!}tU7Xc8Us87T30XXxvu{wyVhP^3v5oPS(G1;X-4b=0kJ}S0U99kc4=)7l| z;!y!+_KaLY%tlt;rgoZ%du1}pDDY*EJULTK5T!xOFtR-8!_V6D)VBaRawwL|lyAMh z&LiS7u3NlbwU7mDm{is?p5Cjl;&6mCZNW(wR%`M_7Aqq#_Wi|y?%j^Xju;Au0bmVR z`T(~fVGX5Ma2o*D4wl!0emzl5If`vUI}{hy8;hWWE*@*{M9Z?;w3CB^REpfC(P!+; zqy;Et7f*pcPi@I+;>9N}gL5A>+_R7=tb2S$RdK(if&rgnsDwqKRj@Z|pajx+8Z^G^ zZ62j%7QrI-Q}j`8qq-&ij(Gzs_kK)8V-|JMwaH+H9SJowb*$L|K%L7`^CxlHZBLJ_CJO-N?y8>Y2%V<+h7y!n*Gj$xrr;~@J0@SgPM=LBxU zz*>LcHW;k+3T}hI8cMt0ydIbv5)Sw(L}r{M3>JH(ag@s2@ka|b>J_=KeIhK1+Z2Kl z7M-|`Az+1EAASz9jN;lJGr^y1W(&u2{t^ci&uf|%OI*(NGj6Kt<_dA&zVM6lh5?n;98ErVS<( zfu7<7?d|T3n-=HFLFtU2nt3UKfVs)ww#=I;qV?c-xxN{C_B$?qJMjonmPuY@Aq%!L zcMi-^6;)mK5=e(k-woMX&02-lGibGv5qUcqeuSi_ZG!EG2= z#6%6Dm7~mJPJcDS0-p%sns^&}+LX%8c ztvXB37DNW$Rg7vL*Tk18%}l!|E=GKfom(GmIz0!ZFsza$i{oP?Wv@aZZ1~4~nad(k zFGyXSttZME^<6Q}=*>zj+3t(3{QtI;i8Vbg_Oitc5o;ymmQtiE^f0DHPc}}1oV-Y4 z4WidFT*k%>32Qj^3T^|y8h-W)ZbQP_zHl*!cSbRX35^U#%u=#Zn(i{FikG%5Wa~1J zV8QlFV@3`ZpHcEt?SZUQv1_?Wqdjb48RUQ5j`!)mPvx<)=Aa=y`UZFefBxUiO^ zRF~_GMNBsiMBHJ9fDL>U^S)t?7kdS_0bmW+`vbTBVNIppFD?e7B-bGA)nvwH@1oYv zCwj@Vdo9ctpn>2DAUA<(#8fI!cNXRjrZTF~$4D*5RPjU2OmWJb9T;UCiy+nv(Sj4k z2&gmll#&H#PED?l>kXZUeBN)-1zDnd{^V-VW31Ni{|na#KdmP{D@w~sCHV3IP4ERS z9o)J(Y*=!;dY}iXLcf?@3r~hwUVuo77)9tw?t>Tz_|0_pyGw$siExeG% z^t}Htu+}TM4FGF+rdMzq4A%CGi`fCDWD<%>BmP%}XR?JDiH~RKH5@aL z7Okfbi3lA4)^M>`a2o*D@I;T`Hax7Y#>E~&NGZg4(tE9p6ZP1BViW7cA2pOrHX|7j zE^>R3eUAbxsfQvfEEYtmDQ>w@Gr}GOP?`WWl3$t4q(3E7gMUVw8(YnobWLzwm9PoT zOoT=ytMch2#Qk74GghmR+gS0Q9rl?i#ERl1(=wHNwL%&S@>QV^-=$RKY^_$Lq9srZ zzi(QyT4@=!)Q@9-1aCE%`Glv4OJP?9~p-OWlg`vT9AxA;1Got8B(4>yb=vL)k z%2w=Pu!i$q!EFFo!!x~t+W@e3KzZ@{T%$>xLsp$xJIO3x6P5)wEsq&3fNHTgaFHET zR!1cvm$PP?Cw#P$_&m!W&Vq`0;;1>UfZBtK#Bg;JdIV=3PCqRcY<3Yj};V1fZq43b;7vw$oTP}TUu z$l*_bZGbek;hh%ybGx4e$%Rc@4*x0#!^Oj^?5t?;p%q`VQuwg8jK#(EX*NtgifO<) z3@3(?FhbO}dFVAJJ-q2NQIYb+DMN*_3rnsvJmE1##hU3 z4ULOE;4uo9@#YN?ahb(gXfXvITZ{8mjRBBxZHyYx!aUl@w93<7I^78u$gNJ=qybVPFkk=@;CFhqcwXm~+OoyUZdq8Y#p{?7W+4-Wn-CmCR)XpH)pe!YPWuz}QA@ zkG3@%n^+L_-h}zYpr(ZR9&YUuZwP8UI*yX}e|tlB_KppuMf2 z#tko`22_k^?s(hVHa6GEe(r2vmmMeyAS~^uW0Qkb{6m`=&lh}{mMm7zop&51#A1}j zVN0xR(54pn#5lgXLa*>*$P*(RDq^h>q0?mk@nXa4QU@%INvV zc!}R(xCwTOQp>6mH_aGeVO}sG$v3wpX`{G{TvV_i=FkC$Aka_L-dG$m)I&tdddR!b zhZ&VCSL!^9k6^;cUH}68^w@0xSi{|3!EFFoLl=4lw;^F|zrG#`7gwv(16L|FqbZAD z$e<;6f0VXVjF{3LV%Di%@SkA#RBzytQ9a#Vmz<4Um_0(X{QB6jV~B!?^KXCq4O<^3 zBdenR8p1>J--Tfl`{lbF=WKiX8UP$niK)RO7HnmL0!ILs;-z7_gnG6%osnPjvHimX zTn+6^E%#wkm)eb%rUIBU^o60XMc@!(sVT(|&BE%;_RA4#XW zI=Shh|A**tuB3%fL#J_K{Qdi5$v9%u>d zMCP1f?_OvK<91V$i?%Xd(? zP;-M~E6Pj^-aN&)(KuI@$DxHBlYC)qMNS8j`i@QG=OW}zymLXi9#Z6K36&w6v2wZO zSa3c7tl?s>;5G!Tjrs+*;bF~}Rk7qzqnqsR?tF9|`#Kf5YUW5KIeo=+xtmomWj8U?4IBw$0H~xW=f)G&!KiN8`oOU?CxXCDay@*X zmXau2TWj2Dj00_DYF^c@Dyz&JHWCey(=z>XJ_x1DkZy@bV@!i~)@Xd#Q}Tu=&ODwq z9Ki3{f3A3PwlY4UN-trC7Unq?{Ak%g7Re=-tz^s*-Ri{73%c5AJf|xLhf$nC>oJM5LW^&XHay5paU8ptuRLu zsQApJ7&ejuaQnoS@aJYxTJ#pxMSFd2=rvn<`K3FU{Gm~}ePh9rZ^~177G1mMCfIV`?)&2e#*CGpm l9mRbeB?$n{G_NHU01wazB88}(*Ma~5002ovPDHLkV1m&wJ#YX3 diff --git a/doc/src/images/rogue-example.png b/doc/src/images/rogue-example.png deleted file mode 100644 index 7aeb0e54f91344c0d7a350ad46293683510142f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10364 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 B0^|Sy diff --git a/doc/src/images/states-example.png b/doc/src/images/states-example.png deleted file mode 100644 index f87b99bec51481457ed95d7add960e6fa2ab11cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34844 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 z 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 z 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 diff --git a/doc/src/images/stickman-example2.png b/doc/src/images/stickman-example2.png deleted file mode 100644 index 980276adbe8271f3e4735e2d8c0e581c0daf55f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37412 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 i*njx{Ula42hYM(r7D$NlF*Db*~VCS0_@lp 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 KMNUMnLSTZp@o7>3 diff --git a/doc/src/images/trafficlight-example.png b/doc/src/images/trafficlight-example.png deleted file mode 100644 index 3431542ad11602dfe2b302436ea017a5289ac1fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5325 zcmeHLhf~wfoBo8*dzB(p>Afg5KokT)2ucSjK_G~LH0dQlDJs%iq$wR#ilX$Apn$Z{ zgn&Q@(xrtCU)qnGo4K30o16Owelt6>`_B99?(ELR7DON4es^3#JVVk#L>W^)Xbt# zU{R>>TIjPeduvGBxP@hovt`WA09 z>oeZ)+Zz%x&B42f)WB(dgEB*PK`44D#r&=;&I!_FQS&L02>H_j%JuUad z=zq_AO>-F?oESB|wXY@sS-pLC-uk;<=BK9os=DuDdE==T_}X12?Q5yl$$6ZKdSBkv zlI=Z9Xg$n$+j0*}I!CMI*M9&=}rSmSFZ`@Qd~a^E>2z!>T0P zJYr-tn-IJ&FOF##Xg78yDMp50m^9WzQk0F!Ji<3Qj(D~wLFKg`*<_`b#`*MxPAoe> zQ~2=TdubFm$ljPSr7;847Bv;VS_N(@rZzU%FEJdDvkqih_6aAwTG|h-1NMOUxs>H1 z_CZHTNv|Vv@Ckrx*_@^6>ZR%I6>HtRO9*rl!B^$$KzRN%ax#&Qky99skC~*d-DOr< zHP0#k^exSXn5)(HFcZgED*hQ5=G7yOIhs+;Z*?#8+vvj%ZaPmgZoky=?iI<%KlfD{ zq*!_Em7^Lnu?ne;kSqJP*;VI-=nk7`bK?u_lmw;^X6%|)RFh8U#1C?V+5$u8hkn(( zdhDk#{AGxyl8F>mpKl^L@7EdDrhBjKPH}N&kX;kXyle4#JwYd|{*JiAz|5gHrh}}n zBhYjria;~E@waAm)p(Q;&a1&(SacIe=DU?A`}~azhDj?@9oTC3SW7>rn#Wh?ow>9g zELht2;38&t)%>Ez$1NpiwA0*Y3`?uuDy7QpOpjBRM=DK38I-8Vdxa9SJ(YQsBjfni zv<&du_MV|c9%W4*hHoXtkkiWe;04^+v--A<#r83;Y;h_UA_N3|$&P1l@huZBA z^%-uPVQh)culI+NwC(e5gW=`*ZB@=LruJ~` z>7+uHwavg7CvNHaqCxLH!L-#*5v2w`#fSzMaS28iMw7}77|ZuLf<5oX3I)dTU3f0QWQ_0eOfWAB7v>y_GbQ(8UP_~${t`1(M%v~w}3WlLkYy(|E zN)bc^+L5m$@>u%yypU&Kq3V@Vge9-a7{%MYulQZvsqX{D`o=2ZyT_i~k-?*Wj89Ma zv|HRm0tqAjR=Xo?LH^;hnNDj77VTi83JT0~=-1r&;do#Btfhk+?s$ad1FES+Il*)^ z^0tW9S}T)lZ3^0-|5f&GoQ1U_%iLau_p-A`8^|U2=oM$fqLj81c5-X!bx=4j>K~4K ztLkkzW^#=p%>zZiQ+OlcSKG}t;Hl`qzT<^iUHDqt$t!HHqpw0rp&#p58LO;eA}gF#2D5N+ z?d^3J#i41w#jhbOw+on4h`&a-j#b19??^YIt^EuF#|Mx|jkv@BHsk*5w(9Si1txSi zat-;9d-zTtZSVoQMJ)fQC&4EJ>vXNJV11rHHt<5y41|lB8wr}EjSR?oLEsC@PfvUE8dF6>VQ zgYLa$ws!&QDY`QCGky#L&2x(5T1PjQ?ISz_8;zQn#O!j(}L6`Tc&;7}2X;IM&qoyp~DfQ{LI)jp% zl3w^+Lz(hQN)<4DzO7mc>+@mZ0&CX3y2b@NvjV2-u+*To)qS16zDKKQS6b!bEW*}B za)b4m*9+I-Un5bj*e^{n_*oMP*2}QLCp}o+vAPLuP++M@DVAV|_V+Y35$g zlv9%}Q<4P6S|OH>WNV7}r+htjfBs&r-Q{l% zVi=%uDEzojDz8QP@}PvsCdQ-9zHD(nk$k~R;{a`Nfdxj&hwuzwl`1MLOX}(}Ycttd z*1`{Nj$Tzeo6j?;i8zc@d`mAi=x{q|mw>fnL{GJ^Z_FaIGshY0HYWOvJvNEZ`3JyK z|J%-?Oy`x*GYz!~ouz#_9b{8A|K<|%q9wlW0A}~TwKhH$oY3%;wvT^8&n0VcjNG{% z0848%=lit0v5B`dZ6rZto45NWFK!A>>w6q?VFlWtZe!#6Oh!`Qu7L&eGjbjilj#aHhQOz*N{iv(!TX+Eh)4 z3O;`HXtC6JV#*hdE1h|!ynzk8jbeD34K2S^9gFpq85sunf-WccX&9a5Vor^8*xv2T?^3N&k2h6+?zqxD_VAcb zcnWTx9Dc(gn`2&}Gi)mD!Ge7(u}Waf_37|@bMD|NZka#eEN`nP-T3nUr$XfX!^y?x zDW;eXMpcyYrQlp`$cswgQ`QrzDXh|cihOz+sF*u~?A?s2)|M=Rg1VwJbWbV!7_)0p zC~%cmulMA4$%rO>GJ8>e+A2FA*||dDg2!YkX`<}L_Z2;a=By=vIqTK({q8 zj5#lC^2k(5CdGpM#e7o6R0?@JVH$^vm|EG~EUm8QR1bvfTO~H*NaWASUrWAZw`e&i z4CE5CW)K-;leSP>e<+?U$Zq`Rr#}n!F3Wc}b#h*+mkB8dKDH(GV{ zoXrvQIhIqr3XL3b|Hc==E!GB~{%3%e`95eT7COx9IaRo^lAi{XGH+oPQ$9~a#QB?=~Ef0{$tV*y{IMQMsEDgw=~e3$G+%$>7QZIB#T8@ve) z1Yao)K+pAif(%h1m{~G!D#W7vcsOzCyn^LOfcW$c*M{1g9A^YVtcI%`6iM9zgrlb| z&+mSSY6mGh+eSYTTyi>fcR|oFW1kV*$k#j9_apuJNVFt1qj>gh6%8|21T`~eeSfRl z{8a2`^$RO%>ldq6TR6o#7D6bKFUWpGDWR58$j-08u^|O1f@stKwwqp6dZ8W=!Ej(G z;hzUX-qQA=5-^wA&*)yL21L+=vlq~b<(6FP2Sg_#n4VE}QRr9#O5?*x;^;p>EkKwc5fKDCZ#pwVu#m2YXJ7Glt`c=f_CtPtzSpNM z#+_TU>mi7@-}mB%NfD0TA&L7c=}3>&n}Qk~6wKp`*bacSm-K6Zq=`K60yh>n{s45r zBc^Q_inX8VX8Nl}kcoHLE)3-WsSnfh6UjekAJ70MLI+2tiSJ`*;P>mQ*lWQE5-_WyM!O%?#A5_pH#Bgp~7IM6Awn_04 zoVD;DAti*H2iFQjpyO_eo6WNeW}L`3a=vHtMmE`t=ROx>djGQ(5Zc*vIO4t~lK*Vj zU!bFi;E8oo*k9(!11^z@%Ph26AEx6jVZT8TUkH~*Pb)B{mUO>?JsJq5^!da7Lx|{u zyUs34iyrJu+X?C90= zcg176S>BMVi5`;aZWl{PsWK9KUWm3fauxGoEBuqm8ik6%NA|cPcK)Qf9_JN*IVkN> zb*{byg#SlNooIKkzu5{1!u?B}E6~}&W*$VKhJ%odZE?`T_Y8eyUBH&v{uZrT+yB->IO-8DI%=b=bZeMWe|2jNjg{X&HEXu zc;wPZqvW}%K%h&;PPAcne;)U3DO47&MLb6Gb4)RYk7WHk?h!*NBX6HvN6~rSiHpOw zq=Z)^=gz|H!mpCDF#NNAL~RZEEsi}>3sU&JO}>y}cf~r%Bx2`z)R&WAdrZV?fVrP((hwgBH!vRM zUn(B9*|B~sbENoNh2>ZT15{#UFtaH^S3M1jqmsxjpbj@rbb3rc7|)t5=X?bSo43ds zCU?17#9K;W#|DtsTr5NRqiyoOSE3;oDJ`oTN&1m=0Ag!4Dr6RufO&wdRT837=>8`I z4H-mbN?lL@{?cCGr)68Ik0h5EgpY4?l0x7TB>(;~9QR1jTW&J?p+4gK;qd?Zy?bF6Qt0+cw@<0lWNzYO;K>N-IEPL{)Ky2 zKHf_Hq3Ex7uy^_)hfy7DaPe09t@MqRccMB>ZPO)dHW$oTmS$7 diff --git a/doc/src/images/transitions.png b/doc/src/images/transitions.png deleted file mode 100644 index b29466f5ab18de8ac71086294625348005b3a3a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4314 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 - - images/Time-For-Lunch-2.jpg - images/centered.png - images/ellipse.png - images/figure8.png - images/kinetic.png - images/random.png - images/tile.png - - diff --git a/examples/widgets/animation/animatedtiles/images/Time-For-Lunch-2.jpg b/examples/widgets/animation/animatedtiles/images/Time-For-Lunch-2.jpg deleted file mode 100644 index c57a555490fc98478ffabac51a9a5d9df7635829..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32471 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 diff --git a/examples/widgets/animation/animatedtiles/images/centered.png b/examples/widgets/animation/animatedtiles/images/centered.png deleted file mode 100644 index e416156a0ed1e6931f2b1f1a55cca015def7057f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 892 zcmeAS@N?(olHy`uVBq!ia0vp^DIm1LhE&{o zdu@NdjH|@4kMGaCy|s~l_T<(Hx*IHnILq_ah~x=8=$_zhE^?xt`43}=dZ1II#@!1O z%yJF-3bb5YrYMM?;A2af@a75Az0ddNeZT%DK*qAuC}>^8$C@Q?%a+WoeO`H=QIG(r zH1wHkS5{c~Q8?M>$DGs48qWLq`~MGfjN9<_Yw7*G?H}(22L|r@Ic54fpJ2P0$L5~x ziQAO0M*h7{U-Gwa-@-QOSg$%P*SyQs$~Ty&!2W;hxv!E^4_RmKULqOSsItIjzS8f~ zwucXO7*ZpXdOnukoWC~MaMdcM^TnU`90*SAeYmP}{(0;2isxVXXFQkc4v)SOZq&7C zfd{mOSFyYg~YWdF>*Gkvy{X3yN-ukgh?E&%c_NwQL_k2Gu zw5Z9a>H9pL(*_bVnjRi7yq+^DT$7=_UhY$J5%*)=$Z5U7OPhRlq)IaI7k>`sX>(pC zy|^;)p=NC3_nt{#-aHFh+;qcAP33fvmW}>-^PPV``|dK&`}E+8-uHh$rft7}W0A(^ z`unG^Y*JgP!S%@En3T6sc;QUbp9gDQOY{4}*Qd%%zyIO4f3-`$@VWECd%mAJcP?pd zsH2)#X11Y(4{L9x^WnCd@3*JN+%dGNoHF6xQx7@o9>c9(Zn@l#<|HR3Hh#!C@%=8h z-uy5L=3{+w`8b^H95KY@84QJKE4-UtEQxShK9NXx~#scab1}Geu<2{ygkdQ=aIr~4}CV@^m%OI g=0X7c^Z&pVAf#pboFyt=akR{0Lqn(^8f$< diff --git a/examples/widgets/animation/animatedtiles/images/ellipse.png b/examples/widgets/animation/animatedtiles/images/ellipse.png deleted file mode 100644 index 2c3ba881c5bed13a1f509518f2a6759a7fad6951..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10767 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 KM;W4M^ZtKZa6j1q diff --git a/examples/widgets/animation/animatedtiles/images/figure8.png b/examples/widgets/animation/animatedtiles/images/figure8.png deleted file mode 100644 index 6b058041c4bbbc48754c9bc4bb82f93cac4ce7ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14050 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 VN%T@j?!N#4002ovPDHLkV1naHwAlav diff --git a/examples/widgets/animation/animatedtiles/images/random.png b/examples/widgets/animation/animatedtiles/images/random.png deleted file mode 100644 index 415d96f85614fc4046a6a5bc44df2dea4fcc8fca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14969 zcmY*gV^rkt+i%lm+qP}nuH9`iH@h}%-fXwoZMNOyHf^?T>-qlv@1E0{=FH5CnOoQO z(H*X)B8!YbfB*pjfh;d4r2#yf{r7-_1^zp3Cu;#upIkI#B_OIMiH?95uqKMKQV<{i z{pEI+Bm(ciJIZ}=fq+06`0w#4nGuB$c=NNXyt4G?B`7EqB9b;7e`N>=G6;DoaV^i~ zvrexpeeLv*4-t>DZ}anO^J_=U@*Xqfgz#S=zCZ@R{Sp&HlhL;z>c#)`1R1m;et@{c z7c{I3?W(V5CZ-;*47~(H4h;vtBq@NX{7>dOlmO=WepVbatAE%9v?8syYXX<3<D0TqRQ#js1~_Xm50e&tYzOCePHqWgtqDbnH33&5D~ zmZtpNd4AFguOdX&*J;PKa*6*;%)m5o##id6da{ z%+EM2ZS4ToVo4tTg~2+eI5OAE;C^Y&t|=GcW~Y<%?gLrX_qgy%5=GeTs|{Y7sP1C1 zBvdPdDK2HD*#UQuD~Oy|ZLnGN{o7==6MF=v@#-#uMB+^vHR4zuoAOOAZhleG-X=@m zO`-Xh#ir;ms$_Ql=S#{XxoRH3M5E6I2i6ZCVz-nh_S3y8XNKa@h1QSk`tnyEp-*yy9T3rmTkP$s}Z1ok(xjT5) z@7{?)VwV3YCUIIDIY5R^tAFzMH!C|kX@&5UHciRAzkv^REZErCTDrQ`N9X4$q~&5v zV;SCy#$m*%a*yR*)m4#8h;DxZ;3nnp;v@gA6_~6vbt{I1*(h2xPKYf*Nee1ArR@~0 zp>BG0DWI1lt^3DO>Kht%8!b0jduGe3XIO=mlp=*4>Tj`EwULZ*Ob3tNUwz}>I#tkL z=qH(W`dpybua<}(_FIDvN1?P_Y?jNpm8j}uG*Lz1=y`d0`Q#JPQNFI%CY@32Qg_e& zh}gv0dS_;%&4SF&nJ{}vg(8e%>jW1?sTk&b9Y(2g7dFl?3%G%=w0}pk_w&jb%Jd1O z)zz_yS2)XN7_X@Gio^fHt^3!+q#t-CDNtWh{r7UwpFvk%at zLtFN)F0OfJtBrj$ndPe!T`cqiDIO;7NL1l8M%hOu)0#v}%ri>M z12Y`9pX=Wdc|`&eGrPulRe$`7`>w{JXvTpb8X5{51ryCvx7|KszTzzd$9I{|jv%Hn3AnUelEH{<+NZPYjmsj+?(h?V z!dYvLGOQ;F5^%lzKNi!I^R?Su9!Wb<(XZb8M`kfv0?GovX%a`sf*L9T~~D|Ho;ie*GcIGJ)l03rfsRx6qWNdJ^hJX{zckyA{4g zxIDCflr7oOjG%-;V=QUJ4(tV|_=qqY`RtRnkQtrS?Vn^DMeGf=ztE?}1I?GUWGd{l z1uf4HN&8VX%H~dlg@rv*VL15s4!tc3SSlPw9p6!>OxfZkGhnDlAOn1s%`2CC_hR+? zt$2F(JPdm?cn$hpBfCIL7iQl>`|fkvwZP6s&lVDf>VwC+iQ}E_B=hljhR@TwPDPP< zGJh!vBpwO1wC5$aS!^yIg7s2Dn2ETgP1(9rIZY4`!_%n{{9f~{-{;(5l8Y9iO)SmO zpqHB_@}(oK((LjPLR9QnWtnDbUl=BvK2r?49)iSwGkSOw{PNu*V!!3ZY{&Yi-~ zJAWmo8D+?NNBFaju<8l7+ZF!3e5lsr!hk|cozQ;3a&y*FU?pvy6H+uL8N8RIm{f-B_^Zof*gInO?Qg& z+o;i!POdWqLvWxVPYGIJ*9;vk?>}{>HX{BVzNUYF#3tR)OLuvsNB)#SlB;9EOx=ih z21JpHW(NcWKt;#o^NpA#XfcFTdL{kAi-}vk8(Mf8!sn&zr%Cy?`Fv7sxm0KF^L~>f zyWmC<4=3n;np;7h)>kByMg-`?B&fa6M^2I<~L(z6vPenh$~HTa$L&&O?Fz^zEhJU-WbC@JrF=a z|7dS(d$tmVz>K1iIjAU)$frBh=pB)BhGKEg**y8Uo+|W^S11Uq_Ss|fd0E-m*X@4B zUTJoaRgkBMC&P)HURsj(_3b3ZS0wyIL}DoJHaB5p98mO$&><@HGQJ&Q{F{C;cH6Jx(Kz?Zpi&c39+It^gO#gBA z#!f3s${tMBb=Fh;(cvL56)@$PJy%J-B`WGYi(!5U(&BL9O-bhc!wE(#16`Y!M)9HD za%9;D@UvX;8rLaHif34xS2H?Atx4W%FRfTKZE5HY4WTIs!m{U7znBOX`%GGMiC@^ zeS;?iJ;<1erPbwdcZhU+xdc~nYnTkplkLD^6lnB&B5x;8RfTAQ85sl=@p7B~VG`sq z0>^as=WAorvZNDjZYOL=LBNMIM_dwc8lm6@RcW~D?4gwT6Q4`<2Q{fQaZ`TGyGW}H z(cj+xJ_rv&-{Z?2nW-yK_dw7T!KAD}b4+4qGVL4q?sq-f+;Y-qzIwYnD90&bs?6Cm zD_v&xR6d9uB?>Y@(cZFf%PNFz3RHW;TlN)N}P`J z^;XArfg*?X=Os)&-DsG*1YHiAswbU9UT5d;>1n?H{(dY37zhCY0Z7nsn|+N9(AYzb zALZ%R3i{X#iYKAqTHu`;Z z#gGixtUw(QQ)8p19xEL44l!iy4hvm|{}ahNs0i1_OEXg9`=HaG>n0BKcGdYV5lR)V zYlWue_ob>`*eZE0w0)3#M9>NKW(9MM@4y`d&q*lyQN>4#0{v%T|) zbF_t>bK_r!2!%)h1@#kS=ET<~yNZ|{IC|>AU*OYN-GsA7`qSxOQWSU+1&g0RtQkmu z8b(|dvi`(&m6v~28Kej{+8zj}!U#9xBhukaAD`4?a`&m#)5^%qgr}zVHmt*6JJmS+ ztPi8C3GSfw7a@nvU>hb~oBR;C_m+xgfJJCu>TFHb&k5V%1Gd6YEa{ZCE=an~A$V5? z*^*9bxROi*Jug2WQd%7@tp8K46&~!B=c~H5HYp<(!un?xG^6|juU+IY{t}%;*Uzoz zS%P>N4z=uekcbCaquB#Gu>YPHQ}XGQayT@9yFJ{pBt*WM9dCdC zk4`K}#2g4*P}Hu$Lu)YMcs=c<#%nmwjL^oj?xu5l<7jJZk7x3t{&bn-4?CJI`Rsxd zDcxkZ!gIiiJtQ6w8MDJCATWA(NOz8Ku>z0p?kNey}pUZxxq|&Ib)mO-V~j+Nu-h(^@bv`lE{r)T~caH|tjn z?ZwH-$w=lu)RcnoIW0JZgp|z9sS$CQj3zR;{qH}B!Q`o9wKfYZRsK&dST|~*g4*kV zHKadlmXhm=2Aw_%I+b6kMX(ACNG2vG@WQDG9ay%LcJXYaD5lwvxLf$9Zq%TC_7}Tp z*BiohB|NU*F8p&G{BAM-Gl6!rLIEcVS^40p)D3ylhLDMnJuJIq zVTS>Fnl~~|BA&nSny%MU66j1T_jc$45iF>Sed0dJBR-z|ZYxc#&&L&C8m!P`b}kPK zViQKp0&}a?=-7ZIUiZ0C#t4VLySuYpYr|Ha*PFc|BA*~j9lN@#_Wv!BC#I~7JZ+U! z`K@_oaq+MManOA7fPzTyTw>gjw5*Hm#M@x+)>Oq}Ek<|gCMqajTv8Hh(1iW+RUe$U za$>oTpRDiHH}Pt+)67?N#i4WdBiUz=r%5P|JcpSKZFk6viBB*T@80wEDJS9Fon4k} z<-q9R!Al{#$nlw&`StL0<0k#%mFnaA$X_;|oQKLEjQDW}TO=ZkHmb0ZK+e$S3L(zorArf%VZNJo9uTR&wx7*{V zt$t!Ap9R^i$W54T$Io|gKQf56Y<^Or9`qM#4;`e?pdDwrujxr3qX*5P znM@D?3K^hQWL4bA!`c4r{G8k!^Ndw4A`FCVt34@+vhwS>V4mufjG&g6Sob$MEU z=#nkdLU48dBKmNDPhtdxl~;3GSu`&EF7>a;Z3ihdT&AFK_6TaGFWU~d zRpFIsslKwj{H(^3DkRb*c_sux?Z}Sj#*FvjKly45ENR^5-=H}+&#w?te zL=6KWBc|&3Ay&RyTN@i0K}_9XiWOTsZ}>h;&&&ko(+NH8CZ4W$5-zwwIoS3E!@Ih> z1C?@`E80~+nIgW2YeLM;D>^Xoqc-IcB~z(YuLnZx_XkEVC+)=mjH65m_( z!leIz^jf>e>-Pojd`1$T6UW0>+Yv7whC%3PwtE=vl2%z&- zGh-oufjwZL*L82pLnyT#G-%8~De{NqjD5e0GL6d`LwjCZB>Wp35x6!O4P<((zXEVC zUjQQsk{-jWV};0)`X=qfie_8p_@?Ny;Fcy%PEL|plEi|6o(v!pnnYlT_C}*g^!h$m zgK5Phqsfd=gzBNPqeFFBEC1YxSDN6%`o$sIoOWa~GBOrxO+ObD6a*lGzI+)0$}Bzs zL4ID|C(y#t*%>f5g-P3Xz30@3xGY%~D@{@q5%bpNCIkiy!I}TiH9o-v$9)<$OJ@49 zsC1L`bu}s`bLO({tDMz11OV-97i;pa`hU%xB#ab_=;+UGwz1g!`(u1}Jb!V?Gup9H z_kBfl5IDioWm?;~-H$L2>)xzDj|IBFsVOCE$0cNCWhGD!>Xw+Y58_oyfQcP2Vb>VJ z(oUYoQiNe?Kjko~O^a2HKC>c+b^!2R-1-{nIv%h6YJ1%dW;k?{U1aAyTD_<>MF9c{ zN_p{Sk?WsNQ0=TrWwWArGa<`f#>Y5GbZt&pFj-lnmy*#JEeEJtWD)s)S}*$$OFD5! z&FHYU2XPI3`nV=&KOLW(ICKK#J!4Yfgb9EV*rg@TLSZH`Ra!`~3W4h)fS{?jx#U8p;|Ymsc} z?5pE70|w@RP>KGxI~^pUs;5=pg`^!sc% zUM@DzjI*v6P>l6gn|L9G&nakbW_i=!!27JRdjIB0cD*TYwYa$Wb>)B;5W3wjwM5hJ z(vKD{4J$r=vyMOOS}?yt|7aMPXs=$Eg?)gob`||~ZyTjL@y=maOX;W&ruB=3-<9Mi zH+P(>C9YG*9{n!PW9dAJ?mtz!G?6J;QI@fnJRN_+2EhA`-jJ(A#{TZINnNA_o5W6SV>a7_znYR)RUgfMiN~J7O16 zNECk&duP_a#a4BaZ%u$nt1{pQno$Y(g4>E`41-IU$LHx4a^|sM^b0{$;gT$w!TJ3P z*J)*W?D6&XV{-#{BcL*Nrt7ZUsP|nCy0W36Au0(|8zTES-KDmg)=e2e14xPR@LEcIdiNq(W*_YqXbNqpU_pM4y*sWJ z|E@NNKBRv1(c;VXKvYnL%P?F9OE$$>u1z9qHQW}^=lQ}&T&NszF)%OyG*ND_VV?TLC1ATZQm+- zZNt!60%aL889CSdi)Ynm)1q-W_2L9|XJ^w3&LHQIepJy{tbVqxui2D1kxmOB4|c!T zM_)IZrXaMyYN8vve@McUlXmzPWjRGNr6~L25`Tt_sJImx4W=I3Wb~(o+--xkAp2HG z3!D|`!QVw}uPIP55a^Q;Ek0PwGbQorXQKppRXqJD(#D+hQ(V`=OueZR@Lnx?y->~Z0?00I<)lA@vziM-7mG~)uf*Y-a8ANJ#WH+))+^=MDatw?V zLUns#K3=^ZhvSv|6R$T}==_A=&P_?**_-Q$Y87?2LwpK1hd4?1%PK_=+Cork%yuxw zkAE|L`CuqMa)FA9Q~vlKDNI?GO9pnbOUPuhe|)Z_n<3k{Fg|djiK&JqSLY4^s`%8@ zZ^4JhH&K5_$GG$J^VkDt{*yTPLN&V0MIMWR{(kfNJGQVp<)SL}JiC-p|Ef0VG5Gkg zJ#|-q(8NfRY#F@pT@^~|15Ut@s;{sy=N^rdPn@C~tO*2f&MPHUh z0;-jcPYw^&P>$e74sQHZawSaKaWcxUJr6wi^Iefr?2L=Bo8Cm^N1D(k1Mc&MQdkWq zZ>B`2HaE$bnVJ0>6OK#lFTS~>emM6wCJ_kfyq>Ew31VDUaV_XZW>X&$+8<>2gT@Yd z68mx^)doK$<$3JL!szR(Zp(+Oy=s=g!DwsCTWA(af;I!pSH#Ix6crJtts3;v6gbk6 z=JF#XtepdgTNKPd=*tnGefBRehPH|uf8PHX*49Z!BpjhX^k5@9b=1s)oW!6XlWX*G9V)RW*Ltx~ku@IwAuHs_#P4iMe3;Ek2Y) z8s$DYDm`ygl4dU0NrX77;J%mZC;x~51Ds#3)H65nM_S~Qr^}jY98Qp|RS$e!PnsQD z?|f{VfVOERomAWg&-G7XeYGp3sj12LiHKCU*G0nTB2o2vCI#2A{2^hH&^Yn!ry-7| zm-tCs5czB;Z9qd~qtjLhZXKX5!2W=}`h#RYEPjl^XaWOIJ9PsX?+lwr% z`gvIvxnRP)r#f|twwMk}tSv5RveJk^3TSd0qFSpc(oR?62ZPto$ExL&3tb^3Hn=He zK8}!20R5e)sO}nNZeH!HGap-QaiWxf1HLjHKv)3Xv;c4jfXN&IjiC-eLJ@-$<>f4V zR{+rxOSl)}0>Q}21#cvkynQ3VP{Sh5TQ2><9D|RV{|G26*Ta;CL=-r}R{cNT0Cd{7#a65LN1rd^z{{?&v5|BowiMkR#9Kq&1Rv9&&S>XX^UT;V zKc1V^G=fTd=)){sdsvYw#}@^%Q`f{Enhdl4lm1KCXh)tj+Pz2&9rB2tFB=&WYt8(j zhoxQi>)q}m+jm(|I|Pr;@8foyQm}$BL1R4lM##i-JM0vdU#8B zoTEztv+UO08FqLMh2%RHd_%+pQy+8fMu}!#x}`^%g!qPI#2h+>{mNM z?6KM#fz9~X>;L}K@auS8@l@nd8ZoN zG1ef*ygIDDdsl&R+AnJ^c-q+7Nc$d%q^{u))U}8&8eN|y`Gu_lqN1X*w3u-GohSJZ z^nF+CngPo0^|%$b)M$eX$a+dN;ZhWI5q*b;R&jTVMH)#8MG#*di)70Vovyt6r<57r zNh&QMH7jC_-6a_r_ZXDMq*_GSmR!YC%EMt!(V;xpAc-L@7ZFS4n(THIHsIu;H-z>K z{BEziuP-cx29Bd0>PDWpCEZDz&RF+nRYfNPVGykV)AC^QcP}J020UOa06#!Z5ElVv z6xmkanj?dxXt|W~j0$oH88WFOmu)+q(7p9;iBSI3QQl2}?5*vg4hf|x_dvLei9EQ= zaZBP~$h+8SO{sw@_->u607;`8=={!AOg%m!r9rj*l~oA zyi;ULB}P8-mO%RW9XR6ix(Z`X3#O?{N&&JUG1YhxY;NL*U!jb8|DK>1zVpti z=?2X^Z1J%aA4zh0tb5UVtU7^7JG-Z+r=k2}v}5=5^94Q*9&(C!xWdl{4f3byLXH2< z%}ITCiD1rLV{cx$u+qZ5LCO7>f|!QVDpr{Edf(h#lx1{$cnC)pSr?5ap+<-02;xQ4 z`63F{VjL@{cd&;%2CuGc*N`2cglnnopH=Dnxma7`%7?68z?bQO^iA5}YiEqp%+Bpn z$))d!dtZ5NY!a`IaVcFOlwEPpeS|6P2z9c;)6vgbBQ=F1|LP~7{2H7hBTMz*2%Bfb zRFxvfuS7~E!8mt|d<~Eb=v+KJ&JSxIK-H+wt+tpi*KTNP`p;sE5xSP+vAgEg1gtZ@i~l{w=!MHuG?;FJ4B|+pwq)Y#k{32z*1Xbe-C` z$f-vR?(dAe!hXn82HhyAhMV#ElRbnq=>}nQ*^q5tL6c`}9_RZ1Nqu|HK*z{E5vbKe zqNg4)!vyWS0O{r2fD!Cc(Pa^#wDF z|Ai>!{GIve&KMyCQsS3U*ltMJ+1KE5q4%=~+*;4~C9@m)e_-9Zn?0tbK>X9&1nX@* zhN_)-#-d9i(urhGz(AT}ertiAJn*)sh+ak_t6Uoh}y z1`tc$K^JtD4JOR30wW#K+LyzFUsHTq!Q6#qCbX`r=uj1+QK|E28AyRcwmc^nN(+>$ z%!~K!L`R({D&zs6I6mp{q}4-r5kPUZ-_&~s_;(n)`qWSb9y|_9C^+R zFdaJqrStIo{2oR$bP)v!$*~`q_dhczQB?$Ai|)X=b(1Pdeh{9 zc!IPtKl?_t*660u6F!qGc>SAQmf^?q@>+ly$TWvH4evPyC#cMe1j|*3!zSLZ-iN13Cvq*!J_$0;MRn4q&+CM#ZjEoG57KJ6AT-RJb78sj$^tM?Bi{g_nZs1r$)ZA`PTfn;Fv#IO**JySE;yLWM$#u|jKhHntjD zGqc^K<|%H=$*dOZjGbUKBf$1b6ZZA>j0r40G@GDOj^}Z2b5fc`X}ef#QsyE+o@sjV zb~bN$`I&eaX#PBKR#DZ4Kn{&6@<_Jve&2j_d~5=^#Q*{_THyiI;g0K3M!+rj&&vi9 z88vn*;C-PQCdZ_^=q zULx2sX||KpYo;@;6p`hnpKUX0C(vO55Sg&HwsuBR=Nt@_D{f#iz{E@?O+o;r>+bd+ z8Xg{=eDfFeeZKW9(;_ILL+HoUf4};MS<94~(N{~vZHb`h@d2wmt9KU!UB+UFtEHn= zdziuydhQ@4(DhZX-JKcGP96D(*e=GbLEuLAeDc)5?OmkdevJ{xI3?WsRB8X>4ZvEP7esF;ZIw1*G0pSE|ve0fh7t(6_WL^Md zuB8D{`gT^;@@?6zVdIo61VutN(SB)q=odpkq`pPIUh#!aMfoTYLaRE_`0_=bCJ|nb zBxVNj;c3ydFUFf{i z8x+(svGR%vsLeR+Ncj0U|FX^Qy&437XCrr;jr_R@$UnhQS`__ayRcK-nt2YSH`PZU)KKZ4~X zKUG;tHol}CLEP2R55Ie)^Y>Q_Ah&brdQpi4EEB@5P^_nrNaz;5XH1w)23#@}%(*-1ceWD|+5*?LZfj)}lQWUTH;7)hj^-PnjdX=4JlVNKltlnd;XB}SYK zH5O+9eHCf*B%iBBCk3E-3ApbzHXH7}rc_YU&_#c<57d9FAAQvzTR1Z@7ygH(vyIhT zPaVPFi0onbO%lr$)Qi8v9rSTa2HjE>X8ruix!_c4S4Ep1iy4s~%%DBfw849Aq=3Dy zTWDb58L+|Db7iYg9A13*f?$M%s*3Qn!tydxxI35GmEtZQ2Z=i977iLP1_6@>1MnVS zWG^(}$n_VbmyNvF(Bin!or8%ELS(G&u{P+ zB4bZgK8LQfn;UnkzBBw-DyyZZBi`W1R;a$vM1OSKr(N}R&rvS=1N7 zbs__04s|p4e)x{P*H2^D^`Rj?0iXS!*hIaKUtT9@RrV}n-v*`v%YE2rr4-5(=*`Qt zFdzdCTD7FG-=DT3*KYu^v(Tq?ID0pJV@x!ag}UR`-rwF zT`+x8qMUgTpr!BvxnlpKgnub)?&2o6!WzGM((S{jKWsl6ye!riOEKX{&NhIaeBLKh zQc_4$z4YuGbI<1JzUp1iJp1|GzZw3QCARN=bGL8Vf^`LzbaiC|=H&TW`+s?olYf<_ zZ_jtT&in&uvLz=B8(w#atA4$RKK>J_!(ZXCKygzUX7wV+CweTD&YUW1Iw@x=94&YJa1Es|e^UVozHhg>j+_)i*n!?5>K#Hs|_)x)vt^1uTCR-$S z!K0%Oy|&=Xv2d(8zjzD=&?5|6tJSa?|edyk-YRy;}@Wz)p1dEKT2f6Y_E#Rd$*^Jx`cVaaa=;yC7BD zfZs?a;w6||3UCcz?c#x0?Dd%8dqPze%YRq_$a$4kKeThYy15zS!2(e;;Qe5e z-o2UZ2r|ASs*5% z*-sC+BJwp!mT7FuAxdg`xgXM~q&X8jnT5wU|5&BwCYLWd-DoVDvP}uOhBY6M1uU# z)=93l^99iYh;RXpae%7tv8L^MM>-H)Okn{j0J@Bue!hH29x_gdNZ9Tq^px91SUw^a zHkO@#Tk$iBlsh0fFzMC&T(NJDE>cXTDB6veB_Yq50`^qUISLTt*c(gjW}NRvYE-1> zKdtH4t22Xdt8&>6r>z4dAOIE^0HM#a>T24Ysd~%U4JT9JNa)gHgo7b0#?#bWb`umS z0QW=R?`dz<`=T?;|NW_gJdhd!0_)lpI@2pFge?c8FN@&+U`@Nn z#ePjciYahFNTb9?4dhr-3jkl89J=0OVtZcKun53qC)M5ApGke<24bKitTAHvxhC%w z%g4sAoM*Q^Du_|T`d58!CN7?r%n58-GkMUAq#e447^_+W0dkiJ4D0i{aqCtW727!3^+jqkal_KO23Gs2Q^9yZzfll+W6jo}C@Xsi%qoZaVfF=X&b;7ama8#1Be_T<$ z-?(643XUNT0MSVzw>N!VUtiz!HDeTHWajguBd==BMQ(2H z%rT^QfMXvNOqYIT!im+!G8g(;A+d%Py;TWQ$Vk6L-S-uS41C#+0RZ67a1I|$ClYXP zaXE27=zR^yUJ3jG;?F?RBm*Gaby54U{HKn5uPD{qYwqR7c(yA|%zWe@tT9(RU{L~u z5EkfRZO^Q$2^k95-LQ(sXRnW;GsfzGgvp*z3J2koJJOmXUK#Jw?(UDsm$Kd&^1HhG z{`y^I-nD`MybK^WC*|N!{XrMzN&s32qMaa8au&^;cpv#k@DYnd?RaAsa3HTBFYYXx zHP+>WozB9zxFSP^wR;vqCu+5`Ny_uo<#K#>b_SFQJ}VKXqC()NLM)E{kO{l{`Kp(# zzyHUN_skeg75)&QTHUXv_q$MQ5Wtmbf{3pWJ%?;%_=RfhUWA)F{0t%4m2b=!+?ta+ z6N8S>0R7i?>PF^65J5u0+Q4~)I?H*K9x%Hd!NeXwIRQd9xy{X~K$IPz5qh;I(sB8V zHO5d)cGWLEFd87x#O39sIS|Tv{jeJ5K*2_N@%=gG+gYrX-Un>obig+PI8PBk0RVTC zqqXr-iZEZmAH3&HBA+b7_|GQiH|E^l{ c8NK?KL@AE^?YAWY?uA0gORGp#Nf-tGAI3JCGynhq diff --git a/examples/widgets/animation/animatedtiles/images/tile.png b/examples/widgets/animation/animatedtiles/images/tile.png deleted file mode 100644 index c8f39d8d409c0033bd50b6471138af3c0f1f7c89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16337 zcmWlg1ymbb6h&!~;suJk1gE&WySr1|p}0dSR@|X@ad-FPRtS)y!JXpn@aM0r5Sf+C z%p>#ezUQ15sj4i4hD?YI0|SF5Co8EAJgWYGM??Vr#$jGo0}t=q)MdnBYNm(}ffop7 z3Nn%~Z~xzZb(bas?;w4Z)pLV^K_C48{w|dfod|gIgS(uP)Q2TlSafbgigE-_7#MOG zIY}{1@8#?++n*pEpZzC+`n_De3_XK|SuLaP3Ou>b&A0RDSXlTmj$ix<9H@x?)FFcL zq2?mFyKB~6F&Ex`T`@x3!?*Yd=0vEA-{AEzu~ucv4E_bEX)W~Z;6C}DMpXT&K^S(+ z%OdM&%;k02iv2`OId%5(wvK(~yU}uGX9n4o(SB+;rV80fT^WU)khYBWJ z<{2n2kEzPis0)mmeBMo*Kv9z(OMmEZu|G*PQ7rCejd2 z2dI^+Ym(dkRDD}pTT??r!}C$^>k*Gtqn>g$Z{Oo1e~V)wDjHhi#4d(7D<5BEi7g_< z=>FC7X#6uGaNwGiS|ueVi}mIohRhPx%R_69Vq#<8VT4nB6g-DnFbNVWv1RAt8rs+( zhqgMG8rPa<(mdUr$sh)wJsq$2_VzkDIK-%z5B3B+0bdFnyyxkPT)wKPmX@}TPW#I( zls;9y$X1>vIbV|j6YgC{4OQqbm1w(AOGlQ|50Eh}n>A@jnzF&#GWj4p}}H@d7M3gdfUpO{n6gVpfx@M5Qzv)2kb znK0A4qLddHftc@v}r;Xm;-NRcl#O9IhFxlUfR-kMZv`AAojpNhm8G(>-$wEHz>R%MK;iqUWpGftHMdoSgHKvjigI3TOzkIi;0XMu3QRfx3sX>d5pm8*ZkvZrZ3;EpplbOxJ96x4&d-xpjf=U_ z>?BFOurf>NOKd4afAel|e61XASs`U+$&)Hdn3}IMo}w}z-E~zfg<#rdH&7Tj2pqH8 z9ZNto_U4%}yf|0PwVvV8Agqb%R7ovV z_9ZmtCesJ>(AP~su{g+fxkIrFW8)0-SC;)az@_nyE~`Y21Mz1E(I2ralCUh*K=<|9 zuLE%ck(S@~AK=8krC_b!U4(p7?O0KJa5;s(DhKZNvAA6Ad{iYm5*`d8Czr$OXC1r? zC;%1J<6g!cy^`=bhu^I~XLar8=20X#^#){?7~IDCxIaZKRg3(IU%gaV>D^|NoS{YZ z_g|-tGcVxncQYygS#{NA6&9ZDd?*bJes|`1+PgW~CP%b>6iehGc3b$-BV*w}m$&OJ&jvE^}MA;(0jAv(_w3F;^E?9Pf`d)-%5jK|vA^b4op$hCxbq6Bv6%WD$o@XWr#2f@`N*W{7NsjN3x z-zhZ7c;u=U{Rq26a1?2%AYZ>|LL-**8ZdSt>}*z$ifuFxtdV`vsM8AK7cJsGSbXCY2V@F(W9 zV0$rzLn72=Iv$4{QNn*+LJj*;DyLh5$Lv9gT^>mZf3?N*jybvj5e!U{ssyZZ?@8$4 zWy8Wd6|qWR-leE-JqVj(n;j6kO-$g+Q**RSf1e>h}{$wzMU-n&R*hOqR$ z%5>dL*Sa=beKd4c!H9+#aZ%N37V)k*N+M)c*SR0g*uQ^}c_Rxv$|AGychBaObIG10 zXy!vHN

xUdsGJBJwu8zN1n5LYQ`@I8FhqTec#4J+k*14AA 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

$X42+zdA=Ial;=4HI+cL1w?xFy?oa28Z) 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 -#include -#include -#include - -class Pixmap : public QObject, public QGraphicsPixmapItem -{ - Q_OBJECT - Q_PROPERTY(QPointF pos READ pos WRITE setPos) -public: - Pixmap(const QPixmap &pix) - : QObject(), QGraphicsPixmapItem(pix) - { - setCacheMode(DeviceCoordinateCache); - } -}; - -class Button : public QGraphicsWidget -{ - Q_OBJECT -public: - Button(const QPixmap &pixmap, QGraphicsItem *parent = nullptr) - : QGraphicsWidget(parent), _pix(pixmap) - { - setAcceptHoverEvents(true); - setCacheMode(DeviceCoordinateCache); - } - - QRectF boundingRect() const override - { - return QRectF(-65, -65, 130, 130); - } - - QPainterPath shape() const override - { - QPainterPath path; - path.addEllipse(boundingRect()); - return path; - } - - void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *) override - { - bool down = option->state & QStyle::State_Sunken; - QRectF r = boundingRect(); - QLinearGradient grad(r.topLeft(), r.bottomRight()); - grad.setColorAt(down ? 1 : 0, option->state & QStyle::State_MouseOver ? Qt::white : Qt::lightGray); - grad.setColorAt(down ? 0 : 1, Qt::darkGray); - painter->setPen(Qt::darkGray); - painter->setBrush(grad); - painter->drawEllipse(r); - QLinearGradient grad2(r.topLeft(), r.bottomRight()); - grad.setColorAt(down ? 1 : 0, Qt::darkGray); - grad.setColorAt(down ? 0 : 1, Qt::lightGray); - painter->setPen(Qt::NoPen); - painter->setBrush(grad); - if (down) - painter->translate(2, 2); - painter->drawEllipse(r.adjusted(5, 5, -5, -5)); - painter->drawPixmap(-_pix.width()/2, -_pix.height()/2, _pix); - } - -signals: - void pressed(); - -protected: - void mousePressEvent(QGraphicsSceneMouseEvent *) override - { - emit pressed(); - update(); - } - - void mouseReleaseEvent(QGraphicsSceneMouseEvent *) override - { - update(); - } - -private: - QPixmap _pix; -}; - -class View : public QGraphicsView -{ -public: - View(QGraphicsScene *scene) : QGraphicsView(scene) { } - -protected: - void resizeEvent(QResizeEvent *event) override - { - QGraphicsView::resizeEvent(event); - fitInView(sceneRect(), Qt::KeepAspectRatio); - } -}; - -int main(int argc, char **argv) -{ - Q_INIT_RESOURCE(animatedtiles); - - QApplication app(argc, argv); - - QPixmap kineticPix(":/images/kinetic.png"); - QPixmap bgPix(":/images/Time-For-Lunch-2.jpg"); - - QGraphicsScene scene(-350, -350, 700, 700); - - QList items; - for (int i = 0; i < 64; ++i) { - Pixmap *item = new Pixmap(kineticPix); - item->setOffset(-kineticPix.width()/2, -kineticPix.height()/2); - item->setZValue(i); - items << item; - scene.addItem(item); - } - - // Buttons - QGraphicsItem *buttonParent = new QGraphicsRectItem; - Button *ellipseButton = new Button(QPixmap(":/images/ellipse.png"), buttonParent); - Button *figure8Button = new Button(QPixmap(":/images/figure8.png"), buttonParent); - Button *randomButton = new Button(QPixmap(":/images/random.png"), buttonParent); - Button *tiledButton = new Button(QPixmap(":/images/tile.png"), buttonParent); - Button *centeredButton = new Button(QPixmap(":/images/centered.png"), buttonParent); - - ellipseButton->setPos(-100, -100); - figure8Button->setPos(100, -100); - randomButton->setPos(0, 0); - tiledButton->setPos(-100, 100); - centeredButton->setPos(100, 100); - - scene.addItem(buttonParent); - buttonParent->setTransform(QTransform::fromScale(0.75, 0.75), true); - buttonParent->setPos(200, 200); - buttonParent->setZValue(65); - - // States - QState *rootState = new QState; - QState *ellipseState = new QState(rootState); - QState *figure8State = new QState(rootState); - QState *randomState = new QState(rootState); - QState *tiledState = new QState(rootState); - QState *centeredState = new QState(rootState); - - // Values - for (int i = 0; i < items.count(); ++i) { - Pixmap *item = items.at(i); - // Ellipse - ellipseState->assignProperty(item, "pos", - QPointF(qCos((i / 63.0) * 6.28) * 250, - qSin((i / 63.0) * 6.28) * 250)); - - // Figure 8 - figure8State->assignProperty(item, "pos", - QPointF(qSin((i / 63.0) * 6.28) * 250, - qSin(((i * 2)/63.0) * 6.28) * 250)); - - // Random - randomState->assignProperty(item, "pos", - QPointF(-250 + QRandomGenerator::global()->bounded(500), - -250 + QRandomGenerator::global()->bounded(500))); - - // Tiled - tiledState->assignProperty(item, "pos", - QPointF(((i % 8) - 4) * kineticPix.width() + kineticPix.width() / 2, - ((i / 8) - 4) * kineticPix.height() + kineticPix.height() / 2)); - - // Centered - centeredState->assignProperty(item, "pos", QPointF()); - } - - // Ui - View *view = new View(&scene); - view->setWindowTitle(QT_TRANSLATE_NOOP(QGraphicsView, "Animated Tiles")); - view->setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate); - view->setBackgroundBrush(bgPix); - view->setCacheMode(QGraphicsView::CacheBackground); - view->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); - view->show(); - - QStateMachine states; - states.addState(rootState); - states.setInitialState(rootState); - rootState->setInitialState(centeredState); - - QParallelAnimationGroup *group = new QParallelAnimationGroup; - for (int i = 0; i < items.count(); ++i) { - QPropertyAnimation *anim = new QPropertyAnimation(items[i], "pos"); - anim->setDuration(750 + i * 25); - anim->setEasingCurve(QEasingCurve::InOutBack); - group->addAnimation(anim); - } - QAbstractTransition *trans = rootState->addTransition(ellipseButton, &Button::pressed, ellipseState); - trans->addAnimation(group); - - trans = rootState->addTransition(figure8Button, &Button::pressed, figure8State); - trans->addAnimation(group); - - trans = rootState->addTransition(randomButton, &Button::pressed, randomState); - trans->addAnimation(group); - - trans = rootState->addTransition(tiledButton, &Button::pressed, tiledState); - trans->addAnimation(group); - - trans = rootState->addTransition(centeredButton, &Button::pressed, centeredState); - trans->addAnimation(group); - - QTimer timer; - timer.start(125); - timer.setSingleShot(true); - trans = rootState->addTransition(&timer, &QTimer::timeout, ellipseState); - trans->addAnimation(group); - - states.start(); - -#ifdef QT_KEYPAD_NAVIGATION - QApplication::setNavigationMode(Qt::NavigationModeCursorAuto); -#endif - return app.exec(); -} - -#include "main.moc" diff --git a/examples/widgets/animation/animation.pro b/examples/widgets/animation/animation.pro index 19b79caf15d..3b4aa0f1002 100644 --- a/examples/widgets/animation/animation.pro +++ b/examples/widgets/animation/animation.pro @@ -1,9 +1,3 @@ TEMPLATE = \ subdirs -SUBDIRS += \ - animatedtiles \ - easing \ - moveblocks \ - states \ - stickman \ - sub-attaq \ +SUBDIRS += easing diff --git a/examples/widgets/animation/moveblocks/CMakeLists.txt b/examples/widgets/animation/moveblocks/CMakeLists.txt deleted file mode 100644 index ed17097f5d9..00000000000 --- a/examples/widgets/animation/moveblocks/CMakeLists.txt +++ /dev/null @@ -1,35 +0,0 @@ -# Generated from moveblocks.pro. - -cmake_minimum_required(VERSION 3.14) -project(moveblocks LANGUAGES CXX) - -set(CMAKE_INCLUDE_CURRENT_DIR ON) - -set(CMAKE_AUTOMOC ON) -set(CMAKE_AUTORCC ON) -set(CMAKE_AUTOUIC ON) - -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/widgets/animation/moveblocks") - -find_package(Qt6 COMPONENTS Core) -find_package(Qt6 COMPONENTS Gui) -find_package(Qt6 COMPONENTS Widgets) - -add_qt_gui_executable(moveblocks - main.cpp -) -target_link_libraries(moveblocks PUBLIC - Qt::Core - Qt::Gui - Qt::Widgets -) - -install(TARGETS moveblocks - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" -) diff --git a/examples/widgets/animation/moveblocks/main.cpp b/examples/widgets/animation/moveblocks/main.cpp deleted file mode 100644 index d03b57cd5e3..00000000000 --- a/examples/widgets/animation/moveblocks/main.cpp +++ /dev/null @@ -1,330 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include -#include - -//![15] -class StateSwitchEvent: public QEvent -{ -public: - StateSwitchEvent() - : QEvent(Type(StateSwitchType)) - { - } - - explicit StateSwitchEvent(int rand) - : QEvent(Type(StateSwitchType)), - m_rand(rand) - { - } - - enum { StateSwitchType = QEvent::User + 256 }; - - int rand() const { return m_rand; } - -private: - int m_rand; -}; -//![15] - -//![16] -class QGraphicsRectWidget : public QGraphicsWidget -{ -public: - void paint(QPainter *painter, const QStyleOptionGraphicsItem *, - QWidget *) override - { - painter->fillRect(rect(), Qt::blue); - } -}; -//![16] - -class StateSwitchTransition: public QAbstractTransition -{ -public: - StateSwitchTransition(int rand) - : QAbstractTransition(), - m_rand(rand) - { - } - -protected: -//![14] - bool eventTest(QEvent *event) override - { - return (event->type() == QEvent::Type(StateSwitchEvent::StateSwitchType)) - && (static_cast(event)->rand() == m_rand); - } -//![14] - - void onTransition(QEvent *) override {} - -private: - int m_rand; -}; - -//![10] -class StateSwitcher : public QState -{ - Q_OBJECT -public: - StateSwitcher(QStateMachine *machine) - : QState(machine), m_stateCount(0), m_lastIndex(0) - { } -//![10] - -//![11] - void onEntry(QEvent *) override - { - int n; - while ((n = QRandomGenerator::global()->bounded(m_stateCount) + 1) == m_lastIndex) - { } - m_lastIndex = n; - machine()->postEvent(new StateSwitchEvent(n)); - } - void onExit(QEvent *) override {} -//![11] - -//![12] - void addState(QState *state, QAbstractAnimation *animation) { - StateSwitchTransition *trans = new StateSwitchTransition(++m_stateCount); - trans->setTargetState(state); - addTransition(trans); - trans->addAnimation(animation); - } -//![12] - -private: - int m_stateCount; - int m_lastIndex; -}; - -//![13] -QState *createGeometryState(QObject *w1, const QRect &rect1, - QObject *w2, const QRect &rect2, - QObject *w3, const QRect &rect3, - QObject *w4, const QRect &rect4, - QState *parent) -{ - QState *result = new QState(parent); - result->assignProperty(w1, "geometry", rect1); - result->assignProperty(w2, "geometry", rect2); - result->assignProperty(w3, "geometry", rect3); - result->assignProperty(w4, "geometry", rect4); - - return result; -} -//![13] - - -class GraphicsView : public QGraphicsView -{ - Q_OBJECT -public: - GraphicsView(QGraphicsScene *scene, QWidget *parent = nullptr) - : QGraphicsView(scene, parent) - { - } - -protected: - void resizeEvent(QResizeEvent *event) override - { - fitInView(scene()->sceneRect()); - QGraphicsView::resizeEvent(event); - } -}; - - -int main(int argc, char **argv) -{ - QApplication app(argc, argv); - -//![1] - QGraphicsRectWidget *button1 = new QGraphicsRectWidget; - QGraphicsRectWidget *button2 = new QGraphicsRectWidget; - QGraphicsRectWidget *button3 = new QGraphicsRectWidget; - QGraphicsRectWidget *button4 = new QGraphicsRectWidget; - button2->setZValue(1); - button3->setZValue(2); - button4->setZValue(3); - QGraphicsScene scene(0, 0, 300, 300); - scene.setBackgroundBrush(Qt::black); - scene.addItem(button1); - scene.addItem(button2); - scene.addItem(button3); - scene.addItem(button4); -//![1] - GraphicsView window(&scene); - window.setFrameStyle(0); - window.setAlignment(Qt::AlignLeft | Qt::AlignTop); - window.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - window.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); -//![2] - QStateMachine machine; - - QState *group = new QState(); - group->setObjectName("group"); - QTimer timer; - timer.setInterval(1250); - timer.setSingleShot(true); - QObject::connect(group, &QState::entered, &timer, QOverload<>::of(&QTimer::start)); -//![2] - -//![3] - QState *state1; - QState *state2; - QState *state3; - QState *state4; - QState *state5; - QState *state6; - QState *state7; - - state1 = createGeometryState(button1, QRect(100, 0, 50, 50), - button2, QRect(150, 0, 50, 50), - button3, QRect(200, 0, 50, 50), - button4, QRect(250, 0, 50, 50), - group); -//![3] - state2 = createGeometryState(button1, QRect(250, 100, 50, 50), - button2, QRect(250, 150, 50, 50), - button3, QRect(250, 200, 50, 50), - button4, QRect(250, 250, 50, 50), - group); - state3 = createGeometryState(button1, QRect(150, 250, 50, 50), - button2, QRect(100, 250, 50, 50), - button3, QRect(50, 250, 50, 50), - button4, QRect(0, 250, 50, 50), - group); - state4 = createGeometryState(button1, QRect(0, 150, 50, 50), - button2, QRect(0, 100, 50, 50), - button3, QRect(0, 50, 50, 50), - button4, QRect(0, 0, 50, 50), - group); - state5 = createGeometryState(button1, QRect(100, 100, 50, 50), - button2, QRect(150, 100, 50, 50), - button3, QRect(100, 150, 50, 50), - button4, QRect(150, 150, 50, 50), - group); - state6 = createGeometryState(button1, QRect(50, 50, 50, 50), - button2, QRect(200, 50, 50, 50), - button3, QRect(50, 200, 50, 50), - button4, QRect(200, 200, 50, 50), - group); -//![4] - state7 = createGeometryState(button1, QRect(0, 0, 50, 50), - button2, QRect(250, 0, 50, 50), - button3, QRect(0, 250, 50, 50), - button4, QRect(250, 250, 50, 50), - group); - group->setInitialState(state1); -//![4] - -//![5] - QParallelAnimationGroup animationGroup; - QSequentialAnimationGroup *subGroup; - - QPropertyAnimation *anim = new QPropertyAnimation(button4, "geometry"); - anim->setDuration(1000); - anim->setEasingCurve(QEasingCurve::OutElastic); - animationGroup.addAnimation(anim); -//![5] - -//![6] - subGroup = new QSequentialAnimationGroup(&animationGroup); - subGroup->addPause(100); - anim = new QPropertyAnimation(button3, "geometry"); - anim->setDuration(1000); - anim->setEasingCurve(QEasingCurve::OutElastic); - subGroup->addAnimation(anim); -//![6] - - subGroup = new QSequentialAnimationGroup(&animationGroup); - subGroup->addPause(150); - anim = new QPropertyAnimation(button2, "geometry"); - anim->setDuration(1000); - anim->setEasingCurve(QEasingCurve::OutElastic); - subGroup->addAnimation(anim); - - subGroup = new QSequentialAnimationGroup(&animationGroup); - subGroup->addPause(200); - anim = new QPropertyAnimation(button1, "geometry"); - anim->setDuration(1000); - anim->setEasingCurve(QEasingCurve::OutElastic); - subGroup->addAnimation(anim); - -//![7] - StateSwitcher *stateSwitcher = new StateSwitcher(&machine); - stateSwitcher->setObjectName("stateSwitcher"); - group->addTransition(&timer, &QTimer::timeout, stateSwitcher); - stateSwitcher->addState(state1, &animationGroup); - stateSwitcher->addState(state2, &animationGroup); -//![7] - stateSwitcher->addState(state3, &animationGroup); - stateSwitcher->addState(state4, &animationGroup); - stateSwitcher->addState(state5, &animationGroup); - stateSwitcher->addState(state6, &animationGroup); -//![8] - stateSwitcher->addState(state7, &animationGroup); -//![8] - -//![9] - machine.addState(group); - machine.setInitialState(group); - machine.start(); -//![9] - - window.resize(300, 300); - window.show(); - - return app.exec(); -} - -#include "main.moc" diff --git a/examples/widgets/animation/moveblocks/moveblocks.pro b/examples/widgets/animation/moveblocks/moveblocks.pro deleted file mode 100644 index 1397246b3ff..00000000000 --- a/examples/widgets/animation/moveblocks/moveblocks.pro +++ /dev/null @@ -1,7 +0,0 @@ -QT += widgets - -SOURCES = main.cpp - -# install -target.path = $$[QT_INSTALL_EXAMPLES]/widgets/animation/moveblocks -INSTALLS += target diff --git a/examples/widgets/animation/states/CMakeLists.txt b/examples/widgets/animation/states/CMakeLists.txt deleted file mode 100644 index 6dd9847f03b..00000000000 --- a/examples/widgets/animation/states/CMakeLists.txt +++ /dev/null @@ -1,53 +0,0 @@ -# Generated from states.pro. - -cmake_minimum_required(VERSION 3.14) -project(states LANGUAGES CXX) - -set(CMAKE_INCLUDE_CURRENT_DIR ON) - -set(CMAKE_AUTOMOC ON) -set(CMAKE_AUTORCC ON) -set(CMAKE_AUTOUIC ON) - -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/widgets/animation/states") - -find_package(Qt6 COMPONENTS Core) -find_package(Qt6 COMPONENTS Gui) -find_package(Qt6 COMPONENTS Widgets) - -add_qt_gui_executable(states - main.cpp -) -target_link_libraries(states PUBLIC - Qt::Core - Qt::Gui - Qt::Widgets -) - - -# Resources: -set(states_resource_files - "accessories-dictionary.png" - "akregator.png" - "digikam.png" - "help-browser.png" - "k3b.png" - "kchart.png" -) - -qt6_add_resources(states "states" - PREFIX - "/" - FILES - ${states_resource_files} -) - -install(TARGETS states - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" -) diff --git a/examples/widgets/animation/states/accessories-dictionary.png b/examples/widgets/animation/states/accessories-dictionary.png deleted file mode 100644 index e9bd55d918166d85d986bf19b1cda78a1ac5e05d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5396 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%0D6n<2k3-2LA6Av9Zn+fdKaQ6H6wi9tjL}3 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%0De-C*1|18U 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 JPDHLkV1g{K>iGZw diff --git a/examples/widgets/animation/states/main.cpp b/examples/widgets/animation/states/main.cpp deleted file mode 100644 index 0f61b7457a9..00000000000 --- a/examples/widgets/animation/states/main.cpp +++ /dev/null @@ -1,295 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include - -class Pixmap : public QGraphicsObject -{ - Q_OBJECT -public: - Pixmap(const QPixmap &pix) : QGraphicsObject(), p(pix) - { - } - - void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) override - { - painter->drawPixmap(QPointF(), p); - } - - QRectF boundingRect() const override - { - return QRectF( QPointF(0, 0), p.size()); - } - -private: - QPixmap p; -}; - -class GraphicsView : public QGraphicsView -{ -public: - GraphicsView(QGraphicsScene *scene) : QGraphicsView(scene) - { - } - - void resizeEvent(QResizeEvent *) override - { - fitInView(sceneRect(), Qt::KeepAspectRatio); - } -}; - -int main(int argc, char *argv[]) -{ - Q_INIT_RESOURCE(states); - - QApplication app(argc, argv); - - // Text edit and button - QTextEdit *edit = new QTextEdit; - edit->setText("asdf lkjha yuoiqwe asd iuaysd u iasyd uiy " - "asdf lkjha yuoiqwe asd iuaysd u iasyd uiy " - "asdf lkjha yuoiqwe asd iuaysd u iasyd uiy " - "asdf lkjha yuoiqwe asd iuaysd u iasyd uiy!"); - - QPushButton *button = new QPushButton; - QGraphicsProxyWidget *buttonProxy = new QGraphicsProxyWidget; - buttonProxy->setWidget(button); - QGraphicsProxyWidget *editProxy = new QGraphicsProxyWidget; - editProxy->setWidget(edit); - - QGroupBox *box = new QGroupBox; - box->setFlat(true); - box->setTitle("Options"); - - QVBoxLayout *layout2 = new QVBoxLayout; - box->setLayout(layout2); - layout2->addWidget(new QRadioButton("Herring")); - layout2->addWidget(new QRadioButton("Blue Parrot")); - layout2->addWidget(new QRadioButton("Petunias")); - layout2->addStretch(); - - QGraphicsProxyWidget *boxProxy = new QGraphicsProxyWidget; - boxProxy->setWidget(box); - - // Parent widget - QGraphicsWidget *widget = new QGraphicsWidget; - QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical, widget); - layout->addItem(editProxy); - layout->addItem(buttonProxy); - widget->setLayout(layout); - - Pixmap *p1 = new Pixmap(QPixmap(":/digikam.png")); - Pixmap *p2 = new Pixmap(QPixmap(":/akregator.png")); - Pixmap *p3 = new Pixmap(QPixmap(":/accessories-dictionary.png")); - Pixmap *p4 = new Pixmap(QPixmap(":/k3b.png")); - Pixmap *p5 = new Pixmap(QPixmap(":/help-browser.png")); - Pixmap *p6 = new Pixmap(QPixmap(":/kchart.png")); - - QGraphicsScene scene(0, 0, 400, 300); - scene.setBackgroundBrush(scene.palette().window()); - scene.addItem(widget); - scene.addItem(boxProxy); - scene.addItem(p1); - scene.addItem(p2); - scene.addItem(p3); - scene.addItem(p4); - scene.addItem(p5); - scene.addItem(p6); - - QStateMachine machine; - QState *state1 = new QState(&machine); - QState *state2 = new QState(&machine); - QState *state3 = new QState(&machine); - machine.setInitialState(state1); - - // State 1 - state1->assignProperty(button, "text", "Switch to state 2"); - state1->assignProperty(widget, "geometry", QRectF(0, 0, 400, 150)); - state1->assignProperty(box, "geometry", QRect(-200, 150, 200, 150)); - state1->assignProperty(p1, "pos", QPointF(68, 200)); // 185)); - state1->assignProperty(p2, "pos", QPointF(168, 200)); // 185)); - state1->assignProperty(p3, "pos", QPointF(268, 200)); // 185)); - state1->assignProperty(p4, "pos", QPointF(68 - 150, 48 - 150)); - state1->assignProperty(p5, "pos", QPointF(168, 48 - 150)); - state1->assignProperty(p6, "pos", QPointF(268 + 150, 48 - 150)); - state1->assignProperty(p1, "rotation", qreal(0)); - state1->assignProperty(p2, "rotation", qreal(0)); - state1->assignProperty(p3, "rotation", qreal(0)); - state1->assignProperty(p4, "rotation", qreal(-270)); - state1->assignProperty(p5, "rotation", qreal(-90)); - state1->assignProperty(p6, "rotation", qreal(270)); - state1->assignProperty(boxProxy, "opacity", qreal(0)); - state1->assignProperty(p1, "opacity", qreal(1)); - state1->assignProperty(p2, "opacity", qreal(1)); - state1->assignProperty(p3, "opacity", qreal(1)); - state1->assignProperty(p4, "opacity", qreal(0)); - state1->assignProperty(p5, "opacity", qreal(0)); - state1->assignProperty(p6, "opacity", qreal(0)); - - // State 2 - state2->assignProperty(button, "text", "Switch to state 3"); - state2->assignProperty(widget, "geometry", QRectF(200, 150, 200, 150)); - state2->assignProperty(box, "geometry", QRect(9, 150, 190, 150)); - state2->assignProperty(p1, "pos", QPointF(68 - 150, 185 + 150)); - state2->assignProperty(p2, "pos", QPointF(168, 185 + 150)); - state2->assignProperty(p3, "pos", QPointF(268 + 150, 185 + 150)); - state2->assignProperty(p4, "pos", QPointF(64, 48)); - state2->assignProperty(p5, "pos", QPointF(168, 48)); - state2->assignProperty(p6, "pos", QPointF(268, 48)); - state2->assignProperty(p1, "rotation", qreal(-270)); - state2->assignProperty(p2, "rotation", qreal(90)); - state2->assignProperty(p3, "rotation", qreal(270)); - state2->assignProperty(p4, "rotation", qreal(0)); - state2->assignProperty(p5, "rotation", qreal(0)); - state2->assignProperty(p6, "rotation", qreal(0)); - state2->assignProperty(boxProxy, "opacity", qreal(1)); - state2->assignProperty(p1, "opacity", qreal(0)); - state2->assignProperty(p2, "opacity", qreal(0)); - state2->assignProperty(p3, "opacity", qreal(0)); - state2->assignProperty(p4, "opacity", qreal(1)); - state2->assignProperty(p5, "opacity", qreal(1)); - state2->assignProperty(p6, "opacity", qreal(1)); - - // State 3 - state3->assignProperty(button, "text", "Switch to state 1"); - state3->assignProperty(p1, "pos", QPointF(0, 5)); - state3->assignProperty(p2, "pos", QPointF(0, 5 + 64 + 5)); - state3->assignProperty(p3, "pos", QPointF(5, 5 + (64 + 5) + 64)); - state3->assignProperty(p4, "pos", QPointF(5 + 64 + 5, 5)); - state3->assignProperty(p5, "pos", QPointF(5 + 64 + 5, 5 + 64 + 5)); - state3->assignProperty(p6, "pos", QPointF(5 + 64 + 5, 5 + (64 + 5) + 64)); - state3->assignProperty(widget, "geometry", QRectF(138, 5, 400 - 138, 200)); - state3->assignProperty(box, "geometry", QRect(5, 205, 400, 90)); - state3->assignProperty(p1, "opacity", qreal(1)); - state3->assignProperty(p2, "opacity", qreal(1)); - state3->assignProperty(p3, "opacity", qreal(1)); - state3->assignProperty(p4, "opacity", qreal(1)); - state3->assignProperty(p5, "opacity", qreal(1)); - state3->assignProperty(p6, "opacity", qreal(1)); - - QAbstractTransition *t1 = state1->addTransition(button, &QAbstractButton::clicked, state2); - QSequentialAnimationGroup *animation1SubGroup = new QSequentialAnimationGroup; - animation1SubGroup->addPause(250); - animation1SubGroup->addAnimation(new QPropertyAnimation(box, "geometry")); - t1->addAnimation(animation1SubGroup); - t1->addAnimation(new QPropertyAnimation(widget, "geometry")); - t1->addAnimation(new QPropertyAnimation(p1, "pos")); - t1->addAnimation(new QPropertyAnimation(p2, "pos")); - t1->addAnimation(new QPropertyAnimation(p3, "pos")); - t1->addAnimation(new QPropertyAnimation(p4, "pos")); - t1->addAnimation(new QPropertyAnimation(p5, "pos")); - t1->addAnimation(new QPropertyAnimation(p6, "pos")); - t1->addAnimation(new QPropertyAnimation(p1, "rotation")); - t1->addAnimation(new QPropertyAnimation(p2, "rotation")); - t1->addAnimation(new QPropertyAnimation(p3, "rotation")); - t1->addAnimation(new QPropertyAnimation(p4, "rotation")); - t1->addAnimation(new QPropertyAnimation(p5, "rotation")); - t1->addAnimation(new QPropertyAnimation(p6, "rotation")); - t1->addAnimation(new QPropertyAnimation(p1, "opacity")); - t1->addAnimation(new QPropertyAnimation(p2, "opacity")); - t1->addAnimation(new QPropertyAnimation(p3, "opacity")); - t1->addAnimation(new QPropertyAnimation(p4, "opacity")); - t1->addAnimation(new QPropertyAnimation(p5, "opacity")); - t1->addAnimation(new QPropertyAnimation(p6, "opacity")); - - QAbstractTransition *t2 = state2->addTransition(button, &QAbstractButton::clicked, state3); - t2->addAnimation(new QPropertyAnimation(box, "geometry")); - t2->addAnimation(new QPropertyAnimation(widget, "geometry")); - t2->addAnimation(new QPropertyAnimation(p1, "pos")); - t2->addAnimation(new QPropertyAnimation(p2, "pos")); - t2->addAnimation(new QPropertyAnimation(p3, "pos")); - t2->addAnimation(new QPropertyAnimation(p4, "pos")); - t2->addAnimation(new QPropertyAnimation(p5, "pos")); - t2->addAnimation(new QPropertyAnimation(p6, "pos")); - t2->addAnimation(new QPropertyAnimation(p1, "rotation")); - t2->addAnimation(new QPropertyAnimation(p2, "rotation")); - t2->addAnimation(new QPropertyAnimation(p3, "rotation")); - t2->addAnimation(new QPropertyAnimation(p4, "rotation")); - t2->addAnimation(new QPropertyAnimation(p5, "rotation")); - t2->addAnimation(new QPropertyAnimation(p6, "rotation")); - t2->addAnimation(new QPropertyAnimation(p1, "opacity")); - t2->addAnimation(new QPropertyAnimation(p2, "opacity")); - t2->addAnimation(new QPropertyAnimation(p3, "opacity")); - t2->addAnimation(new QPropertyAnimation(p4, "opacity")); - t2->addAnimation(new QPropertyAnimation(p5, "opacity")); - t2->addAnimation(new QPropertyAnimation(p6, "opacity")); - - QAbstractTransition *t3 = state3->addTransition(button, &QAbstractButton::clicked, state1); - t3->addAnimation(new QPropertyAnimation(box, "geometry")); - t3->addAnimation(new QPropertyAnimation(widget, "geometry")); - t3->addAnimation(new QPropertyAnimation(p1, "pos")); - t3->addAnimation(new QPropertyAnimation(p2, "pos")); - t3->addAnimation(new QPropertyAnimation(p3, "pos")); - t3->addAnimation(new QPropertyAnimation(p4, "pos")); - t3->addAnimation(new QPropertyAnimation(p5, "pos")); - t3->addAnimation(new QPropertyAnimation(p6, "pos")); - t3->addAnimation(new QPropertyAnimation(p1, "rotation")); - t3->addAnimation(new QPropertyAnimation(p2, "rotation")); - t3->addAnimation(new QPropertyAnimation(p3, "rotation")); - t3->addAnimation(new QPropertyAnimation(p4, "rotation")); - t3->addAnimation(new QPropertyAnimation(p5, "rotation")); - t3->addAnimation(new QPropertyAnimation(p6, "rotation")); - t3->addAnimation(new QPropertyAnimation(p1, "opacity")); - t3->addAnimation(new QPropertyAnimation(p2, "opacity")); - t3->addAnimation(new QPropertyAnimation(p3, "opacity")); - t3->addAnimation(new QPropertyAnimation(p4, "opacity")); - t3->addAnimation(new QPropertyAnimation(p5, "opacity")); - t3->addAnimation(new QPropertyAnimation(p6, "opacity")); - - machine.start(); - - GraphicsView view(&scene); - - view.show(); - - return app.exec(); -} - -#include "main.moc" diff --git a/examples/widgets/animation/states/states.pro b/examples/widgets/animation/states/states.pro deleted file mode 100644 index 491d557a8d5..00000000000 --- a/examples/widgets/animation/states/states.pro +++ /dev/null @@ -1,8 +0,0 @@ -QT += widgets - -SOURCES += main.cpp -RESOURCES += states.qrc - -# install -target.path = $$[QT_INSTALL_EXAMPLES]/widgets/animation/states -INSTALLS += target diff --git a/examples/widgets/animation/states/states.qrc b/examples/widgets/animation/states/states.qrc deleted file mode 100644 index 60ab3f7a605..00000000000 --- a/examples/widgets/animation/states/states.qrc +++ /dev/null @@ -1,10 +0,0 @@ - - - accessories-dictionary.png - akregator.png - digikam.png - help-browser.png - k3b.png - kchart.png - - diff --git a/examples/widgets/animation/stickman/CMakeLists.txt b/examples/widgets/animation/stickman/CMakeLists.txt deleted file mode 100644 index 07f3d96ea07..00000000000 --- a/examples/widgets/animation/stickman/CMakeLists.txt +++ /dev/null @@ -1,57 +0,0 @@ -# Generated from stickman.pro. - -cmake_minimum_required(VERSION 3.14) -project(stickman LANGUAGES CXX) - -set(CMAKE_INCLUDE_CURRENT_DIR ON) - -set(CMAKE_AUTOMOC ON) -set(CMAKE_AUTORCC ON) -set(CMAKE_AUTOUIC ON) - -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/widgets/animation/stickman") - -find_package(Qt6 COMPONENTS Core) -find_package(Qt6 COMPONENTS Gui) -find_package(Qt6 COMPONENTS Widgets) - -add_qt_gui_executable(stickman - animation.cpp animation.h - graphicsview.cpp graphicsview.h - lifecycle.cpp lifecycle.h - main.cpp - node.cpp node.h - rectbutton.cpp rectbutton.h - stickman.cpp stickman.h -) -target_link_libraries(stickman PUBLIC - Qt::Core - Qt::Gui - Qt::Widgets -) - - -# Resources: -set(stickman_resource_files - "animations/chilling.bin" - "animations/dancing.bin" - "animations/dead.bin" - "animations/jumping.bin" -) - -qt6_add_resources(stickman "stickman" - PREFIX - "/" - FILES - ${stickman_resource_files} -) - -install(TARGETS stickman - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" -) diff --git a/examples/widgets/animation/stickman/animation.cpp b/examples/widgets/animation/stickman/animation.cpp deleted file mode 100644 index 77a1875be30..00000000000 --- a/examples/widgets/animation/stickman/animation.cpp +++ /dev/null @@ -1,193 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "animation.h" - -#include -#include - -class Frame -{ -public: - Frame() = default; - - int nodeCount() const - { - return m_nodePositions.size(); - } - - void setNodeCount(int nodeCount) - { - m_nodePositions.resize(nodeCount); - } - - QPointF nodePos(int idx) const - { - return m_nodePositions.at(idx); - } - - void setNodePos(int idx, const QPointF &pos) - { - m_nodePositions[idx] = pos; - } - -private: - QList m_nodePositions; -}; - -Animation::Animation() : m_currentFrame(0) -{ - m_frames.append(new Frame); -} - -Animation::~Animation() -{ - qDeleteAll(m_frames); -} - -void Animation::setTotalFrames(int totalFrames) -{ - while (m_frames.size() < totalFrames) - m_frames.append(new Frame); - - while (totalFrames < m_frames.size()) - delete m_frames.takeLast(); - - setCurrentFrame(m_currentFrame); -} - -int Animation::totalFrames() const -{ - return m_frames.size(); -} - -void Animation::setCurrentFrame(int currentFrame) -{ - m_currentFrame = qBound(0, currentFrame, totalFrames() - 1); -} - -int Animation::currentFrame() const -{ - return m_currentFrame; -} - -void Animation::setNodeCount(int nodeCount) -{ - Frame *frame = m_frames.at(m_currentFrame); - frame->setNodeCount(nodeCount); -} - -int Animation::nodeCount() const -{ - Frame *frame = m_frames.at(m_currentFrame); - return frame->nodeCount(); -} - -void Animation::setNodePos(int idx, const QPointF &pos) -{ - Frame *frame = m_frames.at(m_currentFrame); - frame->setNodePos(idx, pos); -} - -QPointF Animation::nodePos(int idx) const -{ - Frame *frame = m_frames.at(m_currentFrame); - return frame->nodePos(idx); -} - -QString Animation::name() const -{ - return m_name; -} - -void Animation::setName(const QString &name) -{ - m_name = name; -} - -void Animation::save(QIODevice *device) const -{ - QDataStream stream(device); - stream << m_name; - stream << m_frames.size(); - for (const Frame *frame : qAsConst(m_frames)) { - stream << frame->nodeCount(); - for (int i = 0; i < frame->nodeCount(); ++i) - stream << frame->nodePos(i); - } -} - -void Animation::load(QIODevice *device) -{ - qDeleteAll(m_frames); - m_frames.clear(); - - QDataStream stream(device); - stream >> m_name; - - int frameCount; - stream >> frameCount; - - for (int i = 0; i < frameCount; ++i) { - int nodeCount; - stream >> nodeCount; - - Frame *frame = new Frame; - frame->setNodeCount(nodeCount); - - for (int j = 0; j < nodeCount; ++j) { - QPointF pos; - stream >> pos; - frame->setNodePos(j, pos); - } - - m_frames.append(frame); - } -} diff --git a/examples/widgets/animation/stickman/animation.h b/examples/widgets/animation/stickman/animation.h deleted file mode 100644 index 93caff48a27..00000000000 --- a/examples/widgets/animation/stickman/animation.h +++ /dev/null @@ -1,92 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef ANIMATION_H -#define ANIMATION_H - -#include -#include -#include - -class Frame; -QT_BEGIN_NAMESPACE -class QIODevice; -QT_END_NAMESPACE -class Animation -{ -public: - Animation(); - ~Animation(); - - void setTotalFrames(int totalFrames); - int totalFrames() const; - - void setCurrentFrame(int currentFrame); - int currentFrame() const; - - void setNodeCount(int nodeCount); - int nodeCount() const; - - void setNodePos(int idx, const QPointF &pos); - QPointF nodePos(int idx) const; - - QString name() const; - void setName(const QString &name); - - void save(QIODevice *device) const; - void load(QIODevice *device); - -private: - QString m_name; - QList m_frames; - int m_currentFrame; -}; - -#endif diff --git a/examples/widgets/animation/stickman/animations/chilling.bin b/examples/widgets/animation/stickman/animations/chilling.bin deleted file mode 100644 index a81fc7a18c7b3646a43bad5cbde8aada0a33916f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6508 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 diff --git a/examples/widgets/animation/stickman/animations/dead.bin b/examples/widgets/animation/stickman/animations/dead.bin deleted file mode 100644 index 9859b4b4cd8ab93854588c06a25b5985f70fd0a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 268 zcmV+n0rUR<|Ns9000031000oca&^$WN`5;)Zm2qT%t}wdZp0Oh+lqleZIP8quaI%T zX-xi5YaYRmfP=%ksbaG}|9viMeaToFA_J4lBWG+`*<8N$0 za1>KsTWWg1U@gftCa=&ya`A+=@Yt@vQy?KNWLvX9azLP$zg3UGQ4P-z8%R7rYtaR$ zD&Jy2M0b1a1q2g7Zvp%pWocyM9`=}Oo-=ByX&|>YbT5 zxh=2(&WTip83Gn{fb2sAS7cQ&IyxST8z?U!x@dHc?mws|>rHOXckVg4_vU9do6RH= z$(Gm@V$UyBpk=c7B#TD>U%|>_&_e#^9IQNA?pbJ&NGOB(@onEK2df;zwF`YAE~u4% z`@VWUCSlluLawF%=0BDkta74F!A(a$ol%CrM3w3B@ez$PGX9`tx&;bQ-d=m7y8JN; zyeo&^y=X+C=$UlIx4ppI`Kn@>#ugKIaTmw@Qiraxj;20p1~95#&`ppIJn^=vdd(AX z@o5kCO=Y6!7-xAQb2HL34@bq4V<=&dHtZ5_1TJS?qyN}Bh+4hZwaGk!DYja*f%hjw z))WV)pRL98cb4h)nA^~ENo#ZSHVs75Ru8l4Qy?aw$3y$76hf3&R>`yl$Ql=yCD}Pc ziaWhfzbFPbH8*!9-}Qs+UopgS<{m^C*<}BKAy7=Ywd5#Bz>((8oGkHztd!uGX*5|F zTs}Mb0~uAnFLjM)xFTbuWVYr0UV_1GoigGe!Juf#iJqTPDE_L>Pm&8fi7;b(r3n)i zz4E-d1awuOagg0~1jeabj<*!kz)R@lJ?ZNO7tcHFduktoflW?k6$5Dp2ljQkXA%rP zzy3i_9&p24N-1&v1Ori1YRv|ML0Bz`>`X8y{YUkQC#I8)j&e7Qy^<1{ma+73j~9yh6A;)2?le0tK=SRaGuLd=fHT-u<5WvhqJ&R%6dLa-i_>z zjcb&D?*P@MiI1g?+cA{4#d#(x4st5vwF2dPz%3~kG5KpDrN4RK^Fv1=RM(jhy{;T` z)=cD6B%S{;0LE1(c~S9J+`Vb)zF{XFmM0(TS!w7(#cHO$LMTVRoKoGLr^lqAh`yHx z1Q0FKg%md$P+ZjNPaaIe@c0XrpP9Wl&$17fPLEfBFSWgaFWd)ivZDh#c!+UmJl#3E z8B@F~VfvICCY;V4rt=M$HsoSFDZT)rL8e-tsm9PN^x3UBzd>@4!-JnzT?dx5;L%v* zVvIVIclrFKC%~So+u&H156oCB)5?8j}hw#lhbXe05yXsQ+FEs@~*tv2$6L&jgyVy97(e3{Qj>P!L diff --git a/examples/widgets/animation/stickman/graphicsview.cpp b/examples/widgets/animation/stickman/graphicsview.cpp deleted file mode 100644 index 0f5800cff3a..00000000000 --- a/examples/widgets/animation/stickman/graphicsview.cpp +++ /dev/null @@ -1,68 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "graphicsview.h" -#include "stickman.h" - -#include -#include - -void GraphicsView::keyPressEvent(QKeyEvent *e) -{ - if (e->key() == Qt::Key_Escape) - close(); - emit keyPressed(Qt::Key(e->key())); -} - -void GraphicsView::resizeEvent(QResizeEvent *e) -{ - fitInView(scene()->sceneRect()); - QGraphicsView::resizeEvent(e); -} diff --git a/examples/widgets/animation/stickman/graphicsview.h b/examples/widgets/animation/stickman/graphicsview.h deleted file mode 100644 index 29f4c6237e8..00000000000 --- a/examples/widgets/animation/stickman/graphicsview.h +++ /dev/null @@ -1,70 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef GRAPHICSVIEW_H -#define GRAPHICSVIEW_H - -#include - -class GraphicsView: public QGraphicsView -{ - Q_OBJECT -public: - using QGraphicsView::QGraphicsView; - -protected: - void resizeEvent(QResizeEvent *e) override; - void keyPressEvent(QKeyEvent *e) override; - -signals: - void keyPressed(int key); -}; - -#endif diff --git a/examples/widgets/animation/stickman/lifecycle.cpp b/examples/widgets/animation/stickman/lifecycle.cpp deleted file mode 100644 index 5ad284c590e..00000000000 --- a/examples/widgets/animation/stickman/lifecycle.cpp +++ /dev/null @@ -1,234 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "lifecycle.h" -#include "stickman.h" -#include "node.h" -#include "animation.h" -#include "graphicsview.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -class KeyPressTransition: public QSignalTransition -{ -public: - KeyPressTransition(GraphicsView *receiver, Qt::Key key) - : QSignalTransition(receiver, &GraphicsView::keyPressed), m_key(key) - { - } - KeyPressTransition(GraphicsView *receiver, Qt::Key key, QAbstractState *target) - : QSignalTransition(receiver, &GraphicsView::keyPressed), m_key(key) - { - setTargetState(target); - } - - bool eventTest(QEvent *e) override - { - if (QSignalTransition::eventTest(e)) { - QVariant key = static_cast(e)->arguments().at(0); - return (key.toInt() == int(m_key)); - } - - return false; - } -private: - Qt::Key m_key; -}; - -//! [4] -class LightningStrikesTransition: public QEventTransition -{ -public: - LightningStrikesTransition(QAbstractState *target) - : QEventTransition(this, QEvent::Timer) - { - setTargetState(target); - startTimer(1000); - } - - bool eventTest(QEvent *e) override - { - return QEventTransition::eventTest(e) && QRandomGenerator::global()->bounded(50) == 0; - } -}; -//! [4] - -LifeCycle::LifeCycle(StickMan *stickMan, GraphicsView *keyReceiver) - : m_stickMan(stickMan), m_keyReceiver(keyReceiver) -{ - // Create animation group to be used for all transitions - m_animationGroup = new QParallelAnimationGroup(); - const int stickManNodeCount = m_stickMan->nodeCount(); - for (int i = 0; i < stickManNodeCount; ++i) { - QPropertyAnimation *pa = new QPropertyAnimation(m_stickMan->node(i), "pos"); - m_animationGroup->addAnimation(pa); - } - - // Set up initial state graph -//! [3] - m_machine = new QStateMachine(); - m_machine->addDefaultAnimation(m_animationGroup); -//! [3] - - m_alive = new QState(m_machine); - m_alive->setObjectName("alive"); - - // Make it blink when lightning strikes before entering dead animation - QState *lightningBlink = new QState(m_machine); - lightningBlink->assignProperty(m_stickMan->scene(), "backgroundBrush", QColor(Qt::white)); - lightningBlink->assignProperty(m_stickMan, "penColor", QColor(Qt::black)); - lightningBlink->assignProperty(m_stickMan, "fillColor", QColor(Qt::white)); - lightningBlink->assignProperty(m_stickMan, "isDead", true); - -//! [5] - QTimer *timer = new QTimer(lightningBlink); - timer->setSingleShot(true); - timer->setInterval(100); - QObject::connect(lightningBlink, &QAbstractState::entered, - timer, QOverload<>::of(&QTimer::start)); - QObject::connect(lightningBlink, &QAbstractState::exited, - timer, &QTimer::stop); -//! [5] - - m_dead = new QState(m_machine); - m_dead->assignProperty(m_stickMan->scene(), "backgroundBrush", QColor(Qt::black)); - m_dead->assignProperty(m_stickMan, "penColor", QColor(Qt::white)); - m_dead->assignProperty(m_stickMan, "fillColor", QColor(Qt::black)); - m_dead->setObjectName("dead"); - - // Idle state (sets no properties) - m_idle = new QState(m_alive); - m_idle->setObjectName("idle"); - - m_alive->setInitialState(m_idle); - - // Lightning strikes at random - m_alive->addTransition(new LightningStrikesTransition(lightningBlink)); -//! [0] - lightningBlink->addTransition(timer, &QTimer::timeout, m_dead); -//! [0] - - m_machine->setInitialState(m_alive); -} - -void LifeCycle::setDeathAnimation(const QString &fileName) -{ - QState *deathAnimation = makeState(m_dead, fileName); - m_dead->setInitialState(deathAnimation); -} - -void LifeCycle::start() -{ - m_machine->start(); -} - -void LifeCycle::addActivity(const QString &fileName, Qt::Key key, QObject *sender, const char *signal) -{ - QState *state = makeState(m_alive, fileName); - m_alive->addTransition(new KeyPressTransition(m_keyReceiver, key, state)); - - if (sender && signal) - m_alive->addTransition(sender, signal, state); -} - -QState *LifeCycle::makeState(QState *parentState, const QString &animationFileName) -{ - QState *topLevel = new QState(parentState); - - Animation animation; - { - QFile file(animationFileName); - if (file.open(QIODevice::ReadOnly)) - animation.load(&file); - } - - const int frameCount = animation.totalFrames(); - QState *previousState = nullptr; - for (int i = 0; i < frameCount; ++i) { - animation.setCurrentFrame(i); - -//! [1] - QState *frameState = new QState(topLevel); - const int nodeCount = animation.nodeCount(); - for (int j = 0; j < nodeCount; ++j) - frameState->assignProperty(m_stickMan->node(j), "pos", animation.nodePos(j)); -//! [1] - - frameState->setObjectName(QString::fromLatin1("frame %0").arg(i)); - if (previousState == nullptr) - topLevel->setInitialState(frameState); - else -//! [2] - previousState->addTransition(previousState, &QState::propertiesAssigned, frameState); -//! [2] - - previousState = frameState; - } - - // Loop - previousState->addTransition(previousState, &QState::propertiesAssigned, topLevel->initialState()); - - return topLevel; - -} - -LifeCycle::~LifeCycle() -{ - delete m_machine; - delete m_animationGroup; -} diff --git a/examples/widgets/animation/stickman/lifecycle.h b/examples/widgets/animation/stickman/lifecycle.h deleted file mode 100644 index 21ab99276d8..00000000000 --- a/examples/widgets/animation/stickman/lifecycle.h +++ /dev/null @@ -1,91 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef LIFECYCLE_H -#define LIFECYCLE_H - -#include - -QT_BEGIN_NAMESPACE -class QAbstractState; -class QAbstractTransition; -class QAnimationGroup; -class QObject; -class QState; -class QStateMachine; -QT_END_NAMESPACE -class GraphicsView; -class StickMan; -class LifeCycle -{ -public: - LifeCycle(StickMan *stickMan, GraphicsView *keyEventReceiver); - ~LifeCycle(); - - void setDeathAnimation(const QString &fileName); - void addActivity(const QString &fileName, Qt::Key key, - QObject *sender = nullptr, const char *signal = nullptr); - - void start(); - -private: - QState *makeState(QState *parentState, const QString &animationFileName); - - StickMan *m_stickMan; - QStateMachine *m_machine; - QAnimationGroup *m_animationGroup; - GraphicsView *m_keyReceiver; - - QState *m_alive; - QState *m_dead; - QState *m_idle; -}; - -#endif diff --git a/examples/widgets/animation/stickman/main.cpp b/examples/widgets/animation/stickman/main.cpp deleted file mode 100644 index 5142c4fee98..00000000000 --- a/examples/widgets/animation/stickman/main.cpp +++ /dev/null @@ -1,116 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "animation.h" -#include "node.h" -#include "lifecycle.h" -#include "stickman.h" -#include "graphicsview.h" -#include "rectbutton.h" - -#include -#include - -int main(int argc, char **argv) -{ - Q_INIT_RESOURCE(stickman); - QApplication app(argc, argv); - - StickMan *stickMan = new StickMan; - stickMan->setDrawSticks(false); - - QGraphicsTextItem *textItem = new QGraphicsTextItem(); - textItem->setHtml("Stickman" - "

" - "Tell the stickman what to do!" - "

" - "

" - "

  • Press J to make the stickman jump.
  • " - "
  • Press D to make the stickman dance.
  • " - "
  • Press C to make him chill out.
  • " - "
  • When you are done, press Escape.
  • " - "

    " - "

    If he is unlucky, the stickman will get struck by lightning, and never jump, dance or chill out again." - "

    "); - qreal w = textItem->boundingRect().width(); - QRectF stickManBoundingRect = stickMan->mapToScene(stickMan->boundingRect()).boundingRect(); - textItem->setPos(-w / 2.0, stickManBoundingRect.bottom() + 25.0); - - QGraphicsScene scene; - scene.addItem(stickMan); - - scene.addItem(textItem); - scene.setBackgroundBrush(Qt::black); - - GraphicsView view; - view.setRenderHints(QPainter::Antialiasing); - view.setTransformationAnchor(QGraphicsView::NoAnchor); - view.setScene(&scene); - - QRectF sceneRect = scene.sceneRect(); - // making enough room in the scene for stickman to jump and die - view.resize(sceneRect.width() + 100, sceneRect.height() + 100); - view.setSceneRect(sceneRect); - - view.show(); - view.setFocus(); - - LifeCycle cycle(stickMan, &view); - cycle.setDeathAnimation(":/animations/dead.bin"); - - cycle.addActivity(":/animations/jumping.bin", Qt::Key_J); - cycle.addActivity(":/animations/dancing.bin", Qt::Key_D); - cycle.addActivity(":/animations/chilling.bin", Qt::Key_C); - - cycle.start(); - - - return app.exec(); -} diff --git a/examples/widgets/animation/stickman/node.cpp b/examples/widgets/animation/stickman/node.cpp deleted file mode 100644 index 43a9c93de87..00000000000 --- a/examples/widgets/animation/stickman/node.cpp +++ /dev/null @@ -1,102 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "node.h" -#include "stickman.h" - -#include -#include -#include - -Node::Node(const QPointF &pos, QGraphicsItem *parent) - : QGraphicsObject(parent), m_dragging(false) -{ - setPos(pos); - setFlag(QGraphicsItem::ItemSendsGeometryChanges); -} - -Node::~Node() -{ -} - -QRectF Node::boundingRect() const -{ - return QRectF(-6.0, -6.0, 12.0, 12.0); -} - -void Node::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) -{ - painter->setPen(Qt::white); - painter->drawEllipse(QPointF(0.0, 0.0), 5.0, 5.0); -} - -QVariant Node::itemChange(GraphicsItemChange change, const QVariant &value) -{ - if (change == QGraphicsItem::ItemPositionChange) - emit positionChanged(); - - return QGraphicsObject::itemChange(change, value); -} - -void Node::mousePressEvent(QGraphicsSceneMouseEvent *) -{ - m_dragging = true; -} - -void Node::mouseMoveEvent(QGraphicsSceneMouseEvent *event) -{ - if (m_dragging) - setPos(mapToParent(event->pos())); -} - -void Node::mouseReleaseEvent(QGraphicsSceneMouseEvent *) -{ - m_dragging = false; -} diff --git a/examples/widgets/animation/stickman/node.h b/examples/widgets/animation/stickman/node.h deleted file mode 100644 index 2b393c60c10..00000000000 --- a/examples/widgets/animation/stickman/node.h +++ /dev/null @@ -1,80 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef NODE_H -#define NODE_H - -#include - -class Node: public QGraphicsObject -{ - Q_OBJECT -public: - explicit Node(const QPointF &pos, QGraphicsItem *parent = nullptr); - ~Node(); - - QRectF boundingRect() const override; - void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; - -signals: - void positionChanged(); - -protected: - QVariant itemChange(GraphicsItemChange change, const QVariant &value) override; - - void mousePressEvent(QGraphicsSceneMouseEvent *) override; - void mouseMoveEvent(QGraphicsSceneMouseEvent *) override; - void mouseReleaseEvent(QGraphicsSceneMouseEvent *) override; - -private: - bool m_dragging; -}; - -#endif diff --git a/examples/widgets/animation/stickman/rectbutton.cpp b/examples/widgets/animation/stickman/rectbutton.cpp deleted file mode 100644 index 5174d0aeaf7..00000000000 --- a/examples/widgets/animation/stickman/rectbutton.cpp +++ /dev/null @@ -1,78 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "rectbutton.h" -#include - -RectButton::RectButton(const QString &buttonText) : m_ButtonText(buttonText) -{ -} - - -void RectButton::mousePressEvent (QGraphicsSceneMouseEvent *) -{ - emit clicked(); -} - - -QRectF RectButton::boundingRect() const -{ - return QRectF(0.0, 0.0, 90.0, 40.0); -} - - -void RectButton::paint(QPainter *painter, const QStyleOptionGraphicsItem * /* option */, QWidget * /* widget */) -{ - painter->setBrush(Qt::gray); - painter->drawRoundedRect(boundingRect(), 5, 5); - - painter->setPen(Qt::white); - painter->drawText(20, 25, m_ButtonText); -} diff --git a/examples/widgets/animation/stickman/rectbutton.h b/examples/widgets/animation/stickman/rectbutton.h deleted file mode 100644 index ee6cd3f5309..00000000000 --- a/examples/widgets/animation/stickman/rectbutton.h +++ /dev/null @@ -1,75 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef RECTBUTTON_H -#define RECTBUTTON_H - -#include - -class RectButton : public QGraphicsObject -{ - Q_OBJECT -public: - RectButton(const QString &buttonText); - - QRectF boundingRect() const override; - void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; - -protected: - void mousePressEvent (QGraphicsSceneMouseEvent *event) override; - -signals: - void clicked(); - -private: - QString m_ButtonText; -}; - -#endif // RECTBUTTON_H diff --git a/examples/widgets/animation/stickman/stickman.cpp b/examples/widgets/animation/stickman/stickman.cpp deleted file mode 100644 index 3f373b6b52f..00000000000 --- a/examples/widgets/animation/stickman/stickman.cpp +++ /dev/null @@ -1,329 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "stickman.h" -#include "node.h" - -#include -#include - -static constexpr qreal Coords[NodeCount * 2] = { - 0.0, -150.0, // head, #0 - - 0.0, -100.0, // body pentagon, top->bottom, left->right, #1 - 5 - -50.0, -50.0, - 50.0, -50.0, - -25.0, 50.0, - 25.0, 50.0, - - -100.0, 0.0, // right arm, #6 - 7 - -125.0, 50.0, - - 100.0, 0.0, // left arm, #8 - 9 - 125.0, 50.0, - - -35.0, 75.0, // lower body, #10 - 11 - 35.0, 75.0, - - -25.0, 200.0, // right leg, #12 - 13 - -30.0, 300.0, - - 25.0, 200.0, // left leg, #14 - 15 - 30.0, 300.0 - -}; - -static constexpr int Bones[BoneCount * 2] = { - 0, 1, // neck - - 1, 2, // body - 1, 3, - 1, 4, - 1, 5, - 2, 3, - 2, 4, - 2, 5, - 3, 4, - 3, 5, - 4, 5, - - 2, 6, // right arm - 6, 7, - - 3, 8, // left arm - 8, 9, - - 4, 10, // lower body - 4, 11, - 5, 10, - 5, 11, - 10, 11, - - 10, 12, // right leg - 12, 13, - - 11, 14, // left leg - 14, 15 - -}; - -StickMan::StickMan() -{ - // Set up start position of limbs - for (int i = 0; i < NodeCount; ++i) { - m_nodes[i] = new Node(QPointF(Coords[i * 2], Coords[i * 2 + 1]), this); - connect(m_nodes[i], &Node::positionChanged, this, &StickMan::childPositionChanged); - } - - for (int i = 0; i < BoneCount; ++i) { - int n1 = Bones[i * 2]; - int n2 = Bones[i * 2 + 1]; - - Node *node1 = m_nodes[n1]; - Node *node2 = m_nodes[n2]; - - QPointF dist = node1->pos() - node2->pos(); - m_perfectBoneLengths[i] = sqrt(pow(dist.x(), 2) + pow(dist.y(), 2)); - } - - startTimer(10); -} - -void StickMan::childPositionChanged() -{ - prepareGeometryChange(); -} - -void StickMan::setDrawSticks(bool on) -{ - m_sticks = on; - for (int i = 0; i < nodeCount(); ++i) { - Node *node = m_nodes[i]; - node->setVisible(on); - } -} - -QRectF StickMan::boundingRect() const -{ - // account for head radius=50.0 plus pen which is 5.0 - return childrenBoundingRect().adjusted(-55.0, -55.0, 55.0, 55.0); -} - -int StickMan::nodeCount() const -{ - return NodeCount; -} - -Node *StickMan::node(int idx) const -{ - if (idx >= 0 && idx < NodeCount) - return m_nodes[idx]; - return nullptr; -} - -void StickMan::timerEvent(QTimerEvent *) -{ - update(); -} - -void StickMan::stabilize() -{ - static const qreal threshold = 0.001; - - for (int i = 0; i < BoneCount; ++i) { - int n1 = Bones[i * 2]; - int n2 = Bones[i * 2 + 1]; - - Node *node1 = m_nodes[n1]; - Node *node2 = m_nodes[n2]; - - QPointF pos1 = node1->pos(); - QPointF pos2 = node2->pos(); - - QPointF dist = pos1 - pos2; - qreal length = sqrt(pow(dist.x(),2) + pow(dist.y(),2)); - qreal diff = (length - m_perfectBoneLengths[i]) / length; - - QPointF p = dist * (0.5 * diff); - if (p.x() > threshold && p.y() > threshold) { - pos1 -= p; - pos2 += p; - - node1->setPos(pos1); - node2->setPos(pos2); - } - } -} - -QPointF StickMan::posFor(int idx) const -{ - return m_nodes[idx]->pos(); -} - -//#include -void StickMan::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) -{ - /* static int frames = 0; - static QTime time; - if (frames++ % 100 == 0) { - frames = 1; - time.restart(); - } - - if (time.elapsed() > 0) { - painter->setPen(Qt::white); - painter->drawText(0, 0, QString::number(frames / (time.elapsed() / 1000.0))); - }*/ - - stabilize(); - if (m_sticks) { - painter->setPen(Qt::white); - for (int i = 0; i < BoneCount; ++i) { - int n1 = Bones[i * 2]; - int n2 = Bones[i * 2 + 1]; - - Node *node1 = m_nodes[n1]; - Node *node2 = m_nodes[n2]; - - painter->drawLine(node1->pos(), node2->pos()); - } - } else { - // first bone is neck and will be used for head - - QPainterPath path; - path.moveTo(posFor(0)); - path.lineTo(posFor(1)); - - // right arm - path.lineTo(posFor(2)); - path.lineTo(posFor(6)); - path.lineTo(posFor(7)); - - // left arm - path.moveTo(posFor(3)); - path.lineTo(posFor(8)); - path.lineTo(posFor(9)); - - // body - path.moveTo(posFor(2)); - path.lineTo(posFor(4)); - path.lineTo(posFor(10)); - path.lineTo(posFor(11)); - path.lineTo(posFor(5)); - path.lineTo(posFor(3)); - path.lineTo(posFor(1)); - - // right leg - path.moveTo(posFor(10)); - path.lineTo(posFor(12)); - path.lineTo(posFor(13)); - - // left leg - path.moveTo(posFor(11)); - path.lineTo(posFor(14)); - path.lineTo(posFor(15)); - - painter->setPen(QPen(m_penColor, 5.0, Qt::SolidLine, Qt::RoundCap)); - painter->drawPath(path); - - { - int n1 = Bones[0]; - int n2 = Bones[1]; - Node *node1 = m_nodes[n1]; - Node *node2 = m_nodes[n2]; - - QPointF dist = node2->pos() - node1->pos(); - - qreal sinAngle = dist.x() / sqrt(pow(dist.x(), 2) + pow(dist.y(), 2)); - qreal angle = qRadiansToDegrees(asin(sinAngle)); - - QPointF headPos = node1->pos(); - painter->translate(headPos); - painter->rotate(-angle); - - painter->setBrush(m_fillColor); - painter->drawEllipse(QPointF(0,0), 50.0, 50.0); - - painter->setBrush(m_penColor); - painter->setPen(QPen(m_penColor, 2.5, Qt::SolidLine, Qt::RoundCap)); - - // eyes - if (m_isDead) { - painter->drawLine(-30.0, -30.0, -20.0, -20.0); - painter->drawLine(-20.0, -30.0, -30.0, -20.0); - - painter->drawLine(20.0, -30.0, 30.0, -20.0); - painter->drawLine(30.0, -30.0, 20.0, -20.0); - } else { - painter->drawChord(QRectF(-30.0, -30.0, 25.0, 70.0), 30.0*16, 120.0*16); - painter->drawChord(QRectF(5.0, -30.0, 25.0, 70.0), 30.0*16, 120.0*16); - } - - // mouth - if (m_isDead) { - painter->drawLine(-28.0, 2.0, 29.0, 2.0); - } else { - painter->setBrush(QColor(128, 0, 64 )); - painter->drawChord(QRectF(-28.0, 2.0-55.0/2.0, 57.0, 55.0), 0.0, -180.0*16); - } - - // pupils - if (!m_isDead) { - painter->setPen(QPen(m_fillColor, 1.0, Qt::SolidLine, Qt::RoundCap)); - painter->setBrush(m_fillColor); - painter->drawEllipse(QPointF(-12.0, -25.0), 5.0, 5.0); - painter->drawEllipse(QPointF(22.0, -25.0), 5.0, 5.0); - } - } - } -} - - - diff --git a/examples/widgets/animation/stickman/stickman.h b/examples/widgets/animation/stickman/stickman.h deleted file mode 100644 index 63c02abc8ff..00000000000 --- a/examples/widgets/animation/stickman/stickman.h +++ /dev/null @@ -1,108 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef STICKMAN_H -#define STICKMAN_H - -#include - -static const int NodeCount = 16; -static const int BoneCount = 24; - -class Node; -class StickMan: public QGraphicsObject -{ - Q_OBJECT - Q_PROPERTY(QColor penColor WRITE setPenColor READ penColor) - Q_PROPERTY(QColor fillColor WRITE setFillColor READ fillColor) - Q_PROPERTY(bool isDead WRITE setIsDead READ isDead) -public: - StickMan(); - - QRectF boundingRect() const override; - void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; - - int nodeCount() const; - Node *node(int idx) const; - - void setDrawSticks(bool on); - bool drawSticks() const { return m_sticks; } - - QColor penColor() const { return m_penColor; } - void setPenColor(const QColor &color) { m_penColor = color; } - - QColor fillColor() const { return m_fillColor; } - void setFillColor(const QColor &color) { m_fillColor = color; } - - bool isDead() const { return m_isDead; } - void setIsDead(bool isDead) { m_isDead = isDead; } - -public slots: - void stabilize(); - void childPositionChanged(); - -protected: - void timerEvent(QTimerEvent *e) override; - -private: - - QPointF posFor(int idx) const; - - Node *m_nodes[NodeCount]; - qreal m_perfectBoneLengths[BoneCount]; - - bool m_sticks = true; - bool m_isDead = false; - - QColor m_penColor = Qt::white; - QColor m_fillColor = Qt::black; -}; - -#endif // STICKMAN_H diff --git a/examples/widgets/animation/stickman/stickman.pro b/examples/widgets/animation/stickman/stickman.pro deleted file mode 100644 index a803acf6240..00000000000 --- a/examples/widgets/animation/stickman/stickman.pro +++ /dev/null @@ -1,21 +0,0 @@ -QT += widgets - -HEADERS += stickman.h \ - animation.h \ - node.h \ - lifecycle.h \ - graphicsview.h \ - rectbutton.h -SOURCES += main.cpp \ - stickman.cpp \ - animation.cpp \ - node.cpp \ - lifecycle.cpp \ - graphicsview.cpp \ - rectbutton.cpp - -RESOURCES += stickman.qrc - -# install -target.path = $$[QT_INSTALL_EXAMPLES]/widgets/animation/stickman -INSTALLS += target diff --git a/examples/widgets/animation/stickman/stickman.qrc b/examples/widgets/animation/stickman/stickman.qrc deleted file mode 100644 index 4cf3ba3828f..00000000000 --- a/examples/widgets/animation/stickman/stickman.qrc +++ /dev/null @@ -1,8 +0,0 @@ - - - animations/chilling.bin - animations/dancing.bin - animations/dead.bin - animations/jumping.bin - - diff --git a/examples/widgets/animation/sub-attaq/.prev_CMakeLists.txt b/examples/widgets/animation/sub-attaq/.prev_CMakeLists.txt deleted file mode 100644 index 4967673c692..00000000000 --- a/examples/widgets/animation/sub-attaq/.prev_CMakeLists.txt +++ /dev/null @@ -1,196 +0,0 @@ -# Generated from sub-attaq.pro. - -cmake_minimum_required(VERSION 3.14) -project(sub-attaq LANGUAGES CXX) - -set(CMAKE_INCLUDE_CURRENT_DIR ON) - -set(CMAKE_AUTOMOC ON) -set(CMAKE_AUTORCC ON) -set(CMAKE_AUTOUIC ON) - -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/widgets/animation/sub-attaq") - -find_package(Qt6 COMPONENTS Core) -find_package(Qt6 COMPONENTS Gui) -find_package(Qt6 COMPONENTS Widgets) - -add_qt_gui_executable(sub-attaq - animationmanager.cpp animationmanager.h - boat.cpp boat.h boat_p.h - bomb.cpp bomb.h - graphicsscene.cpp graphicsscene.h - main.cpp - mainwindow.cpp mainwindow.h - pixmapitem.cpp pixmapitem.h - progressitem.cpp progressitem.h - qanimationstate.cpp qanimationstate.h - states.cpp states.h - submarine.cpp submarine.h submarine_p.h - textinformationitem.cpp textinformationitem.h - torpedo.cpp torpedo.h -) -target_link_libraries(sub-attaq PUBLIC - Qt::Core - Qt::Gui - Qt::Widgets -) - - -# Resources: -set_source_files_properties("pics/big/background.png" - PROPERTIES QT_RESOURCE_ALIAS "big/background" -) -set_source_files_properties("pics/big/boat.png" - PROPERTIES QT_RESOURCE_ALIAS "big/boat" -) -set_source_files_properties("pics/big/bomb.png" - PROPERTIES QT_RESOURCE_ALIAS "big/bomb" -) -set_source_files_properties("pics/big/explosion/boat/step1.png" - PROPERTIES QT_RESOURCE_ALIAS "big/explosion/boat/step1" -) -set_source_files_properties("pics/big/explosion/boat/step2.png" - PROPERTIES QT_RESOURCE_ALIAS "big/explosion/boat/step2" -) -set_source_files_properties("pics/big/explosion/boat/step3.png" - PROPERTIES QT_RESOURCE_ALIAS "big/explosion/boat/step3" -) -set_source_files_properties("pics/big/explosion/boat/step4.png" - PROPERTIES QT_RESOURCE_ALIAS "big/explosion/boat/step4" -) -set_source_files_properties("pics/big/explosion/submarine/step1.png" - PROPERTIES QT_RESOURCE_ALIAS "big/explosion/submarine/step1" -) -set_source_files_properties("pics/big/explosion/submarine/step2.png" - PROPERTIES QT_RESOURCE_ALIAS "big/explosion/submarine/step2" -) -set_source_files_properties("pics/big/explosion/submarine/step3.png" - PROPERTIES QT_RESOURCE_ALIAS "big/explosion/submarine/step3" -) -set_source_files_properties("pics/big/explosion/submarine/step4.png" - PROPERTIES QT_RESOURCE_ALIAS "big/explosion/submarine/step4" -) -set_source_files_properties("pics/big/submarine.png" - PROPERTIES QT_RESOURCE_ALIAS "big/submarine" -) -set_source_files_properties("pics/big/surface.png" - PROPERTIES QT_RESOURCE_ALIAS "big/surface" -) -set_source_files_properties("pics/big/torpedo.png" - PROPERTIES QT_RESOURCE_ALIAS "big/torpedo" -) -set_source_files_properties("pics/scalable/boat.svg" - PROPERTIES QT_RESOURCE_ALIAS "boat" -) -set_source_files_properties("pics/scalable/sub-attaq.svg" - PROPERTIES QT_RESOURCE_ALIAS "all" -) -set_source_files_properties("pics/scalable/submarine.svg" - PROPERTIES QT_RESOURCE_ALIAS "submarine" -) -set_source_files_properties("pics/scalable/torpedo.svg" - PROPERTIES QT_RESOURCE_ALIAS "torpedo" -) -set_source_files_properties("pics/small/background.png" - PROPERTIES QT_RESOURCE_ALIAS "small/background" -) -set_source_files_properties("pics/small/boat.png" - PROPERTIES QT_RESOURCE_ALIAS "small/boat" -) -set_source_files_properties("pics/small/bomb.png" - PROPERTIES QT_RESOURCE_ALIAS "small/bomb" -) -set_source_files_properties("pics/small/submarine.png" - PROPERTIES QT_RESOURCE_ALIAS "small/submarine" -) -set_source_files_properties("pics/small/surface.png" - PROPERTIES QT_RESOURCE_ALIAS "small/surface" -) -set_source_files_properties("pics/small/torpedo.png" - PROPERTIES QT_RESOURCE_ALIAS "small/torpedo" -) -set_source_files_properties("pics/welcome/logo-a.png" - PROPERTIES QT_RESOURCE_ALIAS "logo-a" -) -set_source_files_properties("pics/welcome/logo-a2.png" - PROPERTIES QT_RESOURCE_ALIAS "logo-a2" -) -set_source_files_properties("pics/welcome/logo-b.png" - PROPERTIES QT_RESOURCE_ALIAS "logo-b" -) -set_source_files_properties("pics/welcome/logo-dash.png" - PROPERTIES QT_RESOURCE_ALIAS "logo-dash" -) -set_source_files_properties("pics/welcome/logo-excl.png" - PROPERTIES QT_RESOURCE_ALIAS "logo-excl" -) -set_source_files_properties("pics/welcome/logo-q.png" - PROPERTIES QT_RESOURCE_ALIAS "logo-q" -) -set_source_files_properties("pics/welcome/logo-s.png" - PROPERTIES QT_RESOURCE_ALIAS "logo-s" -) -set_source_files_properties("pics/welcome/logo-t.png" - PROPERTIES QT_RESOURCE_ALIAS "logo-t" -) -set_source_files_properties("pics/welcome/logo-t2.png" - PROPERTIES QT_RESOURCE_ALIAS "logo-t2" -) -set_source_files_properties("pics/welcome/logo-u.png" - PROPERTIES QT_RESOURCE_ALIAS "logo-u" -) -set(subattaq_resource_files - "data.xml" - "pics/big/background.png" - "pics/big/boat.png" - "pics/big/bomb.png" - "pics/big/explosion/boat/step1.png" - "pics/big/explosion/boat/step2.png" - "pics/big/explosion/boat/step3.png" - "pics/big/explosion/boat/step4.png" - "pics/big/explosion/submarine/step1.png" - "pics/big/explosion/submarine/step2.png" - "pics/big/explosion/submarine/step3.png" - "pics/big/explosion/submarine/step4.png" - "pics/big/submarine.png" - "pics/big/surface.png" - "pics/big/torpedo.png" - "pics/scalable/boat.svg" - "pics/scalable/sub-attaq.svg" - "pics/scalable/submarine.svg" - "pics/scalable/torpedo.svg" - "pics/small/background.png" - "pics/small/boat.png" - "pics/small/bomb.png" - "pics/small/submarine.png" - "pics/small/surface.png" - "pics/small/torpedo.png" - "pics/welcome/logo-a.png" - "pics/welcome/logo-a2.png" - "pics/welcome/logo-b.png" - "pics/welcome/logo-dash.png" - "pics/welcome/logo-excl.png" - "pics/welcome/logo-q.png" - "pics/welcome/logo-s.png" - "pics/welcome/logo-t.png" - "pics/welcome/logo-t2.png" - "pics/welcome/logo-u.png" -) - -qt6_add_resources(sub-attaq "subattaq" - PREFIX - "/" - FILES - ${subattaq_resource_files} -) - -install(TARGETS sub-attaq - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" -) diff --git a/examples/widgets/animation/sub-attaq/CMakeLists.txt b/examples/widgets/animation/sub-attaq/CMakeLists.txt deleted file mode 100644 index a2249ea03b8..00000000000 --- a/examples/widgets/animation/sub-attaq/CMakeLists.txt +++ /dev/null @@ -1,197 +0,0 @@ -# Generated from sub-attaq.pro. - -cmake_minimum_required(VERSION 3.14) -project(sub-attaq LANGUAGES CXX) - -set(CMAKE_INCLUDE_CURRENT_DIR ON) - -set(CMAKE_AUTOMOC ON) -set(CMAKE_AUTORCC ON) -set(CMAKE_AUTOUIC ON) - -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/widgets/animation/sub-attaq") - -find_package(Qt6 COMPONENTS Core) -find_package(Qt6 COMPONENTS Gui) -find_package(Qt6 COMPONENTS Widgets) -find_package(Qt6 COMPONENTS OpenGL) # special case - -add_qt_gui_executable(sub-attaq - animationmanager.cpp animationmanager.h - boat.cpp boat.h boat_p.h - bomb.cpp bomb.h - graphicsscene.cpp graphicsscene.h - main.cpp - mainwindow.cpp mainwindow.h - pixmapitem.cpp pixmapitem.h - progressitem.cpp progressitem.h - qanimationstate.cpp qanimationstate.h - states.cpp states.h - submarine.cpp submarine.h submarine_p.h - textinformationitem.cpp textinformationitem.h - torpedo.cpp torpedo.h -) -target_link_libraries(sub-attaq PUBLIC - Qt::Core - Qt::Gui - Qt::Widgets -) - - -# Resources: -set_source_files_properties("pics/big/background.png" - PROPERTIES QT_RESOURCE_ALIAS "big/background" -) -set_source_files_properties("pics/big/boat.png" - PROPERTIES QT_RESOURCE_ALIAS "big/boat" -) -set_source_files_properties("pics/big/bomb.png" - PROPERTIES QT_RESOURCE_ALIAS "big/bomb" -) -set_source_files_properties("pics/big/explosion/boat/step1.png" - PROPERTIES QT_RESOURCE_ALIAS "big/explosion/boat/step1" -) -set_source_files_properties("pics/big/explosion/boat/step2.png" - PROPERTIES QT_RESOURCE_ALIAS "big/explosion/boat/step2" -) -set_source_files_properties("pics/big/explosion/boat/step3.png" - PROPERTIES QT_RESOURCE_ALIAS "big/explosion/boat/step3" -) -set_source_files_properties("pics/big/explosion/boat/step4.png" - PROPERTIES QT_RESOURCE_ALIAS "big/explosion/boat/step4" -) -set_source_files_properties("pics/big/explosion/submarine/step1.png" - PROPERTIES QT_RESOURCE_ALIAS "big/explosion/submarine/step1" -) -set_source_files_properties("pics/big/explosion/submarine/step2.png" - PROPERTIES QT_RESOURCE_ALIAS "big/explosion/submarine/step2" -) -set_source_files_properties("pics/big/explosion/submarine/step3.png" - PROPERTIES QT_RESOURCE_ALIAS "big/explosion/submarine/step3" -) -set_source_files_properties("pics/big/explosion/submarine/step4.png" - PROPERTIES QT_RESOURCE_ALIAS "big/explosion/submarine/step4" -) -set_source_files_properties("pics/big/submarine.png" - PROPERTIES QT_RESOURCE_ALIAS "big/submarine" -) -set_source_files_properties("pics/big/surface.png" - PROPERTIES QT_RESOURCE_ALIAS "big/surface" -) -set_source_files_properties("pics/big/torpedo.png" - PROPERTIES QT_RESOURCE_ALIAS "big/torpedo" -) -set_source_files_properties("pics/scalable/boat.svg" - PROPERTIES QT_RESOURCE_ALIAS "boat" -) -set_source_files_properties("pics/scalable/sub-attaq.svg" - PROPERTIES QT_RESOURCE_ALIAS "all" -) -set_source_files_properties("pics/scalable/submarine.svg" - PROPERTIES QT_RESOURCE_ALIAS "submarine" -) -set_source_files_properties("pics/scalable/torpedo.svg" - PROPERTIES QT_RESOURCE_ALIAS "torpedo" -) -set_source_files_properties("pics/small/background.png" - PROPERTIES QT_RESOURCE_ALIAS "small/background" -) -set_source_files_properties("pics/small/boat.png" - PROPERTIES QT_RESOURCE_ALIAS "small/boat" -) -set_source_files_properties("pics/small/bomb.png" - PROPERTIES QT_RESOURCE_ALIAS "small/bomb" -) -set_source_files_properties("pics/small/submarine.png" - PROPERTIES QT_RESOURCE_ALIAS "small/submarine" -) -set_source_files_properties("pics/small/surface.png" - PROPERTIES QT_RESOURCE_ALIAS "small/surface" -) -set_source_files_properties("pics/small/torpedo.png" - PROPERTIES QT_RESOURCE_ALIAS "small/torpedo" -) -set_source_files_properties("pics/welcome/logo-a.png" - PROPERTIES QT_RESOURCE_ALIAS "logo-a" -) -set_source_files_properties("pics/welcome/logo-a2.png" - PROPERTIES QT_RESOURCE_ALIAS "logo-a2" -) -set_source_files_properties("pics/welcome/logo-b.png" - PROPERTIES QT_RESOURCE_ALIAS "logo-b" -) -set_source_files_properties("pics/welcome/logo-dash.png" - PROPERTIES QT_RESOURCE_ALIAS "logo-dash" -) -set_source_files_properties("pics/welcome/logo-excl.png" - PROPERTIES QT_RESOURCE_ALIAS "logo-excl" -) -set_source_files_properties("pics/welcome/logo-q.png" - PROPERTIES QT_RESOURCE_ALIAS "logo-q" -) -set_source_files_properties("pics/welcome/logo-s.png" - PROPERTIES QT_RESOURCE_ALIAS "logo-s" -) -set_source_files_properties("pics/welcome/logo-t.png" - PROPERTIES QT_RESOURCE_ALIAS "logo-t" -) -set_source_files_properties("pics/welcome/logo-t2.png" - PROPERTIES QT_RESOURCE_ALIAS "logo-t2" -) -set_source_files_properties("pics/welcome/logo-u.png" - PROPERTIES QT_RESOURCE_ALIAS "logo-u" -) -set(subattaq_resource_files - "data.xml" - "pics/big/background.png" - "pics/big/boat.png" - "pics/big/bomb.png" - "pics/big/explosion/boat/step1.png" - "pics/big/explosion/boat/step2.png" - "pics/big/explosion/boat/step3.png" - "pics/big/explosion/boat/step4.png" - "pics/big/explosion/submarine/step1.png" - "pics/big/explosion/submarine/step2.png" - "pics/big/explosion/submarine/step3.png" - "pics/big/explosion/submarine/step4.png" - "pics/big/submarine.png" - "pics/big/surface.png" - "pics/big/torpedo.png" - "pics/scalable/boat.svg" - "pics/scalable/sub-attaq.svg" - "pics/scalable/submarine.svg" - "pics/scalable/torpedo.svg" - "pics/small/background.png" - "pics/small/boat.png" - "pics/small/bomb.png" - "pics/small/submarine.png" - "pics/small/surface.png" - "pics/small/torpedo.png" - "pics/welcome/logo-a.png" - "pics/welcome/logo-a2.png" - "pics/welcome/logo-b.png" - "pics/welcome/logo-dash.png" - "pics/welcome/logo-excl.png" - "pics/welcome/logo-q.png" - "pics/welcome/logo-s.png" - "pics/welcome/logo-t.png" - "pics/welcome/logo-t2.png" - "pics/welcome/logo-u.png" -) - -qt6_add_resources(sub-attaq "subattaq" - PREFIX - "/" - FILES - ${subattaq_resource_files} -) - -install(TARGETS sub-attaq - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" -) diff --git a/examples/widgets/animation/sub-attaq/animationmanager.cpp b/examples/widgets/animation/sub-attaq/animationmanager.cpp deleted file mode 100644 index 261cbd1e1cd..00000000000 --- a/examples/widgets/animation/sub-attaq/animationmanager.cpp +++ /dev/null @@ -1,98 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -//Own -#include "animationmanager.h" - -#include - -AnimationManager *AnimationManager::self() -{ - // the universe's only animation manager - static AnimationManager s_instance; - return &s_instance; -} - -void AnimationManager::registerAnimation(QAbstractAnimation *anim) -{ - QObject::connect(anim, &QObject::destroyed, this, &AnimationManager::unregisterAnimation_helper); - animations.append(anim); -} - -void AnimationManager::unregisterAnimation_helper(QObject *obj) -{ - unregisterAnimation(static_cast(obj)); -} - -void AnimationManager::unregisterAnimation(QAbstractAnimation *anim) -{ - QObject::disconnect(anim, &QObject::destroyed, this, &AnimationManager::unregisterAnimation_helper); - animations.removeAll(anim); -} - -void AnimationManager::unregisterAllAnimations() -{ - animations.clear(); -} - -void AnimationManager::pauseAll() -{ - for (QAbstractAnimation *animation : qAsConst(animations)) { - if (animation->state() == QAbstractAnimation::Running) - animation->pause(); - } -} -void AnimationManager::resumeAll() -{ - for (QAbstractAnimation *animation : qAsConst(animations)) { - if (animation->state() == QAbstractAnimation::Paused) - animation->resume(); - } -} diff --git a/examples/widgets/animation/sub-attaq/animationmanager.h b/examples/widgets/animation/sub-attaq/animationmanager.h deleted file mode 100644 index a097e7508e9..00000000000 --- a/examples/widgets/animation/sub-attaq/animationmanager.h +++ /dev/null @@ -1,82 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef ANIMATIONMANAGER_H -#define ANIMATIONMANAGER_H - -#include - -QT_BEGIN_NAMESPACE -class QAbstractAnimation; -QT_END_NAMESPACE - -class AnimationManager : public QObject -{ - Q_OBJECT - AnimationManager() = default; - ~AnimationManager() = default; -public: - void registerAnimation(QAbstractAnimation *anim); - void unregisterAnimation(QAbstractAnimation *anim); - void unregisterAllAnimations(); - static AnimationManager *self(); - -public slots: - void pauseAll(); - void resumeAll(); - -private slots: - void unregisterAnimation_helper(QObject *obj); - -private: - QList animations; -}; - -#endif // ANIMATIONMANAGER_H diff --git a/examples/widgets/animation/sub-attaq/boat.cpp b/examples/widgets/animation/sub-attaq/boat.cpp deleted file mode 100644 index d5fa314b600..00000000000 --- a/examples/widgets/animation/sub-attaq/boat.cpp +++ /dev/null @@ -1,281 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -//Own -#include "boat.h" -#include "boat_p.h" -#include "bomb.h" -#include "graphicsscene.h" -#include "animationmanager.h" -#include "qanimationstate.h" - -//Qt -#include -#include -#include -#include -#include -#include - -static QAbstractAnimation *setupDestroyAnimation(Boat *boat) -{ - QSequentialAnimationGroup *group = new QSequentialAnimationGroup(boat); - for (int i = 1; i <= 4; i++) { - PixmapItem *step = new PixmapItem(QString("explosion/boat/step%1").arg(i),GraphicsScene::Big, boat); - step->setZValue(6); - step->setOpacity(0); - - //fade-in - QPropertyAnimation *anim = new QPropertyAnimation(step, "opacity"); - anim->setEndValue(1); - anim->setDuration(100); - group->insertAnimation(i-1, anim); - - //and then fade-out - QPropertyAnimation *anim2 = new QPropertyAnimation(step, "opacity"); - anim2->setEndValue(0); - anim2->setDuration(100); - group->addAnimation(anim2); - } - - AnimationManager::self()->registerAnimation(group); - return group; -} - - - -Boat::Boat() - : PixmapItem(QString("boat"), GraphicsScene::Big), - speed(0), bombsAlreadyLaunched(0), direction(Boat::None) -{ - setZValue(4); - setFlags(QGraphicsItem::ItemIsFocusable); - - //The movement animation used to animate the boat - movementAnimation = new QPropertyAnimation(this, "pos"); - - //The destroy animation used to explode the boat - destroyAnimation = setupDestroyAnimation(this); - - //We setup the state machine of the boat - machine = new QStateMachine(this); - QState *moving = new QState(machine); - StopState *stopState = new StopState(this, moving); - machine->setInitialState(moving); - moving->setInitialState(stopState); - MoveStateRight *moveStateRight = new MoveStateRight(this, moving); - MoveStateLeft *moveStateLeft = new MoveStateLeft(this, moving); - LaunchStateRight *launchStateRight = new LaunchStateRight(this, machine); - LaunchStateLeft *launchStateLeft = new LaunchStateLeft(this, machine); - - //then setup the transitions for the rightMove state - KeyStopTransition *leftStopRight = new KeyStopTransition(this, QEvent::KeyPress, Qt::Key_Left); - leftStopRight->setTargetState(stopState); - KeyMoveTransition *leftMoveRight = new KeyMoveTransition(this, QEvent::KeyPress, Qt::Key_Left); - leftMoveRight->setTargetState(moveStateRight); - KeyMoveTransition *rightMoveRight = new KeyMoveTransition(this, QEvent::KeyPress, Qt::Key_Right); - rightMoveRight->setTargetState(moveStateRight); - KeyMoveTransition *rightMoveStop = new KeyMoveTransition(this, QEvent::KeyPress, Qt::Key_Right); - rightMoveStop->setTargetState(moveStateRight); - - //then setup the transitions for the leftMove state - KeyStopTransition *rightStopLeft = new KeyStopTransition(this, QEvent::KeyPress, Qt::Key_Right); - rightStopLeft->setTargetState(stopState); - KeyMoveTransition *rightMoveLeft = new KeyMoveTransition(this, QEvent::KeyPress, Qt::Key_Right); - rightMoveLeft->setTargetState(moveStateLeft); - KeyMoveTransition *leftMoveLeft = new KeyMoveTransition(this, QEvent::KeyPress,Qt::Key_Left); - leftMoveLeft->setTargetState(moveStateLeft); - KeyMoveTransition *leftMoveStop = new KeyMoveTransition(this, QEvent::KeyPress,Qt::Key_Left); - leftMoveStop->setTargetState(moveStateLeft); - - //We set up the right move state - moveStateRight->addTransition(leftStopRight); - moveStateRight->addTransition(leftMoveRight); - moveStateRight->addTransition(rightMoveRight); - stopState->addTransition(rightMoveStop); - - //We set up the left move state - moveStateLeft->addTransition(rightStopLeft); - moveStateLeft->addTransition(leftMoveLeft); - moveStateLeft->addTransition(rightMoveLeft); - stopState->addTransition(leftMoveStop); - - //The animation is finished, it means we reached the border of the screen, the boat is stopped so we move to the stop state - moveStateLeft->addTransition(movementAnimation, &QAbstractAnimation::finished, stopState); - moveStateRight->addTransition(movementAnimation, &QAbstractAnimation::finished, stopState); - - //We set up the keys for dropping bombs - KeyLaunchTransition *upFireLeft = new KeyLaunchTransition(this, QEvent::KeyPress, Qt::Key_Up); - upFireLeft->setTargetState(launchStateRight); - KeyLaunchTransition *upFireRight = new KeyLaunchTransition(this, QEvent::KeyPress, Qt::Key_Up); - upFireRight->setTargetState(launchStateRight); - KeyLaunchTransition *upFireStop = new KeyLaunchTransition(this, QEvent::KeyPress, Qt::Key_Up); - upFireStop->setTargetState(launchStateRight); - KeyLaunchTransition *downFireLeft = new KeyLaunchTransition(this, QEvent::KeyPress, Qt::Key_Down); - downFireLeft->setTargetState(launchStateLeft); - KeyLaunchTransition *downFireRight = new KeyLaunchTransition(this, QEvent::KeyPress, Qt::Key_Down); - downFireRight->setTargetState(launchStateLeft); - KeyLaunchTransition *downFireMove = new KeyLaunchTransition(this, QEvent::KeyPress, Qt::Key_Down); - downFireMove->setTargetState(launchStateLeft); - - //We set up transitions for fire up - moveStateRight->addTransition(upFireRight); - moveStateLeft->addTransition(upFireLeft); - stopState->addTransition(upFireStop); - - //We set up transitions for fire down - moveStateRight->addTransition(downFireRight); - moveStateLeft->addTransition(downFireLeft); - stopState->addTransition(downFireMove); - - //Finally the launch state should come back to its original state - QHistoryState *historyState = new QHistoryState(moving); - launchStateLeft->addTransition(historyState); - launchStateRight->addTransition(historyState); - - QFinalState *finalState = new QFinalState(machine); - - //This state play the destroyed animation - QAnimationState *destroyedState = new QAnimationState(machine); - destroyedState->setAnimation(destroyAnimation); - - //Play a nice animation when the boat is destroyed - moving->addTransition(this, &Boat::boatDestroyed, destroyedState); - - //Transition to final state when the destroyed animation is finished - destroyedState->addTransition(destroyedState, &QAnimationState::animationFinished, finalState); - - //The machine has finished to be executed, then the boat is dead - connect(machine, &QState::finished, this, &Boat::boatExecutionFinished); - -} - -void Boat::run() -{ - //We register animations - AnimationManager::self()->registerAnimation(movementAnimation); - AnimationManager::self()->registerAnimation(destroyAnimation); - machine->start(); -} - -void Boat::stop() -{ - movementAnimation->stop(); - machine->stop(); -} - -void Boat::updateBoatMovement() -{ - if (speed == 0 || direction == Boat::None) { - movementAnimation->stop(); - return; - } - - movementAnimation->stop(); - - if (direction == Boat::Left) { - movementAnimation->setEndValue(QPointF(0,y())); - movementAnimation->setDuration(x()/speed*15); - } - else /*if (direction == Boat::Right)*/ { - movementAnimation->setEndValue(QPointF(scene()->width()-size().width(),y())); - movementAnimation->setDuration((scene()->width()-size().width()-x())/speed*15); - } - movementAnimation->start(); -} - -void Boat::destroy() -{ - movementAnimation->stop(); - emit boatDestroyed(); -} - -int Boat::bombsLaunched() const -{ - return bombsAlreadyLaunched; -} - -void Boat::setBombsLaunched(int number) -{ - if (number > MAX_BOMB) { - qWarning("Boat::setBombsLaunched : It impossible to launch that number of bombs"); - return; - } - bombsAlreadyLaunched = number; -} - -int Boat::currentSpeed() const -{ - return speed; -} - -void Boat::setCurrentSpeed(int speed) -{ - if (speed > 3 || speed < 0) { - qWarning("Boat::setCurrentSpeed: The boat can't run on that speed"); - return; - } - this->speed = speed; -} - -enum Boat::Movement Boat::currentDirection() const -{ - return direction; -} - -void Boat::setCurrentDirection(Movement direction) -{ - this->direction = direction; -} - -int Boat::type() const -{ - return Type; -} diff --git a/examples/widgets/animation/sub-attaq/boat.h b/examples/widgets/animation/sub-attaq/boat.h deleted file mode 100644 index 22f2f0f7c17..00000000000 --- a/examples/widgets/animation/sub-attaq/boat.h +++ /dev/null @@ -1,103 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef BOAT_H -#define BOAT_H - -#include "pixmapitem.h" - -QT_BEGIN_NAMESPACE -class QVariantAnimation; -class QAbstractAnimation; -class QStateMachine; -QT_END_NAMESPACE - -class Boat : public PixmapItem -{ -Q_OBJECT -public: - enum Movement { - None = 0, - Left, - Right - }; - enum { Type = UserType + 2 }; - Boat(); - void destroy(); - void run(); - void stop(); - - int bombsLaunched() const; - void setBombsLaunched(int number); - - int currentSpeed() const; - void setCurrentSpeed(int speed); - - enum Movement currentDirection() const; - void setCurrentDirection(Movement direction); - - void updateBoatMovement(); - - int type() const override; - -signals: - void boatDestroyed(); - void boatExecutionFinished(); - -private: - int speed; - int bombsAlreadyLaunched; - Movement direction; - QVariantAnimation *movementAnimation; - QAbstractAnimation *destroyAnimation; - QStateMachine *machine; -}; - -#endif // BOAT_H diff --git a/examples/widgets/animation/sub-attaq/boat_p.h b/examples/widgets/animation/sub-attaq/boat_p.h deleted file mode 100644 index bb1a783392e..00000000000 --- a/examples/widgets/animation/sub-attaq/boat_p.h +++ /dev/null @@ -1,246 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef BOAT_P_H -#define BOAT_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -//Own -#include "bomb.h" -#include "graphicsscene.h" - -// Qt -#include -#include -#include - -static const int MAX_BOMB = 5; - - -//These transtion test if we have to stop the boat (i.e current speed is 1) -class KeyStopTransition : public QKeyEventTransition -{ -public: - KeyStopTransition(Boat *b, QEvent::Type t, int k) - : QKeyEventTransition(b, t, k), boat(b) - { - } -protected: - bool eventTest(QEvent *event) override - { - if (!QKeyEventTransition::eventTest(event)) - return false; - return (boat->currentSpeed() == 1); - } -private: - Boat *boat; -}; - -//These transtion test if we have to move the boat (i.e current speed was 0 or another value) - class KeyMoveTransition : public QKeyEventTransition -{ -public: - KeyMoveTransition(Boat *b, QEvent::Type t, int k) - : QKeyEventTransition(b, t, k), boat(b), key(k) - { - } -protected: - bool eventTest(QEvent *event) override - { - if (!QKeyEventTransition::eventTest(event)) - return false; - return (boat->currentSpeed() >= 0); - } - void onTransition(QEvent *) override - { - //We decrease the speed if needed - if (key == Qt::Key_Left && boat->currentDirection() == Boat::Right) - boat->setCurrentSpeed(boat->currentSpeed() - 1); - else if (key == Qt::Key_Right && boat->currentDirection() == Boat::Left) - boat->setCurrentSpeed(boat->currentSpeed() - 1); - else if (boat->currentSpeed() < 3) - boat->setCurrentSpeed(boat->currentSpeed() + 1); - boat->updateBoatMovement(); - } -private: - Boat *boat; - int key; -}; - -//This transition trigger the bombs launch - class KeyLaunchTransition : public QKeyEventTransition -{ -public: - KeyLaunchTransition(Boat *boat, QEvent::Type type, int key) - : QKeyEventTransition(boat, type, key), boat(boat) - { - } -protected: - bool eventTest(QEvent *event) override - { - if (!QKeyEventTransition::eventTest(event)) - return false; - //We have enough bomb? - return (boat->bombsLaunched() < MAX_BOMB); - } -private: - Boat *boat; -}; - -//This state is describing when the boat is moving right -class MoveStateRight : public QState -{ -public: - explicit MoveStateRight(Boat *boat, QState *parent = nullptr) - : QState(parent), boat(boat) - { - } -protected: - void onEntry(QEvent *) override - { - boat->setCurrentDirection(Boat::Right); - boat->updateBoatMovement(); - } -private: - Boat *boat; -}; - - //This state is describing when the boat is moving left -class MoveStateLeft : public QState -{ -public: - explicit MoveStateLeft(Boat *boat, QState *parent = nullptr) - : QState(parent), boat(boat) - { - } -protected: - void onEntry(QEvent *) override - { - boat->setCurrentDirection(Boat::Left); - boat->updateBoatMovement(); - } -private: - Boat *boat; -}; - -//This state is describing when the boat is in a stand by position -class StopState : public QState -{ -public: - explicit StopState(Boat *boat, QState *parent = nullptr) - : QState(parent), boat(boat) - { - } -protected: - void onEntry(QEvent *) override - { - boat->setCurrentSpeed(0); - boat->setCurrentDirection(Boat::None); - boat->updateBoatMovement(); - } -private: - Boat *boat; -}; - -//This state is describing the launch of the torpedo on the right -class LaunchStateRight : public QState -{ -public: - explicit LaunchStateRight(Boat *boat, QState *parent = nullptr) - : QState(parent), boat(boat) - { - } -protected: - void onEntry(QEvent *) override - { - Bomb *b = new Bomb; - b->setPos(boat->x()+boat->size().width(),boat->y()); - GraphicsScene *scene = static_cast(boat->scene()); - scene->addItem(b); - b->launch(Bomb::Right); - boat->setBombsLaunched(boat->bombsLaunched() + 1); - } -private: - Boat *boat; -}; - -//This state is describing the launch of the torpedo on the left -class LaunchStateLeft : public QState -{ -public: - explicit LaunchStateLeft(Boat *boat, QState *parent = nullptr) - : QState(parent), boat(boat) - { - } -protected: - void onEntry(QEvent *) override - { - Bomb *b = new Bomb; - b->setPos(boat->x() - b->size().width(), boat->y()); - GraphicsScene *scene = static_cast(boat->scene()); - scene->addItem(b); - b->launch(Bomb::Left); - boat->setBombsLaunched(boat->bombsLaunched() + 1); - } -private: - Boat *boat; -}; - -#endif // BOAT_P_H diff --git a/examples/widgets/animation/sub-attaq/bomb.cpp b/examples/widgets/animation/sub-attaq/bomb.cpp deleted file mode 100644 index 0b9c3656623..00000000000 --- a/examples/widgets/animation/sub-attaq/bomb.cpp +++ /dev/null @@ -1,128 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -//Own -#include "bomb.h" -#include "submarine.h" -#include "animationmanager.h" -#include "qanimationstate.h" - -//Qt -#include -#include -#include -#include - -Bomb::Bomb() : PixmapItem(QString("bomb"), GraphicsScene::Big) -{ - setZValue(2); -} - -void Bomb::launch(Bomb::Direction direction) -{ - QSequentialAnimationGroup *launchAnimation = new QSequentialAnimationGroup; - AnimationManager::self()->registerAnimation(launchAnimation); - qreal delta = direction == Right ? 20 : - 20; - QPropertyAnimation *anim = new QPropertyAnimation(this, "pos"); - anim->setEndValue(QPointF(x() + delta,y() - 20)); - anim->setDuration(150); - launchAnimation->addAnimation(anim); - anim = new QPropertyAnimation(this, "pos"); - anim->setEndValue(QPointF(x() + delta*2, y() )); - anim->setDuration(150); - launchAnimation->addAnimation(anim); - anim = new QPropertyAnimation(this, "pos"); - anim->setEndValue(QPointF(x() + delta*2,scene()->height())); - anim->setDuration(y()/2*60); - launchAnimation->addAnimation(anim); - connect(anim, &QVariantAnimation::valueChanged, this, &Bomb::onAnimationLaunchValueChanged); - connect(this, &Bomb::bombExploded, launchAnimation, &QAbstractAnimation::stop); - //We setup the state machine of the bomb - QStateMachine *machine = new QStateMachine(this); - - //This state is when the launch animation is playing - QAnimationState *launched = new QAnimationState(machine); - launched->setAnimation(launchAnimation); - - //End - QFinalState *finalState = new QFinalState(machine); - - machine->setInitialState(launched); - - //### Add a nice animation when the bomb is destroyed - launched->addTransition(this, &Bomb::bombExploded, finalState); - - //If the animation is finished, then we move to the final state - launched->addTransition(launched, &QAnimationState::animationFinished, finalState); - - //The machine has finished to be executed, then the boat is dead - connect(machine,&QState::finished, this, &Bomb::bombExecutionFinished); - - machine->start(); - -} - -void Bomb::onAnimationLaunchValueChanged(const QVariant &) -{ - const QList colItems = - collidingItems(Qt::IntersectsItemBoundingRect); - for (QGraphicsItem *item : colItems) { - if (item->type() == SubMarine::Type) { - SubMarine *s = static_cast(item); - destroy(); - s->destroy(); - } - } -} - -void Bomb::destroy() -{ - emit bombExploded(); -} diff --git a/examples/widgets/animation/sub-attaq/bomb.h b/examples/widgets/animation/sub-attaq/bomb.h deleted file mode 100644 index 9ae54b4d819..00000000000 --- a/examples/widgets/animation/sub-attaq/bomb.h +++ /dev/null @@ -1,76 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef BOMB_H -#define BOMB_H - -#include "pixmapitem.h" - -class Bomb : public PixmapItem -{ -Q_OBJECT -public: - enum Direction { - Left = 0, - Right - }; - Bomb(); - void launch(Direction direction); - void destroy(); - -signals: - void bombExploded(); - void bombExecutionFinished(); - -private slots: - void onAnimationLaunchValueChanged(const QVariant &); -}; - -#endif // BOMB_H diff --git a/examples/widgets/animation/sub-attaq/data.xml b/examples/widgets/animation/sub-attaq/data.xml deleted file mode 100644 index 0f30515ddfc..00000000000 --- a/examples/widgets/animation/sub-attaq/data.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/widgets/animation/sub-attaq/graphicsscene.cpp b/examples/widgets/animation/sub-attaq/graphicsscene.cpp deleted file mode 100644 index 5248ed9f924..00000000000 --- a/examples/widgets/animation/sub-attaq/graphicsscene.cpp +++ /dev/null @@ -1,301 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -//Own -#include "graphicsscene.h" -#include "states.h" -#include "boat.h" -#include "submarine.h" -#include "torpedo.h" -#include "bomb.h" -#include "animationmanager.h" -#include "qanimationstate.h" -#include "progressitem.h" -#include "textinformationitem.h" - -//Qt -#include -#include -#include -#include -#include -#include -#include -#include -#include - -GraphicsScene::GraphicsScene(int x, int y, int width, int height, Mode mode, QObject *parent) - : QGraphicsScene(x, y, width, height, parent), mode(mode), boat(new Boat) -{ - PixmapItem *backgroundItem = new PixmapItem(QStringLiteral("background"), mode); - backgroundItem->setZValue(1); - backgroundItem->setPos(0,0); - addItem(backgroundItem); - - PixmapItem *surfaceItem = new PixmapItem(QStringLiteral("surface"), mode); - surfaceItem->setZValue(3); - surfaceItem->setPos(0, sealLevel() - surfaceItem->boundingRect().height() / 2); - addItem(surfaceItem); - - //The item that display score and level - progressItem = new ProgressItem(backgroundItem); - - textInformationItem = new TextInformationItem(backgroundItem); - textInformationItem->hide(); - //We create the boat - addItem(boat); - boat->setPos(this->width()/2, sealLevel() - boat->size().height()); - boat->hide(); - - //parse the xml that contain all data of the game - QXmlStreamReader reader; - QFile file(":data.xml"); - file.open(QIODevice::ReadOnly); - reader.setDevice(&file); - LevelDescription currentLevel; - while (!reader.atEnd()) { - reader.readNext(); - if (reader.tokenType() == QXmlStreamReader::StartElement) { - if (reader.name() == u"submarine") { - SubmarineDescription desc; - desc.name = reader.attributes().value("name").toString(); - desc.points = reader.attributes().value("points").toInt(); - desc.type = reader.attributes().value("type").toInt(); - submarinesData.append(desc); - } else if (reader.name() == u"level") { - currentLevel.id = reader.attributes().value("id").toInt(); - currentLevel.name = reader.attributes().value("name").toString(); - } else if (reader.name() == u"subinstance") { - currentLevel.submarines.append(qMakePair(reader.attributes().value("type").toInt(), - reader.attributes().value("nb").toInt())); - } - } else if (reader.tokenType() == QXmlStreamReader::EndElement) { - if (reader.name() == u"level") { - levelsData.insert(currentLevel.id, currentLevel); - currentLevel.submarines.clear(); - } - } - } -} - -qreal GraphicsScene::sealLevel() const -{ - return (mode == Big) ? 220 : 160; -} - -void GraphicsScene::setupScene(QAction *newAction, QAction *quitAction) -{ - static constexpr int nLetters = 10; - static constexpr struct { - char const *pix; - qreal initX, initY; - qreal destX, destY; - } logoData[nLetters] = { - {"s", -1000, -1000, 300, 150 }, - {"u", -800, -1000, 350, 150 }, - {"b", -600, -1000, 400, 120 }, - {"dash", -400, -1000, 460, 150 }, - {"a", 1000, 2000, 350, 250 }, - {"t", 800, 2000, 400, 250 }, - {"t2", 600, 2000, 430, 250 }, - {"a2", 400, 2000, 465, 250 }, - {"q", 200, 2000, 510, 250 }, - {"excl", 0, 2000, 570, 220 } }; - - QSequentialAnimationGroup *lettersGroupMoving = new QSequentialAnimationGroup(this); - QParallelAnimationGroup *lettersGroupFading = new QParallelAnimationGroup(this); - - for (int i = 0; i < nLetters; ++i) { - PixmapItem *logo = new PixmapItem(QLatin1String(":/logo-") + logoData[i].pix, this); - logo->setPos(logoData[i].initX, logoData[i].initY); - logo->setZValue(i + 3); - //creation of the animations for moving letters - QPropertyAnimation *moveAnim = new QPropertyAnimation(logo, "pos", lettersGroupMoving); - moveAnim->setEndValue(QPointF(logoData[i].destX, logoData[i].destY)); - moveAnim->setDuration(200); - moveAnim->setEasingCurve(QEasingCurve::OutElastic); - lettersGroupMoving->addPause(50); - //creation of the animations for fading out the letters - QPropertyAnimation *fadeAnim = new QPropertyAnimation(logo, "opacity", lettersGroupFading); - fadeAnim->setDuration(800); - fadeAnim->setEndValue(0); - fadeAnim->setEasingCurve(QEasingCurve::OutQuad); - } - - QStateMachine *machine = new QStateMachine(this); - - //This state is when the player is playing - PlayState *gameState = new PlayState(this, machine); - - //Final state - QFinalState *finalState = new QFinalState(machine); - - //Animation when the player enter in the game - QAnimationState *lettersMovingState = new QAnimationState(machine); - lettersMovingState->setAnimation(lettersGroupMoving); - - //Animation when the welcome screen disappear - QAnimationState *lettersFadingState = new QAnimationState(machine); - lettersFadingState->setAnimation(lettersGroupFading); - - //if new game then we fade out the welcome screen and start playing - lettersMovingState->addTransition(newAction, &QAction::triggered, lettersFadingState); - lettersFadingState->addTransition(lettersFadingState, &QAnimationState::animationFinished, gameState); - - //New Game is triggered then player start playing - gameState->addTransition(newAction, &QAction::triggered, gameState); - - //Wanna quit, then connect to CTRL+Q - gameState->addTransition(quitAction, &QAction::triggered, finalState); - lettersMovingState->addTransition(quitAction, &QAction::triggered, finalState); - - //Welcome screen is the initial state - machine->setInitialState(lettersMovingState); - - machine->start(); - - //We reach the final state, then we quit - connect(machine, &QStateMachine::finished, qApp, &QApplication::quit); -} - -void GraphicsScene::addItem(Bomb *bomb) -{ - bombs.insert(bomb); - connect(bomb, &Bomb::bombExecutionFinished, - this, &GraphicsScene::onBombExecutionFinished); - QGraphicsScene::addItem(bomb); -} - -void GraphicsScene::addItem(Torpedo *torpedo) -{ - torpedos.insert(torpedo); - connect(torpedo, &Torpedo::torpedoExecutionFinished, - this, &GraphicsScene::onTorpedoExecutionFinished); - QGraphicsScene::addItem(torpedo); -} - -void GraphicsScene::addItem(SubMarine *submarine) -{ - submarines.insert(submarine); - connect(submarine, &SubMarine::subMarineExecutionFinished, - this, &GraphicsScene::onSubMarineExecutionFinished); - QGraphicsScene::addItem(submarine); -} - -void GraphicsScene::addItem(QGraphicsItem *item) -{ - QGraphicsScene::addItem(item); -} - -void GraphicsScene::onBombExecutionFinished() -{ - Bomb *bomb = qobject_cast(sender()); - if (!bomb) - return; - bombs.remove(bomb); - bomb->deleteLater(); - boat->setBombsLaunched(boat->bombsLaunched() - 1); -} - -void GraphicsScene::onTorpedoExecutionFinished() -{ - Torpedo *torpedo = qobject_cast(sender()); - if (!torpedo) - return; - torpedos.remove(torpedo); - torpedo->deleteLater(); -} - -void GraphicsScene::onSubMarineExecutionFinished() -{ - SubMarine *submarine = qobject_cast(sender()); - if (!submarine) - return; - submarines.remove(submarine); - if (submarines.count() == 0) - emit allSubMarineDestroyed(submarine->points()); - else - emit subMarineDestroyed(submarine->points()); - submarine->deleteLater(); -} - -void GraphicsScene::clearScene() -{ - for (SubMarine *sub : qAsConst(submarines)) { - // make sure to not go into onSubMarineExecutionFinished - sub->disconnect(this); - sub->destroy(); - sub->deleteLater(); - } - - for (Torpedo *torpedo : qAsConst(torpedos)) { - // make sure to not go into onTorpedoExecutionFinished - torpedo->disconnect(this); - torpedo->destroy(); - torpedo->deleteLater(); - } - - for (Bomb *bomb : qAsConst(bombs)) { - // make sure to not go into onBombExecutionFinished - bomb->disconnect(this); - bomb->destroy(); - bomb->deleteLater(); - } - - submarines.clear(); - bombs.clear(); - torpedos.clear(); - - AnimationManager::self()->unregisterAllAnimations(); - - boat->stop(); - boat->hide(); - boat->setEnabled(true); -} diff --git a/examples/widgets/animation/sub-attaq/graphicsscene.h b/examples/widgets/animation/sub-attaq/graphicsscene.h deleted file mode 100644 index ce9ee115ca7..00000000000 --- a/examples/widgets/animation/sub-attaq/graphicsscene.h +++ /dev/null @@ -1,130 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef GRAPHICSSCENE_H -#define GRAPHICSSCENE_H - -//Qt -#include -#include - - -class Boat; -class SubMarine; -class Torpedo; -class Bomb; -class PixmapItem; -class ProgressItem; -class TextInformationItem; -QT_BEGIN_NAMESPACE -class QAction; -QT_END_NAMESPACE - -class GraphicsScene : public QGraphicsScene -{ -Q_OBJECT -public: - enum Mode { - Big = 0, - Small - }; - - struct SubmarineDescription { - int type = 0; - int points = 0; - QString name; - }; - - struct LevelDescription { - int id = 0; - QString name; - QList> submarines; - }; - - GraphicsScene(int x, int y, int width, int height, Mode mode, QObject *parent = nullptr); - qreal sealLevel() const; - void setupScene(QAction *newAction, QAction *quitAction); - void addItem(Bomb *bomb); - void addItem(Torpedo *torpedo); - void addItem(SubMarine *submarine); - void addItem(QGraphicsItem *item); - void clearScene(); - -signals: - void subMarineDestroyed(int); - void allSubMarineDestroyed(int); - -private slots: - void onBombExecutionFinished(); - void onTorpedoExecutionFinished(); - void onSubMarineExecutionFinished(); - -private: - Mode mode; - ProgressItem *progressItem; - TextInformationItem *textInformationItem; - Boat *boat; - QSet submarines; - QSet bombs; - QSet torpedos; - QList submarinesData; - QHash levelsData; - - friend class PauseState; - friend class PlayState; - friend class LevelState; - friend class LostState; - friend class WinState; - friend class WinTransition; - friend class UpdateScoreTransition; -}; - -#endif // GRAPHICSSCENE_H - diff --git a/examples/widgets/animation/sub-attaq/main.cpp b/examples/widgets/animation/sub-attaq/main.cpp deleted file mode 100644 index 9b28d8c40ff..00000000000 --- a/examples/widgets/animation/sub-attaq/main.cpp +++ /dev/null @@ -1,64 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include - -#include "mainwindow.h" - -int main(int argc, char *argv[]) -{ - QApplication app(argc, argv); - Q_INIT_RESOURCE(subattaq); - - MainWindow w; - w.show(); - - return app.exec(); -} diff --git a/examples/widgets/animation/sub-attaq/mainwindow.cpp b/examples/widgets/animation/sub-attaq/mainwindow.cpp deleted file mode 100644 index 0c152c91801..00000000000 --- a/examples/widgets/animation/sub-attaq/mainwindow.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -//Own -#include "mainwindow.h" -#include "graphicsscene.h" - -//Qt -#include -#include -#include -#include -#include - -MainWindow::MainWindow(QWidget *parent) - : QMainWindow(parent) -{ - QMenu *file = menuBar()->addMenu(tr("&File")); - - QAction *newAction = file->addAction(tr("New Game")); - newAction->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_N)); - QAction *quitAction = file->addAction(tr("Quit")); - quitAction->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_Q)); - - if (QApplication::arguments().contains("-fullscreen")) { - scene = new GraphicsScene(0, 0, 750, 400, GraphicsScene::Small, this); - setWindowState(Qt::WindowFullScreen); - } else { - scene = new GraphicsScene(0, 0, 880, 630, GraphicsScene::Big, this); - layout()->setSizeConstraint(QLayout::SetFixedSize); - } - - view = new QGraphicsView(scene, this); - view->setAlignment(Qt::AlignLeft | Qt::AlignTop); - scene->setupScene(newAction, quitAction); - setCentralWidget(view); -} diff --git a/examples/widgets/animation/sub-attaq/mainwindow.h b/examples/widgets/animation/sub-attaq/mainwindow.h deleted file mode 100644 index 660acfaa0ad..00000000000 --- a/examples/widgets/animation/sub-attaq/mainwindow.h +++ /dev/null @@ -1,72 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef MAINWINDOW_H -#define MAINWINDOW_H - -//Qt -#include -class GraphicsScene; -QT_BEGIN_NAMESPACE -class QGraphicsView; -QT_END_NAMESPACE - -class MainWindow : public QMainWindow -{ -Q_OBJECT -public: - MainWindow(QWidget *parent = nullptr); - -private: - GraphicsScene *scene; - QGraphicsView *view; -}; - -#endif // MAINWINDOW_H diff --git a/examples/widgets/animation/sub-attaq/pics/big/background.png b/examples/widgets/animation/sub-attaq/pics/big/background.png deleted file mode 100644 index 9f581571fad98c6e907570f30045d390ab2cc761..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48858 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 diff --git a/examples/widgets/animation/sub-attaq/pics/big/boat.png b/examples/widgets/animation/sub-attaq/pics/big/boat.png deleted file mode 100644 index be82dff62aeecc8d6b9fa57c62e7bd7bd941e0c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5198 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 diff --git a/examples/widgets/animation/sub-attaq/pics/big/bomb.png b/examples/widgets/animation/sub-attaq/pics/big/bomb.png deleted file mode 100644 index 3af5f2f29cc3b6bedfb06d98ffcb67377514728a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 760 zcmVu4`a zL>S5QyoYP%a?NbsO!3m!(m9H(O3fx0@Ppa$#gn>zgnpfM#ieuYUFaW_?}Oz)#604 zNTpgqDf_PHd8bD{YxF{)PX)YPT_QOsC!c zBqC?E)=}b5yEQg8b~RrpB+r#fequ`ywnXEMQEGF)>jTkxVA12621?c#|j=i%*xA zm#;Nj?excu4Se6nvf$OL*Id4Q1!D}WFJDraD=_Hy0bzcAp3Tk8d%o`*JDZ&>)wZ@y z?flrzxUOqWWV3`(NGg?Lb#;|;xy;PW482~DMi3AVhXg^B;h^6Gb}bRX^E^i>RhiA_ z^HWpPWHK&J!Xb_g{lS24w@0(tWN&W|5g|5FYd?-}Xsurytl<0pL)&p4jE_%@C2X5i zI)$xlhG9sz+hx%2W2xV(n{fC}L@sEp<$wbbc@#&{X9Zk1UqbKf@_l=oAPDGnI!sKA zGc}pTgyA<4xvsUAe?Zb&?~BMKkp9}*I$;$41*ovs>5xvlMr8lC)_UtdkVf*49QlgK qCJ+F}fFw`@QX-rIDQT@Mqx)aPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L00w9P00w9Q#Je-J00007bV*G`2iXJz z69*r{`Dk(g02TmAL_t(|+U=WJa9!7xp1-xvx%0&ga0Eed5(#RuEZJ^Jk!4#RIt^sw@y-dNmZ(nO6MU}i7S;S+o|q2mdllHyWQPs$!y7PQ3EM)0*HYa zh#9!RozJ{i9zZq+0VF_ifaLpE;R$Eod+yo)+3VYDtqm=;)KW_=wbW8eEw$8AOD(n3 zQcEqh)KW_=eX=E=_8%B$5becS2W%OetD>!GZy9DoCH8ccH%|Nvo#rG5%n5qP5a~F}T4cUyDd$J9+nu;o z2gx5IrTfWhku(O}fWTkIcgKj`+Jhb6GR%VvMF&ai0DaDv&Eq_C@XI(wUyfb=3*yj| z8JfPuZg=AHgQVp!ozhRY?4p2!)ioM2N6BWW@HWw%!r)fNw+!NS++qf4+lMP17_EZtr6`BkZ9Y%GoOJtfO{BBor2Q3Q zW5VW9l8ldYa~PBwO>dlfvWnGy3U?cyAH%i`^9ba`SVDY)aK_rXw?(3c#I;2&6Kjr~ z9HQ?|6X&fW#V09pfDVeJsgh_&hJ*CT=kibMu2=st((XymFaEcw&(?H_oNMsoXXw}{ z44MyVXeW6&Lf2;F%`O^@wN{u%v%;(qm^n)NjyGiNkCsWh%5YUvP%bK*IY_+>LeXx*dz?yt4bNbiVK# z93MHw+NINW1xurRS=vTVqn!=n*(=o5mx##bFq?%z%>xmUHfTst8M1|sj+dwfy^mDQ zA>x7(YC?e`DWIrXjMlMohl$fBf{>LW9psJ=I_}pFCfa^dio>%^+Esp49+4NmKO>p6 z)rIPuUZAWcnkE9-APnLYVu`3w*D+Svw|d4L|G_M7N^c%db!YR-12s%EfQW%4g{Xr_ z3RF=OK$4)D1kBWfeWUUx$;u#m?2{ajy>y#30(*uPrYYHT)XeVHv*zUb#Mzn3{Pl@b zgCQZO3pi$OXejCUGo^H~Ap@DGw2e_6@>Y}C=9uYfdUg?yNy>H}Un(FQgh3spVtfLr z5^IsABq5No#)_oSo5$zQ{Ti+?@ovNx5L-k@;n*Ao2f;y5)Fvn~HuOk>44U#$GkyOb zRI&#X?V%VSqd#@L^LIJ)+zYBx=ZqP9!$w?Xiuw3wESZVMa=bv%G|A{yns$uP9HPzi zl9vp5mRDky{%n?oa`>KlVHqMVew6BFrNkEO5P*#X?Z>_HmUKeWuk(mgV)D4sc z8Zt#A{Wn;^21-S%csh+M233#f=JCH)hOzxf+=fXyaI}DHQlun>Lkb6j07`~4@%JNP5kn6y z1u`a2h8!8mkkS;62%>-_BpMQmPoPZ#bqFGtI5~`Uu59n&`A5lmgY3=h;Sdq!+yb-p z4=EMriDM6>L1LcJ)4CdcJx ze)38)_r)-_7fCuWwi{QAWTl}i zi(GTD9m7*}=bz*y`PPwt=uXcMajE&1&2lzA%c47l4VGv!!5Rlk=V*U-pCn)Z3fZ!& zyFT~4NCUI-;}6{nk(2zf9d)mqnusO|ofu<$67^8=Yk@?=s)Y_m+UmYN9Zz$S5glVC z`})T9DE}x~d6qsIpaV3C0$>Mn^c&hNf}Q|%-d-?q~Cv63zc5UhmN|H1g|+QF*QkuvuB7nv!30J z`q899O=nqQrg5I^dyh$byOGNB2gy9s)L4`i!aJGRe1#|E#jYpR+C}qL$m^16?l945;? zil&`5QYMXRpuScq(J&JjodQ)7VqzjQurhT}_l;3K;DD=DQtfm^cMwF_Ok5PsS9;X)jqhOiqr{V>&a3 zHQjw2Q|N%WX5#V)h3aMN+LFdt@yTjHfKQ-#A}wrfm6=?_J~qp$UWhI^hlYM?JCA(9 z`r(MFYm*u|d76|pAT_K#PuZ-HvVDOO!wL<2EitXrEd2X-h~MeM{L(|O8=!E3&`+4d zr=}C}kXjO{P#wKQaO^O>@-jV7mstMxo2(q1zHz@vjFJ#aVwbGeJ|OX@B-SQAmNvv* zmd;ZxWVv8-UR5gp_p~(C zv!}wE*-NkNBa4HzD>P-47$s{C(a8bwT471fLVXVB-@eQqd6Mqi4UiooVu)4$AZ3$A zGoxtm8H(l~InVRWXJ6sU*w6RI<-cK?<}D_kV^x3UT`>G`o>+bRRxmHqMD%XVckTn= zyB%#9wct1yb#Nqwqj?Q$qSKw52urah{JU8jomLv_lsYUaP)QB zFRm5G)i>WT&&Y3m_KO=C03dr4tl9#YU9Oel3t4tm#I}_`Vq*UT>Qcn7mPqL~LJHObWXp;b_eilWN3vG@2> zHH&Oi4UUV8{n9%(tgBQ^W8@b}`mK4w%ja2%Dv44yZ-nowe0M}Aqg6YEzuD)Px^aqw z6s?bA-isp*NppaFP@|EV`smxAn?b{a$X5AIlc-@#c|!f_B;C5IHLBFHWC+RLneSdJ zV7~bxyJT=b;xe9F`RH4{9llcy z0+o>|2`-+M?$sfwvcxJPb(%I!<4%0{tz+cx#8x{iB!NnVYDlahku-_4M67GnD3piA zoO3npFRJP5K*OpelOqyLU($M1)fHl@L=q5cL_&l@!*^<k)`g zM1*yNt$poxJ2AiCgBvHrnMrJF20PV>*D=@~YgcDee>yfM`DXmL)!+&Za}ldqL}D~M zeCq_eyAk{J{**3NOz@?qWPWku|C&O`z*Ock|OU`(F>k5%h5y(8At4Tu;NFn}PTuLG+!ArzOOiWz01^ThBFl zSbPF4X~{H4-bmcH7Ory;O#-*E@jY*k?-GT`3f)=b^mHWY+AhskTrtRcHFa~oJA4)U z*RQek;@i>kObtCWw1c4+z+VJ6#ts(!^3GWDVa|X=;ro zbpq=V8*gjh_sUW7@>`kD@TK4WdpddQkCLVNWzMe0?93bZfFJc^YzC16XbQ*f-nh-8 zxq=-$K}HYJmhL8F4M?4aH%HB!C(P8)>$|_+Gupx6o$cg3;Y{$rJ36<8(S10-a#RTx1~$De)fhA7&7D1V46J zjLTG|J#q+%Ne0g?vp&h=|oA z5}(*MiA^2NoVoR3l)7Dmtnl10kFB^sk6G>`phcvi0dWLU3Kk3YOo4BSqeh4qNU zkd*=Um{-jSJ%03Maq|sxV))N3zAsg3@6X{r`4#qrA+?{KV)dI-1e!(MWlZusT{oW) zh(}mC*hxzM;E7j_=bbzH@2>oHGDmbLzH@SwaZNHs^!dIKRM#lU7#<$rV$@vQ5Gs}!OMtaLHr0UCg-9$<-ZZ4VvSyY{8~ z#V>5MjqSfJ>$&YViv_Gsks-mw3)eI*52>Ln)?Xze%%zD@8d%0rmPBuazReEGarE*P z{ZB)Gg`t-IF|j>@XoEyuLUm}WfsOc1uk&4rh&6m|&`@vte0L{ZXRAkMm^d6%f4uPLgv99|-)NfJ?4X=jd|RiH`P23O8Z(aCW7xnU5(BDO zjfp=l-)&c?_mla|m)ZNBYoYbqi}&_EUwPsnWf>klfF|c z_#@|;i|bT~QkDDHW`VV9HlnV>csf;`CrwqCDakZz@m1oz6DSjW@$DxHp-%Y^U}MSghwywQf$?VHj9wn><* zuohgRksAKn>+gB>SWY7y$I05mw5K}AZj^Am`TD&R*o{K#BQwlawOu%sb`3P$nP;k+ z(V=ExvmTM1(q^$yTEKSD=PVQ13tT`L->ka59km}LttaR;C)qEL)8(WHZ%;Vx*wVnZ zc2?Vk(_(o<*A~ZYpjGOm2siEl-YIPsx96wyi@U!j#pk~&I=|xVI{)9|YP2AmRJXUP zs|7^&kvE6wGhcTG^~ljLVRFrz6OOCXB;8B*KX3EU4Rfz>YTV_f^)%S52Y9EnS=^qV z()Ph4PUbgzZE~hW&jl+Tn9Zu&Th*=%q6JdyCP#nYF)6Gk9PO^}jmUwE<8ltStq3fA z3Raj0)&u;A+AQvxpYlgvPn=&ZiZ^_Ta(G1oe5dj8-h698ltdE(Y_ygPFgFZkPuJr;nn|VypQnGw`E#wG!9#%+~T#cio+pv3>=QX;!(odPW9+u!x&V zm|U4;j4Eq{?gKgi_s|XVAmP;U(5AQMy!En0_=%}j-;*8!oIc7l{HI+He}#ESaO#Y#+v0wu;ahrCE6hWN)6@-a zXqn=ZYM7k_r!8%B)AA_4JUM}cZ5Y#rqj^%A#l0Jx>H~t)mOcT70Z1N4!XhFCgwzc< yPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L00w9P00w9Q#Je-J00007bV*G`2iXJz z69*kE_X%DA03ZNKL_t(|+U>nrjAhw%p82hPhI{TDb7TxTXI5rqW=*UjSu9Ev$&yK1 zqNHv$Nf~Vz@Ph#ZvR>3`pn*2ve&~mOXt>evL$}dJ8-`8GG9^loO;{w&qNu83vF5C* zoFgM6Gh>dp5qG}#%zODEGK*OgSp&%`()k1Nau9Luy=VP*t+oI4?;UU#cX1bYaTj-S z7k6UNa8xP;!N#9hJwkQ_m@ zg5Y6n5rcz>gP>bdVv_SCLzsW!A-^+%{2)aC zu)p^(-|pJ`xleL0lGkyxjAJ}p_I?Zo13-=?B_kmtB9|_?+rv87K6p@@4pKUdr*i~U z@G(G4EDa)ek<9J=ViD&fL6~opF~9j3Q*tlkx=Um0DRy4mg*RV2xQu5zm02|ZG;iFH0;nTpO(kRyyR&zMY6#=&ZffvmI3 z4Lbg_q`ydnaX$)g;!DRVnXfpH@S6|)8cU1cn#tNf{L&T7o3F9V@IBopY(J~p#9E;s zH3F$nqD+y1f-wXN1uPyZR$@Yp>4-}ohk**jN}3z!t<)c;Ry?WR_)*DZh;#KB)9$}!hq#h} zO~}M0)e@>yQ!FW|4j8cBT(;9^&uVG5C7tD)EMn+U z(rHHAafZ<^NE7USRNlyE*3hjTn4ZNAAH+zAbvDV|=igg>|I8YiSHYV^@Np>MNf}=! zab*^d(ZW9U4?L>X)1MM|YFb1BWTUFZ-TP#|KNN7)keh_ab{R-Ul4odl0_%?BlH+L| zcTlEqVxGf#hEZMSYWjVydzZ=Xd@oLyJnzs?FVgYmJ*4!)IkUF$L;GSs*JYV!zZ!E7 z6*}}~on2d?!$-Uc{>Tt!cMPX;h6?+sQ^6-D&bMgC7a0_8zCCHu1Be*NJwzQuJWxfW z4#or&G@vXMit6E0$55g|Y5cgB9(d6BkIW!-56w}(YN)P^<42D$;m=8FBh^mcWru;S z;E6%~L)3MWae*R&t#~-*)9yn&{+plBSD*g6-Q0~fi)`*Y`=fw+tJrj!p{cN;-`x4O zPVAQRNK@yYu`kM(#t#{;y(D#a@Qc(0|I7&UPQf%WWJN9{25!SOdq1*XUs?MenTSn}j5a-+$;&2c6Fylv!J5#q4-(8T>#-@yr$$rL&Da!;WV)}m!9-D;qh#15B##TI7onP9(tT8TfLT7b?{P*x^(e{J?-}pH zf68~YWoL=FMHoAeWL3;9A3ocR9AqC2RIiiKL>X$GG%2B} zLZ+%IBC1MmRr6SEziIQ%CSe?*ROC3GoTg@XrLF~YSnhe~aT)Dp;tV&`)+;ugs!0Fk z?~n`{ys+4|*Rt-HK1IO){^&m%d*;gb|J}{z%YSbLExb$)gzg`1$Px|Iac;m)l{owX_wq-VkqIrKJlsE zd(82^us=7`2V~!sKq{$|SNHD!)F>vYAdKTureI1GQl;!VlrU6mm8xIjUYVk-pB$g( z_+y`!&XpT{d*Nj~utmm9)GX@oa!<`@6=%{@Qqk;sk9c)~=*9(Un{8bjwlv4%jCazW z`pn6vpRg^ySh z{8J-LG>0S=%$>o!LsfM|5CtSB*MvkOVjU8zL!5J;OMslq7t5m1v7p3G7)2MQm)TcEWdS>fDp4 z`?9ulO{-TDDUQTec5*T|7u|S~z7BkdNU`-7N&nw}+WEneUFgr_yJM7ehKe_VYe5(w z_BHx4-8^efeQiw#j%#1+MYO2#7*$iI$4wgM0-JflE-${Zk^ZG1jGaL8I>wISYK1^* zl%ztDGDRulnE<0MA_^qrG9=XjkrWu>ASy(%#elPHQeJyX4t)Iu?PNXs91Yzd{O61C zkH5k!|MRJ@n1$xH`Qy!}vI0(_#(n1Z=DtEW2#9)3IZ+>B@{@;YURp4%>#O|K zHyGN4k&$spPELv5%-J{TitTU7`uBc7i3OZ+S)*h}cNpjzIW3A5sF3tyh8Iy!95XUh zhFOoL@4li1*^!tw1%FF*a8b|G)LnXX_k#P?E>d}j3gb*tWrk_SIF4hgbh%1PFEPl! z#b$nS(3BQclu7frnb*_D9u=?Dm$ggZvBZ&d={1+h$F@H@S>~rg7#)GMiet(Ys8NzS z6{%5Tl7IGEp6-z98mVcM<^#IgplH^H=a939r05i6I_}z$&p#kZVW4Y2 zd_ou63(`ziG-O@ZY1$2X#n;GhH}ITbzntJ+#yBho&A1*pavZ<3EB9RaE6w5seU`Rf z0aL=t!;Elv@{m-&{6&#k!%qI2MW!ztWOMez>hJqpasS2@M_S zRqN7{oRl^hEn?ecs6!Iz6WJFulZ~aenPP%R=8l?)FHVUqHM8QtW%tPq&atj5Y)Xfr zS=eh*@0qyOz~9d-pPcv{#e05*k=3r$zI;lkZQF@|yC5@{R-}wehXlcDie;FzG;Lp2 zv0aIVT^*21ii*9}`~9*ICi8#*BR(!A3b$0%K#ow9V~m@T!V&eyPGHJ)$a*GgFHr7Y zv98_K3@Z_V#>7O#S|XK@EI9YZ2jmnHrwZZ_>PFIVrm5R09CMgVM!i%k8e`AQsVx^s zqL{QgW2^N^neVKqWk8<+3q*D~i}BdhoK!4Z6xgyJF)^wsiHQjr5}BCDZqt-5E#1;} z`yext^tZ8BtD03)(_QV-g*>6_Y%=s;`ca>u9%2i)?leB5_Z%|v=}C2;4#{_}Tbnmz zFzjm^mm(!o!&i$hO)`DHwIscN`=_{W!czN&ULw&RHk&|lgE$`%bJqtZj8jB1A7gyn zTdJyeOI0mPJvgex!=F|E%o&(0BT17vJ>otdA=`CimX@jZzDa zgHZ=ZJRB|Im`RMx<1sohN$}8q!-F-lqNq&@T3k86I42}OzfCXAHDD-xT%93c22cC6 zxk@MBpyyFRwz3Wb*Ak~YWTt}<(iTfj2`lsQezyMjFQv$gPVGCycxl=Uhp%e- z#^rBkf@;}eN>}NdQ%iqsrPh|g+7{WlZArYQF0_|*1C=^OsUyb4)r^!IbhXh7$w_pF z9xW0ATxz(nl6{b=`A3Q{Zx>7%!;ulG5saTu|Ni@p^YA267c?uYjEQQrA*J4ujD=mT zVbsUP$HBqq+q@%VAa~%FOU{UkXn-*VHG5Zc2$_Wr-_dUSy-*hh&I)TrRoC6^5b zTAb|YmED%q!c-ES3MQ@;Ftu@H zUl|z{F(sp#irC3O&EzOfp)7^aNPyrX7z78@y!AD5AXhM;D5{Ez#fp+D*+4aoHBU;2 zqlj9O#9F5?FV*{sOkEsM?<^R_)$!v8obnguZ1Mb@99tC1S<0*%%fw?YX)jBIZtm|R zkTcA^L2-VX4g3ErKVdDIJI__!`Lk#BX1=4lq)bw{El8GopaVKOh%$NT&{6w;UV4%_ z9n+D*Sbi>Eb4KvZI05q%K|8(3YzB4n@kcY9NF`%Y8y_v23dPzdvr zf(cm+SxGfjusP%*n)L;nSOvAHD5~80+qe0sqF^kR9IH9GB-pHt%B~$EyGsZ!^%-3?SH!gn1YJ-k+uRm?;&#Ypvy(+z|l|$3}LHay}e|br7q)qQE zvAv(kwjA>ujsC$DkZEBA$eJlkMg1!Fk*3|qB_!lFX|GtV} zKhBt(Vf6l88o&E4+=(9=Vcss749PXN9m!e?>Mb2o89gR4?kj1i_WBL-m1~-WZ3biv zv6_)Oj`TN{VVirU_}@!a7ULSi`(*w+FU<_EkxiMN6Y)EjdF|+8%0k zZd@g5Nw~YBF}t!(lOJp^%BeqpO5?0;Uu4_q(|`6!(#Kv%w^w`Ue31erygL==jHv@M zez{1H`8r0SP{pH2!FiJ)sSzp#>gEBC$z%0n>e#j7)4jg^*W2f`y1kMY7;yu}HJ~Iu z1-!yxTR8kH1oxeR$+Bu3t1R4<_`+EkYhIEr+cXjBGqgT~JNvt>0#cpDZFu<8k8ns% zv0sX2R=)h;DVCT1>fN{#KfICzdS@_YNUFPJ+M-9feOb(FuKLlIn#nqvbS1yBAo21= z?WbMcA)`wwF^Q(+WY~BePMspKN2qyq0&74z4DC7t>61yB*s+M5a*pVsk3FuduU=4X zw#-b{qSS3mtF=la>&nQ@P;t7t7_YO;PQJmquG29WvqUmtZ7|>p*=N>J*3kGgMg9Hy z$7NyI)!lSYaW+qF%JA|9RjAS5EE zpSSXDXJMx=xt7fFLWzB!Jcg+x;y!s(&+TsJi*}bz)@1`F#g_?+vcZmdlBPm-TjP2C zK};j|;duwPhx$sRO?mApnfv;Sb~Ow2X?j>hMk&9OAgN8Ptl$#cq4pbBAYZ3rGjRxH zKjY?C%yCX1`m}m}F1^KN2&Ocfs93iq#wi&k0U0Y=fB(Hw3npala$;6GExSrloW1QS z{Wem*W2&z;#<14cVdsWy*;jP&U;Vju^Nn}oPW)({ozKTV4K&CsSdXrc-2yK_44u~0&4R4~QV-(F1Ce0U|d-dqC&ti(hpmOnt z`WyF57oWKCm-buzm7Ytd@+wW7^@h#`NVz^PrN1>Tl)8DaRU&_8SC`mehg6O-Bac;2 z;_8Y%-A}a7KpPB_|H5-7M4d7wYtp5ZdGrvCFf#h%1xY*59yL<7 z(iM5-JO5E5T6#8XD>#f2aA52p<6rrdXtAUA|L-$MQ{phejf$F!Lau0JB_9cljMa0e zH%-v-#2^+x(YnRtcTV+dk3On9mwvzt-~C?teJ(lAvc8^?y&HGphdLUFw!qCW^-)UZ zv;Ikb{WrhJ*(aWtqmRz$=8KK&$>v!z!>$E&VshFfw1{k%q4pTkC$=G3IYG3H$23Le zCyz_{%YR#>*2qu&>ud7#m6z;7)|MV=y@JT+-ElqfiCMY%;;Xc}yLR-_G+GPkZ!SuY zO=+^JmLd-a6MFi8{4zE=Z`%KU*}jx)YDR7aONJfpVDCLiK@U^)$0%3>^cm;^14$UN zkAh54HC2Ll5+v28eG{~=QtV!_MQ!DmvmIHbr!5BJ;Al!hoNQ^hvxE&I8AMI#hJE#y zCR9ca!AL<#Q|v<5>ZVxhZ`0n{piLqP2|1ZqR0Vm;BIxl3QEs`I8{%5Pz zd|<-tj^X(CQeln}g;DL=q4xV%B+A=bG^enHa+#uSFl91!t)VTJNQcA>iKI(xhh)wW zwF3|(*PIxeZmM?AE7CQ7($F|vmmx#xfptmAbX5a+m9Adpe79}vpDg0JR#*C)c9AXJ zW>+hWm{c1!>t2u~T&1mwLs6#pnsiCYTrfJ#sGMe>oM6N$5bJezjK_9HbLw zCZOBvs~AtXklRYX1*0RHhN+2Gn_J_=NG@H zf7)MBOHV^miOB4b%=FR1%j_*SI)p6KZh->xQ&P}~UpA9tMhnr_4?zi%D zoO|+y?jkyZr>o(zcv!nd#0sr^m)InzJ{>Qb-k<#`DXBe|4y8h%E}rD%HY628AP3lI z9ycfT#Iau$w=^&(FMr#nQ6eppL61^pgoD=NPykb43}@`5n$!0i{n&&`%|KRBf5f%% zpks!eP(Lv-D>KnW^R3p7dbHT4!SfiqG)SdLT?1U1vJSc%8`~YKI%AUAR0nB9sAxh$ z7f1Sdn&J?G^iZdY)h&9w#zwB|&$vgEoN{G{XZNQ1-i41iVQvrF^azLK%=m9h?exc; z;^M3H*Pqcfp6&k!UZPB;@=2$v-ou{Mnwj?dk%SD1_r5XS0KD@*`k>woqP$MSKA|aB zS`Ez*dx?YM4#J{;J^B1pY2CqE9EdRs)-;ic^LzB)Du~bRQQ|gRXG!Kk8 zu2C_Fj8xPcoucTMB}*D;-Xb8UfVC|KY|@YzsFN{9m535ua;j;SV^c@;+U5$|s`vzq zi^sGSsn}F=8VuOB>vRhjQ9DDFxonv>U43z94cSR_jW$<)KE9a`L>Tpu+{N=sj7f3o zJ}HkM)_ps^^QFR+&TJ;-ILu|7ioTGAa^qip({^;tfNQ%r&MLXT`Xi#;_5f!daEZ`v zlB=O_0;-HKDl<$07G+3*M7+Jfecg~XAkiMFS}YYjY7}LZqSWwo9ApY)lp=T9EH<%v zlL9#|Vbap9eMt>%u~Ab)Qg?5oeoQ-E*KRfxgHI1nD{+Pyq~u-HWQt=1NsVNgi)TaK z*nN!^wnWLT0uG8xibo_q5hVgDD0K>qOHs;`bw+k#OdiXWTW9QJ$4Dxn9=oz&g3S#( z$gfEQCp$uJme8#xadj3eH6n?~olP>Y^OLj7|5ZT#r}%?qp$|luEW|nkQtc3nx4CA= zK6^q+c+&6q>U7KUiSUehpn9JU6H71N5JScmnYn;w8M~}v-_`?cF=}zep~5VO%t?;2 zj|x5dY_cnc9f~Ak(AN!F1!6oRamm!+P@?2iDeD}8c?X+?%rU@0bc2MK+E*p{+7@Mh z$nwsjoM#{rnH75GyPGe|7^57Zq64*N&|c5oYwPM4TrnfQiWOzMFY(Gcow!TFP$N>} zTfLHtXbB@FjE-Vuo?H&%%Y-+9KQaMLm6_2wosUXVD){0)I8IpZ*=Q%CxRywOuO*C~ z!|m0;uTf$@buCh$OP0;hi&p754U%^v&U14V9{e0Lzn{?i&woSncemajaXt`Xf*owU zMORl@lg8i$-Pb7Vpx=;}pZptrDO;Am6Fj5`zwlM@Z|qQPcU8*k(zxo_=w*1(i-WzYZX5)nv|Ip#Rcef8gw=@a|O*PrM5>NBJ$WAw!#f8CI^iI3o8$pnlP z-+5JYr_BOuTQ;SymkIS|cLSfUZqn2%bVcw?fQyTYgM;9!kgFMNie7mI+aIVMsgb9t zgj<_5w=dGPZEc~nu!N*GMU96@fFm`~X{;Q?k-5S&BZoewg)^sNq5`3iZu;0pqflL4QC%iYoe7zo+b`7zrmQLNH?lUV zsve_6rXa)D4Os!MwRoD5lYsH(%3r%A5myR^PlW=Z|9a4`6`h8p^il``?l9fe4d)4%gX_O~1#EDt)^Y z2O?zABB5WTY+sBoNcJ@HQ01g8wZS#Jl7=l^$CDXmu}=#}?lI=noE_^GVQE-ypwl!o;U3%HJP(INy$MI-e~JXePe?dDQTqu{l6APgjMj^s-2$y&@0( z`?FH?6D~HESs~{%GkkvfamGIRD9y{yi!MB)>v&8NQ^hqIC2is|K-n2)crRU(8OO6@ zhaaGR=pL!e6mZ?1<@y0J7aZBQ{fcZe&~1#QAPK(hQDv7Yip5!+k%~%1q);|U_Rcm7 zFxJ7~<5I+xDn_SJ*^eVLg=rl<_>h+FJAq6VkvP`m>Vza0Q!&k!3JEDG39T(*i3hG{rE$B~wMELrOxZ+cep^_N*Pr1-CSB zye~}U!Apmwcy$8um0WqtFlpvGmg|Hc+A7JNM(q7_9?LC9=SEJj+a1wwu0C0}Xu5sT-KYWeNrkQ9Hx*RGor~ zEAMQxP*gy0a9%GX)2QqtV08R|mLI&wxDSut%2Y-5$Ix=LA;Dll%5i7|LaQWXxa?<4 z9$}U;v$BInlXY4&?a+2j<*k!^t2eIWY@E|dd;_13C=p8f`Xqk@Yqsd=1=gjr^Bntk zhjME4Og>SWC0tykod=Rr)Dq@)96mD3YUg_ld;j#pQ^5cmmDhKI0d92tjT_0G8`w9Y-A0UPom=6S_^?Y+rdcAA6#!I~UiaZR?C+%$!@t9X~-Fj7u#}WVE}X4A!M4 zC5p8wW?xCXiMJZE+(KDO5$tWr^`%H%PMCR49DG>4LRIps4Nb?86xRy>xu9JD00wMH zL_t(T^vBpNK=rmE%m*zZ1mfb=MlkzIV#W|t64lhew5R@biRyw%Ee@qjXbhPx63Bh* z<8zarr~KgKGFWT#%$09wBkyX9p4Q$v$v63p1xZ&fXqa`hMS6RZ9}TcUhSdz+c$Ii6 zXH(V)WLHOIq%}(I)hXOyl6k+(!K6S7uenP0v)G>UfqIzge}26d_TTXZuA^KhdEIbz z5;JHpEL>nm*?O7j|9F#bKE{J{k4PnqG?0S;*It#N-&T`FkR_^V zz?%$NMs1QSV98OG5{8-48LD4>$Vjno!>?T?etu2kO%I`I^yWL-EUd-Ko?5e)afDoi zM9KOhc?4PU4TdnuJ5tb|4T#kv79kanKxT05=*h#b|HU!O^KHskB38)lbz%v!Eg9bk zP4UN1@_QR-DPShfX|^oczAsbDFVb)N~dZ^%rFQl98*p)e8J9 zwx|5uPj9$1pm6*Q`*atZpJT(>&4)}7Q_i=k77tOn|Fkh5o5U7`yr-%~qjuO5mfDiG zRyAFmRvDc~CtM{B-;gO%Vok7Q3^b+3Fx}R4_nI~3P~zT2X|HaQ-3-;*K6%)DTbo5l zD*0OtVWiqNwtdCgrGsxUgz1gz*ww3Q!(CEh3CUGS$;h=u!wDC^mpjjG$>8FmHuI}= zY0EO!8giMniH!8y6#C}vCizK|uvB7X521#wO9b~E z#hWdoqavvDnXVCQ!ce$ zl6(Jn6W7bRv2%k(y0l2#<)6)5>E}wAKZ?;mPzEG+iJ@(XA;rNrKA9=YKt0=2vKV7a zYOLZo79$af?Gx!x#kR;B9nPkcd96_&D4EYtf%nMqbZUDX9!dd5)n5h?7B9MNAb(mCQ!O6!w&Dxpnxh=6mPr z-8soGDq8q=Z+|LPCiIgY@#_nU9+|UBUcUGdH&DH&M%f`xw-_>tYJ&H+Dc=pZtW1oc zQBU%v>m=LPv~QbiVd;~q!+?OH^@vDGrAz#JrWi7m0g)Y&J2{aWhBm_`!L{L!56*3y zg*^&7AXk?}9foQ^EIH9nE+cmu!b}K-#XZ{wKzvi4yhPW#cD?OZp+ARLzw^Co3{M!9Z9e0NyK_s@e%8@=fM;(d$tRe z1l$WB&BGBtl#{^IGni}~SLy_eP%&dvnWV%4e3`|S5nKv;imh#v>n2vOle0ytT|!bK zAQFd6b#J5B?M$I>G-PorIJ}?Wy+O^ zwM9ykSi6LDi3y2SNl_HDXJ33rL)MRW2fXJ1I+xM>9_&xEjQpbGL;GI?_BaxcVWfsf z8J`M)ln4m+Qa*1^`8^VbMA9O$F`0?5IOxwSjen3#b(b(dCEQK}Npla9R1n!) z^1hz(c~i>Q7_0vcr2M;txtsFu;x6vuF7D!8;lBcja>1SGs0WGw0000Foe&EP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L00w9P00w9Q#Je-J00007bV*G`2iXJz z69*)7@_|+W03ZNKL_t(|+U&hqtZmnIruU7xn%y_2Klj|eZ`q3!DN1Gaw##<8tg@>F zSDZWsaSB1=3XmX$BtRY#AV4LLmB2^=Ri(HTM^YkNwj^7WNr{w1QtWyAbMCpP?{~jf zKj+B9B`wLZY)O_Z+UEbTu@~0H!or^a8uK6Rf_L#Q-o?9k7w_U-yo-17F5bnvco*;D zUA&8T@z())r{Cbe2#{ZHBhSU?e=$OT)a&Gj5$A#HL1plxU*~NUClDKedLRL)f=R(z zsNDIhU;kag{0R7L4f6}{V^%IQr3dWoe4YK{tGFNL8ukd1T_lt?6+8?>GF>96+@SbT z?kPKkXdNNIxC(-Yh=-sk7S#fk7$;-2bn9;)ar}4k&Hdt8s^-_c_wWl3{S0>&zjUbR zeUnw9ADAqYNbvv_bBP&qfi@*PT_V;xd!sP}(?Xm@(>;o*{qGQQFoWmM;s4ol*+q

    n*sXkuTcGo!VdFg$4 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 diff --git a/examples/widgets/animation/sub-attaq/pics/big/explosion/submarine/step2.png b/examples/widgets/animation/sub-attaq/pics/big/explosion/submarine/step2.png deleted file mode 100644 index 524f5890ee48dfa6fd5a0ae81e5ea4079386bb7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6205 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 bGT{FJk2DHPU)42(00000NkvXXu0mjf6vQ2h diff --git a/examples/widgets/animation/sub-attaq/pics/big/explosion/submarine/step3.png b/examples/widgets/animation/sub-attaq/pics/big/explosion/submarine/step3.png deleted file mode 100644 index 2cca1e80feb31a1954e8976d1557d27d71bb9b70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6678 zcmV+x8tLVUP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L00t=l00t=m>D`n$00007bV*G`2iXJz z5EmZ(di3l702!7^L_t(&-p!iHuV=?~-#@4B{F~oA_3Mev=4eussM$6lDRu%wLE<0? z5M+@ovP>5FGyE3>aJ-0t1PS7WZABL3S(I&=lti+{shd5&e%){W&BL9l>SWQ>V2TzJ z+i`NXRdws!&#gMQ>U)mxH!#16pkR(s{y((ICK9b+v_qgV#v3H^sH^aPj>}H);nDwn z-^2eCn6`(p&(O48GH3CNLuTq5P4emYmalV3>21o*bm;V1uxYbhxKZIE?AgBn!&$6LcO(!hXy4Up7Rvi11 z(#IGTBm(a${A`L#hq%9w74jpn7m;e0C|n|=Lrc0eXb?$&p~h2EGGk#v=1$1-63Y^z z9ReR?yv0O{+7g}2ap?#bAK^bbPtitbLzyC?5a($6G4J`;!aco+;YGUPXW7+VSqjH0 zyicT`%FglJ=YB=&!Ko~M@Z0{7K;}%s4Ef;-32G|36m^rb&Zwh%KkeXO`G{9Ayhy_v zM6NSW-u>DAKhDZ^q}n2sE=^r#$*j`jJPlR|O@?TJV?@aV3hx+8&Ws%@O%bz9NK9lr ziFlfU$D5p?+a%A=kq09TFVgk~%X`e|AT$WWkN|^X@r#SpVILRY`myhSE!@sF5m#8% zSDMeU{^@_N)6*e~_ui0j7O6BbL5Se+%&1x5BxUYA{nAhv z@U}ody5)Ybfw-Ti7yOHr&jw)_>eo)bdw;Aa7x#bMXTE|+gh&b~kOMXP!{;nE5Vu5V zphd(Q4c6GCYcA53^>|g&s9|h9^k>zHI%Z}{=5lgLsYpRuL>kbRkS#7J&l!x->-jaE z@quOx-4%Mlzgqs33Btbqx0AR0oI2=`n3&KjP-DY6xo?tJ303?q?q`RE27#tDq_Opq z$QS>Cj~>lQuRqWm#{-qGe@CjxKySO4m}Sn9vVlsB@i~rD678f{aAD0~%--@-hSoC+ zru1DvH67rCCL!A-YB6jC8+_tZ|4f6dE!V$!cXzWqWgnevB0+~hIz*ZhxsbpBVsXBt zUi7gh16?MPkdAM#Ax(B^vnI>5+3sESn@@j2leHD8j}FCs@O>JSJ>Q`)js-$t5`-pQ zX|bX`cJzt0F9}ggI!71fgZ!Jm&ux~aqtCqfJSIDmt>1rON>}STsdNd92c|eZW+4$1 zFHGkPisoJX$HKK25jVu>AtE;(?fIQ=e2086W$H`q`$Eos@G5fxMl|TrHM_Lfih7cU zjlkAppW2Yk-CrS(8l1hq!fG5C4QITu_?DS-Cuk#bo~}GcTSMT6L;mcw-=!Nly2 zvlhANa93CS66@FAq;wM+EHq$1i@+=gFR~tN$ws4tn}W{+v2Z;Y8zAPC+J7%Ule4$JNrRL% zjA@D2k%~--e2bnek!iPaPCJ)=j`sSh_|qd<+`Yq{JBJtvd1d9(vcB|$j?9eXn8s~%d{JyJM_}BAO6I1C+G=k?$kL~prG`;W=I44W{Z=2xc zEpl~!Mw2#+YygNeRpniOEn^DwKp?_X+K7o|m#V=Je=o z`hwJ3u@9%aZ1Dv7ojox!lu!NZU%*6xPJaE{euV}RJL<@Eqj6Q5zxwY9vp~-O=b2wW zIj!EJT0TUpT_RbcBP(pmDqFJ63fpATA=aF()bzB`y2MOW_NE`GXJVc-%d9n?Cw42+ z2~uKKRQqk*nNbhwPr;ob>tB3E+e;DVn$xqr>3De{p{ z-{}*@A-1e#)2z#iKhr}*j|!2aAMBB40S~5D=Cp!k8ahX%K`ae=^jMQ!R^%C0WGC42 zQMfH7Emck7rJvV+XvBRdFlx{IQ&(R$-Sf|?FG9?=(Rhq3J}_RsB`PZ_)BT*qty7

    !G@0B$5c9ZHauap;Y&PoDeZBLQUEmYR+E>%}xV# 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 diff --git a/examples/widgets/animation/sub-attaq/pics/big/explosion/submarine/step4.png b/examples/widgets/animation/sub-attaq/pics/big/explosion/submarine/step4.png deleted file mode 100644 index 82100a8260a77dcec4c8d43592a53394c0ae0313..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6666 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 U-6gfhiU0rr07*qoM6N<$f_Zw)i2wiq diff --git a/examples/widgets/animation/sub-attaq/pics/big/submarine.png b/examples/widgets/animation/sub-attaq/pics/big/submarine.png deleted file mode 100644 index df435dc47d631bf781053627b0a108d9989080c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3202 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 diff --git a/examples/widgets/animation/sub-attaq/pics/big/torpedo.png b/examples/widgets/animation/sub-attaq/pics/big/torpedo.png deleted file mode 100644 index f9c26873f18aa9c391f1c5acb72ce5d128c70e95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 951 zcmV;o14#UdP)9MF^H|EVJ=#>c*A0Dg(3WA7Hn$8U&XCp%qe)>;y3cB9U3t7^S3$=H*)7y(i;Ih107#`$vJm1cN~yaiL@D)ImNh#+ zKMw$i$K&vLJTibU`Y9#6UM~v-0ssI)2*$_9?*SzHLStiN_m2zVa9AURO!b54yWm(-I z0pPZmz2@!ht)svggDlH;<#L&Kg&1Q>r@dCI12t4 z4a0clfDFUPMIw>ctE;P|R4Unzq2uFY%+AhYWMt%ZGMUT)fE0~JHC0vLn5G#p41?6` zb%)Z~*_jB1LS$uSC7`P6n`ktuNdp4|8`*63g~#JTFc<`5%(3V7^)q* zIrjJWq3b$%=zW+AOPZ#&iF`iaDi({4%gf6@8DqG(xDd@|^QKa%v>s-3T_0%sFBA%Q zhlhuy_4Rd=5MuA{?uu5cW#@9a?OLr?IyySK0{}t@k%SPa)oRG+^R>;*&Fx4e(nzP% z8`WyHGBq{zLpq%UYW^c-VY8AzPq}*(j}kI_p51|Zvoh!O4Bsos;c@6+1c6o zG8T*7d~B$Dl*?t|ip64o{8In`D5W>957JKw?!w=TJ|*mbqhvpu(*HaC7p3R3$Dd6} Z`~@y*Uq6)_|FHl7002ovPDHLkV1h*#x-|d* diff --git a/examples/widgets/animation/sub-attaq/pics/scalable/background-n810.svg b/examples/widgets/animation/sub-attaq/pics/scalable/background-n810.svg deleted file mode 100644 index ece9f7aaf14..00000000000 --- a/examples/widgets/animation/sub-attaq/pics/scalable/background-n810.svg +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/widgets/animation/sub-attaq/pics/scalable/background.svg b/examples/widgets/animation/sub-attaq/pics/scalable/background.svg deleted file mode 100644 index 0be268010e4..00000000000 --- a/examples/widgets/animation/sub-attaq/pics/scalable/background.svg +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/widgets/animation/sub-attaq/pics/scalable/boat.svg b/examples/widgets/animation/sub-attaq/pics/scalable/boat.svg deleted file mode 100644 index 5298821ba8d..00000000000 --- a/examples/widgets/animation/sub-attaq/pics/scalable/boat.svg +++ /dev/null @@ -1,279 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/widgets/animation/sub-attaq/pics/scalable/bomb.svg b/examples/widgets/animation/sub-attaq/pics/scalable/bomb.svg deleted file mode 100644 index 294771a6ddd..00000000000 --- a/examples/widgets/animation/sub-attaq/pics/scalable/bomb.svg +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/widgets/animation/sub-attaq/pics/scalable/sand.svg b/examples/widgets/animation/sub-attaq/pics/scalable/sand.svg deleted file mode 100644 index 8af11b7a666..00000000000 --- a/examples/widgets/animation/sub-attaq/pics/scalable/sand.svg +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/widgets/animation/sub-attaq/pics/scalable/see.svg b/examples/widgets/animation/sub-attaq/pics/scalable/see.svg deleted file mode 100644 index 0666691215c..00000000000 --- a/examples/widgets/animation/sub-attaq/pics/scalable/see.svg +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - diff --git a/examples/widgets/animation/sub-attaq/pics/scalable/sky.svg b/examples/widgets/animation/sub-attaq/pics/scalable/sky.svg deleted file mode 100644 index 1546c087a7e..00000000000 --- a/examples/widgets/animation/sub-attaq/pics/scalable/sky.svg +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - diff --git a/examples/widgets/animation/sub-attaq/pics/scalable/sub-attaq.svg b/examples/widgets/animation/sub-attaq/pics/scalable/sub-attaq.svg deleted file mode 100644 index b075179b461..00000000000 --- a/examples/widgets/animation/sub-attaq/pics/scalable/sub-attaq.svg +++ /dev/null @@ -1,1473 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/widgets/animation/sub-attaq/pics/scalable/submarine.svg b/examples/widgets/animation/sub-attaq/pics/scalable/submarine.svg deleted file mode 100644 index 8a0ffddbcad..00000000000 --- a/examples/widgets/animation/sub-attaq/pics/scalable/submarine.svg +++ /dev/null @@ -1,214 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/widgets/animation/sub-attaq/pics/scalable/surface.svg b/examples/widgets/animation/sub-attaq/pics/scalable/surface.svg deleted file mode 100644 index 40ed239638e..00000000000 --- a/examples/widgets/animation/sub-attaq/pics/scalable/surface.svg +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/examples/widgets/animation/sub-attaq/pics/scalable/torpedo.svg b/examples/widgets/animation/sub-attaq/pics/scalable/torpedo.svg deleted file mode 100644 index 48e429d2bfb..00000000000 --- a/examples/widgets/animation/sub-attaq/pics/scalable/torpedo.svg +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/widgets/animation/sub-attaq/pics/small/background.png b/examples/widgets/animation/sub-attaq/pics/small/background.png deleted file mode 100644 index 5ad3db660a9d04f63b7359f4b38e3d324f63595a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34634 zcmXt_1h?SsEE*Pf53&SzXK}(VED4Z=;JP>@xCEDk;O-vWg8SvY z|9fZ7oH^59X1c5T>0edX#A|D*;Nt*s0002KDo9ZW06+r*04O!sn9nU+=p6>nHxw@& z6?s7AFzxR11E!6-iX!0YzcZ(;_|tRC3wMyQ7XX0c``?AKopFzNZp89d)l|Zo#UUn; z5W9­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 Dwh_V! diff --git a/examples/widgets/animation/sub-attaq/pics/small/boat.png b/examples/widgets/animation/sub-attaq/pics/small/boat.png deleted file mode 100644 index 114ccc310e56095a7c194c41fa426c3390218d28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2394 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 M07*qoM6N<$f^T($l>h($ diff --git a/examples/widgets/animation/sub-attaq/pics/small/bomb.png b/examples/widgets/animation/sub-attaq/pics/small/bomb.png deleted file mode 100644 index 3af5f2f29cc3b6bedfb06d98ffcb67377514728a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 760 zcmVu4`a zL>S5QyoYP%a?NbsO!3m!(m9H(O3fx0@Ppa$#gn>zgnpfM#ieuYUFaW_?}Oz)#604 zNTpgqDf_PHd8bD{YxF{)PX)YPT_QOsC!c zBqC?E)=}b5yEQg8b~RrpB+r#fequ`ywnXEMQEGF)>jTkxVA12621?c#|j=i%*xA zm#;Nj?excu4Se6nvf$OL*Id4Q1!D}WFJDraD=_Hy0bzcAp3Tk8d%o`*JDZ&>)wZ@y z?flrzxUOqWWV3`(NGg?Lb#;|;xy;PW482~DMi3AVhXg^B;h^6Gb}bRX^E^i>RhiA_ z^HWpPWHK&J!Xb_g{lS24w@0(tWN&W|5g|5FYd?-}Xsurytl<0pL)&p4jE_%@C2X5i zI)$xlhG9sz+hx%2W2xV(n{fC}L@sEp<$wbbc@#&{X9Zk1UqbKf@_l=oAPDGnI!sKA zGc}pTgyA<4xvsUAe?Zb&?~BMKkp9}*I$;$41*ovs>5xvlMr8lC)_UtdkVf*49QlgK qCJ+F}fFw`@QX-rIDQT@Mqx)aTQj$ikEBmuG-L$JV>DF#ob<>6Gs;wH-(Q2)6k`^jPV1)Sr=FR^PZ{EGP z3(!~tNP?+fa&zzE&$y1TobU0q$@wfg*>LU76$r-or5k%&*GQmLN` z`TY54G|D#Y2mpBzf`^8NMoxZqYUuK%OGwS7kj-WxQ3-X{I#5Y6bJ^^8Dw#Z=OeVjI zMxz^YC~sITfX!}qfH8)J^a3(^2Kjsrk|e`sv!Q8|OWqR-Z_i~jomZ}0aRK<`d3=Nr z$?Nrg7zhN8l}aUY_wLpAQ_^D#Ch+HmPOQ+MB(_efk4Gj<5Bq}NORx21= z>P=nO&Fj~%|CmT5{(72&2qAFj(BaDXzvK3p|NpAo{X;J;e!e2=>`0G z=Z||=uU_3Lo^ebDj~+Yv?t2H%_V@QSIqY_5nz}5aghH{1VyTR3wF;wFgUR@s8O&xf zn7IEBl8HDLt5p;W1(YjgXqpDMy9K^2ThQwB!|rf^5V9s$Y( zwyy2J2qC8B=9ZSv+uPflYDNu}N(BHwDTQGeFijJjF)+r!O!nlvR)gJcM{i$0IAbsw z1Lq8kaS#A?Rx4zAsRH?PcmTlbZLM!PGWe!VQGV;$+554>uJtS$hF1n)o!52biv?I@ z3nWPbApqwbrpZtV(LI@<{v(s~Pb7#iyPfYqep38+&@y364 ziGhKEL2G^eu&Szk4yV)oGBR!$2G3=)_p6o4&1$v!&FJXp1Am}xd#l&;d#PNGthoGy z!(pE+%O@zMK}xA#k|YnM)J`eYD5Vl11RDv4bN={LIOloB*gWTahI9Uib3SUC=FgEx zLxUjBmEffl=05$_~QA+)U5I+Df06QT>C4{H|l;v9mpkQf=76254 w5Je%x<9AL75feg82q9tsl95PcVZFir3vH`6`5&T+-2eap07*qoM6N<$f`uk;1poj5 diff --git a/examples/widgets/animation/sub-attaq/pics/small/surface.png b/examples/widgets/animation/sub-attaq/pics/small/surface.png deleted file mode 100644 index 06d0e47a5c1a55fd2d2303a2928c3db6987bbb6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 502 zcmeAS@N?(olHy`uVBq!ia0y~yU{(OKO*q(qWYPVY3LwQ&?Bp530R%N1DIGvQXMsm# zF#`iv69_X(`Zucq1tm*dBT9nv(@M${i&7cN%ggmL^RkPR6AM!H@{7`Ezq65IU|=lv zba4!+nDh4T!B7@M9v8>M!t5Ohht+k9Zc0u*I=^|f(ub|_-q()5{+=(!z~GQ@?d!j~ zUxEw_2PD(t-_Ktz&&a?q$B~(dfgy!OfPq25`1dX_ZFriGgMmR{W-bdi14BoK0|P@t z4;u>u!-+GSTKE_kTuc;zh8+W`nNZjP)Og~|zW3`PrX^mx_xX!5P=oQATiY3cCaXY9 zer?vo3Je9X&a`bH370=0k(9K%Qa}?HB(j6dmpBNNFailE7~hr!QHvOXZZu*7S+x;l zcgh{GfZGO;n*?=03Zp?Da7o(9MF^H|EVJ=#>c*A0Dg(3WA7Hn$8U&XCp%qe)>;y3cB9U3t7^S3$=H*)7y(i;Ih107#`$vJm1cN~yaiL@D)ImNh#+ zKMw$i$K&vLJTibU`Y9#6UM~v-0ssI)2*$_9?*SzHLStiN_m2zVa9AURO!b54yWm(-I z0pPZmz2@!ht)svggDlH;<#L&Kg&1Q>r@dCI12t4 z4a0clfDFUPMIw>ctE;P|R4Unzq2uFY%+AhYWMt%ZGMUT)fE0~JHC0vLn5G#p41?6` zb%)Z~*_jB1LS$uSC7`P6n`ktuNdp4|8`*63g~#JTFc<`5%(3V7^)q* zIrjJWq3b$%=zW+AOPZ#&iF`iaDi({4%gf6@8DqG(xDd@|^QKa%v>s-3T_0%sFBA%Q zhlhuy_4Rd=5MuA{?uu5cW#@9a?OLr?IyySK0{}t@k%SPa)oRG+^R>;*&Fx4e(nzP% z8`WyHGBq{zLpq%UYW^c-VY8AzPq}*(j}kI_p51|Zvoh!O4Bsos;c@6+1c6o zG8T*7d~B$Dl*?t|ip64o{8In`D5W>957JKw?!w=TJ|*mbqhvpu(*HaC7p3R3$Dd6} Z`~@y*Uq6)_|FHl7002ovPDHLkV1h*#x-|d* diff --git a/examples/widgets/animation/sub-attaq/pics/welcome/logo-a.png b/examples/widgets/animation/sub-attaq/pics/welcome/logo-a.png deleted file mode 100644 index 67dd76dac0a6537a4ec6617425a9c81072929993..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5972 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 diff --git a/examples/widgets/animation/sub-attaq/pics/welcome/logo-b.png b/examples/widgets/animation/sub-attaq/pics/welcome/logo-b.png deleted file mode 100644 index cf6c04560b9744e3b0a1cb5a9fb3a4bfd963ec95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6869 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 P00000NkvXXu0mjfEun@u diff --git a/examples/widgets/animation/sub-attaq/pics/welcome/logo-dash.png b/examples/widgets/animation/sub-attaq/pics/welcome/logo-dash.png deleted file mode 100644 index 219233ce6bade1da25839dd21042d25ac2a9894e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2255 zcmV;=2r&1FP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01b%&W)SP500007bV*G`2iOY* z4h<$BiX(df000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}000OoNkl9v?Z<-#;3U#YVQawuI+6ghCZr?YP|8* zTi%VyNy$#$>p1avCOtGX8jHm;TU%SQTCEZY1Z0m_9f=kTN0rTWwOA}7T@S-B2!%t4 zrCT@)bJ(_x9ZMp=euDX;MLF3%F*7~&(#gjj`|#Yaf7OshyB8$Twd~0B#2XXtn{U7E zUb^%TZ|BAhx971_y~CNza3Yx;F68q@s=M3k>+6$EO-){RwVVkRwnp8Vt74~E#Bm(_ zegkcF8Q;b#=ItGN<3SSf1aW_i7CnGsNE`!fAt{P7ODl7zijS$X_4GpzJtRV*&`VOv zt3rr-3;6B$1mmy2KJedb*U~4x`&4>xXebj;B-85~>#pB0yi=!6x#km3cmwfRZ*wu9 z7HhZIytPQBVxy>nfEh%|euB1^#lN;mswF@yo*-$&F?AOqY#ay37Iz!-?9`=#e zRt|r%jcPPWp|JJ+f?>?OKQ})ER1Otz>O0@#4`6OFY)FiR| zHdd*Gi-*r=V9ZvLt4nC>tMs~6T3X`75;0oBK6Jyw6J^RakS!sz3%~;I|C6FQXt%R; z6fMlYA+A@eBUdITM}ZF-3i#Q}zfdk-{LAT{-rh6DM)ufH)k1y$GVbklyyX?zLMG9s zCYqX~G{s^>d=fO5s=Y&H6Xg05^5Z33!1`r>Zghl;%uzG^^L z)p3&T#AC7kM;?Co*)kk8U`D`sDdlA$1j;L~yn@fC3;*UiBh4Yy)#C1GwI*uqejYr` zi}g0*5c@md@wLE4ZyT%KM<_S9(348h-PP4sg>P5jC%{X<2`MF7{*zmTmlp7EtP}Tn zSapNQJ5oo;`+N4z=ZD!HmU?EZf|F=tt$UEmr3!12INhViNT<`7rb*d$sHzH8Re8b( zvj%*u0U{EP3ez+R`X$yqye#VgWCNIbcwYdNR022I$&Qrd^Lg_50^5Z=J4Kg@4R)=1 z>9&e(D^&au7IkPH`x=={hJpSgXsQZ;=el@8K`1;6C>kKPa+@TJMYe74&~VGTP&a}% zyG*>+PKwPfEH5v!nq8$J1y)s~Y6~ny$5KN$VFNE5LlY{RreXMWR87ZBXHeTaaU)Ii zd6J>QLB__$h{xiH8iYXLI8}sC?*N|DI@7}xJ9~s>?XXt5O;dw#i$hXF>-1BNw~`Nr zSy)&k7YLJcH7r-B;BUt13KMK^Cpb8Q(RT#lGY};U$Eo6Z9-4X}K+|-Ds^HUflFv^Aj(qg-ve*~6|&lsPd+(gO-#%bi-m!yK!m{HC?h*LlFAG^%8 zsjEaQ0?z~6(aHOwSlt7d14C#%M=(3O@k%9hT_+d{(G-mmPbBE*=%B5&m0&1{D(Wg! zqY8kifyo;1fq^)mA%?*bQ~ z?rz{N0pq|Y8bE(rt0kp;?Ki*s{nX#ydvEyMrAd!U*#*2G_6iYGIm$EzQ@YQ}@@En)|az6G`TmUP;j0;m`$nV`(K^VKwr-7S$ha2rv z?6qcrkAbm0kIDOZANE7NKY$C%66SW7BUV(HQECF}g0cckt56Mz`)>_Djewb&YF7pI zum~u%kL?ZV!K?yXfK>yU2IgvySAb~&ju4;ie}(%B5JE^PmPOEuv9 dmjPUV{SSAaTT+t{fMx&y002ovPDHLkV1nNCKfV9} diff --git a/examples/widgets/animation/sub-attaq/pics/welcome/logo-excl.png b/examples/widgets/animation/sub-attaq/pics/welcome/logo-excl.png deleted file mode 100644 index 8dd0a2eb867ef2aee7ccdaa2b63f39633aec51eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2740 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 diff --git a/examples/widgets/animation/sub-attaq/pics/welcome/logo-t2.png b/examples/widgets/animation/sub-attaq/pics/welcome/logo-t2.png deleted file mode 100644 index b11a77886ec918027f72fcb0d8200581d79ddaf7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3688 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 diff --git a/examples/widgets/animation/sub-attaq/pixmapitem.cpp b/examples/widgets/animation/sub-attaq/pixmapitem.cpp deleted file mode 100644 index a8581d881a9..00000000000 --- a/examples/widgets/animation/sub-attaq/pixmapitem.cpp +++ /dev/null @@ -1,87 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -//Own -#include "pixmapitem.h" - -//Qt -#include - -PixmapItem::PixmapItem(const QString &fileName, GraphicsScene::Mode mode, QGraphicsItem *parent) - : QGraphicsObject(parent) -{ - if (mode == GraphicsScene::Big) - pix = QPixmap(QStringLiteral(":/big/") + fileName); - else - pix = QPixmap(QStringLiteral(":/small/") + fileName); -} - -PixmapItem::PixmapItem(const QString &fileName, QGraphicsScene *scene) - : QGraphicsObject(), pix(fileName) -{ - scene->addItem(this); -} - -QSizeF PixmapItem::size() const -{ - return pix.size(); -} - -QRectF PixmapItem::boundingRect() const -{ - return QRectF(QPointF(0, 0), pix.size()); -} - -void PixmapItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) -{ - painter->drawPixmap(0, 0, pix); -} - - diff --git a/examples/widgets/animation/sub-attaq/pixmapitem.h b/examples/widgets/animation/sub-attaq/pixmapitem.h deleted file mode 100644 index 45e2ca806f1..00000000000 --- a/examples/widgets/animation/sub-attaq/pixmapitem.h +++ /dev/null @@ -1,72 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef PIXMAPITEM_H -#define PIXMAPITEM_H - -//Own -#include "graphicsscene.h" - -//Qt -#include - -class PixmapItem : public QGraphicsObject -{ -public: - PixmapItem(const QString &fileName, GraphicsScene::Mode mode, QGraphicsItem *parent = nullptr); - PixmapItem(const QString &fileName, QGraphicsScene *scene); - QSizeF size() const; - QRectF boundingRect() const override; - void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *) override; -private: - QPixmap pix; -}; - -#endif // PIXMAPITEM_H diff --git a/examples/widgets/animation/sub-attaq/progressitem.cpp b/examples/widgets/animation/sub-attaq/progressitem.cpp deleted file mode 100644 index 350dbb7bbd9..00000000000 --- a/examples/widgets/animation/sub-attaq/progressitem.cpp +++ /dev/null @@ -1,77 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "progressitem.h" - -#include - -ProgressItem::ProgressItem(QGraphicsItem *parent) - : QGraphicsTextItem(parent) -{ - setFont(QFont("Comic Sans MS")); - setPos(parentItem()->boundingRect().topRight() - QPointF(180, -5)); -} - -void ProgressItem::setLevel(int level) -{ - currentLevel = level; - updateProgress(); -} - -void ProgressItem::setScore(int score) -{ - currentScore = score; - updateProgress(); -} - -void ProgressItem::updateProgress() -{ - setHtml(QString("Level : %1 Score : %2").arg(currentLevel).arg(currentScore)); -} diff --git a/examples/widgets/animation/sub-attaq/progressitem.h b/examples/widgets/animation/sub-attaq/progressitem.h deleted file mode 100644 index f76b1681513..00000000000 --- a/examples/widgets/animation/sub-attaq/progressitem.h +++ /dev/null @@ -1,70 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef PROGRESSITEM_H -#define PROGRESSITEM_H - -//Qt -#include - -class ProgressItem : public QGraphicsTextItem -{ -public: - ProgressItem(QGraphicsItem *parent = nullptr); - void setLevel(int level); - void setScore(int score); - -private: - void updateProgress(); - int currentLevel = 1; - int currentScore = 0; -}; - -#endif // PROGRESSITEM_H diff --git a/examples/widgets/animation/sub-attaq/qanimationstate.cpp b/examples/widgets/animation/sub-attaq/qanimationstate.cpp deleted file mode 100644 index 6da085561b2..00000000000 --- a/examples/widgets/animation/sub-attaq/qanimationstate.cpp +++ /dev/null @@ -1,154 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qanimationstate.h" - -#include - -QT_BEGIN_NAMESPACE - -/*! -\class QAnimationState - -\brief The QAnimationState class provides state that handle an animation and emit -a signal when this animation is finished. - -\ingroup statemachine - -QAnimationState provides a state that handle an animation. It will start this animation -when the state is entered and stop it when it is leaved. When the animation has finished the -state emit animationFinished signal. -QAnimationState is part of \l{The State Machine Framework}. - -\code -QStateMachine machine; -QAnimationState *s = new QAnimationState(machine->rootState()); -QPropertyAnimation *animation = new QPropertyAnimation(obj, "pos"); -s->setAnimation(animation); -QState *s2 = new QState(machine->rootState()); -s->addTransition(s, &QAnimationState::animationFinished, s2); -machine.start(); -\endcode - -\sa QState, {The Animation Framework} -*/ - -/*! - Constructs a new state with the given \a parent state. -*/ -QAnimationState::QAnimationState(QState *parent) - : QState(parent), m_animation(nullptr) -{ -} - -/*! - Destroys the animation state. -*/ -QAnimationState::~QAnimationState() -{ -} - -/*! - Set an \a animation for this QAnimationState. If an animation was previously handle by this - state then it won't emit animationFinished for the old animation. The QAnimationState doesn't - take the ownership of the animation. -*/ -void QAnimationState::setAnimation(QAbstractAnimation *animation) -{ - if (animation == m_animation) - return; - - //Disconnect from the previous animation if exist - if (m_animation) - disconnect(m_animation, &QAbstractAnimation::finished, this, &QAnimationState::animationFinished); - - m_animation = animation; - - if (m_animation) { - //connect the new animation - connect(m_animation, &QAbstractAnimation::finished, this, &QAnimationState::animationFinished); - } -} - -/*! - Returns the animation handle by this animation state, or \nullptr if there is no animation. -*/ -QAbstractAnimation* QAnimationState::animation() const -{ - return m_animation; -} - -/*! - \reimp -*/ -void QAnimationState::onEntry(QEvent *) -{ - if (m_animation) - m_animation->start(); -} - -/*! - \reimp -*/ -void QAnimationState::onExit(QEvent *) -{ - if (m_animation) - m_animation->stop(); -} - -/*! - \reimp -*/ -bool QAnimationState::event(QEvent *e) -{ - return QState::event(e); -} - -QT_END_NAMESPACE diff --git a/examples/widgets/animation/sub-attaq/qanimationstate.h b/examples/widgets/animation/sub-attaq/qanimationstate.h deleted file mode 100644 index 24759851baf..00000000000 --- a/examples/widgets/animation/sub-attaq/qanimationstate.h +++ /dev/null @@ -1,85 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QANIMATIONSTATE_H -#define QANIMATIONSTATE_H - -#include - -QT_BEGIN_NAMESPACE - -class QAbstractAnimation; - -class QAnimationState : public QState -{ - Q_OBJECT -public: - QAnimationState(QState *parent = nullptr); - ~QAnimationState(); - - void setAnimation(QAbstractAnimation *animation); - QAbstractAnimation* animation() const; - -signals: - void animationFinished(); - -protected: - void onEntry(QEvent *) override; - void onExit(QEvent *) override; - bool event(QEvent *e) override; - -private: - Q_DISABLE_COPY(QAnimationState) - QAbstractAnimation *m_animation; -}; - -QT_END_NAMESPACE - -#endif // QANIMATIONSTATE_H diff --git a/examples/widgets/animation/sub-attaq/states.cpp b/examples/widgets/animation/sub-attaq/states.cpp deleted file mode 100644 index c7e2738aad2..00000000000 --- a/examples/widgets/animation/sub-attaq/states.cpp +++ /dev/null @@ -1,335 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -//Own -#include "states.h" -#include "graphicsscene.h" -#include "boat.h" -#include "submarine.h" -#include "torpedo.h" -#include "animationmanager.h" -#include "progressitem.h" -#include "textinformationitem.h" - -//Qt -#include -#include -#include -#include -#include -#include - -PlayState::PlayState(GraphicsScene *scene, QState *parent) - : QState(parent), scene(scene), machine(nullptr), - currentLevel(0), score(0) -{ -} - -PlayState::~PlayState() -{ - delete machine; -} - -void PlayState::onEntry(QEvent *) -{ - //We are now playing? - if (machine) { - machine->stop(); - //we hide the information - scene->textInformationItem->hide(); - scene->clearScene(); - currentLevel = 0; - score = 0; - delete machine; - } - - machine = new QStateMachine; - - //This state is when player is playing - LevelState *levelState = new LevelState(scene, this, machine); - - //This state is when the player is actually playing but the game is not paused - QState *playingState = new QState(levelState); - levelState->setInitialState(playingState); - - //This state is when the game is paused - PauseState *pauseState = new PauseState(scene, levelState); - - //We have one view, it receive the key press event - QKeyEventTransition *pressPplay = new QKeyEventTransition(scene->views().at(0), QEvent::KeyPress, Qt::Key_P); - pressPplay->setTargetState(pauseState); - QKeyEventTransition *pressPpause = new QKeyEventTransition(scene->views().at(0), QEvent::KeyPress, Qt::Key_P); - pressPpause->setTargetState(playingState); - - //Pause "P" is triggered, the player pause the game - playingState->addTransition(pressPplay); - - //To get back playing when the game has been paused - pauseState->addTransition(pressPpause); - - //This state is when player have lost - LostState *lostState = new LostState(scene, this, machine); - - //This state is when player have won - WinState *winState = new WinState(scene, this, machine); - - //The boat has been destroyed then the game is finished - levelState->addTransition(scene->boat, &Boat::boatExecutionFinished,lostState); - - //This transition check if we won or not - WinTransition *winTransition = new WinTransition(scene, this, winState); - - //The boat has been destroyed then the game is finished - levelState->addTransition(winTransition); - - //This state is an animation when the score changed - UpdateScoreState *scoreState = new UpdateScoreState(levelState); - - //This transition update the score when a submarine die - UpdateScoreTransition *scoreTransition = new UpdateScoreTransition(scene, this, levelState); - scoreTransition->setTargetState(scoreState); - - //The boat has been destroyed then the game is finished - playingState->addTransition(scoreTransition); - - //We go back to play state - scoreState->addTransition(playingState); - - //We start playing!!! - machine->setInitialState(levelState); - - //Final state - QFinalState *finalState = new QFinalState(machine); - - //This transition is triggered when the player press space after completing a level - CustomSpaceTransition *spaceTransition = new CustomSpaceTransition(scene->views().at(0), this, QEvent::KeyPress, Qt::Key_Space); - spaceTransition->setTargetState(levelState); - winState->addTransition(spaceTransition); - - //We lost we should reach the final state - lostState->addTransition(lostState, &QState::finished, finalState); - - machine->start(); -} - -LevelState::LevelState(GraphicsScene *scene, PlayState *game, QState *parent) : QState(parent), scene(scene), game(game) -{ -} -void LevelState::onEntry(QEvent *) -{ - initializeLevel(); -} - -void LevelState::initializeLevel() -{ - //we re-init the boat - scene->boat->setPos(scene->width()/2, scene->sealLevel() - scene->boat->size().height()); - scene->boat->setCurrentSpeed(0); - scene->boat->setCurrentDirection(Boat::None); - scene->boat->setBombsLaunched(0); - scene->boat->show(); - scene->setFocusItem(scene->boat, Qt::OtherFocusReason); - scene->boat->run(); - - scene->progressItem->setScore(game->score); - scene->progressItem->setLevel(game->currentLevel + 1); - - const GraphicsScene::LevelDescription currentLevelDescription = scene->levelsData.value(game->currentLevel); - for (const QPair &subContent : currentLevelDescription.submarines) { - - GraphicsScene::SubmarineDescription submarineDesc = scene->submarinesData.at(subContent.first); - - for (int j = 0; j < subContent.second; ++j ) { - SubMarine *sub = new SubMarine(submarineDesc.type, submarineDesc.name, submarineDesc.points); - scene->addItem(sub); - int random = QRandomGenerator::global()->bounded(15) + 1; - qreal x = random == 13 || random == 5 ? 0 : scene->width() - sub->size().width(); - qreal y = scene->height() -(QRandomGenerator::global()->bounded(150) + 1) - sub->size().height(); - sub->setPos(x,y); - sub->setCurrentDirection(x == 0 ? SubMarine::Right : SubMarine::Left); - sub->setCurrentSpeed(QRandomGenerator::global()->bounded(3) + 1); - } - } -} - -/** Pause State */ -PauseState::PauseState(GraphicsScene *scene, QState *parent) : QState(parent), scene(scene) -{ -} - -void PauseState::onEntry(QEvent *) -{ - AnimationManager::self()->pauseAll(); - scene->boat->setEnabled(false); -} -void PauseState::onExit(QEvent *) -{ - AnimationManager::self()->resumeAll(); - scene->boat->setEnabled(true); - scene->boat->setFocus(); -} - -/** Lost State */ -LostState::LostState(GraphicsScene *scene, PlayState *game, QState *parent) : QState(parent), scene(scene), game(game) -{ -} - -void LostState::onEntry(QEvent *) -{ - //The message to display - QString message = QString("You lose on level %1. Your score is %2.").arg(game->currentLevel+1).arg(game->score); - - //We set the level back to 0 - game->currentLevel = 0; - - //We set the score back to 0 - game->score = 0; - - //We clear the scene - scene->clearScene(); - - //We inform the player - scene->textInformationItem->setMessage(message); - scene->textInformationItem->show(); -} - -void LostState::onExit(QEvent *) -{ - //we hide the information - scene->textInformationItem->hide(); -} - -/** Win State */ -WinState::WinState(GraphicsScene *scene, PlayState *game, QState *parent) : QState(parent), scene(scene), game(game) -{ -} - -void WinState::onEntry(QEvent *) -{ - //We clear the scene - scene->clearScene(); - - QString message; - if (scene->levelsData.size() - 1 != game->currentLevel) { - message = QString("You win the level %1. Your score is %2.\nPress Space to continue.").arg(game->currentLevel+1).arg(game->score); - //We increment the level number - game->currentLevel++; - } else { - message = QString("You finish the game on level %1. Your score is %2.").arg(game->currentLevel+1).arg(game->score); - //We set the level back to 0 - game->currentLevel = 0; - //We set the score back to 0 - game->score = 0; - } - - //We inform the player - scene->textInformationItem->setMessage(message); - scene->textInformationItem->show(); -} - -void WinState::onExit(QEvent *) -{ - //we hide the information - scene->textInformationItem->hide(); -} - -/** UpdateScore State */ -UpdateScoreState::UpdateScoreState(QState *parent) : QState(parent) -{ -} - -/** Win transition */ -UpdateScoreTransition::UpdateScoreTransition(GraphicsScene *scene, PlayState *game, QAbstractState *target) - : QSignalTransition(scene, &GraphicsScene::subMarineDestroyed), - game(game), scene(scene) -{ - setTargetState(target); -} - -bool UpdateScoreTransition::eventTest(QEvent *event) -{ - if (!QSignalTransition::eventTest(event)) - return false; - QStateMachine::SignalEvent *se = static_cast(event); - game->score += se->arguments().at(0).toInt(); - scene->progressItem->setScore(game->score); - return true; -} - -/** Win transition */ -WinTransition::WinTransition(GraphicsScene *scene, PlayState *game, QAbstractState *target) - : QSignalTransition(scene, &GraphicsScene::allSubMarineDestroyed), - game(game), scene(scene) -{ - setTargetState(target); -} - -bool WinTransition::eventTest(QEvent *event) -{ - if (!QSignalTransition::eventTest(event)) - return false; - QStateMachine::SignalEvent *se = static_cast(event); - game->score += se->arguments().at(0).toInt(); - scene->progressItem->setScore(game->score); - return true; -} - -/** Space transition */ -CustomSpaceTransition::CustomSpaceTransition(QWidget *widget, PlayState *game, QEvent::Type type, int key) - : QKeyEventTransition(widget, type, key), game(game) -{ -} - -bool CustomSpaceTransition::eventTest(QEvent *event) -{ - if (!QKeyEventTransition::eventTest(event)) - return false; - return (game->currentLevel != 0); -} diff --git a/examples/widgets/animation/sub-attaq/states.h b/examples/widgets/animation/sub-attaq/states.h deleted file mode 100644 index b3651e1c821..00000000000 --- a/examples/widgets/animation/sub-attaq/states.h +++ /dev/null @@ -1,180 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef STATES_H -#define STATES_H - -//Qt -#include -#include -#include - -class GraphicsScene; -QT_BEGIN_NAMESPACE -class QStateMachine; -QT_END_NAMESPACE - -class PlayState : public QState -{ -public: - explicit PlayState(GraphicsScene *scene, QState *parent = nullptr); - ~PlayState(); - - protected: - void onEntry(QEvent *) override; - -private : - GraphicsScene *scene; - QStateMachine *machine; - int currentLevel; - int score; - - friend class UpdateScoreState; - friend class UpdateScoreTransition; - friend class WinTransition; - friend class CustomSpaceTransition; - friend class WinState; - friend class LostState; - friend class LevelState; -}; - -class LevelState : public QState -{ -public: - LevelState(GraphicsScene *scene, PlayState *game, QState *parent = nullptr); -protected: - void onEntry(QEvent *) override; -private : - void initializeLevel(); - GraphicsScene *scene; - PlayState *game; -}; - -class PauseState : public QState -{ -public: - explicit PauseState(GraphicsScene *scene, QState *parent = nullptr); - -protected: - void onEntry(QEvent *) override; - void onExit(QEvent *) override; -private : - GraphicsScene *scene; -}; - -class LostState : public QState -{ -public: - LostState(GraphicsScene *scene, PlayState *game, QState *parent = nullptr); - -protected: - void onEntry(QEvent *) override; - void onExit(QEvent *) override; -private : - GraphicsScene *scene; - PlayState *game; -}; - -class WinState : public QState -{ -public: - WinState(GraphicsScene *scene, PlayState *game, QState *parent = nullptr); - -protected: - void onEntry(QEvent *) override; - void onExit(QEvent *) override; -private : - GraphicsScene *scene; - PlayState *game; -}; - -class UpdateScoreState : public QState -{ -public: - UpdateScoreState(QState *parent); -private: -}; - -//These transtion is used to update the score -class UpdateScoreTransition : public QSignalTransition -{ -public: - UpdateScoreTransition(GraphicsScene *scene, PlayState *game, QAbstractState *target); -protected: - bool eventTest(QEvent *event) override; -private: - PlayState *game; - GraphicsScene *scene; -}; - -//These transtion test if we have won the game -class WinTransition : public QSignalTransition -{ -public: - WinTransition(GraphicsScene *scene, PlayState *game, QAbstractState *target); -protected: - bool eventTest(QEvent *event) override; -private: - PlayState *game; - GraphicsScene *scene; -}; - -//These transtion is true if one level has been completed and the player want to continue - class CustomSpaceTransition : public QKeyEventTransition -{ -public: - CustomSpaceTransition(QWidget *widget, PlayState *game, QEvent::Type type, int key); -protected: - bool eventTest(QEvent *event) override; -private: - PlayState *game; -}; - -#endif // STATES_H diff --git a/examples/widgets/animation/sub-attaq/sub-attaq.pro b/examples/widgets/animation/sub-attaq/sub-attaq.pro deleted file mode 100644 index ea44253fa11..00000000000 --- a/examples/widgets/animation/sub-attaq/sub-attaq.pro +++ /dev/null @@ -1,33 +0,0 @@ -QT += widgets -HEADERS += boat.h \ - bomb.h \ - mainwindow.h \ - submarine.h \ - torpedo.h \ - pixmapitem.h \ - graphicsscene.h \ - animationmanager.h \ - states.h \ - boat_p.h \ - submarine_p.h \ - qanimationstate.h \ - progressitem.h \ - textinformationitem.h -SOURCES += boat.cpp \ - bomb.cpp \ - main.cpp \ - mainwindow.cpp \ - submarine.cpp \ - torpedo.cpp \ - pixmapitem.cpp \ - graphicsscene.cpp \ - animationmanager.cpp \ - states.cpp \ - qanimationstate.cpp \ - progressitem.cpp \ - textinformationitem.cpp -RESOURCES += subattaq.qrc - -# install -target.path = $$[QT_INSTALL_EXAMPLES]/widgets/animation/sub-attaq -INSTALLS += target diff --git a/examples/widgets/animation/sub-attaq/subattaq.qrc b/examples/widgets/animation/sub-attaq/subattaq.qrc deleted file mode 100644 index 80a3af11ccc..00000000000 --- a/examples/widgets/animation/sub-attaq/subattaq.qrc +++ /dev/null @@ -1,39 +0,0 @@ - - - pics/scalable/sub-attaq.svg - pics/scalable/submarine.svg - pics/scalable/boat.svg - pics/scalable/torpedo.svg - pics/welcome/logo-s.png - pics/welcome/logo-u.png - pics/welcome/logo-b.png - pics/welcome/logo-dash.png - pics/welcome/logo-a.png - pics/welcome/logo-t.png - pics/welcome/logo-t2.png - pics/welcome/logo-a2.png - pics/welcome/logo-q.png - pics/welcome/logo-excl.png - pics/big/background.png - pics/big/boat.png - pics/big/bomb.png - pics/big/submarine.png - pics/big/surface.png - pics/big/torpedo.png - pics/small/background.png - pics/small/boat.png - pics/small/bomb.png - pics/small/submarine.png - pics/small/surface.png - pics/small/torpedo.png - pics/big/explosion/boat/step1.png - pics/big/explosion/boat/step2.png - pics/big/explosion/boat/step3.png - pics/big/explosion/boat/step4.png - pics/big/explosion/submarine/step1.png - pics/big/explosion/submarine/step2.png - pics/big/explosion/submarine/step3.png - pics/big/explosion/submarine/step4.png - data.xml - - diff --git a/examples/widgets/animation/sub-attaq/submarine.cpp b/examples/widgets/animation/sub-attaq/submarine.cpp deleted file mode 100644 index a4ca3760454..00000000000 --- a/examples/widgets/animation/sub-attaq/submarine.cpp +++ /dev/null @@ -1,187 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -//Own -#include "submarine.h" -#include "submarine_p.h" -#include "torpedo.h" -#include "graphicsscene.h" -#include "animationmanager.h" -#include "qanimationstate.h" - -#include -#include -#include -#include - -static QAbstractAnimation *setupDestroyAnimation(SubMarine *sub) -{ - QSequentialAnimationGroup *group = new QSequentialAnimationGroup(sub); - for (int i = 1; i <= 4; ++i) { - PixmapItem *step = new PixmapItem(QString::fromLatin1("explosion/submarine/step%1").arg(i), GraphicsScene::Big, sub); - step->setZValue(6); - step->setOpacity(0); - QPropertyAnimation *anim = new QPropertyAnimation(step, "opacity", group); - anim->setDuration(100); - anim->setEndValue(1); - } - AnimationManager::self()->registerAnimation(group); - return group; -} - - -SubMarine::SubMarine(int type, const QString &name, int points) : PixmapItem(QString("submarine"), GraphicsScene::Big), - subType(type), subName(name), subPoints(points), speed(0), direction(SubMarine::None) -{ - setZValue(5); - setTransformOriginPoint(boundingRect().center()); - - graphicsRotation = new QGraphicsRotation(this); - graphicsRotation->setAxis(Qt::YAxis); - graphicsRotation->setOrigin(QVector3D(size().width() / 2, size().height() / 2, 0)); - QList r({graphicsRotation}); - setTransformations(r); - - //We setup the state machine of the submarine - QStateMachine *machine = new QStateMachine(this); - - //This state is when the boat is moving/rotating - QState *moving = new QState(machine); - - //This state is when the boat is moving from left to right - MovementState *movement = new MovementState(this, moving); - - //This state is when the boat is moving from left to right - ReturnState *rotation = new ReturnState(this, moving); - - //This is the initial state of the moving root state - moving->setInitialState(movement); - - movement->addTransition(this, &SubMarine::subMarineStateChanged, moving); - - //This is the initial state of the machine - machine->setInitialState(moving); - - //End - QFinalState *finalState = new QFinalState(machine); - - //If the moving animation is finished we move to the return state - movement->addTransition(movement, &QAnimationState::animationFinished, rotation); - - //If the return animation is finished we move to the moving state - rotation->addTransition(rotation, &QAnimationState::animationFinished, movement); - - //This state play the destroyed animation - QAnimationState *destroyedState = new QAnimationState(machine); - destroyedState->setAnimation(setupDestroyAnimation(this)); - - //Play a nice animation when the submarine is destroyed - moving->addTransition(this, &SubMarine::subMarineDestroyed, destroyedState); - - //Transition to final state when the destroyed animation is finished - destroyedState->addTransition(destroyedState, &QAnimationState::animationFinished, finalState); - - //The machine has finished to be executed, then the submarine is dead - connect(machine,&QState::finished,this, &SubMarine::subMarineExecutionFinished); - - machine->start(); -} - -int SubMarine::points() const -{ - return subPoints; -} - -void SubMarine::setCurrentDirection(SubMarine::Movement direction) -{ - if (this->direction == direction) - return; - if (direction == SubMarine::Right && this->direction == SubMarine::None) - graphicsRotation->setAngle(180); - this->direction = direction; -} - -enum SubMarine::Movement SubMarine::currentDirection() const -{ - return direction; -} - -void SubMarine::setCurrentSpeed(int speed) -{ - if (speed < 0 || speed > 3) - qWarning("SubMarine::setCurrentSpeed : The speed is invalid"); - this->speed = speed; - emit subMarineStateChanged(); -} - -int SubMarine::currentSpeed() const -{ - return speed; -} - -void SubMarine::launchTorpedo(int speed) -{ - Torpedo *torp = new Torpedo; - GraphicsScene *scene = static_cast(this->scene()); - scene->addItem(torp); - torp->setPos(pos()); - torp->setCurrentSpeed(speed); - torp->launch(); -} - -void SubMarine::destroy() -{ - emit subMarineDestroyed(); -} - -int SubMarine::type() const -{ - return Type; -} diff --git a/examples/widgets/animation/sub-attaq/submarine.h b/examples/widgets/animation/sub-attaq/submarine.h deleted file mode 100644 index 256683ec706..00000000000 --- a/examples/widgets/animation/sub-attaq/submarine.h +++ /dev/null @@ -1,99 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef SUBMARINE_H -#define SUBMARINE_H - -#include "pixmapitem.h" - -#include - -class SubMarine : public PixmapItem -{ -Q_OBJECT -public: - enum Movement { - None = 0, - Left, - Right - }; - enum { Type = UserType + 1 }; - SubMarine(int type, const QString &name, int points); - - int points() const; - - void setCurrentDirection(Movement direction); - enum Movement currentDirection() const; - - void setCurrentSpeed(int speed); - int currentSpeed() const; - - void launchTorpedo(int speed); - void destroy(); - - int type() const override; - - QGraphicsRotation *rotation() const { return graphicsRotation; } - -signals: - void subMarineDestroyed(); - void subMarineExecutionFinished(); - void subMarineStateChanged(); - -private: - int subType; - QString subName; - int subPoints; - int speed; - Movement direction; - QGraphicsRotation *graphicsRotation; -}; - -#endif // SUBMARINE_H diff --git a/examples/widgets/animation/sub-attaq/submarine_p.h b/examples/widgets/animation/sub-attaq/submarine_p.h deleted file mode 100644 index 36807dade31..00000000000 --- a/examples/widgets/animation/sub-attaq/submarine_p.h +++ /dev/null @@ -1,147 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef SUBMARINE_P_H -#define SUBMARINE_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -//Own -#include "animationmanager.h" -#include "submarine.h" -#include "qanimationstate.h" - -//Qt -#include -#include - -//This state is describing when the boat is moving right -class MovementState : public QAnimationState -{ -Q_OBJECT -public: - explicit MovementState(SubMarine *submarine, QState *parent = nullptr) : QAnimationState(parent) - { - movementAnimation = new QPropertyAnimation(submarine, "pos"); - connect(movementAnimation, &QPropertyAnimation::valueChanged, - this, &MovementState::onAnimationMovementValueChanged); - setAnimation(movementAnimation); - AnimationManager::self()->registerAnimation(movementAnimation); - this->submarine = submarine; - } - -protected slots: - void onAnimationMovementValueChanged(const QVariant &) - { - if (QRandomGenerator::global()->bounded(200) + 1 == 3) - submarine->launchTorpedo(QRandomGenerator::global()->bounded(3) + 1); - } - -protected: - void onEntry(QEvent *e) override - { - if (submarine->currentDirection() == SubMarine::Left) { - movementAnimation->setEndValue(QPointF(0,submarine->y())); - movementAnimation->setDuration(submarine->x()/submarine->currentSpeed()*12); - } - else /*if (submarine->currentDirection() == SubMarine::Right)*/ { - movementAnimation->setEndValue(QPointF(submarine->scene()->width()-submarine->size().width(),submarine->y())); - movementAnimation->setDuration((submarine->scene()->width()-submarine->size().width()-submarine->x())/submarine->currentSpeed()*12); - } - QAnimationState::onEntry(e); - } - -private: - SubMarine *submarine; - QPropertyAnimation *movementAnimation; -}; - -//This state is describing when the boat is moving right -class ReturnState : public QAnimationState -{ -public: - explicit ReturnState(SubMarine *submarine, QState *parent = nullptr) : QAnimationState(parent) - { - returnAnimation = new QPropertyAnimation(submarine->rotation(), "angle"); - returnAnimation->setDuration(500); - AnimationManager::self()->registerAnimation(returnAnimation); - setAnimation(returnAnimation); - this->submarine = submarine; - } - -protected: - void onEntry(QEvent *e) override - { - returnAnimation->stop(); - returnAnimation->setEndValue(submarine->currentDirection() == SubMarine::Right ? 360. : 180.); - QAnimationState::onEntry(e); - } - - void onExit(QEvent *e) override - { - submarine->currentDirection() == SubMarine::Right ? submarine->setCurrentDirection(SubMarine::Left) : submarine->setCurrentDirection(SubMarine::Right); - QAnimationState::onExit(e); - } - -private: - SubMarine *submarine; - QPropertyAnimation *returnAnimation; -}; - -#endif // SUBMARINE_P_H diff --git a/examples/widgets/animation/sub-attaq/textinformationitem.cpp b/examples/widgets/animation/sub-attaq/textinformationitem.cpp deleted file mode 100644 index 4d4934f63d0..00000000000 --- a/examples/widgets/animation/sub-attaq/textinformationitem.cpp +++ /dev/null @@ -1,64 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "textinformationitem.h" -#include "pixmapitem.h" - -TextInformationItem::TextInformationItem (QGraphicsItem *parent) - : QGraphicsTextItem(parent) -{ - setFont(QFont("Comic Sans MS", 15)); -} - -void TextInformationItem::setMessage(const QString &text) -{ - setHtml(text); - setPos(parentItem()->boundingRect().center().x() - boundingRect().size().width() / 2, - parentItem()->boundingRect().center().y()); -} diff --git a/examples/widgets/animation/sub-attaq/textinformationitem.h b/examples/widgets/animation/sub-attaq/textinformationitem.h deleted file mode 100644 index 0a0b618460c..00000000000 --- a/examples/widgets/animation/sub-attaq/textinformationitem.h +++ /dev/null @@ -1,64 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef TEXTINFORMATIONITEM_H -#define TEXTINFORMATIONITEM_H - -//Qt -#include - -class TextInformationItem : public QGraphicsTextItem -{ -public: - TextInformationItem(QGraphicsItem *parent = nullptr); - void setMessage(const QString &text); -}; - -#endif // TEXTINFORMATIONITEM_H diff --git a/examples/widgets/animation/sub-attaq/torpedo.cpp b/examples/widgets/animation/sub-attaq/torpedo.cpp deleted file mode 100644 index 7395aa39ac1..00000000000 --- a/examples/widgets/animation/sub-attaq/torpedo.cpp +++ /dev/null @@ -1,124 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -//Own -#include "torpedo.h" -#include "boat.h" -#include "graphicsscene.h" -#include "animationmanager.h" -#include "qanimationstate.h" - -#include -#include -#include - -Torpedo::Torpedo() : PixmapItem(QString::fromLatin1("torpedo"),GraphicsScene::Big), - currentSpeed(0) -{ - setZValue(2); -} - -void Torpedo::launch() -{ - QPropertyAnimation *launchAnimation = new QPropertyAnimation(this, "pos"); - AnimationManager::self()->registerAnimation(launchAnimation); - launchAnimation->setEndValue(QPointF(x(), qobject_cast(scene())->sealLevel() - 15)); - launchAnimation->setEasingCurve(QEasingCurve::InQuad); - launchAnimation->setDuration(y() / currentSpeed * 10); - connect(launchAnimation, &QVariantAnimation::valueChanged, this, &Torpedo::onAnimationLaunchValueChanged); - connect(this, &Torpedo::torpedoExploded, launchAnimation, &QAbstractAnimation::stop); - - //We setup the state machine of the torpedo - QStateMachine *machine = new QStateMachine(this); - - //This state is when the launch animation is playing - QAnimationState *launched = new QAnimationState(machine); - launched->setAnimation(launchAnimation); - - //End - QFinalState *finalState = new QFinalState(machine); - - machine->setInitialState(launched); - - //### Add a nice animation when the torpedo is destroyed - launched->addTransition(this, &Torpedo::torpedoExploded, finalState); - - //If the animation is finished, then we move to the final state - launched->addTransition(launched, &QAnimationState::animationFinished, finalState); - - //The machine has finished to be executed, then the boat is dead - connect(machine, &QState::finished, this, &Torpedo::torpedoExecutionFinished); - - machine->start(); -} - -void Torpedo::setCurrentSpeed(int speed) -{ - if (speed < 0) { - qWarning("Torpedo::setCurrentSpeed : The speed is invalid"); - return; - } - currentSpeed = speed; -} - -void Torpedo::onAnimationLaunchValueChanged(const QVariant &) -{ - const QList colItems = - collidingItems(Qt::IntersectsItemBoundingRect); - for (QGraphicsItem *item : colItems) { - if (Boat *b = qgraphicsitem_cast(item)) - b->destroy(); - } -} - -void Torpedo::destroy() -{ - emit torpedoExploded(); -} diff --git a/examples/widgets/animation/sub-attaq/torpedo.h b/examples/widgets/animation/sub-attaq/torpedo.h deleted file mode 100644 index 7ac853d4e95..00000000000 --- a/examples/widgets/animation/sub-attaq/torpedo.h +++ /dev/null @@ -1,76 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef TORPEDO_H -#define TORPEDO_H - -#include "pixmapitem.h" - -class Torpedo : public PixmapItem -{ -Q_OBJECT -public: - Torpedo(); - void launch(); - void setCurrentSpeed(int speed); - void destroy(); - -signals: - void torpedoExploded(); - void torpedoExecutionFinished(); - -private slots: - void onAnimationLaunchValueChanged(const QVariant &); - -private: - int currentSpeed; -}; - -#endif // TORPEDO_H diff --git a/examples/widgets/doc/images/factorial-example.png b/examples/widgets/doc/images/factorial-example.png deleted file mode 100644 index 8fb1cc692503fba723051e5a783e50b0a0394504..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4032 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

    k$6y!$i%+AB4pQ zjGa%MkHK~n7|l$zUC2cxTksmf4}N+S|D`wFanbO@80eC0<>(~wnV&(}D$+@F)L&)} zbk>wFn6;lF3dIYcpRxws10yXP9iNN&#TT_@2L2?$VJ`s>s_#AQEUec-zFTSXYNivF z$b$2&S`=?(s&GtuFRNhUI*q@h&pO$XyI{(DL3K^rqZC$?uD0D z-DS$CqB9mXK-we&9%}k)Q6Pn?Ic&#n19dz^ee%(3{P3&oX*7$4$dcRUdG+i%FU=wr+0&t7+)ADz8gcXv!6j|mY%x}0icjgk4+ v9V!{LT7SI1{q5V_+*=Tk4+o$?5Hjd-XmdN|h?;RG1irny4_FsldS3iH>|p$M diff --git a/examples/widgets/doc/images/pingpong-example.png b/examples/widgets/doc/images/pingpong-example.png deleted file mode 100644 index af707e4633fd2fcb96c8d145b6d5aa5998674a47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7843 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 Z|CTso`plO!aF2vGc>8%>TO0PnzX6lk1d0Fv diff --git a/examples/widgets/doc/images/trafficlight-example2.png b/examples/widgets/doc/images/trafficlight-example2.png deleted file mode 100644 index a12e4db03e17b3196a2eb183d8838572a92dca35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7257 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 DJxhin diff --git a/examples/widgets/doc/src/animatedtiles.qdoc b/examples/widgets/doc/src/animatedtiles.qdoc deleted file mode 100644 index 9f1d912b0d2..00000000000 --- a/examples/widgets/doc/src/animatedtiles.qdoc +++ /dev/null @@ -1,36 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the documentation of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:FDL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Free Documentation License Usage -** Alternatively, this file may be used under the terms of the GNU Free -** Documentation License version 1.3 as published by the Free Software -** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure -** the GNU Free Documentation License version 1.3 requirements -** will be met: https://www.gnu.org/licenses/fdl-1.3.html. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -/*! - \example animation/animatedtiles - \title Animated Tiles Example - - \brief The Animated Tiles example animates items in a graphics scene. - - \image animatedtiles-example.png -*/ - diff --git a/examples/widgets/doc/src/eventtransitions.qdoc b/examples/widgets/doc/src/eventtransitions.qdoc deleted file mode 100644 index e74831b14b9..00000000000 --- a/examples/widgets/doc/src/eventtransitions.qdoc +++ /dev/null @@ -1,85 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the documentation of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:FDL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Free Documentation License Usage -** Alternatively, this file may be used under the terms of the GNU Free -** Documentation License version 1.3 as published by the Free Software -** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure -** the GNU Free Documentation License version 1.3 requirements -** will be met: https://www.gnu.org/licenses/fdl-1.3.html. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -/*! - \example statemachine/eventtransitions - \title Event Transitions Example - - \brief The Event Transitions example shows how to use event transitions, - a feature of \l{The State Machine Framework}. - - The Event Transitions Example illustrates how states change when a - user enters or leaves the area of a button. The states are handled by - a QStateMachine object. The screen consists of a QVBoxLayout with a - central button. - - When the mouse is outside the button, the text in the button displays - "Outside". When the mouse enters the button, it displays "Inside". - - \borderedimage transitions.png - - \snippet statemachine/eventtransitions/main.cpp 0 - - The \c Window class's constructors begins by creating a button. - This button is added to \c layout, which is a QVBoxLayout object. - Then two states are created: \c s1 is the state - "Outside", and \c s2 is the state "Inside". - - \snippet statemachine/eventtransitions/main.cpp 1 - - State \c s1 is the state "Outside" and state \c s2 is state "Inside". - - \snippet statemachine/eventtransitions/main.cpp 2 - - When the button receives an event of type QEvent::Enter and the state - machine is in state \c s1, the machine will transition to state \c s2. - - \snippet statemachine/eventtransitions/main.cpp 3 - - When the button receives an event of type QEvent::Leave and the state - machine is in state \c s2, the machine will transition back to state \c - s1. - - \snippet statemachine/eventtransitions/main.cpp 4 - - Next, state \c s3 is created. \c s3 will be entered when the button - receives an event of type QEvent::MouseButtonPress and the state machine - is in state \c s2. When the button receives an event of type - QEvent::MouseButtonRelease and the state machine is in state \c s3, the - machine will revert to state \c s2. - - \snippet statemachine/eventtransitions/main.cpp 5 - - Finally, the states are added to the machine as top-level states, the - initial state is set to be \c s1 ("Outside"), and the machine is started. - - \snippet statemachine/eventtransitions/main.cpp 6 - - The main() function constructs a Window object that displays the QVBoxLayout - object \c layout with its \c button. - -*/ diff --git a/examples/widgets/doc/src/factorial.qdoc b/examples/widgets/doc/src/factorial.qdoc deleted file mode 100644 index a0ace96cd38..00000000000 --- a/examples/widgets/doc/src/factorial.qdoc +++ /dev/null @@ -1,88 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the documentation of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:FDL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Free Documentation License Usage -** Alternatively, this file may be used under the terms of the GNU Free -** Documentation License version 1.3 as published by the Free Software -** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure -** the GNU Free Documentation License version 1.3 requirements -** will be met: https://www.gnu.org/licenses/fdl-1.3.html. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -/*! - \example statemachine/factorial - \title Factorial States Example - - \brief The Factorial States example shows how to use \l{The State Machine - Framework} to calculate the factorial of an integer. - - The statechart for calculating the factorial looks as follows: - - \image factorial-example.png - \omit - \caption This is a caption - \endomit - - In other words, the state machine calculates the factorial of 6 and prints - the result. - - \snippet statemachine/factorial/main.cpp 0 - - The Factorial class is used to hold the data of the computation, \c x and - \c fac. It also provides a signal that's emitted whenever the value of \c - x changes. - - \snippet statemachine/factorial/main.cpp 1 - - The FactorialLoopTransition class implements the guard (\c x > 1) and - calculations (\c fac = \c x * \c fac; \c x = \c x - 1) of the factorial - loop. - - \snippet statemachine/factorial/main.cpp 2 - - The FactorialDoneTransition class implements the guard (\c x <= 1) that - terminates the factorial computation. It also prints the final result to - standard output. - - \snippet statemachine/factorial/main.cpp 3 - - The application's main() function first creates the application object, a - Factorial object and a state machine. - - \snippet statemachine/factorial/main.cpp 4 - - The \c compute state is created, and the initial values of \c x and \c fac - are defined. A FactorialLoopTransition object is created and added to the - state. - - \snippet statemachine/factorial/main.cpp 5 - - A final state, \c done, is created, and a FactorialDoneTransition object - is created with \c done as its target state. The transition is then added - to the \c compute state. - - \snippet statemachine/factorial/main.cpp 6 - - The machine's initial state is set to be the \c compute state. We connect - the QStateMachine::finished() signal to the QCoreApplication::quit() slot, - so the application will quit when the state machine's work is - done. Finally, the state machine is started, and the application's event - loop is entered. - - */ diff --git a/examples/widgets/doc/src/moveblocks.qdoc b/examples/widgets/doc/src/moveblocks.qdoc deleted file mode 100644 index 64045f1c4f6..00000000000 --- a/examples/widgets/doc/src/moveblocks.qdoc +++ /dev/null @@ -1,214 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the documentation of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:FDL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Free Documentation License Usage -** Alternatively, this file may be used under the terms of the GNU Free -** Documentation License version 1.3 as published by the Free Software -** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure -** the GNU Free Documentation License version 1.3 requirements -** will be met: https://www.gnu.org/licenses/fdl-1.3.html. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -/*! - \example animation/moveblocks - \title Move Blocks Example - - \brief The Move Blocks example shows how to animate items in a - QGraphicsScene using a QStateMachine with a custom transition. - - \image moveblocks-example.png - - The example animates the blue blocks that you can see in the image - above. The animation moves the blocks between four preset positions. - - The example consists of the following classes: - - \list - \li \c StateSwitcher inherits QState and can add - \c {StateSwitchTransition}s to other states. - When entered, it will randomly transition to one of these - states. - \li \c StateSwitchTransition is a custom transition that - triggers on \c{StateSwitchEvent}s. - \li \c StateSwitchEvent is a QEvent that triggers \c{StateSwitchTransition}s. - \li \c QGraphicsRectWidget is a QGraphicsWidget that simply - paints its background in a solid \l{Qt::}{blue} color. - \endlist - - The blocks are instances of \c QGraphicsRectWidget and are - animated in a QGraphicsScene. We do this by building a state - graph, which we insert animations into. The graph is then executed - in a QStateMachine. All this is done in \c main(). - Let's look at the \c main() function first. - - \section1 The \c main() Function - - After QApplication has been initialized, we set up the - QGraphicsScene with its \c{QGraphicsRectWidget}s. - - \snippet animation/moveblocks/main.cpp 1 - - After adding the scene to a QGraphicsView, it is time to build the - state graph. Let's first look at a statechart of what we are - trying to build. - - \image move-blocks-chart.png - - Note that the \c group has seven sub states, but we have only - included three of them in the diagram. The code that builds this - graph will be examined line-by-line, and will show how the graph - works. First off, we construct the \c group state: - - \snippet animation/moveblocks/main.cpp 2 - - The timer is used to add a delay between each time the blocks are - moved. The timer is started when \c group is entered. As we will - see later, \c group has a transition back to the \c StateSwitcher - when the timer times out. \c group is the initial state in the - machine, so an animation will be scheduled when the example is - started. - - \snippet animation/moveblocks/main.cpp 3 - \dots - \snippet animation/moveblocks/main.cpp 4 - - \c createGeometryState() returns a QState that will set the - geometry of our items upon entry. It also assigns \c group as the - parent of this state. - - A QPropertyAnimation inserted into a transition will use the - values assigned to a QState (with QState::assignProperty()), i.e., - the animation will interpolate between the current values of the - properties and the values in the target state. We add animated - transitions to the state graph later. - - \snippet animation/moveblocks/main.cpp 5 - - We move the items in parallel. Each item is added to \c - animationGroup, which is the animation that is inserted into the - transitions. - - \snippet animation/moveblocks/main.cpp 6 - - The sequential animation group, \c subGroup, helps us insert a - delay between the animation of each item. - - \snippet animation/moveblocks/main.cpp 7 - \dots - \snippet animation/moveblocks/main.cpp 8 - - A StateSwitchTransition is added to the state switcher - in \c StateSwitcher::addState(). We also add the animation in this - function. Since QPropertyAnimation uses the values from the - states, we can insert the same QPropertyAnimation instance in all - \c {StateSwitchTransition}s. - - As mentioned previously, we add a transition to the state switcher - that triggers when the timer times out. - - \snippet animation/moveblocks/main.cpp 9 - - Finally, we can create the state machine, add our initial state, - and start execution of the state graph. - - \section2 The \c createGeometryState() Function - - In \c createGeometryState(), we set up the geometry for each - graphics item. - - \snippet animation/moveblocks/main.cpp 13 - - As mentioned before, QAbstractTransition will set up an animation - added with \l{QAbstractTransition::}{addAnimation()} using - property values set with \l{QState::}{assignProperty()}. - - \section1 The StateSwitcher Class - - \c StateSwitcher has state switch transitions to each \l{QState}s - we created with \c createGeometryState(). Its job is to transition - to one of these states at random when it is entered. - - All functions in \c StateSwitcher are inlined. We'll step through - its definition. - - \snippet animation/moveblocks/main.cpp 10 - - \c StateSwitcher is a state designed for a particular purpose and - will always be a top-level state. We use \c m_stateCount to keep - track of how many states we are managing, and \c m_lastIndex to - remember which state was the last state to which we transitioned. - - \snippet animation/moveblocks/main.cpp 11 - - We select the next state we are going to transition to, and post a - \c StateSwitchEvent, which we know will trigger the \c - StateSwitchTransition to the selected state. - - \snippet animation/moveblocks/main.cpp 12 - - This is where the magic happens. We assign a number to each state - added. This number is given to both a StateSwitchTransition and to - StateSwitchEvents. As we have seen, state switch events will - trigger a transition with the same number. - - \section1 The StateSwitchTransition Class - - \c StateSwitchTransition inherits QAbstractTransition and triggers - on \c{StateSwitchEvent}s. It contains only inline functions, so - let's take a look at its \l{QAbstractTransition::}{eventTest()} - function, which is the only function that we define.. - - \snippet animation/moveblocks/main.cpp 14 - - \c eventTest is called by QStateMachine when it checks whether a - transition should be triggered--a return value of true means that - it will. We simply check if our assigned number is equal to the - event's number (in which case we fire away). - - \section1 The StateSwitchEvent Class - - \c StateSwitchEvent inherits QEvent, and holds a number that has - been assigned to a state and state switch transition by - \c StateSwitcher. We have already seen how it is used to trigger - \c{StateSwitchTransition}s in \c StateSwitcher. - - \snippet animation/moveblocks/main.cpp 15 - - We only have inlined functions in this class, so a look at its - definition will do. - - \section1 The QGraphicsRectWidget Class - - QGraphicsRectWidget inherits QGraphicsWidget and simply paints its - \l{QWidget::}{rect()} blue. We inline \l{QWidget::}{paintEvent()}, - which is the only function we define. Here is the - QGraphicsRectWidget class definition: - - \snippet animation/moveblocks/main.cpp 16 - - \section1 Moving On - - The technique shown in this example works equally well for all - \l{QPropertyAnimation}s. As long as the value to be animated is a - Qt property, you can insert an animation of it into a state graph. - - QState::addAnimation() takes a QAbstractAnimation, so any type - of animation can be inserted into the graph. -*/ - diff --git a/examples/widgets/doc/src/padnavigator.qdoc b/examples/widgets/doc/src/padnavigator.qdoc deleted file mode 100644 index 31440b650ff..00000000000 --- a/examples/widgets/doc/src/padnavigator.qdoc +++ /dev/null @@ -1,586 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the documentation of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:FDL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Free Documentation License Usage -** Alternatively, this file may be used under the terms of the GNU Free -** Documentation License version 1.3 as published by the Free Software -** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure -** the GNU Free Documentation License version 1.3 requirements -** will be met: https://www.gnu.org/licenses/fdl-1.3.html. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -/*! - \example graphicsview/padnavigator - \title Pad Navigator Example - \ingroup examples-graphicsview - \brief Demonstrates how to create animated user interface. - - The Pad Navigator Example shows how you can use Graphics View together with - embedded widgets and Qt's \l{The State Machine Framework}{state machine - framework} to create a simple but useful, dynamic, animated user interface. - - \image padnavigator-example.png - - The interface consists of a flippable, rotating pad with icons that can be - selected using the arrow keys on your keyboard or keypad. Pressing enter - will flip the pad around and reveal its back side, which has a form - embedded into a QGraphicsProxyWidget. You can interact with the form, and - press the enter key to flip back to the front side of the pad at any time. - - Graphics View provides the QGraphicsScene class for managing and - interacting with a large number of custom-made 2D graphical items derived - from the QGraphicsItem class, and a QGraphicsView widget for visualizing - the items, with support for zooming and rotation. - - This example consists of a \c RoundRectItem class, a \c FlippablePad class, - a \c PadNavigator class, a \c SplashItem class, and a \c main() function. - - \section1 RoundRectItem Class Definition - - The \c RoundRectItem class is used by itself to display the icons on the - pad, and as a base class for \c FlippablePad, the class for the pad itself. - The role of the class is to paint a round rectangle of a specified size and - gradient color, and optionally to paint a pixmap icon on top. To support \c - FlippablePad it also allows filling its contents with a plain window - background color. - - Let's start by reviewing the \c RoundRectItem class declaration. - - \snippet graphicsview/padnavigator/roundrectitem.h 0 - - \c RoundRectItem inherits QGraphicsObject, which makes it easy to control - its properties using QPropertyAnimation. Its constructor takes a rectangle - to determine its bounds, and a color. - - Besides implementing the mandatory \l{QGraphicsItem::paint()}{paint()} and - \l{QGraphicsItem::boundingRect()}{boundingRect()} pure virtual functions, - it also provides the \c pixmap and \c fill properties. - - The \c pixmap property sets an optional pixmap that is drawn on top of the - round rectangle. The \c fill property will, when true, fill the round - rectangle contents with a fixed QPalette::Window background color. - Otherwise the contents are filled using a gradient based on the color - passed to \c RoundRectItem's constructor. - - \snippet graphicsview/padnavigator/roundrectitem.h 1 - - The private data members are: - - \list - \li \c pix: The optional pixmap that is drawn on top of the rectangle. - \li \c fillRect: Corresponds to the \c fill property. - \li \c color: The configurable gradient color fill of the rectangle. - \li \c bounds: The bounds of the rectangle. - \li \c gradient: A precalculated gradient used to fill the rectangle. - \endlist - - We will now review the \c RoundRectItem implementation. Let's start by - looking at its constructor: - - \snippet graphicsview/padnavigator/roundrectitem.cpp 0 - - The constructor initializes its member variables and forwards the \c parent - argument to QGraphicsObject's constructor. It then constructs the linear - gradient that is used in \l{QGraphicsItem::paint()}{paint()} to draw the - round rectangle's gradient background. The linear gradient's starting point - is at the top-left corner of the bounds, and the end is at the bottom-left - corner. The start color is identical to the color passed as an argument, - and a slightly darker color is chosen for the final stop. - - We store this gradient as a member variable to avoid having to recreate the - gradient every time the item is repainted. - - Finally we set the cache mode - \l{QGraphicsItem::ItemCoordinateCache}{ItemCoordinateCache}. This mode - causes the item's rendering to be cached into an off-screen pixmap that - remains persistent as we move and transform the item. This mode is ideal - for this example, and works particularly well with OpenGL and OpenGL ES. - - \snippet graphicsview/padnavigator/roundrectitem.cpp 1 - - The \c pixmap property implementation simple returns the member pixmap, or - sets it and then calls \l{QGraphicsItem::update()}{update()}. - - \snippet graphicsview/padnavigator/roundrectitem.cpp 2 - - As the \l{QGraphicsItem::paint()}{paint()} implementation below draws a - simple drop shadow down and to the right of the item, we return a slightly - adjusted rectangle from \l{QGraphicsItem::boundingRect()}{boundingRect()}. - - \snippet graphicsview/padnavigator/roundrectitem.cpp 3 - - The \l{QGraphicsItem::paint()}{paint()} implementation starts by rendering - a semi transparent black round rectangle drop shadow, two units down and to - the right of the main item. - - \snippet graphicsview/padnavigator/roundrectitem.cpp 4 - - We then draw the "foreground" round rectangle itself. The fill depends on - the \c fill property; if true, we will with a plain QPalette::Window color. - We get the current brush from QApplication::palette(). We assign a single - unit wide pen for the stroke, assign the brush, and then draw the - rectangle. - - \snippet graphicsview/padnavigator/roundrectitem.cpp 5 - - If a pixmap has been assigned to the \e pixmap property, we draw this - pixmap in the center of the rectangle item. The pixmaps are scaled to match - the size of the icons; in arguably a better approach would have been to - store the icons with the right size in the first places. - - \snippet graphicsview/padnavigator/roundrectitem.cpp 6 - - Finally, for completeness we include the \c fill property implementation. - It returns the \c fill member variable's value, and when assigned to, it - calls \l{QGraphicsItem::update()}{update()}. - - As mentioned already, \c RoundRectItem is the base class for \c - FlippablePad, which is the class representing the tilting pad itself. We - will proceed to reviewing \c FlippablePad. - - \section1 FlippablePad Class Definition - - \c FlippablePad is, in addition to its inherited \c RoundRectItem - responsibilities, responsible for creating and managing a grid of icons. - - \snippet graphicsview/padnavigator/flippablepad.h 0 - - Its declaration is very simple: It inherits \c RoundRectItem and does not - need any special polymorphic behavior. It's suitable to declare its own - constructor, and a getter-function that allows \c PadNavigator to access - the icons in the grid by (row, column). - - The example has no "real" behavior or logic of any kind, and because of - that, the icons do not need to provide any \e behavior or special - interactions management. In a real application, however, it would be - natural for the \c FlippablePad and its icons to handle more of the - navigation logic. In this example, we have chosen to leave this to - the \c PadNavigator class, which we will get back to below. - - We will now review the \c FlippablePad implementation. This implementation - starts with two helper functions: \c boundsFromSize() and \c - posForLocation(): - - \snippet graphicsview/padnavigator/flippablepad.cpp 0 - - \c boundsForSize() takes a QSize argument, and returns the bounding - rectangle of the flippable pad item. The QSize determines how many rows and - columns the icon grid should have. Each icon is given 150x150 units of - space, and this determines the bounds. - - \snippet graphicsview/padnavigator/flippablepad.cpp 1 - - \c posForLocation() returns the position of an icon given its row and - column position. Like \c boundsForSize(), the function assumes each icon is - given 150x150 units of space, and that all icons are centered around the - flippable pad item's origin (0, 0). - - \snippet graphicsview/padnavigator/flippablepad.cpp 2 - - The \c FlippablePad constructor passes suitable bounds (using \c - boundsForSize()) and specific color to \c RoundRectItem's constructor. - - \snippet graphicsview/padnavigator/flippablepad.cpp 3 - - It then loads pixmaps from compiled-in resources to use for its icons. - QDirIterator is very useful in this context, as it allows us to fetch all - resource "*.png" files inside the \c :/images directory without explicitly - naming the files. - - We also make sure not to load more pixmaps than we need. - - \snippet graphicsview/padnavigator/flippablepad.cpp 4 - - Now that we have the pixmaps, we can create icons, position then and assign - pixmaps. We start by finding a suitable size and color for the icons, and - initializing a convenient grid structure for storing the icons. This \c - iconGrid is also used later to find the icon for a specific (column, row) - location. - - For each row and column in our grid, we proceed to constructing each icon - as an instance of \c RoundRectItem. The item is placed by using the \c - posForLocation() helper function. To make room for the slip-behind - selection item, we give each icon a \l{QGraphicsItem::zValue()}{Z-value} of - 1. The pixmaps are distributed to the icons in round-robin fasion. - - Again, this approach is only suitable for example purposes. In a real-life - application where each icon represents a specific action, it would be more - natural to assign the pixmaps directly, or that the icons themselves - provide suitable pixmaps. - - \snippet graphicsview/padnavigator/flippablepad.cpp 5 - - Finally, the \c iconAt() function returns a pointer to the icon at a - specific row and column. It makes a somewhat bold assumption that the input - is valid, which is fair because the \c PadNavigator class only calls this - function with correct input. - - We will now review the \c SplashItem class. - - \section1 SplashItem Class Definition - - The \c SplashItem class represents the "splash window", a semitransparent - white overlay with text that appears immediately after the application has - started, and disappears after pressing any key. The animation is controlled - by \c PadNavigator; this class is very simple by itself. - - \snippet graphicsview/padnavigator/splashitem.h 0 - - The class declaration shows that \c SplashItem inherits QGraphicsObject to - allow it to be controlled by QPropertyAnimation. It reimplements the - mandatory \l{QGraphicsItem::paint()}{paint()} and - \l{QGraphicsItem::boundingRect()}{boundingRect()} pure virtual functions, - and keeps a \c text member variable which will contain the information text - displayed on this splash item. - - Let's look at its implementation. - - \snippet graphicsview/padnavigator/splashitem.cpp 0 - - The constructor forwards to QGraphicsObject as expected, assigns a text - message to the \c text member variable, and enables - \l{QGraphicsItem::DeviceCoordinateCache}{DeviceCoordinateCache}. This cache - mode is suitable because the splash item only moves and is never - transformed, and because it contains text, it's important that it has a - pixel perfect visual appearance (in constrast to - \l{QGraphicsItem::ItemCoordinateCache}{ItemCoordinateCache}, where the - visual appearance is not as good). - - We use caching to avoid having to relayout and rerender the text for each - frame. An alterative approach would be to use the new QStaticText class. - - \snippet graphicsview/padnavigator/splashitem.cpp 1 - - \c SplashItem's bounding rectangle is fixed at (400x175). - - \snippet graphicsview/padnavigator/splashitem.cpp 2 - - The \l{QGraphicsItem::paint()}{paint()} implementation draws a clipped - round rectangle with a thick 2-unit border and a semi-transparent white - background. It proceeds to finding a suitable text area by adjusting the - splash item's bounding rectangle with 10 units in each side. The text is - rendered inside this rectangle, with top-left alignment, and with word - wrapping enabled. - - The main class now remains. We will proceed to reviewing \c PadNavigator. - - \section1 PadNavigator Class Definition - - \c PadNavigator represents the main window of our Pad Navigator Example - application. It creates and controls a somewhat complex state machine, and - several animations. Its class declaration is very simple: - - \snippet graphicsview/padnavigator/padnavigator.h 0 - - It inherits QGraphicsView and reimplements only one function: - \l{QGraphicsView::resizeEvent()}{resizeEvent()}, to ensure the scene is - scaled to fit inside the view when resizing the main window. - - The \c PadNavigator constructor takes a QSize argument that determines the - number or rows and columns in the grid. - - It also keeps a private member instance, \c form, which is the generated - code for the pad's back side item's QGraphicsProxyWidget-embedded form. - - \snippet graphicsview/padnavigator/padnavigator.cpp 0 - - \c PadNavigator's constructor is a bit long. In short, its job is to create - all items, including the \c FlippablePad, the \c SplashItem and the - QGraphicsProxyWidget \c backItem, and then to set up all animations, states - and transitions that control the behavior of the application. - - It starts out simple, by forwarding to QGraphicsView's constructor. - - \snippet graphicsview/padnavigator/padnavigator.cpp 1 - - The first item to be created is \c SplashItem. This is going to be a top-level - item in the scene, next to \c FlippablePad, and stacked on top of it, so we - assign it a \l{QGraphicsItem::zValue()}{Z-value} of 1. - - \snippet graphicsview/padnavigator/padnavigator.cpp 2 - - Now we construct the \c FlippablePad item, passing its column-row count to - its constructor. - - The pad is controlled by three transformations, and we create one - QGraphicsRotation object for each of these. - - \list - \li \c flipRotation: Rotates the grid around its Qt::YAxis. This rotation is - animated from 0 to 180, and eventually back, when enter is pressed on the - keyboard, flipping the pad around. - \li \c xRotation: Rotates the grid around its Qt::XAxis. This is used to - tilt the pad vertically corresponding to which item is currently selected. - This way, the selected item is always kept in front. - \li \c yRotation: Rotates the grid around its Qt::YAxis. This is used to - tilt the pad horizontally corresponding to which item is selected. This - way, the selected item is always kept in front. - \endlist - - The combination of all three rotations is assigned via - QGraphicsItem::setTransformations(). - - \snippet graphicsview/padnavigator/padnavigator.cpp 3 - - Now we construct the QGraphicsProxyWidget-embedded \c backItem. The proxy - widget is created as a child of the pad. We create a new QWidget and - populate it with the \c form member. To ensure the \c hostName line edit is - the first to receive input focus when this item is shown, we call - \l{QWidget::setFocus()}{setFocus()} immediately. This will not give the - widget focus right away; it will only prepare the item to automatically - receive focus once it is shown. - - The QWidget based form is embedded into the proxy widget. The proxy is - hidden initially; we only want to show it when the pad is rotated at least - 90 degrees, and we also rotate the proxy itself by 180 degrees. This way we - give the impression that the proxy widget is "behind" the flipped pad, when - in fact, it's actually \e{on top of it}. - - We enable \l{QGraphicsItem::ItemCoordinateCache}{ItemCoordinateCache} to - ensure the flip animation can run smoothly. - - \snippet graphicsview/padnavigator/padnavigator.cpp 4 - - We now create the selection item. This is simply another instance of \c - RoundRectItem that is slightly larger than the icons on the pad. We create - it as an immediate child of the \c FlippablePad, so the selection item is a - sibling to all the icons. By giving it a - \l{QGraphicsItem::zValue()}{Z-value} of 0.5 we ensure it will slide between - the pad and its icons. - - What follows now is a series of animation initializations. - - \snippet graphicsview/padnavigator/padnavigator.cpp 5 - - We begin with the animations that apply to the splash item. The first - animation, \c smoothSplashMove, ensures that the "y" property of \c splash - will be animated with a 250-millisecond duration - \l{QEasingCurve::InQuad}{InQuad} easing function. \c smoothSplashOpacity - ensures the opacity of \c splash eases in and out in 250 milliseconds. - - The values are assigned by \c PadNavigator's state machine, which is - created later. - - \snippet graphicsview/padnavigator/padnavigator.cpp 6 - - These are the animations that control the selection item's movement and the - \c xRotation and \c yRotation QGraphicsRotation objects that tilt the pad. - All animations have a duration of 125 milliseconds, and they all use the - \l{QEasingCurve::InOutQuad}{InOutQuad} easing function. - - \snippet graphicsview/padnavigator/padnavigator.cpp 7 - - We now create the animations that control the flip-effect when you press - the enter key. The main goal is to rotate the pad by 180 degrees or back. - - \list - \li \c smoothFlipRotation: Animates the main 180 degree rotation of the pad. - \li \c smoothFlipScale: Scales the pad out and then in again while the pad is rotating. - \li \c flipAnimation: A parallel animation group that ensures the above animations are run in parallel. - \endlist - - All animations are given a 500 millisecond duration and an - \l{QEasingCurve::InOutQuad}{InOutQuad} easing function. - - It's worth taking a close look at \c smoothFlipScale. This animation's - start and end values are both 1.0, but at animation step 0.5 the - animation's value is 0.7. This means that after 50% of the animation's - duration, or 250 milliseconds, the pad will be scaled down to 0.7x of its - original size, which gives a great visual effect while flipping. - - \snippet graphicsview/padnavigator/padnavigator.cpp 8 - - This section uses a trick to ensure that certain properties are assigned - precisely when the flip animation passes 50%, or 90 degrees, rotation. In - short, the pad's icons and selection item are all hidden, the pad's \c fill - property is enabled, and \c backItem is shown when flipping over. When - flipping back, the reverse properties are applied. - - The way this is achieved is by running a sequential animation in parallel - to the other animations. This sequence, dubbed \c setVariablesSequence, - starts with a 250 millisecond pause, and then executes several animations - with a duration of 0. Each animation will ensure that properties are set - immediate at this point. - - This approach can also be used to call functions or set any other - properties at a specific time while an animation is running. - - \snippet graphicsview/padnavigator/padnavigator.cpp 9 - - We will now create the state machine. The whole \c PadNavigator state - machinery is controlled by one single state machine that has a - straight-forward state structure. The state engine itself is created - as a child of the \c PadNavigator itself. We then create three top level - states: - - \list - \li \c splashState: The initial state where the splash item is visible. - \li \c frontState: The base state where the splash is gone and we can see - the front side of the pad, and navigate the selection item. - \li \c backState: The flipped state where the \c backItem is visible, and we - can interact with the QGraphicsProxyWidget-embedded form. - \endlist - - \snippet graphicsview/padnavigator/padnavigator.cpp 10 - - Each state assigns specific properties to objects on entry. Most - interesting perhaps is the assignment of the value 0.0 to the pad's \c - flipRotation angle property when in \c frontState, and 180.0 when in \c - backState. - - At the end of this section we register default animations with the state - engine; these animations will apply to their respective objects and - properties for any state transition. Otherwise it's common to assign - animations to specific transitions. - - Specifically, we use default animations to control the selection item's - movement and tilt rotations. The tilt rotations are set to 0 when the pad - is flipped, and restored back to their original values when flipped back. - - The \c splashState state is set as the initial state. This is required - before we start the state engine. We proceed with creating some - transitions. - - \snippet graphicsview/padnavigator/padnavigator.cpp 11 - - QEventTransition defines a very flexible transition type. You can use this - class to trigger a transition based on an object receiving an event of a - specific type. In this case, we would like to transition from \c - splashState into \c frontState if \c PadNavigator receives any key press - event (QEvent::KeyPress). - - We register the \c splashItem's animations to this transition to ensure they - are used to animate the item's movement and opacity. - - \snippet graphicsview/padnavigator/padnavigator.cpp 12 - - We use QKeyEventTransition to capture specific key events. In this case, we - detect that the user presses Qt::Key_Return or Qt::Key_Enter, and use this - to trigger transitions between \c frontState and backState. We register \c - flipAnimation, our complex parallel animation group, with these - transitions. - - We continue by defining the states for each of the icons in the grid. - - \snippet graphicsview/padnavigator/padnavigator.cpp 13 - - We will use state groups to control transitions between icons. Each icon - represents a \e substate of \c frontState. We will then define transitions - between the states by detecting key presses, using QKeyEventTransition. - - We start by creating all the substates, and at the same time we create a - temporary grid structure for the states to make it easier to find which - states represents icons that are up, down, left and to the right each - other. - - Once the first substate is known, we set this up as the initial substate of - \c frontState. We will use the (0, 0), or top-left, icon for the initial - substate. We initialze the selection item's position to be exactly where - the top-left icon is. - - \snippet graphicsview/padnavigator/padnavigator.cpp 14 - - We can now create four transitions for each icon. Each transition ensures - that we move to the state corresponding to which arrow key has been - pressed. It's clear from this techinique that we could design any other - specific transitions to and from each of the sub states depending on these - and other keys. - - \snippet graphicsview/padnavigator/padnavigator.cpp 15 - - Also, for each of the icons, we assign suitable values to the \c xRotation - and \c yRotation objects' "angle"-properties. If you recall, these - properties "tilt" the pad corresponding to which item is currently - selected. We ensure each icon is invisible when the pad is flipped, and - visible when the pad is not flipped. To ensure the visible property is - assigned at the right time, we add property-controlling animations to the - \c setVariableSequence animation defined earlier. - - \snippet graphicsview/padnavigator/padnavigator.cpp 16 - - We are now finished with all states, transitions, and animations. We now - create the scene that will contain all our items. The scene gets a defined - background pixmap, and we disable item indexing (as most items in this - scene are animated). We add our \c pad item to the scene, and use its - bounding rectangle to fixate the scene rectangle. This rectangle is used by - the view to find a suitable size for the application window. - - Then the scene is assigned to the view, or in our case, \c PadNavigator - itself. - - \snippet graphicsview/padnavigator/padnavigator.cpp 17 - - Now that the scene has received its final size, we can position the splash - item at the very top, find its fade-out position, and add it to the scene. - - \snippet graphicsview/padnavigator/padnavigator.cpp 18 - - The view toggles a few necessary properties: - - \list - \li It disables its scroll bars - this application has no use for scroll bars. - \li It assigns a minimum size. This is necessary to avoid numerical errors - in our fit-in-view \c resizeEvent() implementation. - \li It sets \l{QGraphicsView::FullViewportUpdate}{FullViewportUpdate}, to - ensure QGraphicsView doesn't spend time figuring out precisely what needs - to be redrawn. This application is very simple - if anything changes, - everything is updated. - \li It enables background caching - this makes no performance difference - with OpenGL, but without OpenGL it avoids unnecessary re-scaling of the - background pixmap. - \li It sets render hints that increase rendering quality. - \li If OpenGL is supported, a QOpenGLWidget viewport is assigned to the view. - \endlist - - Finally, we start the state engine. - - \snippet graphicsview/padnavigator/padnavigator.cpp 19 - - The \l{QGraphicsView::resizeEvent()}{resizeEvent()} implementation calls - the base implementation, and then calls QGraphicsView::fitInView() to scale - the scene so that it fits perfectly inside the view. - - By resizing the main application window, you can see this effect yourself. - The scene contents grow when you make the window larger, and shrink when - you make it smaller, while keeping the aspect ratio intact. - - \section1 The main() Function - - \snippet graphicsview/padnavigator/main.cpp 0 - - The \c main function creates the QApplication instance, uses - Q_INIT_RESOURCE to ensure our compiled-in resources aren't removed by the - linker, and then creates a 3x3 \c PadNavigator instance and shows it. - - Our flippable pad shows up with a suitable splash item once control returns - to the event loop. - - \section1 Performance Notes - - The example uses OpenGL if this is available, to achieve optimal - performance; otherwise perspective tranformations can be quite costly. - - Although this example does use QGraphicsProxyWidget to demonstrate - integration of Qt widget components integrated into Graphics View, using - QGraphicsProxyWidget comes with a performance penalty, and is therefore not - recommended for embedded development. - - This example uses extensive item caching to avoid rerendering of static - elements, at the expense of graphics memory. -*/ diff --git a/examples/widgets/doc/src/pingpong.qdoc b/examples/widgets/doc/src/pingpong.qdoc deleted file mode 100644 index 95450585001..00000000000 --- a/examples/widgets/doc/src/pingpong.qdoc +++ /dev/null @@ -1,93 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the documentation of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:FDL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Free Documentation License Usage -** Alternatively, this file may be used under the terms of the GNU Free -** Documentation License version 1.3 as published by the Free Software -** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure -** the GNU Free Documentation License version 1.3 requirements -** will be met: https://www.gnu.org/licenses/fdl-1.3.html. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -/*! - \example statemachine/pingpong - \title Ping Pong States Example - - \brief The Ping Pong States example shows how to use parallel states together - with custom events and transitions in \l{The State Machine Framework}. - - This example implements a statechart where two states communicate by - posting events to the state machine. The state chart looks as follows: - - \image pingpong-example.png - \omit - \caption This is a caption - \endomit - - The \c pinger and \c ponger states are parallel states, i.e. they are - entered simultaneously and will take transitions independently of - eachother. - - The \c pinger state will post the first \c ping event upon entry; the \c - ponger state will respond by posting a \c pong event; this will cause the - \c pinger state to post a new \c ping event; and so on. - - \snippet statemachine/pingpong/main.cpp 0 - - Two custom events are defined, \c PingEvent and \c PongEvent. - - \snippet statemachine/pingpong/main.cpp 1 - - The \c Pinger class defines a state that posts a \c PingEvent to the state - machine when the state is entered. - - \snippet statemachine/pingpong/main.cpp 2 - - The \c PingTransition class defines a transition that is triggered by - events of type \c PingEvent, and that posts a \c PongEvent (with a delay - of 500 milliseconds) to the state machine when the transition is - triggered. - - \snippet statemachine/pingpong/main.cpp 3 - - The \c PongTransition class defines a transition that is triggered by - events of type \c PongEvent, and that posts a \c PingEvent (with a delay - of 500 milliseconds) to the state machine when the transition is - triggered. - - \snippet statemachine/pingpong/main.cpp 4 - - The main() function begins by creating a state machine and a parallel - state group. - - \snippet statemachine/pingpong/main.cpp 5 - - Next, the \c pinger and \c ponger states are created, with the parallel - state group as their parent state. Note that the transitions are \e - targetless. When such a transition is triggered, the source state won't be - exited and re-entered; only the transition's onTransition() function will - be called, and the state machine's configuration will remain the same, - which is precisely what we want in this case. - - \snippet statemachine/pingpong/main.cpp 6 - - Finally, the group is added to the state machine, the machine is started, - and the application event loop is entered. - - */ diff --git a/examples/widgets/doc/src/rogue.qdoc b/examples/widgets/doc/src/rogue.qdoc deleted file mode 100644 index b8b7cb15d6c..00000000000 --- a/examples/widgets/doc/src/rogue.qdoc +++ /dev/null @@ -1,208 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the documentation of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:FDL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Free Documentation License Usage -** Alternatively, this file may be used under the terms of the GNU Free -** Documentation License version 1.3 as published by the Free Software -** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure -** the GNU Free Documentation License version 1.3 requirements -** will be met: https://www.gnu.org/licenses/fdl-1.3.html. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -/*! - \example statemachine/rogue - \title Rogue Example - - \brief The Rogue example shows how to use the Qt state machine for event - handling. - - \image rogue-example.png - - This example implements a simple text based game. Do you see the - \c{@} in the screenshot? That's you, the rogue. The \c{#} - characters are walls, and the dots represent floor. In a real - game, other ASCII characters would represent all kinds of objects - and creatures, for instance, ancient dragons (\c{D}s) or food - rations (\c{%}s). But let's not get carried away. In this game, - the rogue is simply running around in an empty room. - - The rogue is moved with the keypad (2, 4, 8, 6). That aside, we - have implemented a \c quit command that triggers if the player - types \c {q}. The player is then asked if he/she really wants to - quit. - - Most games have commands that need more than one key press (we - think of consecutive presses, i.e., not of several keys being - pressed at the same time). In this game, only the \c quit command - falls under this category, but for the sake of argument, let's - imagine a fully-fledged game with a rich set of commands. If we - were to implement these by catching key events in - \l{QWidget::}{keyPressEvent()}, we would have to keep a lot of - class member variables to track the sequence of keys already typed - (or find some other way of deducing the current state of a - command). This can easily lead to spaghetti, which is--as we all - well know, I'm sure--unpleasant. With a state machine, on the - other hand, separate states can wait for a single key press, and - that makes our lives a lot simpler. - - The example consists of two classes: - - \list - \li \c Window draws the text display of the game and sets - up the state machine. The window also has a status bar - above the area in which the rouge moves. - \li \c MovementTransition is a transition that carries out - a single move of the rogue. - \endlist - - Before we embark on a code walkthrough, it is necessary to take a - closer look at the design of the machine. Here is a state chart - that shows what we want to achieve: - - \image rogue-statechart.png - - The input state waits for a key press to start a new command. - When receiving a key it recognizes, it transitions to one of the - two commands of the game; though, as we will see, movement is - handled by the transition itself. The quit state waits for the - player to answer yes or no (by typing \c y or \c n) when asked - whether he/she really wants to quit the game. - - The chart demonstrates how we use one state to wait for a single - key press. The press received may trigger one of the transitions - connected to the state. - - \section1 Window Class Definition - - The \c Window class is a widget that draws the text display of the - game. It also sets up the state machine, i.e., creates and - connects the states in the machine. It is the key events from this - widget that are used by the machine. - - \snippet statemachine/rogue/window.h 0 - - \c Direction specifies the direction in which the rogue is to - move. We use this in \c movePlayer(), which moves the rogue and - repaints the window. The game has a status line above the area in - which the rogue moves. The \c status property contains the text of - this line. We use a property because the QState class allows - setting any Qt \l{Qt's Property System}{property} when entered. - More on this later. - - \snippet statemachine/rogue/window.h 1 - - The \c map is an array with the characters that are currently - displayed. We set up the array in \c setupMap(), and update it - when the rogue is moved. \c pX and \c pY is the current position - of the rogue. \c WIDTH and \c HEIGHT are macros specifying the - dimensions of the map. - - The \c paintEvent() function is left out of this walkthrough. We - also do not discuss other code that does not concern the state - machine (the \c setupMap(), \c status(), \c setStatus(), \c - movePlayer(), and \c sizeHint() functions). If you wish to take a - look at the code, click on the link for the \c window.cpp file at - the top of this page. - - \section1 Window Class Implementation - - Here is the constructor of \c Window: - - \snippet statemachine/rogue/window.cpp 0 - \dots - \snippet statemachine/rogue/window.cpp 1 - - The player starts off at position (5, 5). We then set up the map - and statemachine. Let's proceed with the \c buildMachine() - function: - - \snippet statemachine/rogue/window.cpp 2 - - We enter \c inputState when the machine is started and from the \c - quitState if the user wants to continue playing. We then set the - status to a helpful reminder of how to play the game. - - First, the \c Movement transition is added to the input state. - This will enable the rogue to be moved with the keypad. Notice - that we don't set a target state for the movement transition. This - will cause the transition to be triggered (and the - \l{QAbstractTransition::}{onTransition()} function to be invoked), - but the machine will not leave the \c inputState. If we had set \c - inputState as the target state, we would first have left and then - entered the \c inputState again. - - \snippet statemachine/rogue/window.cpp 3 - - When we enter \c quitState, we update the status bar of the - window. - - \c QKeyEventTransition is a utility class that removes the hassle - of implementing transitions for \l{QKeyEvent}s. We simply need to - specify the key on which the transition should trigger and the - target state of the transition. - - \snippet statemachine/rogue/window.cpp 4 - - The transition from \c inputState allows triggering the quit state - when the player types \c {q}. - - \snippet statemachine/rogue/window.cpp 5 - - The machine is set up, so it's time to start it. - - \section1 The MovementTransition Class - - \c MovementTransition is triggered when the player request the - rogue to be moved (by typing 2, 4, 6, or 8) when the machine is in - the \c inputState. - - \snippet statemachine/rogue/movementtransition.h 0 - - In the constructor, we tell QEventTransition to only send - \l{QEvent::}{KeyPress} events to the - \l{QAbstractTransition::}{eventTest()} function: - - \snippet statemachine/rogue/movementtransition.h 1 - - The KeyPress events come wrapped in \l{QStateMachine::WrappedEvent}s. \c event - must be confirmed to be a wrapped event because Qt uses other - events internally. After that, it is simply a matter of checking - which key has been pressed. - - Let's move on to the \c onTransition() function: - - \snippet statemachine/rogue/movementtransition.h 2 - - When \c onTransition() is invoked, we know that we have a - \l{QEvent::}{KeyPress} event with 2, 4, 6, or 8, and can ask \c - Window to move the player. - - \section1 The Roguelike Tradition - - You might have been wondering why the game features a rogue. Well, - these kinds of text based dungeon exploration games date back to a - game called, yes, "Rogue". Although outflanked by the technology - of modern 3D computer games, roguelikes have a solid community of - hard-core, devoted followers. - - Playing these games can be surprisingly addictive (despite the - lack of graphics). Angband, the perhaps most well-known rougelike, - is found here: \l{http://rephial.org/}. -*/ - diff --git a/examples/widgets/doc/src/states.qdoc b/examples/widgets/doc/src/states.qdoc deleted file mode 100644 index 1ae379f9182..00000000000 --- a/examples/widgets/doc/src/states.qdoc +++ /dev/null @@ -1,36 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the documentation of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:FDL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Free Documentation License Usage -** Alternatively, this file may be used under the terms of the GNU Free -** Documentation License version 1.3 as published by the Free Software -** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure -** the GNU Free Documentation License version 1.3 requirements -** will be met: https://www.gnu.org/licenses/fdl-1.3.html. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -/*! - \example animation/states - \title States Example - - \brief The States example shows how to use the Qt state machine to play - animations. - - \image states-example.png -*/ diff --git a/examples/widgets/doc/src/stickman.qdoc b/examples/widgets/doc/src/stickman.qdoc deleted file mode 100644 index ffc736674ba..00000000000 --- a/examples/widgets/doc/src/stickman.qdoc +++ /dev/null @@ -1,102 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the documentation of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:FDL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Free Documentation License Usage -** Alternatively, this file may be used under the terms of the GNU Free -** Documentation License version 1.3 as published by the Free Software -** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure -** the GNU Free Documentation License version 1.3 requirements -** will be met: https://www.gnu.org/licenses/fdl-1.3.html. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -/*! - \example animation/stickman - \title Stickman Example - - \brief The Stickman example shows how to animate transitions in a state - machine to implement key frame animations. - - \image stickman-example.png - - In this example, we will write a small application which animates the joints in a skeleton and - projects a stickman figure on top. The stickman can be either "alive" or "dead", and when in the - "alive" state, he can be performing different actions defined by key frame animations. - - Animations are implemented as composite states. Each child state of the animation state - represents a frame in the animation by setting the position of each joint in the stickman's - skeleton to the positions defined for the particular frame. The frames are then bound together - with animated transitions that trigger on the source state's propertiesAssigned() signal. Thus, - the machine will enter the state representing the next frame in the animation immediately after - it has finished animating into the previous frame. - - \image stickman-example1.png - - The states for an animation is constructed by reading a custom animation file format and - creating states that assign values to the "position" properties of each of the nodes in the - skeleton graph. - - \snippet animation/stickman/lifecycle.cpp 1 - - The states are then bound together with signal transitions that listen to the - propertiesAssigned() signal. - - \snippet animation/stickman/lifecycle.cpp 2 - - The last frame state is given a transition to the first one, so that the animation will loop - until it is interrupted when a transition out from the animation state is taken. To get smooth - animations between the different key frames, we set a default animation on the state machine. - This is a parallel animation group which contains animations for all the "position" properties - and will be selected by default when taking any transition that leads into a state that assigns - values to these properties. - - \snippet animation/stickman/lifecycle.cpp 3 - - Several such animation states are constructed, and are placed together as children of a top - level "alive" state which represents the stickman life cycle. Transitions go from the parent - state to the child state to ensure that each of the child states inherit them. - - \image stickman-example2.png - - This saves us the effort of connect every state to every state with identical transitions. The - state machine makes sure that transitions between the key frame animations are also smooth by - applying the default animation when interrupting one and starting another. - - Finally, there is a transition out from the "alive" state and into the "dead" state. This is - a custom transition type called LightningSrikesTransition which samples every second and - triggers at random (one out of fifty times on average.) - - \snippet animation/stickman/lifecycle.cpp 4 - - When it triggers, the machine will first enter a "lightningBlink" state which uses a timer to - pause for a brief period of time while the background color of the scene is white. This gives us - a flash effect when the lightning strikes. - - \snippet animation/stickman/lifecycle.cpp 5 - - We start and stop a QTimer object when entering and exiting the state. Then we transition into - the "dead" state when the timer times out. - - \snippet animation/stickman/lifecycle.cpp 0 - - When the machine is in the "dead" state, it will be unresponsive. This is because the "dead" - state has no transitions leading out. - - \image stickman-example3.png - -*/ diff --git a/examples/widgets/doc/src/sub-attaq.qdoc b/examples/widgets/doc/src/sub-attaq.qdoc deleted file mode 100644 index 994e9d6f907..00000000000 --- a/examples/widgets/doc/src/sub-attaq.qdoc +++ /dev/null @@ -1,41 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the documentation of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:FDL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Free Documentation License Usage -** Alternatively, this file may be used under the terms of the GNU Free -** Documentation License version 1.3 as published by the Free Software -** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure -** the GNU Free Documentation License version 1.3 requirements -** will be met: https://www.gnu.org/licenses/fdl-1.3.html. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -/*! - \example animation/sub-attaq - \title Sub-Attaq - \ingroup examples-layout - - \brief This example shows Qt's ability to combine \l{The Animation Framework}{the animation framework} - and \l{The State Machine Framework}{the state machine framework} to create a game. - - \image sub-attaq-demo.png - - The purpose of the game is to destroy all submarines to win the current level. - The boat can be controlled using left and right keys. To fire a bomb you can press - up and down keys. -*/ diff --git a/examples/widgets/doc/src/trafficlight.qdoc b/examples/widgets/doc/src/trafficlight.qdoc deleted file mode 100644 index 50c09441019..00000000000 --- a/examples/widgets/doc/src/trafficlight.qdoc +++ /dev/null @@ -1,85 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the documentation of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:FDL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Free Documentation License Usage -** Alternatively, this file may be used under the terms of the GNU Free -** Documentation License version 1.3 as published by the Free Software -** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure -** the GNU Free Documentation License version 1.3 requirements -** will be met: https://www.gnu.org/licenses/fdl-1.3.html. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -/*! - \example statemachine/trafficlight - \title Traffic Light Example - - \brief The Traffic Light example shows how to use \l{The State Machine Framework} - to implement the control flow of a traffic light. - - \image trafficlight-example.png - - In this example we write a TrafficLightWidget class. The traffic light has - three lights: Red, yellow and green. The traffic light transitions from - one light to another (red to yellow to green to yellow to red again) at - certain intervals. - - \snippet statemachine/trafficlight/main.cpp 0 - - The LightWidget class represents a single light of the traffic light. It - provides an \c on property and two slots, turnOn() and turnOff(), to turn - the light on and off, respectively. The widget paints itself in the color - that's passed to the constructor. - - \snippet statemachine/trafficlight/main.cpp 1 - - The TrafficLightWidget class represents the visual part of the traffic - light; it's a widget that contains three lights arranged vertically, and - provides accessor functions for these. - - \snippet statemachine/trafficlight/main.cpp 2 - - The createLightState() function creates a state that turns a light on when - the state is entered, and off when the state is exited. The state uses a - timer, and as we shall see the timeout is used to transition from one - LightState to another. Here is the statechart for the light state: - - \image trafficlight-example1.png - \omit - \caption This is a caption - \endomit - - \snippet statemachine/trafficlight/main.cpp 3 - - The TrafficLight class combines the TrafficLightWidget with a state - machine. The state graph has four states: red-to-yellow, yellow-to-green, - green-to-yellow and yellow-to-red. The initial state is red-to-yellow; - when the state's timer times out, the state machine transitions to - yellow-to-green. The same process repeats through the other states. - This is what the statechart looks like: - - \image trafficlight-example2.png - \omit - \caption This is a caption - \endomit - - \snippet statemachine/trafficlight/main.cpp 4 - - The main() function constructs a TrafficLight and shows it. - -*/ diff --git a/examples/widgets/doc/src/twowaybutton.qdoc b/examples/widgets/doc/src/twowaybutton.qdoc deleted file mode 100644 index 2e1c29199d1..00000000000 --- a/examples/widgets/doc/src/twowaybutton.qdoc +++ /dev/null @@ -1,68 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the documentation of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:FDL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Free Documentation License Usage -** Alternatively, this file may be used under the terms of the GNU Free -** Documentation License version 1.3 as published by the Free Software -** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure -** the GNU Free Documentation License version 1.3 requirements -** will be met: https://www.gnu.org/licenses/fdl-1.3.html. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -/*! - \example statemachine/twowaybutton - \title Two-way Button Example - - \brief The Two-way button example shows how to use \l{The State Machine - Framework} to implement a simple state machine that toggles the current - state when a button is clicked. - - \snippet statemachine/twowaybutton/main.cpp 0 - - The application's main() function begins by constructing the application - object, a button and a state machine. - - \snippet statemachine/twowaybutton/main.cpp 1 - - The state machine has two states; \c on and \c off. When either state is - entered, the text of the button will be set accordingly. - - \snippet statemachine/twowaybutton/main.cpp 2 - - When the state machine is in the \c off state and the button is clicked, - it will transition to the \c on state; when the state machine is in the \c - on state and the button is clicked, it will transition to the \c off - state. - - \snippet statemachine/twowaybutton/main.cpp 3 - - The states are added to the state machine; they become top-level (sibling) - states. - - \snippet statemachine/twowaybutton/main.cpp 4 - - The initial state is \c off; this is the state the state machine will - immediately transition to once the state machine is started. - - \snippet statemachine/twowaybutton/main.cpp 5 - - Finally, the button is resized and made visible, and the application event - loop is entered. - -*/ diff --git a/examples/widgets/graphicsview/CMakeLists.txt b/examples/widgets/graphicsview/CMakeLists.txt index 5ea8d6b2c63..a60ba190efb 100644 --- a/examples/widgets/graphicsview/CMakeLists.txt +++ b/examples/widgets/graphicsview/CMakeLists.txt @@ -4,7 +4,6 @@ add_subdirectory(chip) add_subdirectory(elasticnodes) add_subdirectory(embeddeddialogs) add_subdirectory(collidingmice) -add_subdirectory(padnavigator) add_subdirectory(basicgraphicslayouts) add_subdirectory(diagramscene) add_subdirectory(flowlayout) diff --git a/examples/widgets/graphicsview/graphicsview.pro b/examples/widgets/graphicsview/graphicsview.pro index d5914505595..8becd8aa9d3 100644 --- a/examples/widgets/graphicsview/graphicsview.pro +++ b/examples/widgets/graphicsview/graphicsview.pro @@ -4,7 +4,6 @@ SUBDIRS = \ elasticnodes \ embeddeddialogs \ collidingmice \ - padnavigator \ basicgraphicslayouts \ diagramscene \ dragdroprobot \ diff --git a/examples/widgets/graphicsview/padnavigator/.prev_CMakeLists.txt b/examples/widgets/graphicsview/padnavigator/.prev_CMakeLists.txt deleted file mode 100644 index e00a7d40a5f..00000000000 --- a/examples/widgets/graphicsview/padnavigator/.prev_CMakeLists.txt +++ /dev/null @@ -1,68 +0,0 @@ -# Generated from padnavigator.pro. - -cmake_minimum_required(VERSION 3.14) -project(padnavigator LANGUAGES CXX) - -set(CMAKE_INCLUDE_CURRENT_DIR ON) - -set(CMAKE_AUTOMOC ON) -set(CMAKE_AUTORCC ON) -set(CMAKE_AUTOUIC ON) - -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/widgets/graphicsview/padnavigator") - -find_package(Qt6 COMPONENTS Core) -find_package(Qt6 COMPONENTS Gui) -find_package(Qt6 COMPONENTS Widgets) - -add_executable(padnavigator - flippablepad.cpp flippablepad.h - form.ui - main.cpp - padnavigator.cpp padnavigator.h - roundrectitem.cpp roundrectitem.h - splashitem.cpp splashitem.h -) -target_link_libraries(padnavigator PUBLIC - Qt::Core - Qt::Gui - Qt::Widgets -) - - -# Resources: -set(padnavigator_resource_files - "images/artsfftscope.png" - "images/blue_angle_swirl.jpg" - "images/kontact_contacts.png" - "images/kontact_journal.png" - "images/kontact_mail.png" - "images/kontact_notes.png" - "images/kopeteavailable.png" - "images/metacontact_online.png" - "images/minitools.png" -) - -qt6_add_resources(padnavigator "padnavigator" - PREFIX - "/" - FILES - ${padnavigator_resource_files} -) - -if(TARGET Qt::OpenGL) - target_link_libraries(padnavigator PUBLIC - Qt::OpenGL - Qt::OpenGLWidgets - ) -endif() - -install(TARGETS padnavigator - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" -) diff --git a/examples/widgets/graphicsview/padnavigator/CMakeLists.txt b/examples/widgets/graphicsview/padnavigator/CMakeLists.txt deleted file mode 100644 index cb21f80d22a..00000000000 --- a/examples/widgets/graphicsview/padnavigator/CMakeLists.txt +++ /dev/null @@ -1,69 +0,0 @@ -# Generated from padnavigator.pro. - -cmake_minimum_required(VERSION 3.14) -project(padnavigator LANGUAGES CXX) - -set(CMAKE_INCLUDE_CURRENT_DIR ON) - -set(CMAKE_AUTOMOC ON) -set(CMAKE_AUTORCC ON) -set(CMAKE_AUTOUIC ON) - -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/widgets/graphicsview/padnavigator") - -find_package(Qt6 COMPONENTS Core) -find_package(Qt6 COMPONENTS Gui) -find_package(Qt6 COMPONENTS Widgets) -find_package(Qt6 COMPONENTS OpenGL) # special case - -add_executable(padnavigator - flippablepad.cpp flippablepad.h - form.ui - main.cpp - padnavigator.cpp padnavigator.h - roundrectitem.cpp roundrectitem.h - splashitem.cpp splashitem.h -) -target_link_libraries(padnavigator PUBLIC - Qt::Core - Qt::Gui - Qt::Widgets -) - - -# Resources: -set(padnavigator_resource_files - "images/artsfftscope.png" - "images/blue_angle_swirl.jpg" - "images/kontact_contacts.png" - "images/kontact_journal.png" - "images/kontact_mail.png" - "images/kontact_notes.png" - "images/kopeteavailable.png" - "images/metacontact_online.png" - "images/minitools.png" -) - -qt6_add_resources(padnavigator "padnavigator" - PREFIX - "/" - FILES - ${padnavigator_resource_files} -) - -if(TARGET Qt::OpenGL) - target_link_libraries(padnavigator PUBLIC - Qt::OpenGL - Qt::OpenGLWidgets - ) -endif() - -install(TARGETS padnavigator - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" -) diff --git a/examples/widgets/graphicsview/padnavigator/flippablepad.cpp b/examples/widgets/graphicsview/padnavigator/flippablepad.cpp deleted file mode 100644 index 263909225e4..00000000000 --- a/examples/widgets/graphicsview/padnavigator/flippablepad.cpp +++ /dev/null @@ -1,108 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "flippablepad.h" - -#include - -//! [0] -static QRectF boundsFromSize(const QSize &size) -{ - return QRectF((-size.width() / 2.0) * 150, (-size.height() / 2.0) * 150, - size.width() * 150, size.height() * 150); -} -//! [0] - -//! [1] -static QPointF posForLocation(int column, int row, const QSize &size) -{ - return QPointF(column * 150, row * 150) - - QPointF((size.width() - 1) * 75, (size.height() - 1) * 75); -} -//! [1] - -//! [2] -FlippablePad::FlippablePad(const QSize &size, QGraphicsItem *parent) - : RoundRectItem(boundsFromSize(size), QColor(226, 255, 92, 64), parent) -{ -//! [2] -//! [3] - int numIcons = size.width() * size.height(); - QList pixmaps; - QDirIterator it(":/images", {"*.png"}); - while (it.hasNext() && pixmaps.size() < numIcons) - pixmaps << it.next(); -//! [3] - -//! [4] - const QRectF iconRect(-54, -54, 108, 108); - const QColor iconColor(214, 240, 110, 128); - iconGrid.resize(size.height()); - int n = 0; - - for (int y = 0; y < size.height(); ++y) { - iconGrid[y].resize(size.width()); - for (int x = 0; x < size.width(); ++x) { - RoundRectItem *rect = new RoundRectItem(iconRect, iconColor, this); - rect->setZValue(1); - rect->setPos(posForLocation(x, y, size)); - rect->setPixmap(pixmaps.at(n++ % pixmaps.size())); - iconGrid[y][x] = rect; - } - } -} -//! [4] - -//! [5] -RoundRectItem *FlippablePad::iconAt(int column, int row) const -{ - return iconGrid[row][column]; -} -//! [5] diff --git a/examples/widgets/graphicsview/padnavigator/flippablepad.h b/examples/widgets/graphicsview/padnavigator/flippablepad.h deleted file mode 100644 index a056eae1c50..00000000000 --- a/examples/widgets/graphicsview/padnavigator/flippablepad.h +++ /dev/null @@ -1,71 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef FLIPPABLEPAD_H -#define FLIPPABLEPAD_H - -#include "roundrectitem.h" - -#include - -//! [0] -class FlippablePad : public RoundRectItem -{ -public: - explicit FlippablePad(const QSize &size, QGraphicsItem *parent = nullptr); - - RoundRectItem *iconAt(int column, int row) const; - -private: - QList> iconGrid; -}; -//! [0] - -#endif // FLIPPABLEPAD_H diff --git a/examples/widgets/graphicsview/padnavigator/form.ui b/examples/widgets/graphicsview/padnavigator/form.ui deleted file mode 100644 index fc7d12321e2..00000000000 --- a/examples/widgets/graphicsview/padnavigator/form.ui +++ /dev/null @@ -1,208 +0,0 @@ - - Form - - - - 0 - 0 - 378 - 385 - - - - BackSide - - - - - - Settings - - - true - - - true - - - - - - Title: - - - - - - - Pad Navigator Example - - - - - - - Modified: - - - - - - - Extent - - - - - - - - - 42 - - - Qt::Horizontal - - - - - - - 42 - - - - - - - - - - - - - - - Other input - - - true - - - true - - - - - - - Widgets On Graphics View - - - - - QGraphicsProxyWidget - - - - QGraphicsWidget - - - - QObject - - - - - QGraphicsItem - - - - - QGraphicsLayoutItem - - - - - - - QGraphicsGridLayout - - - - QGraphicsLayout - - - - QGraphicsLayoutItem - - - - - - - QGraphicsLinearLayout - - - - QGraphicsLayout - - - - QGraphicsLayoutItem - - - - - - - - - - - - - groupBox - hostName - dateTimeEdit - horizontalSlider - spinBox - groupBox_2 - treeWidget - - - - - horizontalSlider - valueChanged(int) - spinBox - setValue(int) - - - 184 - 125 - - - 275 - 127 - - - - - spinBox - valueChanged(int) - horizontalSlider - setValue(int) - - - 272 - 114 - - - 190 - 126 - - - - - diff --git a/examples/widgets/graphicsview/padnavigator/images/artsfftscope.png b/examples/widgets/graphicsview/padnavigator/images/artsfftscope.png deleted file mode 100644 index 4db003f8d23d0c86706239374fe197c28e3e23ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1291 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 z 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 diff --git a/examples/widgets/graphicsview/padnavigator/images/kontact_mail.png b/examples/widgets/graphicsview/padnavigator/images/kontact_mail.png deleted file mode 100644 index 672f8fa3ab186cf678bd4c9a0e991e0cd0dd7137..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3202 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 diff --git a/examples/widgets/graphicsview/padnavigator/images/kontact_notes.png b/examples/widgets/graphicsview/padnavigator/images/kontact_notes.png deleted file mode 100644 index 229bf73ac696fc525fac48c7a750aca6d6be2d8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3893 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 D|7l0W diff --git a/examples/widgets/graphicsview/padnavigator/images/kopeteavailable.png b/examples/widgets/graphicsview/padnavigator/images/kopeteavailable.png deleted file mode 100644 index 2eaf41afec04ab7c1a13f7adacfd65b70e08ca03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2380 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 Hu0mjfNwUI} diff --git a/examples/widgets/graphicsview/padnavigator/images/minitools.png b/examples/widgets/graphicsview/padnavigator/images/minitools.png deleted file mode 100644 index 0248c9d50aecfe318c292853ae387b7bd296a2cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2087 zcmV+?2-x?DP)Nkl5*6ZE%;`PQh#$d|TCXQ|DV%)kAq6E^41i~e*OT#TVDIt`SR-{fG zQHYbMh&Gi-Lkn1-5{U+5Zb^^}v?*1D8z(ee47M?Ae8HFX-tF1hnK?6WBW3@nEDI}U zEUmxNPv_s~tLJ_6yhrDR7^CBv#PQAXFCfO~SRJFdLX3Ba$7KiNBhJ!-4%S}fPf<9o z1oV0)j$)Y0&-RaKMsi#T#0N0!bSDyLB4hHEXZi@5jtcS{vP>p zFAyKbu*=lZv6_yDs8MJ(e^$F0Xd2f7hOCMQaqTQ@!?5_dlNsivE8LCz_!g*IVE_v@ z;9fkyc|T`AGbXzn1?0x1KwNF99{e#(CO$`e7G2_HIKazSxntZ4=<$s>fXmlnHOknG ze`o3A^s%VRHE2dMt_0%!&N1k0bK!F0_c0Nz#7A)@^HBGpf4;y~Xc|`n2HhD4antSi zPwYYtdHe+Lh+n=Q4+mUf67u&FAHhTfBxu8GTK|C)_)v?5SI;sJ zP2)nqush-quKxqkmzKw(U3Q09w^#XkP}!)`*^2PEqV#HTIro{F4{RZW)akodT& zvczmf^rM0^*5aFJM*@Hh5ZIWn8NBu_#21YA37OP(G%4-Ub zTkm}cF-G8@!q;`VQQe5tY;}|{fD$TWsS~THVG5?BgloUZq*cUuXhjA9P(_`vQP}q- z>EHc}SfKO{2e*?X)FWviMv^RcVJF&$Eh#KmMh)59;QA3Rosbz(7-N4O*dS4~qrgX_K-TYS3 zcD##S|6c%n;!Km)-Kxj1T%3qocH5gorGCd7)6X`!m~A2gpuPKIJ8Ul19CF z7kg1XQ~+E#SKH&uy<_LRX3IN3Kcv;0F!^C^;!|l{skZ2eINu-#ir&*Ygu(!w78;V+5*je@JdFy=zC3IsS z;*s|N!dIOiziqvC=Y`vD5x;u_$zzmr#L$@Il0^12Q_c!)kv;o#FCWp~#;&S2#)=@|-E|3OB75Z#|JS1{e+0qoXE4CBwcJa)frQ+hNl^Oqd))t( zH?6@Sx-sAoj(CIsp!-W!%<8ntF5>l=SD+Y)M=MZgdmBxJ)`Xw#x8**jckRt(Dw$Pn&P9s7I+qpoj~-5YUn@- zwZjx&LyBh9-$$a38af%Na#G%G6p%yp*u0UYmZTMQVg#dODWi%awqPr^p@bA=j2#8ud-voM`lL4n#sq*uc)G*!CoTOxT1XYR0;O60#VgYdZa9{%o4x zL-yDR1k36vp#>GxQN?Bq5^{t+>|e*=9wxWb)j`j0wyh!j7h&fiSN{qTnKnkMT+r@9 zfjRJCw7pPm3Z6+457jF}4gtzH`i%d#L^q%t**DZYBop>*0)BG2F`g6au zsF2r}mU-(Xia#Q}Md(KsIVR*eG3#_=gWS-MeDSM7eYqHK73+74@eVOA7l%G8mX?a; zW#X!N?!iSkA19+302ve>nd`6ie@yH?U)*@E7?+CiZZZC?xbq^hd%n21)n#aJYzIbM zG?Jo1*vH5&4j!Pb!1_MVP5L*V`P#2Mjoo+?J5T~Z4Wrk-=DSl~)VepdrlpzJwy^OD z^f05712sP0ZUM55U1Y&$Lyfdd@gVI5dJgDb@{GHGHJ}?q*o*!nETI$!7jLlaiYe~7 z^Ata5$vSPrPnq0KEwXT;CHOuvs5RyY-D*qmIx*fTR - -//! [0] -int main(int argc, char *argv[]) -{ - QApplication app(argc, argv); - Q_INIT_RESOURCE(padnavigator); - - PadNavigator navigator(QSize(3, 3)); - navigator.show(); - return app.exec(); -} -//! [0] diff --git a/examples/widgets/graphicsview/padnavigator/padnavigator.cpp b/examples/widgets/graphicsview/padnavigator/padnavigator.cpp deleted file mode 100644 index 5088386a265..00000000000 --- a/examples/widgets/graphicsview/padnavigator/padnavigator.cpp +++ /dev/null @@ -1,318 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "flippablepad.h" -#include "padnavigator.h" -#include "splashitem.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifndef QT_NO_OPENGL -#include -#endif - -//! [0] -PadNavigator::PadNavigator(const QSize &size, QWidget *parent) - : QGraphicsView(parent) -{ -//! [0] -//! [1] - // Splash item - SplashItem *splash = new SplashItem; - splash->setZValue(1); -//! [1] - -//! [2] - // Pad item - FlippablePad *pad = new FlippablePad(size); - QGraphicsRotation *flipRotation = new QGraphicsRotation(pad); - QGraphicsRotation *xRotation = new QGraphicsRotation(pad); - QGraphicsRotation *yRotation = new QGraphicsRotation(pad); - flipRotation->setAxis(Qt::YAxis); - xRotation->setAxis(Qt::YAxis); - yRotation->setAxis(Qt::XAxis); - pad->setTransformations(QList() - << flipRotation - << xRotation << yRotation); -//! [2] - -//! [3] - // Back (proxy widget) item - QGraphicsProxyWidget *backItem = new QGraphicsProxyWidget(pad); - QWidget *widget = new QWidget; - form.setupUi(widget); - form.hostName->setFocus(); - backItem->setWidget(widget); - backItem->setVisible(false); - backItem->setFocus(); - backItem->setCacheMode(QGraphicsItem::ItemCoordinateCache); - const QRectF r = backItem->rect(); - backItem->setTransform(QTransform() - .rotate(180, Qt::YAxis) - .translate(-r.width()/2, -r.height()/2)); -//! [3] - -//! [4] - // Selection item - RoundRectItem *selectionItem = new RoundRectItem(QRectF(-60, -60, 120, 120), Qt::gray, pad); - selectionItem->setZValue(0.5); -//! [4] - -//! [5] - // Splash animations - QPropertyAnimation *smoothSplashMove = new QPropertyAnimation(splash, "y"); - QPropertyAnimation *smoothSplashOpacity = new QPropertyAnimation(splash, "opacity"); - smoothSplashMove->setEasingCurve(QEasingCurve::InQuad); - smoothSplashMove->setDuration(250); - smoothSplashOpacity->setDuration(250); -//! [5] - -//! [6] - // Selection animation - QPropertyAnimation *smoothXSelection = new QPropertyAnimation(selectionItem, "x"); - QPropertyAnimation *smoothYSelection = new QPropertyAnimation(selectionItem, "y"); - QPropertyAnimation *smoothXRotation = new QPropertyAnimation(xRotation, "angle"); - QPropertyAnimation *smoothYRotation = new QPropertyAnimation(yRotation, "angle"); - smoothXSelection->setDuration(125); - smoothYSelection->setDuration(125); - smoothXRotation->setDuration(125); - smoothYRotation->setDuration(125); - smoothXSelection->setEasingCurve(QEasingCurve::InOutQuad); - smoothYSelection->setEasingCurve(QEasingCurve::InOutQuad); - smoothXRotation->setEasingCurve(QEasingCurve::InOutQuad); - smoothYRotation->setEasingCurve(QEasingCurve::InOutQuad); -//! [6] - -//! [7] - // Flip animation setup - QPropertyAnimation *smoothFlipRotation = new QPropertyAnimation(flipRotation, "angle"); - QPropertyAnimation *smoothFlipScale = new QPropertyAnimation(pad, "scale"); - QParallelAnimationGroup *flipAnimation = new QParallelAnimationGroup(this); - smoothFlipScale->setDuration(500); - smoothFlipRotation->setDuration(500); - smoothFlipScale->setEasingCurve(QEasingCurve::InOutQuad); - smoothFlipRotation->setEasingCurve(QEasingCurve::InOutQuad); - smoothFlipScale->setKeyValueAt(0, qvariant_cast(1.0)); - smoothFlipScale->setKeyValueAt(0.5, qvariant_cast(0.7)); - smoothFlipScale->setKeyValueAt(1, qvariant_cast(1.0)); - flipAnimation->addAnimation(smoothFlipRotation); - flipAnimation->addAnimation(smoothFlipScale); -//! [7] - -//! [8] - // Flip animation delayed property assignment - QSequentialAnimationGroup *setVariablesSequence = new QSequentialAnimationGroup; - QPropertyAnimation *setFillAnimation = new QPropertyAnimation(pad, "fill"); - QPropertyAnimation *setBackItemVisibleAnimation = new QPropertyAnimation(backItem, "visible"); - QPropertyAnimation *setSelectionItemVisibleAnimation = new QPropertyAnimation(selectionItem, "visible"); - setFillAnimation->setDuration(0); - setBackItemVisibleAnimation->setDuration(0); - setSelectionItemVisibleAnimation->setDuration(0); - setVariablesSequence->addPause(250); - setVariablesSequence->addAnimation(setBackItemVisibleAnimation); - setVariablesSequence->addAnimation(setSelectionItemVisibleAnimation); - setVariablesSequence->addAnimation(setFillAnimation); - flipAnimation->addAnimation(setVariablesSequence); -//! [8] - -//! [9] - // Build the state machine - QStateMachine *stateMachine = new QStateMachine(this); - QState *splashState = new QState(stateMachine); - QState *frontState = new QState(stateMachine); - QHistoryState *historyState = new QHistoryState(frontState); - QState *backState = new QState(stateMachine); -//! [9] -//! [10] - frontState->assignProperty(pad, "fill", false); - frontState->assignProperty(splash, "opacity", 0.0); - frontState->assignProperty(backItem, "visible", false); - frontState->assignProperty(flipRotation, "angle", qvariant_cast(0.0)); - frontState->assignProperty(selectionItem, "visible", true); - backState->assignProperty(pad, "fill", true); - backState->assignProperty(backItem, "visible", true); - backState->assignProperty(xRotation, "angle", qvariant_cast(0.0)); - backState->assignProperty(yRotation, "angle", qvariant_cast(0.0)); - backState->assignProperty(flipRotation, "angle", qvariant_cast(180.0)); - backState->assignProperty(selectionItem, "visible", false); - stateMachine->addDefaultAnimation(smoothXRotation); - stateMachine->addDefaultAnimation(smoothYRotation); - stateMachine->addDefaultAnimation(smoothXSelection); - stateMachine->addDefaultAnimation(smoothYSelection); - stateMachine->setInitialState(splashState); -//! [10] - -//! [11] - // Transitions - QEventTransition *anyKeyTransition = new QEventTransition(this, QEvent::KeyPress, splashState); - anyKeyTransition->setTargetState(frontState); - anyKeyTransition->addAnimation(smoothSplashMove); - anyKeyTransition->addAnimation(smoothSplashOpacity); -//! [11] - -//! [12] - QKeyEventTransition *enterTransition = new QKeyEventTransition(this, QEvent::KeyPress, - Qt::Key_Enter, backState); - QKeyEventTransition *returnTransition = new QKeyEventTransition(this, QEvent::KeyPress, - Qt::Key_Return, backState); - QKeyEventTransition *backEnterTransition = new QKeyEventTransition(this, QEvent::KeyPress, - Qt::Key_Enter, frontState); - QKeyEventTransition *backReturnTransition = new QKeyEventTransition(this, QEvent::KeyPress, - Qt::Key_Return, frontState); - enterTransition->setTargetState(historyState); - returnTransition->setTargetState(historyState); - backEnterTransition->setTargetState(backState); - backReturnTransition->setTargetState(backState); - enterTransition->addAnimation(flipAnimation); - returnTransition->addAnimation(flipAnimation); - backEnterTransition->addAnimation(flipAnimation); - backReturnTransition->addAnimation(flipAnimation); -//! [12] - -//! [13] - // Create substates for each icon; store in temporary grid. - int columns = size.width(); - int rows = size.height(); - QList> stateGrid; - stateGrid.resize(rows); - for (int y = 0; y < rows; ++y) { - stateGrid[y].resize(columns); - for (int x = 0; x < columns; ++x) - stateGrid[y][x] = new QState(frontState); - } - frontState->setInitialState(stateGrid[0][0]); - selectionItem->setPos(pad->iconAt(0, 0)->pos()); -//! [13] - -//! [14] - // Enable key navigation using state transitions - for (int y = 0; y < rows; ++y) { - for (int x = 0; x < columns; ++x) { - QState *state = stateGrid[y][x]; - QKeyEventTransition *rightTransition = new QKeyEventTransition(this, QEvent::KeyPress, - Qt::Key_Right, state); - QKeyEventTransition *leftTransition = new QKeyEventTransition(this, QEvent::KeyPress, - Qt::Key_Left, state); - QKeyEventTransition *downTransition = new QKeyEventTransition(this, QEvent::KeyPress, - Qt::Key_Down, state); - QKeyEventTransition *upTransition = new QKeyEventTransition(this, QEvent::KeyPress, - Qt::Key_Up, state); - rightTransition->setTargetState(stateGrid[y][(x + 1) % columns]); - leftTransition->setTargetState(stateGrid[y][((x - 1) + columns) % columns]); - downTransition->setTargetState(stateGrid[(y + 1) % rows][x]); - upTransition->setTargetState(stateGrid[((y - 1) + rows) % rows][x]); -//! [14] -//! [15] - RoundRectItem *icon = pad->iconAt(x, y); - state->assignProperty(xRotation, "angle", -icon->x() / 6.0); - state->assignProperty(yRotation, "angle", icon->y() / 6.0); - state->assignProperty(selectionItem, "x", icon->x()); - state->assignProperty(selectionItem, "y", icon->y()); - frontState->assignProperty(icon, "visible", true); - backState->assignProperty(icon, "visible", false); - - QPropertyAnimation *setIconVisibleAnimation = new QPropertyAnimation(icon, "visible"); - setIconVisibleAnimation->setDuration(0); - setVariablesSequence->addAnimation(setIconVisibleAnimation); - } - } -//! [15] - -//! [16] - // Scene - QGraphicsScene *scene = new QGraphicsScene(this); - scene->setBackgroundBrush(QPixmap(":/images/blue_angle_swirl.jpg")); - scene->setItemIndexMethod(QGraphicsScene::NoIndex); - scene->addItem(pad); - scene->setSceneRect(scene->itemsBoundingRect()); - setScene(scene); -//! [16] - -//! [17] - // Adjust splash item to scene contents - const QRectF sbr = splash->boundingRect(); - splash->setPos(-sbr.width() / 2, scene->sceneRect().top() - 2); - frontState->assignProperty(splash, "y", splash->y() - 100.0); - scene->addItem(splash); -//! [17] - -//! [18] - // View - setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - setMinimumSize(50, 50); - setViewportUpdateMode(FullViewportUpdate); - setCacheMode(CacheBackground); - setRenderHints(QPainter::Antialiasing - | QPainter::SmoothPixmapTransform - | QPainter::TextAntialiasing); -#ifndef QT_NO_OPENGL - setViewport(new QOpenGLWidget); -#endif - - stateMachine->start(); -//! [18] -} - -//! [19] -void PadNavigator::resizeEvent(QResizeEvent *event) -{ - QGraphicsView::resizeEvent(event); - fitInView(scene()->sceneRect(), Qt::KeepAspectRatio); -} -//! [19] diff --git a/examples/widgets/graphicsview/padnavigator/padnavigator.h b/examples/widgets/graphicsview/padnavigator/padnavigator.h deleted file mode 100644 index 0fe9ad045d7..00000000000 --- a/examples/widgets/graphicsview/padnavigator/padnavigator.h +++ /dev/null @@ -1,72 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef PADNAVIGATOR_H -#define PADNAVIGATOR_H - -#include -#include "ui_form.h" - -//! [0] -class PadNavigator : public QGraphicsView -{ - Q_OBJECT -public: - explicit PadNavigator(const QSize &size, QWidget *parent = nullptr); - -protected: - void resizeEvent(QResizeEvent *event) override; - -private: - Ui::Form form; -}; -//! [0] - -#endif // PADNAVIGATOR_H diff --git a/examples/widgets/graphicsview/padnavigator/padnavigator.pro b/examples/widgets/graphicsview/padnavigator/padnavigator.pro deleted file mode 100644 index d957be4593c..00000000000 --- a/examples/widgets/graphicsview/padnavigator/padnavigator.pro +++ /dev/null @@ -1,27 +0,0 @@ -SOURCES += main.cpp \ - roundrectitem.cpp \ - flippablepad.cpp \ - padnavigator.cpp \ - splashitem.cpp - -HEADERS += \ - roundrectitem.h \ - flippablepad.h \ - padnavigator.h \ - splashitem.h - -RESOURCES += \ - padnavigator.qrc - -FORMS += \ - form.ui - -QT += widgets -requires(qtConfig(treewidget)) -qtHaveModule(opengl): QT += opengl openglwidgets - -# install -target.path = $$[QT_INSTALL_EXAMPLES]/widgets/graphicsview/padnavigator -INSTALLS += target - -CONFIG += console diff --git a/examples/widgets/graphicsview/padnavigator/padnavigator.qrc b/examples/widgets/graphicsview/padnavigator/padnavigator.qrc deleted file mode 100644 index b26ab92ae14..00000000000 --- a/examples/widgets/graphicsview/padnavigator/padnavigator.qrc +++ /dev/null @@ -1,13 +0,0 @@ - - - images/blue_angle_swirl.jpg - images/artsfftscope.png - images/kontact_contacts.png - images/kontact_journal.png - images/kontact_mail.png - images/kontact_notes.png - images/kopeteavailable.png - images/metacontact_online.png - images/minitools.png - - diff --git a/examples/widgets/graphicsview/padnavigator/roundrectitem.cpp b/examples/widgets/graphicsview/padnavigator/roundrectitem.cpp deleted file mode 100644 index b4ea4890694..00000000000 --- a/examples/widgets/graphicsview/padnavigator/roundrectitem.cpp +++ /dev/null @@ -1,125 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "roundrectitem.h" - -#include -#include -#include - -//! [0] -RoundRectItem::RoundRectItem(const QRectF &bounds, const QColor &color, - QGraphicsItem *parent) - : QGraphicsObject(parent), fillRect(false), bounds(bounds) -{ - gradient.setStart(bounds.topLeft()); - gradient.setFinalStop(bounds.bottomRight()); - gradient.setColorAt(0, color); - gradient.setColorAt(1, color.darker(200)); - setCacheMode(ItemCoordinateCache); -} -//! [0] - -//! [1] -QPixmap RoundRectItem::pixmap() const -{ - return pix; -} -void RoundRectItem::setPixmap(const QPixmap &pixmap) -{ - pix = pixmap; - update(); -} -//! [1] - -//! [2] -QRectF RoundRectItem::boundingRect() const -{ - return bounds.adjusted(0, 0, 2, 2); -} -//! [2] - -//! [3] -void RoundRectItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, - QWidget *widget) -{ - Q_UNUSED(option); - Q_UNUSED(widget); - painter->setPen(Qt::NoPen); - painter->setBrush(QColor(0, 0, 0, 64)); - painter->drawRoundedRect(bounds.translated(2, 2), 25, 25, Qt::RelativeSize); -//! [3] -//! [4] - if (fillRect) - painter->setBrush(QGuiApplication::palette().brush(QPalette::Window)); - else - painter->setBrush(gradient); - painter->setPen(QPen(Qt::black, 1)); - painter->drawRoundedRect(bounds, 25,25, Qt::RelativeSize); -//! [4] -//! [5] - if (!pix.isNull()) { - painter->scale(1.95, 1.95); - painter->drawPixmap(-pix.width() / 2, -pix.height() / 2, pix); - } -} -//! [5] - -//! [6] -bool RoundRectItem::fill() const -{ - return fillRect; -} -void RoundRectItem::setFill(bool fill) -{ - fillRect = fill; - update(); -} -//! [6] diff --git a/examples/widgets/graphicsview/padnavigator/roundrectitem.h b/examples/widgets/graphicsview/padnavigator/roundrectitem.h deleted file mode 100644 index 91b3e6542ea..00000000000 --- a/examples/widgets/graphicsview/padnavigator/roundrectitem.h +++ /dev/null @@ -1,85 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef ROUNDRECTITEM_H -#define ROUNDRECTITEM_H - -#include -#include - -//! [0] -class RoundRectItem : public QGraphicsObject -{ - Q_OBJECT - Q_PROPERTY(bool fill READ fill WRITE setFill) -public: - RoundRectItem(const QRectF &bounds, const QColor &color, - QGraphicsItem *parent = nullptr); - - QPixmap pixmap() const; - void setPixmap(const QPixmap &pixmap); - - QRectF boundingRect() const override; - void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override; - - bool fill() const; - void setFill(bool fill); -//! [0] - -//! [1] -private: - QPixmap pix; - bool fillRect; - QRectF bounds; - QLinearGradient gradient; -}; -//! [1] - -#endif // ROUNDRECTITEM_H diff --git a/examples/widgets/graphicsview/padnavigator/splashitem.cpp b/examples/widgets/graphicsview/padnavigator/splashitem.cpp deleted file mode 100644 index 7c3dfba5881..00000000000 --- a/examples/widgets/graphicsview/padnavigator/splashitem.cpp +++ /dev/null @@ -1,93 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "splashitem.h" - -#include - -//! [0] -SplashItem::SplashItem(QGraphicsItem *parent) - : QGraphicsObject(parent) -{ - text = tr("Welcome to the Pad Navigator Example. You can use the" - " keyboard arrows to navigate the icons, and press enter" - " to activate an item. Press any key to begin."); - setCacheMode(DeviceCoordinateCache); -} -//! [0] - -//! [1] -QRectF SplashItem::boundingRect() const -{ - return QRectF(0, 0, 400, 175); -} -//! [1] - -//! [2] -void SplashItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, - QWidget *widget) -{ - Q_UNUSED(option); - Q_UNUSED(widget); - painter->setPen(QPen(Qt::black, 2)); - painter->setBrush(QColor(245, 245, 255, 220)); - painter->setClipRect(boundingRect()); - painter->drawRoundedRect(3, -100 + 3, 400 - 6, 250 - 6, 25, 25, Qt::RelativeSize); - - QRectF textRect = boundingRect().adjusted(10, 10, -10, -10); - int flags = Qt::AlignTop | Qt::AlignLeft | Qt::TextWordWrap; - - QFont font; - font.setPixelSize(18); - painter->setPen(Qt::black); - painter->setFont(font); - painter->drawText(textRect, flags, text); -} -//! [2] diff --git a/examples/widgets/graphicsview/padnavigator/splashitem.h b/examples/widgets/graphicsview/padnavigator/splashitem.h deleted file mode 100644 index b8e723db81a..00000000000 --- a/examples/widgets/graphicsview/padnavigator/splashitem.h +++ /dev/null @@ -1,71 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef SPLASHITEM_H -#define SPLASHITEM_H - -#include - -//! [0] -class SplashItem : public QGraphicsObject -{ - Q_OBJECT -public: - explicit SplashItem(QGraphicsItem *parent = nullptr); - - QRectF boundingRect() const override; - void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override; - -private: - QString text; -}; -//! [0] - -#endif // SPLASHITEM_H diff --git a/examples/widgets/statemachine/CMakeLists.txt b/examples/widgets/statemachine/CMakeLists.txt deleted file mode 100644 index 90a7b3e2631..00000000000 --- a/examples/widgets/statemachine/CMakeLists.txt +++ /dev/null @@ -1,10 +0,0 @@ -# Generated from statemachine.pro. - -add_subdirectory(factorial) -add_subdirectory(pingpong) -if(TARGET Qt::Widgets) - add_subdirectory(eventtransitions) - add_subdirectory(rogue) - add_subdirectory(trafficlight) - add_subdirectory(twowaybutton) -endif() diff --git a/examples/widgets/statemachine/README b/examples/widgets/statemachine/README deleted file mode 100644 index a0ac35a89b7..00000000000 --- a/examples/widgets/statemachine/README +++ /dev/null @@ -1,6 +0,0 @@ -Qt is provided with a powerful hierchical finite state machine through -the Qt State Machine classes. - - -Documentation for these examples can be found via the Examples -link in the main Qt documentation. diff --git a/examples/widgets/statemachine/eventtransitions/CMakeLists.txt b/examples/widgets/statemachine/eventtransitions/CMakeLists.txt deleted file mode 100644 index 642e6343db0..00000000000 --- a/examples/widgets/statemachine/eventtransitions/CMakeLists.txt +++ /dev/null @@ -1,35 +0,0 @@ -# Generated from eventtransitions.pro. - -cmake_minimum_required(VERSION 3.14) -project(eventtransitions LANGUAGES CXX) - -set(CMAKE_INCLUDE_CURRENT_DIR ON) - -set(CMAKE_AUTOMOC ON) -set(CMAKE_AUTORCC ON) -set(CMAKE_AUTOUIC ON) - -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/widgets/statemachine/eventtransitions") - -find_package(Qt6 COMPONENTS Core) -find_package(Qt6 COMPONENTS Gui) -find_package(Qt6 COMPONENTS Widgets) - -add_qt_gui_executable(eventtransitions - main.cpp -) -target_link_libraries(eventtransitions PUBLIC - Qt::Core - Qt::Gui - Qt::Widgets -) - -install(TARGETS eventtransitions - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" -) diff --git a/examples/widgets/statemachine/eventtransitions/eventtransitions.pro b/examples/widgets/statemachine/eventtransitions/eventtransitions.pro deleted file mode 100644 index 07c8be73d4e..00000000000 --- a/examples/widgets/statemachine/eventtransitions/eventtransitions.pro +++ /dev/null @@ -1,7 +0,0 @@ -QT += widgets - -SOURCES = main.cpp - -# install -target.path = $$[QT_INSTALL_EXAMPLES]/widgets/statemachine/eventtransitions -INSTALLS += target diff --git a/examples/widgets/statemachine/eventtransitions/main.cpp b/examples/widgets/statemachine/eventtransitions/main.cpp deleted file mode 100644 index fe9518092f0..00000000000 --- a/examples/widgets/statemachine/eventtransitions/main.cpp +++ /dev/null @@ -1,130 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include -#include -#include -#include -#include -#include - -//! [0] -class Window : public QWidget -{ -public: - Window(QWidget *parent = nullptr) - : QWidget(parent) - { - QPushButton *button = new QPushButton(this); - button->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - - QVBoxLayout *layout = new QVBoxLayout; - layout->addWidget(button); - layout->setContentsMargins(80, 80, 80, 80); - setLayout(layout); -//! [0] - -//! [1] - QStateMachine *machine = new QStateMachine(this); - - QState *s1 = new QState(); - s1->assignProperty(button, "text", "Outside"); - - QState *s2 = new QState(); - s2->assignProperty(button, "text", "Inside"); -//! [1] - -//! [2] - QEventTransition *enterTransition = new QEventTransition(button, QEvent::Enter); - enterTransition->setTargetState(s2); - s1->addTransition(enterTransition); -//! [2] - -//! [3] - QEventTransition *leaveTransition = new QEventTransition(button, QEvent::Leave); - leaveTransition->setTargetState(s1); - s2->addTransition(leaveTransition); -//! [3] - -//! [4] - QState *s3 = new QState(); - s3->assignProperty(button, "text", "Pressing..."); - - QEventTransition *pressTransition = new QEventTransition(button, QEvent::MouseButtonPress); - pressTransition->setTargetState(s3); - s2->addTransition(pressTransition); - - QEventTransition *releaseTransition = new QEventTransition(button, QEvent::MouseButtonRelease); - releaseTransition->setTargetState(s2); - s3->addTransition(releaseTransition); -//! [4] - -//! [5] - machine->addState(s1); - machine->addState(s2); - machine->addState(s3); - - machine->setInitialState(s1); - machine->start(); - } -}; -//! [5] - -//! [6] -int main(int argc, char **argv) -{ - QApplication app(argc, argv); - Window window; - window.resize(300, 300); - window.show(); - - return app.exec(); -} -//! [6] diff --git a/examples/widgets/statemachine/factorial/CMakeLists.txt b/examples/widgets/statemachine/factorial/CMakeLists.txt deleted file mode 100644 index 17904e3cd2e..00000000000 --- a/examples/widgets/statemachine/factorial/CMakeLists.txt +++ /dev/null @@ -1,31 +0,0 @@ -# Generated from factorial.pro. - -cmake_minimum_required(VERSION 3.14) -project(factorial LANGUAGES CXX) - -set(CMAKE_INCLUDE_CURRENT_DIR ON) - -set(CMAKE_AUTOMOC ON) -set(CMAKE_AUTORCC ON) -set(CMAKE_AUTOUIC ON) - -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/widgets/statemachine/factorial") - -find_package(Qt6 COMPONENTS Core) - -add_executable(factorial - main.cpp -) -target_link_libraries(factorial PUBLIC - Qt::Core -) - -install(TARGETS factorial - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" -) diff --git a/examples/widgets/statemachine/factorial/factorial.pro b/examples/widgets/statemachine/factorial/factorial.pro deleted file mode 100644 index bf285acf4d9..00000000000 --- a/examples/widgets/statemachine/factorial/factorial.pro +++ /dev/null @@ -1,10 +0,0 @@ -QT = core -CONFIG += cmdline - -SOURCES += main.cpp - -# install -target.path = $$[QT_INSTALL_EXAMPLES]/widgets/statemachine/factorial -INSTALLS += target - - diff --git a/examples/widgets/statemachine/factorial/main.cpp b/examples/widgets/statemachine/factorial/main.cpp deleted file mode 100644 index e6cbdcae290..00000000000 --- a/examples/widgets/statemachine/factorial/main.cpp +++ /dev/null @@ -1,181 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include - -//! [0] -class Factorial : public QObject -{ - Q_OBJECT - Q_PROPERTY(int x READ x WRITE setX) - Q_PROPERTY(int fac READ fac WRITE setFac) -public: - using QObject::QObject; - - int x() const - { - return m_x; - } - - void setX(int x) - { - if (x == m_x) - return; - m_x = x; - emit xChanged(x); - } - - int fac() const - { - return m_fac; - } - - void setFac(int fac) - { - m_fac = fac; - } - -Q_SIGNALS: - void xChanged(int value); - -private: - int m_x = -1; - int m_fac = 1; -}; -//! [0] - -//! [1] -class FactorialLoopTransition : public QSignalTransition -{ -public: - FactorialLoopTransition(Factorial *fact) - : QSignalTransition(fact, &Factorial::xChanged), m_fact(fact) - {} - - bool eventTest(QEvent *e) override - { - if (!QSignalTransition::eventTest(e)) - return false; - QStateMachine::SignalEvent *se = static_cast(e); - return se->arguments().at(0).toInt() > 1; - } - - void onTransition(QEvent *e) override - { - QStateMachine::SignalEvent *se = static_cast(e); - int x = se->arguments().at(0).toInt(); - int fac = m_fact->property("fac").toInt(); - m_fact->setProperty("fac", x * fac); - m_fact->setProperty("x", x - 1); - } - -private: - Factorial *m_fact; -}; -//! [1] - -//! [2] -class FactorialDoneTransition : public QSignalTransition -{ -public: - FactorialDoneTransition(Factorial *fact) - : QSignalTransition(fact, &Factorial::xChanged), m_fact(fact) - {} - - bool eventTest(QEvent *e) override - { - if (!QSignalTransition::eventTest(e)) - return false; - QStateMachine::SignalEvent *se = static_cast(e); - return se->arguments().at(0).toInt() <= 1; - } - - void onTransition(QEvent *) override - { - qInfo() << m_fact->property("fac").toInt(); - } - -private: - Factorial *m_fact; -}; -//! [2] - -//! [3] -int main(int argc, char **argv) -{ - QCoreApplication app(argc, argv); - Factorial factorial; - QStateMachine machine; -//! [3] - -//! [4] - QState *compute = new QState(&machine); - compute->assignProperty(&factorial, "fac", 1); - compute->assignProperty(&factorial, "x", 6); - compute->addTransition(new FactorialLoopTransition(&factorial)); -//! [4] - -//! [5] - QFinalState *done = new QFinalState(&machine); - FactorialDoneTransition *doneTransition = new FactorialDoneTransition(&factorial); - doneTransition->setTargetState(done); - compute->addTransition(doneTransition); -//! [5] - -//! [6] - machine.setInitialState(compute); - QObject::connect(&machine, &QStateMachine::finished, &app, QCoreApplication::quit); - machine.start(); - - return app.exec(); -} -//! [6] - -#include "main.moc" diff --git a/examples/widgets/statemachine/pingpong/CMakeLists.txt b/examples/widgets/statemachine/pingpong/CMakeLists.txt deleted file mode 100644 index 68cb4acb443..00000000000 --- a/examples/widgets/statemachine/pingpong/CMakeLists.txt +++ /dev/null @@ -1,31 +0,0 @@ -# Generated from pingpong.pro. - -cmake_minimum_required(VERSION 3.14) -project(pingpong LANGUAGES CXX) - -set(CMAKE_INCLUDE_CURRENT_DIR ON) - -set(CMAKE_AUTOMOC ON) -set(CMAKE_AUTORCC ON) -set(CMAKE_AUTOUIC ON) - -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/widgets/statemachine/pingpong") - -find_package(Qt6 COMPONENTS Core) - -add_executable(pingpong - main.cpp -) -target_link_libraries(pingpong PUBLIC - Qt::Core -) - -install(TARGETS pingpong - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" -) diff --git a/examples/widgets/statemachine/pingpong/main.cpp b/examples/widgets/statemachine/pingpong/main.cpp deleted file mode 100644 index c09060c5023..00000000000 --- a/examples/widgets/statemachine/pingpong/main.cpp +++ /dev/null @@ -1,149 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include -#include - -//! [0] -class PingEvent : public QEvent -{ -public: - PingEvent() : QEvent(QEvent::Type(QEvent::User+2)) - {} -}; - -class PongEvent : public QEvent -{ -public: - PongEvent() : QEvent(QEvent::Type(QEvent::User+3)) - {} -}; -//! [0] - -//! [1] -class Pinger : public QState -{ -public: - Pinger(QState *parent) - : QState(parent) {} - -protected: - void onEntry(QEvent *) override - { - machine()->postEvent(new PingEvent()); - fprintf(stdout, "ping?\n"); - } -}; -//! [1] - -//! [3] -class PongTransition : public QAbstractTransition -{ -public: - PongTransition() {} - -protected: - bool eventTest(QEvent *e) override { - return (e->type() == QEvent::User+3); - } - void onTransition(QEvent *) override - { - machine()->postDelayedEvent(new PingEvent(), 500); - fprintf(stdout, "ping?\n"); - } -}; -//! [3] - -//! [2] -class PingTransition : public QAbstractTransition -{ -public: - PingTransition() {} - -protected: - bool eventTest(QEvent *e) override { - return (e->type() == QEvent::User+2); - } - void onTransition(QEvent *) override - { - machine()->postDelayedEvent(new PongEvent(), 500); - fprintf(stdout, "pong!\n"); - } -}; -//! [2] - -//! [4] -int main(int argc, char **argv) -{ - QCoreApplication app(argc, argv); - - QStateMachine machine; - QState *group = new QState(QState::ParallelStates); - group->setObjectName("group"); -//! [4] - -//! [5] - Pinger *pinger = new Pinger(group); - pinger->setObjectName("pinger"); - pinger->addTransition(new PongTransition()); - - QState *ponger = new QState(group); - ponger->setObjectName("ponger"); - ponger->addTransition(new PingTransition()); -//! [5] - -//! [6] - machine.addState(group); - machine.setInitialState(group); - machine.start(); - - return app.exec(); -} -//! [6] diff --git a/examples/widgets/statemachine/pingpong/pingpong.pro b/examples/widgets/statemachine/pingpong/pingpong.pro deleted file mode 100644 index 18dee0400d7..00000000000 --- a/examples/widgets/statemachine/pingpong/pingpong.pro +++ /dev/null @@ -1,10 +0,0 @@ -QT = core -CONFIG += cmdline - -SOURCES = main.cpp - -# install -target.path = $$[QT_INSTALL_EXAMPLES]/widgets/statemachine/pingpong -INSTALLS += target - - diff --git a/examples/widgets/statemachine/rogue/CMakeLists.txt b/examples/widgets/statemachine/rogue/CMakeLists.txt deleted file mode 100644 index 156b0543118..00000000000 --- a/examples/widgets/statemachine/rogue/CMakeLists.txt +++ /dev/null @@ -1,37 +0,0 @@ -# Generated from rogue.pro. - -cmake_minimum_required(VERSION 3.14) -project(rogue LANGUAGES CXX) - -set(CMAKE_INCLUDE_CURRENT_DIR ON) - -set(CMAKE_AUTOMOC ON) -set(CMAKE_AUTORCC ON) -set(CMAKE_AUTOUIC ON) - -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/widgets/statemachine/rogue") - -find_package(Qt6 COMPONENTS Core) -find_package(Qt6 COMPONENTS Gui) -find_package(Qt6 COMPONENTS Widgets) - -add_qt_gui_executable(rogue - main.cpp - movementtransition.h - window.cpp window.h -) -target_link_libraries(rogue PUBLIC - Qt::Core - Qt::Gui - Qt::Widgets -) - -install(TARGETS rogue - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" -) diff --git a/examples/widgets/statemachine/rogue/main.cpp b/examples/widgets/statemachine/rogue/main.cpp deleted file mode 100644 index 44ade770eec..00000000000 --- a/examples/widgets/statemachine/rogue/main.cpp +++ /dev/null @@ -1,64 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the documentation of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include - -#include "window.h" - -int main(int argv, char **args) -{ - QApplication app(argv, args); - - Window window; - window.show(); - - return app.exec(); -} - diff --git a/examples/widgets/statemachine/rogue/movementtransition.h b/examples/widgets/statemachine/rogue/movementtransition.h deleted file mode 100644 index 74ffed66085..00000000000 --- a/examples/widgets/statemachine/rogue/movementtransition.h +++ /dev/null @@ -1,122 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the documentation of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef MOVEMENTTRANSITION_H -#define MOVEMENTTRANSITION_H - -#include - -#include "window.h" - -//![0] -class MovementTransition : public QEventTransition -{ - Q_OBJECT - -public: - MovementTransition(Window *window) : - QEventTransition(window, QEvent::KeyPress) { - this->window = window; - } -//![0] - -//![1] -protected: - bool eventTest(QEvent *event) override { - if (event->type() == QEvent::StateMachineWrapped && - static_cast(event)->event()->type() == QEvent::KeyPress) { - QEvent *wrappedEvent = static_cast(event)->event(); - - QKeyEvent *keyEvent = static_cast(wrappedEvent); - int key = keyEvent->key(); - - return key == Qt::Key_2 || key == Qt::Key_8 || key == Qt::Key_6 || - key == Qt::Key_4 || key == Qt::Key_Down || key == Qt::Key_Up || - key == Qt::Key_Right || key == Qt::Key_Left; - } - return false; - } -//![1] - -//![2] - void onTransition(QEvent *event) override { - QKeyEvent *keyEvent = static_cast( - static_cast(event)->event()); - - int key = keyEvent->key(); - switch (key) { - case Qt::Key_Left: - case Qt::Key_4: - window->movePlayer(Window::Left); - break; - case Qt::Key_Up: - case Qt::Key_8: - window->movePlayer(Window::Up); - break; - case Qt::Key_Right: - case Qt::Key_6: - window->movePlayer(Window::Right); - break; - case Qt::Key_Down: - case Qt::Key_2: - window->movePlayer(Window::Down); - break; - default: - ; - } - } -//![2] - -private: - Window *window; -}; - -#endif - diff --git a/examples/widgets/statemachine/rogue/rogue.pro b/examples/widgets/statemachine/rogue/rogue.pro deleted file mode 100644 index cf9657c7d65..00000000000 --- a/examples/widgets/statemachine/rogue/rogue.pro +++ /dev/null @@ -1,10 +0,0 @@ -QT += widgets - -HEADERS = window.h \ - movementtransition.h -SOURCES = main.cpp \ - window.cpp - -# install -target.path = $$[QT_INSTALL_EXAMPLES]/widgets/statemachine/rogue -INSTALLS += target diff --git a/examples/widgets/statemachine/rogue/window.cpp b/examples/widgets/statemachine/rogue/window.cpp deleted file mode 100644 index a5363e27581..00000000000 --- a/examples/widgets/statemachine/rogue/window.cpp +++ /dev/null @@ -1,261 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the documentation of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include - -#include "window.h" -#include "movementtransition.h" - -//![0] -Window::Window() -{ - pX = 5; - pY = 5; -//![0] - - QFontDatabase database; - QFont font; - if (database.families().contains("Monospace")) { - font = QFont("Monospace"); - } - else { - const QStringList fontFamilies = database.families(); - for (const QString &family : fontFamilies ) { - if (database.isFixedPitch(family)) { - font = QFont(family); - break; - } - } - } - font.setPointSize(12); - setFont(font); - -//![1] - setupMap(); - buildMachine(); -} -//![1] - -void Window::setStatus(const QString &status) -{ - myStatus = status; - repaint(); -} - -QString Window::status() const -{ - return myStatus; -} - -void Window::paintEvent(QPaintEvent * /* event */) -{ - QFontMetrics metrics(font()); - QPainter painter(this); - int fontHeight = metrics.height(); - int fontWidth = metrics.horizontalAdvance('X'); - int yPos = fontHeight; - int xPos; - - painter.fillRect(rect(), Qt::black); - painter.setPen(Qt::white); - - painter.drawText(QPoint(0, yPos), status()); - - for (int y = 0; y < HEIGHT; ++y) { - yPos += fontHeight; - xPos = 0; - - for (int x = 0; x < WIDTH; ++x) { - if (y == pY && x == pX) { - xPos += fontWidth; - continue; - } - - painter.setPen(Qt::white); - - double x1 = static_cast(pX); - double y1 = static_cast(pY); - double x2 = static_cast(x); - double y2 = static_cast(y); - - if (x2x1) { - x2-=0.5; - } - - if (y2y1) { - y2-=0.5; - } - - double dx = x2 - x1; - double dy = y2 - y1; - - double length = qSqrt(dx*dx+dy*dy); - - dx /= length; - dy /= length; - - double xi = x1; - double yi = y1; - - while (length > 0) { - int cx = static_cast(xi+0.5); - int cy = static_cast(yi+0.5); - - if (x2 == cx && y2 == cy) - break; - - if (!(x1==cx && y1==cy) - && (map[cx][cy] == '#' || (length-10) > 0)) { - painter.setPen(QColor(60,60,60)); - break; - } - - xi += dx; - yi += dy; - --length; - } - - painter.drawText(QPoint(xPos, yPos), map[x][y]); - xPos += fontWidth; - } - } - painter.setPen(Qt::white); - painter.drawText(QPoint(pX * fontWidth, (pY + 2) * fontHeight), QChar('@')); -} - -QSize Window::sizeHint() const -{ - QFontMetrics metrics(font()); - - return QSize(metrics.horizontalAdvance('X') * WIDTH, metrics.height() * (HEIGHT + 1)); -} - -//![2] -void Window::buildMachine() -{ - machine = new QStateMachine; - - QState *inputState = new QState(machine); - inputState->assignProperty(this, "status", "Move the rogue with 2, 4, 6, and 8"); - - MovementTransition *transition = new MovementTransition(this); - inputState->addTransition(transition); -//![2] - -//![3] - QState *quitState = new QState(machine); - quitState->assignProperty(this, "status", "Really quit(y/n)?"); - - QKeyEventTransition *yesTransition = new - QKeyEventTransition(this, QEvent::KeyPress, Qt::Key_Y); - yesTransition->setTargetState(new QFinalState(machine)); - quitState->addTransition(yesTransition); - - QKeyEventTransition *noTransition = - new QKeyEventTransition(this, QEvent::KeyPress, Qt::Key_N); - noTransition->setTargetState(inputState); - quitState->addTransition(noTransition); -//![3] - -//![4] - QKeyEventTransition *quitTransition = - new QKeyEventTransition(this, QEvent::KeyPress, Qt::Key_Q); - quitTransition->setTargetState(quitState); - inputState->addTransition(quitTransition); -//![4] - -//![5] - machine->setInitialState(inputState); - - connect(machine, &QStateMachine::finished, - qApp, &QApplication::quit); - - machine->start(); -} -//![5] - -void Window::movePlayer(Direction direction) -{ - switch (direction) { - case Left: - if (map[pX - 1][pY] != '#') - --pX; - break; - case Right: - if (map[pX + 1][pY] != '#') - ++pX; - break; - case Up: - if (map[pX][pY - 1] != '#') - --pY; - break; - case Down: - if (map[pX][pY + 1] != '#') - ++pY; - break; - } - repaint(); -} - -void Window::setupMap() -{ - for (int x = 0; x < WIDTH; ++x) - for (int y = 0; y < HEIGHT; ++y) { - if (x == 0 || x == WIDTH - 1 || y == 0 || y == HEIGHT - 1 || QRandomGenerator::global()->bounded(40) == 0) - map[x][y] = '#'; - else - map[x][y] = '.'; - } -} - diff --git a/examples/widgets/statemachine/rogue/window.h b/examples/widgets/statemachine/rogue/window.h deleted file mode 100644 index af34815ffdb..00000000000 --- a/examples/widgets/statemachine/rogue/window.h +++ /dev/null @@ -1,100 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the documentation of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef WINDOW_H -#define WINDOW_H - -#include - -QT_BEGIN_NAMESPACE -class QState; -class QStateMachine; -class QTransition; -QT_END_NAMESPACE - -#define WIDTH 35 -#define HEIGHT 20 - -//![0] -class Window : public QWidget -{ - Q_OBJECT - Q_PROPERTY(QString status READ status WRITE setStatus) - -public: - enum Direction { Up, Down, Left, Right }; - - Window(); - - void movePlayer(Direction direction); - void setStatus(const QString &status); - QString status() const; - - QSize sizeHint() const override; - -protected: - void paintEvent(QPaintEvent *event) override; -//![0] - -//![1] -private: - void buildMachine(); - void setupMap(); - - QChar map[WIDTH][HEIGHT]; - int pX, pY; - - QStateMachine *machine; - QString myStatus; -}; -//![1] - -#endif - diff --git a/examples/widgets/statemachine/statemachine.pro b/examples/widgets/statemachine/statemachine.pro deleted file mode 100644 index 926e01cfda5..00000000000 --- a/examples/widgets/statemachine/statemachine.pro +++ /dev/null @@ -1,12 +0,0 @@ -TEMPLATE = subdirs -SUBDIRS = \ - factorial \ - pingpong - -qtHaveModule(widgets) { - SUBDIRS += \ - eventtransitions \ - rogue \ - trafficlight \ - twowaybutton -} diff --git a/examples/widgets/statemachine/trafficlight/CMakeLists.txt b/examples/widgets/statemachine/trafficlight/CMakeLists.txt deleted file mode 100644 index ca2ec2313ae..00000000000 --- a/examples/widgets/statemachine/trafficlight/CMakeLists.txt +++ /dev/null @@ -1,35 +0,0 @@ -# Generated from trafficlight.pro. - -cmake_minimum_required(VERSION 3.14) -project(trafficlight LANGUAGES CXX) - -set(CMAKE_INCLUDE_CURRENT_DIR ON) - -set(CMAKE_AUTOMOC ON) -set(CMAKE_AUTORCC ON) -set(CMAKE_AUTOUIC ON) - -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/widgets/statemachine/trafficlight") - -find_package(Qt6 COMPONENTS Core) -find_package(Qt6 COMPONENTS Gui) -find_package(Qt6 COMPONENTS Widgets) - -add_qt_gui_executable(trafficlight - main.cpp -) -target_link_libraries(trafficlight PUBLIC - Qt::Core - Qt::Gui - Qt::Widgets -) - -install(TARGETS trafficlight - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" -) diff --git a/examples/widgets/statemachine/trafficlight/main.cpp b/examples/widgets/statemachine/trafficlight/main.cpp deleted file mode 100644 index dd8bddcb373..00000000000 --- a/examples/widgets/statemachine/trafficlight/main.cpp +++ /dev/null @@ -1,200 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include -#include -#include -#include -#include -#include -#include - -//! [0] -class LightWidget : public QWidget -{ - Q_OBJECT - Q_PROPERTY(bool on READ isOn WRITE setOn) -public: - LightWidget(const QColor &color, QWidget *parent = nullptr) - : QWidget(parent), m_color(color), m_on(false) {} - - bool isOn() const - { return m_on; } - void setOn(bool on) - { - if (on == m_on) - return; - m_on = on; - update(); - } - -public slots: - void turnOff() { setOn(false); } - void turnOn() { setOn(true); } - -protected: - void paintEvent(QPaintEvent *) override - { - if (!m_on) - return; - QPainter painter(this); - painter.setRenderHint(QPainter::Antialiasing); - painter.setBrush(m_color); - painter.drawEllipse(0, 0, width(), height()); - } - -private: - QColor m_color; - bool m_on; -}; -//! [0] - -//! [1] -class TrafficLightWidget : public QWidget -{ -public: - TrafficLightWidget(QWidget *parent = nullptr) - : QWidget(parent) - { - QVBoxLayout *vbox = new QVBoxLayout(this); - m_red = new LightWidget(Qt::red); - vbox->addWidget(m_red); - m_yellow = new LightWidget(Qt::yellow); - vbox->addWidget(m_yellow); - m_green = new LightWidget(Qt::green); - vbox->addWidget(m_green); - QPalette pal = palette(); - pal.setColor(QPalette::Window, Qt::black); - setPalette(pal); - setAutoFillBackground(true); - } - - LightWidget *redLight() const - { return m_red; } - LightWidget *yellowLight() const - { return m_yellow; } - LightWidget *greenLight() const - { return m_green; } - -private: - LightWidget *m_red; - LightWidget *m_yellow; - LightWidget *m_green; -}; -//! [1] - -//! [2] -QState *createLightState(LightWidget *light, int duration, QState *parent = nullptr) -{ - QState *lightState = new QState(parent); - QTimer *timer = new QTimer(lightState); - timer->setInterval(duration); - timer->setSingleShot(true); - QState *timing = new QState(lightState); - QObject::connect(timing, &QAbstractState::entered, light, &LightWidget::turnOn); - QObject::connect(timing, &QAbstractState::entered, timer, QOverload<>::of(&QTimer::start)); - QObject::connect(timing, &QAbstractState::exited, light, &LightWidget::turnOff); - QFinalState *done = new QFinalState(lightState); - timing->addTransition(timer, &QTimer::timeout, done); - lightState->setInitialState(timing); - return lightState; -} -//! [2] - -//! [3] -class TrafficLight : public QWidget -{ -public: - TrafficLight(QWidget *parent = nullptr) - : QWidget(parent) - { - QVBoxLayout *vbox = new QVBoxLayout(this); - TrafficLightWidget *widget = new TrafficLightWidget; - vbox->addWidget(widget); - vbox->setContentsMargins(QMargins()); - - QStateMachine *machine = new QStateMachine(this); - QState *redGoingYellow = createLightState(widget->redLight(), 3000); - redGoingYellow->setObjectName("redGoingYellow"); - QState *yellowGoingGreen = createLightState(widget->yellowLight(), 1000); - yellowGoingGreen->setObjectName("yellowGoingGreen"); - redGoingYellow->addTransition(redGoingYellow, &QState::finished, yellowGoingGreen); - QState *greenGoingYellow = createLightState(widget->greenLight(), 3000); - greenGoingYellow->setObjectName("greenGoingYellow"); - yellowGoingGreen->addTransition(yellowGoingGreen, &QState::finished, greenGoingYellow); - QState *yellowGoingRed = createLightState(widget->yellowLight(), 1000); - yellowGoingRed->setObjectName("yellowGoingRed"); - greenGoingYellow->addTransition(greenGoingYellow, &QState::finished, yellowGoingRed); - yellowGoingRed->addTransition(yellowGoingRed, &QState::finished, redGoingYellow); - - machine->addState(redGoingYellow); - machine->addState(yellowGoingGreen); - machine->addState(greenGoingYellow); - machine->addState(yellowGoingRed); - machine->setInitialState(redGoingYellow); - machine->start(); - } -}; -//! [3] - -//! [4] -int main(int argc, char **argv) -{ - QApplication app(argc, argv); - - TrafficLight widget; - widget.resize(110, 300); - widget.show(); - - return app.exec(); -} -//! [4] - -#include "main.moc" diff --git a/examples/widgets/statemachine/trafficlight/trafficlight.pro b/examples/widgets/statemachine/trafficlight/trafficlight.pro deleted file mode 100644 index 85d9cda5047..00000000000 --- a/examples/widgets/statemachine/trafficlight/trafficlight.pro +++ /dev/null @@ -1,9 +0,0 @@ -QT += widgets - -SOURCES = main.cpp - -# install -target.path = $$[QT_INSTALL_EXAMPLES]/widgets/statemachine/trafficlight -INSTALLS += target - - diff --git a/examples/widgets/statemachine/twowaybutton/CMakeLists.txt b/examples/widgets/statemachine/twowaybutton/CMakeLists.txt deleted file mode 100644 index 91abfc0db0f..00000000000 --- a/examples/widgets/statemachine/twowaybutton/CMakeLists.txt +++ /dev/null @@ -1,35 +0,0 @@ -# Generated from twowaybutton.pro. - -cmake_minimum_required(VERSION 3.14) -project(twowaybutton LANGUAGES CXX) - -set(CMAKE_INCLUDE_CURRENT_DIR ON) - -set(CMAKE_AUTOMOC ON) -set(CMAKE_AUTORCC ON) -set(CMAKE_AUTOUIC ON) - -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/widgets/statemachine/twowaybutton") - -find_package(Qt6 COMPONENTS Core) -find_package(Qt6 COMPONENTS Gui) -find_package(Qt6 COMPONENTS Widgets) - -add_qt_gui_executable(twowaybutton - main.cpp -) -target_link_libraries(twowaybutton PUBLIC - Qt::Core - Qt::Gui - Qt::Widgets -) - -install(TARGETS twowaybutton - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" -) diff --git a/examples/widgets/statemachine/twowaybutton/main.cpp b/examples/widgets/statemachine/twowaybutton/main.cpp deleted file mode 100644 index 3d4fef3bbe4..00000000000 --- a/examples/widgets/statemachine/twowaybutton/main.cpp +++ /dev/null @@ -1,91 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include - -//! [0] -int main(int argc, char **argv) -{ - QApplication app(argc, argv); - QPushButton button; - QStateMachine machine; -//! [0] - -//! [1] - QState *off = new QState(); - off->assignProperty(&button, "text", "Off"); - off->setObjectName("off"); - - QState *on = new QState(); - on->setObjectName("on"); - on->assignProperty(&button, "text", "On"); -//! [1] - -//! [2] - off->addTransition(&button, &QAbstractButton::clicked, on); - on->addTransition(&button, &QAbstractButton::clicked, off); -//! [2] - -//! [3] - machine.addState(off); - machine.addState(on); -//! [3] - -//! [4] - machine.setInitialState(off); - machine.start(); -//! [4] - -//! [5] - button.resize(100, 50); - button.show(); - return app.exec(); -} -//! [5] diff --git a/examples/widgets/statemachine/twowaybutton/twowaybutton.pro b/examples/widgets/statemachine/twowaybutton/twowaybutton.pro deleted file mode 100644 index 22d19308ae0..00000000000 --- a/examples/widgets/statemachine/twowaybutton/twowaybutton.pro +++ /dev/null @@ -1,9 +0,0 @@ -QT += widgets - -SOURCES = main.cpp - -# install -target.path = $$[QT_INSTALL_EXAMPLES]/widgets/statemachine/twowaybutton -INSTALLS += target - - diff --git a/examples/widgets/widgets.pro b/examples/widgets/widgets.pro index 4452414668e..2dbbefa141d 100644 --- a/examples/widgets/widgets.pro +++ b/examples/widgets/widgets.pro @@ -18,7 +18,6 @@ SUBDIRS = \ painting \ richtext \ scroller \ - statemachine \ tools \ touch \ tutorials \ diff --git a/src/corelib/.prev_CMakeLists.txt b/src/corelib/.prev_CMakeLists.txt index eb1ca0cc4b6..747a0d75df5 100644 --- a/src/corelib/.prev_CMakeLists.txt +++ b/src/corelib/.prev_CMakeLists.txt @@ -128,14 +128,6 @@ qt_add_module(Core serialization/qxmlstreamgrammar.cpp serialization/qxmlstreamgrammar_p.h serialization/qxmlstreamparser_p.h serialization/qxmlutils.cpp serialization/qxmlutils_p.h - statemachine/qabstractstate.cpp statemachine/qabstractstate.h statemachine/qabstractstate_p.h - statemachine/qabstracttransition.cpp statemachine/qabstracttransition.h statemachine/qabstracttransition_p.h - statemachine/qfinalstate.cpp statemachine/qfinalstate.h statemachine/qfinalstate_p.h - statemachine/qhistorystate.cpp statemachine/qhistorystate.h statemachine/qhistorystate_p.h - statemachine/qsignaleventgenerator_p.h - statemachine/qsignaltransition.cpp statemachine/qsignaltransition.h statemachine/qsignaltransition_p.h - statemachine/qstate.cpp statemachine/qstate.h statemachine/qstate_p.h - statemachine/qstatemachine.cpp statemachine/qstatemachine.h statemachine/qstatemachine_p.h text/qbytearray.cpp text/qbytearray.h text/qbytearray_p.h text/qbytearrayalgorithms.h text/qbytearraylist.cpp text/qbytearraylist.h @@ -1001,11 +993,6 @@ qt_extend_target(Core CONDITION QT_FEATURE_cborstreamwriter serialization/qcborstreamwriter.cpp serialization/qcborstreamwriter.h ) -qt_extend_target(Core CONDITION QT_FEATURE_qeventtransition - SOURCES - statemachine/qeventtransition.cpp statemachine/qeventtransition.h statemachine/qeventtransition_p.h -) - qt_extend_target(Core CONDITION QT_FEATURE_mimetype SOURCES mimetypes/qmimedatabase.cpp mimetypes/qmimedatabase.h mimetypes/qmimedatabase_p.h diff --git a/src/corelib/.prev_configure.cmake b/src/corelib/.prev_configure.cmake index ddbbbc56e83..6619762a29f 100644 --- a/src/corelib/.prev_configure.cmake +++ b/src/corelib/.prev_configure.cmake @@ -872,17 +872,6 @@ qt_feature("animation" PUBLIC CONDITION QT_FEATURE_properties AND QT_FEATURE_easingcurve ) qt_feature_definition("animation" "QT_NO_ANIMATION" NEGATE VALUE "1") -qt_feature("statemachine" PUBLIC - SECTION "Utilities" - LABEL "State machine" - PURPOSE "Provides hierarchical finite state machines." - CONDITION QT_FEATURE_properties -) -qt_feature_definition("statemachine" "QT_NO_STATEMACHINE" NEGATE VALUE "1") -qt_feature("qeventtransition" PUBLIC - LABEL "QEventTransition class" - CONDITION QT_FEATURE_statemachine -) qt_feature("gestures" PUBLIC SECTION "Utilities" LABEL "Gesture" diff --git a/src/corelib/CMakeLists.txt b/src/corelib/CMakeLists.txt index 26364f46607..3411f4f8f64 100644 --- a/src/corelib/CMakeLists.txt +++ b/src/corelib/CMakeLists.txt @@ -150,14 +150,6 @@ qt_add_module(Core serialization/qxmlstreamgrammar.cpp serialization/qxmlstreamgrammar_p.h serialization/qxmlstreamparser_p.h serialization/qxmlutils.cpp serialization/qxmlutils_p.h - statemachine/qabstractstate.cpp statemachine/qabstractstate.h statemachine/qabstractstate_p.h - statemachine/qabstracttransition.cpp statemachine/qabstracttransition.h statemachine/qabstracttransition_p.h - statemachine/qfinalstate.cpp statemachine/qfinalstate.h statemachine/qfinalstate_p.h - statemachine/qhistorystate.cpp statemachine/qhistorystate.h statemachine/qhistorystate_p.h - statemachine/qsignaleventgenerator_p.h - statemachine/qsignaltransition.cpp statemachine/qsignaltransition.h statemachine/qsignaltransition_p.h - statemachine/qstate.cpp statemachine/qstate.h statemachine/qstate_p.h - statemachine/qstatemachine.cpp statemachine/qstatemachine.h statemachine/qstatemachine_p.h text/qbytearray.cpp text/qbytearray.h text/qbytearray_p.h text/qbytearrayalgorithms.h text/qbytearraylist.cpp text/qbytearraylist.h @@ -1115,11 +1107,6 @@ qt_extend_target(Core CONDITION QT_FEATURE_cborstreamwriter serialization/qcborstreamwriter.cpp serialization/qcborstreamwriter.h ) -qt_extend_target(Core CONDITION QT_FEATURE_qeventtransition - SOURCES - statemachine/qeventtransition.cpp statemachine/qeventtransition.h statemachine/qeventtransition_p.h -) - qt_extend_target(Core CONDITION QT_FEATURE_mimetype SOURCES mimetypes/qmimedatabase.cpp mimetypes/qmimedatabase.h mimetypes/qmimedatabase_p.h diff --git a/src/corelib/configure.cmake b/src/corelib/configure.cmake index 31cdcb45dc5..a6aecd2ae10 100644 --- a/src/corelib/configure.cmake +++ b/src/corelib/configure.cmake @@ -878,17 +878,6 @@ qt_feature("animation" PUBLIC CONDITION QT_FEATURE_properties AND QT_FEATURE_easingcurve ) qt_feature_definition("animation" "QT_NO_ANIMATION" NEGATE VALUE "1") -qt_feature("statemachine" PUBLIC - SECTION "Utilities" - LABEL "State machine" - PURPOSE "Provides hierarchical finite state machines." - CONDITION QT_FEATURE_properties -) -qt_feature_definition("statemachine" "QT_NO_STATEMACHINE" NEGATE VALUE "1") -qt_feature("qeventtransition" PUBLIC - LABEL "QEventTransition class" - CONDITION QT_FEATURE_statemachine -) qt_feature("gestures" PUBLIC SECTION "Utilities" LABEL "Gesture" diff --git a/src/corelib/configure.json b/src/corelib/configure.json index 4557212a766..8e2d4e859df 100644 --- a/src/corelib/configure.json +++ b/src/corelib/configure.json @@ -947,18 +947,6 @@ "condition": "features.properties && features.easingcurve", "output": [ "publicFeature", "feature" ] }, - "statemachine": { - "label": "State machine", - "purpose": "Provides hierarchical finite state machines.", - "section": "Utilities", - "condition": "features.properties", - "output": [ "publicFeature", "feature" ] - }, - "qeventtransition": { - "label": "QEventTransition class", - "condition": "features.statemachine", - "output": [ "publicFeature" ] - }, "gestures": { "label": "Gesture", "purpose": "Provides a framework for gestures.", diff --git a/src/corelib/corelib.pro b/src/corelib/corelib.pro index 7a52cadf05b..73479e2309d 100644 --- a/src/corelib/corelib.pro +++ b/src/corelib/corelib.pro @@ -45,7 +45,6 @@ include(itemmodels/itemmodels.pri) include(plugin/plugin.pri) include(kernel/kernel.pri) include(serialization/serialization.pri) -include(statemachine/statemachine.pri) include(mimetypes/mimetypes.pri) include(platform/platform.pri) diff --git a/src/corelib/doc/images/statemachine-button-history.png b/src/corelib/doc/images/statemachine-button-history.png deleted file mode 100644 index 7f51cae3f2504fd868702f533e5f4aec68263e92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8493 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 ekeA+kVqyzN^o-5WYzq!mm{(k_U{7tj~ diff --git a/src/corelib/doc/images/statemachine-button.png b/src/corelib/doc/images/statemachine-button.png deleted file mode 100644 index 10102bdf2c777a2d5f437fccde27cff7b09e9cbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4233 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 ZEsJ~Jm-A@u>Y1Pi`TKk+DCYk)?Y}lSw@?58 diff --git a/src/corelib/doc/images/statemachine-customevents2.png b/src/corelib/doc/images/statemachine-customevents2.png deleted file mode 100644 index 57b37ef1dd3675124928e289877fe882cb725d20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6713 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 uR^{-VWV!qJY)s+>22mTkk$`85# diff --git a/src/corelib/doc/images/statemachine-examples.png b/src/corelib/doc/images/statemachine-examples.png deleted file mode 100644 index b2ec66e19dc85fe7f6c9f7ddffb9e9427964bdf5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3326 zcmV#k@00004XF*Lt006O% z3;baP000cNNklVvHuP7;ii|6vW+#FL*?RVTR$9xeuncW=373%+LeP0KTsG zy?)hQUw`$h|5SH%SIwK@Vaiv~*}8>%;R2G1R96snY4IwxL^_DlK$XRXjelgs;%pNeXU2djrj@ zfQh>>t%yHgZnsF?VyUXtDxLjjq~ki$VIAqZk#t&b$gd}z4BOhy5S{Sd2gs{Dqh)gs%YJ1?J5C;n>x}>|E{To7%J2HK#K)C)2bi z(zO4+syT8|b0JGQ?o%Nq-(k`&+s;IaOouQJqYG1h)rm`~~V; z*GT$7a%n%gxQ|>&Bq@pHYyvqIPg1r=ZYx6X%jkaw?RNm(euZ;3yzU_U9>N|X{2}HQ zAR-?j4=`7RS%sJ(gpUBz1@O#=muVaK=f&UEn|@HO|6UpKl_KzSh2JK*&pP>}RkC3V z$T#NxJT_Gi!Qc zw#UxQX$e_D2XCJ_`cvyUDf&;)w-D0`;7(Pi+MBTP`A1V#aXXdE_bNlTDtteaPhKf= ziIa|ql@5-PIe6vnNiOU>uV_!QdgVT4(mD09G|iz4nuBN6NoQ0E$*Nw#l3^j&0=8Gi z|57Sj6HpSrN^<&eLC|PHq=O=*j&r5` zBIIv*-`$&B*fm15{itTfM#Y~(8vie;jgMsboXpwVAAS8xY2|{6qE(@^Se1A8{_u99 zl>sy_TI8MM)S>v;H|T#CJ#V1>W}xRKjK2?;0t2g>`Wv>!4EcCvHhjdGB+R&{Au0(x zMer2Dt2!GmIDAFr{ttP;W`*ac@^Q;#!(yfVqoh5;WIe;=9lY-DJt6ECCH~@&YU*mm z`E1RAInutNlDGUT;U@VmMbpk-I*g+Ki=vm6&vgJqdm8JYgOSdj7 zX-v}0VWhb_X!$zU00-GrX1d~c}Z0#4qw4U5!_{%C4-Ly9#YJfVu}QQ zGWbj2F8ThVdSJLDbesIhRrPo0)!$!HkJ_Naq-Sqv zKa7DJ1a0j8=ovIcIzgX>sk`OngR$TN9$BdO@6LmDDDig zEj|1thE(E%0yyjj`uzcSF=nU|_9k!sI(gHMsAI$_tX|#S4-nM1i>~gvs?bM~3-T{8++^ z(jkJt{>mMfXAF1dwU*07~*)mFrU^Qkd+PJ09JwSGyRTd6F zf%o6@-Fgdr-xvA4C-&)8&6wYNBQ-+BKb1KI0VtiDL5n_Gj;}VRZyG0mQgi&IQ7Gbam-S>mn z=I+ zy9U%6eHk0j&o*y~r46VBdUHU?Hn*`20^l{~4S0;+`DW{djE1BU^#lE^{KFX1TZA4^ z|J=ql%wj^%9DSy>xQ+BaHPSOgA81`}BRw6<%q1r1%^HH+NN;O~-H6WXoNeYZ&1g9E z)ViQgYdCJB@NTB)YgAp;(CEtAp=(BCuj&}#~PM&m#?_o`tEowl~YU+@&>U+~PJyEnA(lWIaYH|LnvaP(JeoXp^x zoi3&GIMx|2U#!KZj_CCCcN>DfueoVEfXT$2F#?^xw5Il6=DBGpb9CxV=Z>vIPv?JX zP8OllaCF|jzUhb5Ol|OZGMT}2RfC>F*G%ZjNqsbc&RG48A$RT2jlt=v6}$9{nL`^r zYoYqHRV1*{0Q%jt+N3(78>^%%w1+O6#uCC4}s&nYp z{6sj_t*Q2tx;WK2)h$wh>o69{#ga3pI!i)Y6oymXBDq*{=2T}%NQ=U7s#_!%OU|6? zED32*7*2JIo6>e$v70JI%BC=bmUZLQB206IMo?T#iApp zI*Vd54rP3;Zj#S196IAqnMFrVbr!{B9Eww&u~aNNa;mc^CgV`tOfO@pSajr6XHiVX zp_;tv=6@8Cu@2UCtnrrxt&3wxZ5+BKYO&?po%Yrfr$EnUpCYGI={6jA{nzGy@Y6!;-N!HcdSR1E0r@BQ7yc8W~5&apjCY7cc z|1YWAAMJumU!6(pdt<807*qo IM6N<$g8E%}eEcp|CB|9Lq!m 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 diff --git a/src/corelib/doc/images/statemachine-nonparallel.png b/src/corelib/doc/images/statemachine-nonparallel.png deleted file mode 100644 index f9850a74a639d2bd7cd4e4485cc127b974ce73e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5350 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 L(2ux5>vsMdp0V|j diff --git a/src/corelib/doc/snippets/code/src_corelib_statemachine_qstatemachine.cpp b/src/corelib/doc/snippets/code/src_corelib_statemachine_qstatemachine.cpp deleted file mode 100644 index c756116de4d..00000000000 --- a/src/corelib/doc/snippets/code/src_corelib_statemachine_qstatemachine.cpp +++ /dev/null @@ -1,65 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the documentation of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -//! [simple state machine] -QPushButton button; - -QStateMachine machine; -QState *s1 = new QState(); -s1->assignProperty(&button, "text", "Click me"); - -QFinalState *s2 = new QFinalState(); -s1->addTransition(&button, &QPushButton::clicked, s2); - -machine.addState(s1); -machine.addState(s2); -machine.setInitialState(s1); -machine.start(); -//! [simple state machine] diff --git a/src/corelib/doc/snippets/statemachine/eventtest.cpp b/src/corelib/doc/snippets/statemachine/eventtest.cpp deleted file mode 100644 index d7d4ce0d212..00000000000 --- a/src/corelib/doc/snippets/statemachine/eventtest.cpp +++ /dev/null @@ -1,83 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the documentation of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include - -class MyTransition : public QAbstractTransition -{ - Q_OBJECT -public: - MyTransition() {} - -protected: -//![0] - bool eventTest(QEvent *event) override - { - if (event->type() == QEvent::Wrapped) { - QEvent *wrappedEvent = static_cast(event)->event(); - if (wrappedEvent->type() == QEvent::KeyPress) { - QKeyEvent *keyEvent = static_cast(wrappedEvent); - // Do your event test - } - } - return false; - } -//![0] - - void onTransition(QEvent *event) override - { - - } -}; - -int main(int argv, char **args) -{ - return 0; -} diff --git a/src/corelib/doc/snippets/statemachine/main.cpp b/src/corelib/doc/snippets/statemachine/main.cpp deleted file mode 100644 index c399f4f1992..00000000000 --- a/src/corelib/doc/snippets/statemachine/main.cpp +++ /dev/null @@ -1,98 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the documentation of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include - -int main(int argv, char **args) -{ - QApplication app(argv, args); - - QLabel *label = new QLabel; - QPushButton *button = new QPushButton; - -//![0] - QStateMachine machine; - QState *s1 = new QState(); - QState *s2 = new QState(); - QState *s3 = new QState(); -//![0] - -//![4] - s1->assignProperty(label, "text", "In state s1"); - s2->assignProperty(label, "text", "In state s2"); - s3->assignProperty(label, "text", "In state s3"); -//![4] - -//![5] - QObject::connect(s3, &QState::entered, button, &QPushButton:showMaximized); - QObject::connect(s3, &QState::exited, button, &QPushButton::showMinimized); -//![5] - -//![1] - s1->addTransition(button, &QPushButton::clicked, s2); - s2->addTransition(button, &QPushButton::clicked, s3); - s3->addTransition(button, &QPushButton::clicked, s1); -//![1] - -//![2] - machine.addState(s1); - machine.addState(s2); - machine.addState(s3); - machine.setInitialState(s1); -//![2] - -//![3] - machine.start(); -//![3] - - label->show(); - - return app.exec(); -} diff --git a/src/corelib/doc/snippets/statemachine/main2.cpp b/src/corelib/doc/snippets/statemachine/main2.cpp deleted file mode 100644 index dedd2d29bf4..00000000000 --- a/src/corelib/doc/snippets/statemachine/main2.cpp +++ /dev/null @@ -1,103 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the documentation of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include - -int main(int argv, char **args) -{ - QApplication app(argv, args); - - QStateMachine machine; - -//![0] - QState *s1 = new QState(); - QState *s11 = new QState(s1); - QState *s12 = new QState(s1); - QState *s13 = new QState(s1); - s1->setInitialState(s11); - machine.addState(s1); -//![0] - -//![2] - s12->addTransition(quitButton, &QPushButton::clicked, s12); -//![2] - -//![1] - QFinalState *s2 = new QFinalState(); - s1->addTransition(quitButton, &QPushButton::clicked, s2); - machine.addState(s2); - machine.setInitialState(s1); - - QObject::connect(&machine, &QStateMachine::finished, - QCoreApplication::instance(), &QCoreApplication::quit); -//![1] - - QButton *interruptButton = new QPushButton("Interrupt Button"); - QWidget *mainWindow = new QWidget(); - -//![3] - QHistoryState *s1h = new QHistoryState(s1); - - QState *s3 = new QState(); - s3->assignProperty(label, "text", "In s3"); - QMessageBox *mbox = new QMessageBox(mainWindow); - mbox->addButton(QMessageBox::Ok); - mbox->setText("Interrupted!"); - mbox->setIcon(QMessageBox::Information); - QObject::connect(s3, &QState::entered, mbox, &QMessageBox::exec); - s3->addTransition(s1h); - machine.addState(s3); - - s1->addTransition(interruptButton, &QPushButton::clicked, s3); -//![3] - - return app.exec(); -} - diff --git a/src/corelib/doc/snippets/statemachine/main3.cpp b/src/corelib/doc/snippets/statemachine/main3.cpp deleted file mode 100644 index b665565aef3..00000000000 --- a/src/corelib/doc/snippets/statemachine/main3.cpp +++ /dev/null @@ -1,70 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the documentation of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include - -int main(int argv, char **args) -{ - QApplication app(argv, args); - -//![0] - QState *s1 = new QState(QState::ParallelStates); - // s11 and s12 will be entered in parallel - QState *s11 = new QState(s1); - QState *s12 = new QState(s1); -//![0] - -//![1] - s1->addTransition(s1, &QState::finished, s2); -//![1] - - return app.exec(); -} - diff --git a/src/corelib/doc/snippets/statemachine/main4.cpp b/src/corelib/doc/snippets/statemachine/main4.cpp deleted file mode 100644 index e21656b91c4..00000000000 --- a/src/corelib/doc/snippets/statemachine/main4.cpp +++ /dev/null @@ -1,122 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the documentation of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include - - -//![0] -struct StringEvent : public QEvent -{ - StringEvent(const QString &val) - : QEvent(QEvent::Type(QEvent::User+1)), - value(val) {} - - QString value; -}; -//![0] - -//![1] -class StringTransition : public QAbstractTransition -{ - Q_OBJECT - -public: - StringTransition(const QString &value) - : m_value(value) {} - -protected: - bool eventTest(QEvent *e) override - { - if (e->type() != QEvent::Type(QEvent::User+1)) // StringEvent - return false; - StringEvent *se = static_cast(e); - return (m_value == se->value); - } - - void onTransition(QEvent *) override {} - -private: - QString m_value; -}; -//![1] - -int main(int argv, char **args) -{ - QApplication app(argv, args); - -//![2] - QStateMachine machine; - QState *s1 = new QState(); - QState *s2 = new QState(); - QFinalState *done = new QFinalState(); - - StringTransition *t1 = new StringTransition("Hello"); - t1->setTargetState(s2); - s1->addTransition(t1); - StringTransition *t2 = new StringTransition("world"); - t2->setTargetState(done); - s2->addTransition(t2); - - machine.addState(s1); - machine.addState(s2); - machine.addState(done); - machine.setInitialState(s1); -//![2] - -//![3] - machine.postEvent(new StringEvent("Hello")); - machine.postEvent(new StringEvent("world")); -//![3] - - return app.exec(); -} - -#include "main4.moc" - diff --git a/src/corelib/doc/snippets/statemachine/main5.cpp b/src/corelib/doc/snippets/statemachine/main5.cpp deleted file mode 100644 index d701f51e2b6..00000000000 --- a/src/corelib/doc/snippets/statemachine/main5.cpp +++ /dev/null @@ -1,182 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the documentation of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include - -int main(int argv, char **args) -{ - QApplication app(argv, args); - QWidget *button; - - { -//![0] - QStateMachine machine; - machine.setGlobalRestorePolicy(QStateMachine::RestoreProperties); - - QState *s1 = new QState(); - s1->assignProperty(object, "fooBar", 1.0); - machine.addState(s1); - machine.setInitialState(s1); - - QState *s2 = new QState(); - machine.addState(s2); -//![0] - } - - { - -//![2] - QStateMachine machine; - machine.setGlobalRestorePolicy(QStateMachine::RestoreProperties); - - QState *s1 = new QState(); - s1->assignProperty(object, "fooBar", 1.0); - machine.addState(s1); - machine.setInitialState(s1); - - QState *s2 = new QState(s1); - s2->assignProperty(object, "fooBar", 2.0); - s1->setInitialState(s2); - - QState *s3 = new QState(s1); -//![2] - - } - - { -//![3] - QState *s1 = new QState(); - QState *s2 = new QState(); - - s1->assignProperty(button, "geometry", QRectF(0, 0, 50, 50)); - s2->assignProperty(button, "geometry", QRectF(0, 0, 100, 100)); - - s1->addTransition(button, &QPushButton::clicked, s2); -//![3] - - } - - { -//![4] - QState *s1 = new QState(); - QState *s2 = new QState(); - - s1->assignProperty(button, "geometry", QRectF(0, 0, 50, 50)); - s2->assignProperty(button, "geometry", QRectF(0, 0, 100, 100)); - - QSignalTransition *transition = s1->addTransition(button, &QPushButton::clicked, s2); - transition->addAnimation(new QPropertyAnimation(button, "geometry")); -//![4] - - } - - { - QMainWindow *mainWindow = 0; - -//![5] - QMessageBox *messageBox = new QMessageBox(mainWindow); - messageBox->addButton(QMessageBox::Ok); - messageBox->setText("Button geometry has been set!"); - messageBox->setIcon(QMessageBox::Information); - - QState *s1 = new QState(); - - QState *s2 = new QState(); - s2->assignProperty(button, "geometry", QRectF(0, 0, 50, 50)); - connect(s2, &QState::entered, messageBox, SLOT(exec())); - - s1->addTransition(button, &QPushButton::clicked, s2); -//![5] - } - - { - QMainWindow *mainWindow = 0; - -//![6] - QMessageBox *messageBox = new QMessageBox(mainWindow); - messageBox->addButton(QMessageBox::Ok); - messageBox->setText("Button geometry has been set!"); - messageBox->setIcon(QMessageBox::Information); - - QState *s1 = new QState(); - - QState *s2 = new QState(); - s2->assignProperty(button, "geometry", QRectF(0, 0, 50, 50)); - - QState *s3 = new QState(); - connect(s3, &QState::entered, messageBox, SLOT(exec())); - - s1->addTransition(button, &QPushButton::clicked, s2); - s2->addTransition(s2, &QState::propertiesAssigned, s3); -//![6] - - } - - { - -//![7] - QState *s1 = new QState(); - QState *s2 = new QState(); - - s2->assignProperty(object, "fooBar", 2.0); - s1->addTransition(s2); - - QStateMachine machine; - machine.setInitialState(s1); - machine.addDefaultAnimation(new QPropertyAnimation(object, "fooBar")); -//![7] - - } - - - - return app.exec(); -} - diff --git a/src/corelib/doc/src/animation.qdoc b/src/corelib/doc/src/animation.qdoc index 9cbe50d4a98..16569ded0be 100644 --- a/src/corelib/doc/src/animation.qdoc +++ b/src/corelib/doc/src/animation.qdoc @@ -326,47 +326,4 @@ it to another group. This way, you can build a tree structure of animations which specifies when the animations are played in relation to each other. - - \section1 Animations and States - - When using a \l{The State Machine Framework}{state machine}, we - can associate one or more animations to a transition between states - using a QSignalTransition or QEventTransition class. These classes - are both derived from QAbstractTransition, which defines the - convenience function \l{QAbstractTransition::}{addAnimation()} that - enables the appending of one or more animations triggered when the - transition occurs. - - We also have the possibility to associate properties with the - states rather than setting the start and end values ourselves. - Below is a complete code example that animates the geometry of a - QPushButton. - - \code - QPushButton *button = new QPushButton("Animated Button"); - button->show(); - - QStateMachine *machine = new QStateMachine; - - QState *state1 = new QState(machine); - state1->assignProperty(button, "geometry", QRect(0, 0, 100, 30)); - machine->setInitialState(state1); - - QState *state2 = new QState(machine); - state2->assignProperty(button, "geometry", QRect(250, 250, 100, 30)); - - QSignalTransition *transition1 = state1->addTransition(button, - &QPushButton::clicked, state2); - transition1->addAnimation(new QPropertyAnimation(button, "geometry")); - - QSignalTransition *transition2 = state2->addTransition(button, - &QPushButton::clicked, state1); - transition2->addAnimation(new QPropertyAnimation(button, "geometry")); - - machine->start(); - \endcode - - For a more comprehensive example of how to use the state machine - framework for animations, see the states example (it lives in the - \c{examples/animation/states} directory). */ diff --git a/src/corelib/doc/src/statemachine.qdoc b/src/corelib/doc/src/statemachine.qdoc deleted file mode 100644 index 881a0785c6c..00000000000 --- a/src/corelib/doc/src/statemachine.qdoc +++ /dev/null @@ -1,577 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the documentation of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:FDL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Free Documentation License Usage -** Alternatively, this file may be used under the terms of the GNU Free -** Documentation License version 1.3 as published by the Free Software -** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure -** the GNU Free Documentation License version 1.3 requirements -** will be met: https://www.gnu.org/licenses/fdl-1.3.html. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -/*! - \group statemachine - \brief How to create and execute state graphs. - \title State Machine Classes - - These \l{Qt Core} classes are part of the \l{The State Machine Framework}{ - State Machine Framework}. - -*/ - -/*! - \page statemachine-api.html - \title The State Machine Framework - \brief An overview of the State Machine framework for constructing and executing state graphs. - - \ingroup frameworks-technologies - - \tableofcontents - - The State Machine framework provides classes for creating and executing - state graphs. The concepts and notation are based on those from Harel's - \l{http://www.wisdom.weizmann.ac.il/~dharel/SCANNED.PAPERS/Statecharts.pdf}{Statecharts: A visual formalism for complex systems}, which - is also the basis of UML state diagrams. The semantics of state machine - execution are based on \l{State Chart XML: State Machine Notation for - Control Abstraction}{State Chart XML (SCXML)}. - - Statecharts provide a graphical way of modeling how a system reacts to - stimuli. This is done by defining the possible \e states that the system can - be in, and how the system can move from one state to another (\e transitions - between states). A key characteristic of event-driven systems (such as Qt - applications) is that behavior often depends not only on the last or current - event, but also the events that preceded it. With statecharts, this - information is easy to express. - - The State Machine framework provides an API and execution model that can be - used to effectively embed the elements and semantics of statecharts in Qt - applications. The framework integrates tightly with Qt's meta-object system; - for example, transitions between states can be triggered by signals, and - states can be configured to set properties and invoke methods on {QObject}s. - Qt's event system is used to drive the state machines. - - The state graph in the State Machine framework is hierarchical. States can be nested inside of - other states, and the current configuration of the state machine consists of the set of states - which are currently active. All the states in a valid configuration of the state machine will - have a common ancestor. - - \sa {The Declarative State Machine Framework} - - \section1 Classes in the State Machine Framework - - These classes are provided by qt for creating event-driven state machines. - - \annotatedlist statemachine - - \section1 A Simple State Machine - - To demonstrate the core functionality of the State Machine API, let's look - at a small example: A state machine with three states, \c s1, \c s2 and \c - s3. The state machine is controlled by a single QPushButton; when the button - is clicked, the machine transitions to another state. Initially, the state - machine is in state \c s1. The statechart for this machine is as follows: - - \image statemachine-button.png - \omit - \caption This is a caption - \endomit - - The following snippet shows the code needed to create such a state machine. - First, we create the state machine and states: - - \snippet statemachine/main.cpp 0 - - Then, we create the transitions by using the QState::addTransition() - function: - - \snippet statemachine/main.cpp 1 - - Next, we add the states to the machine and set the machine's initial state: - - \snippet statemachine/main.cpp 2 - - Finally, we start the state machine: - - \snippet statemachine/main.cpp 3 - - The state machine executes asynchronously, i.e. it becomes part of your - application's event loop. - - \section1 Doing Useful Work on State Entry and Exit - - The above state machine merely transitions from one state to another, it - doesn't perform any operations. The QState::assignProperty() function can be - used to have a state set a property of a QObject when the state is - entered. In the following snippet, the value that should be assigned to a - QLabel's text property is specified for each state: - - \snippet statemachine/main.cpp 4 - - When any of the states is entered, the label's text will be changed - accordingly. - - The QState::entered() signal is emitted when the state is entered, and the - QState::exited() signal is emitted when the state is exited. In the - following snippet, the button's \l {QPushButton::}{showMaximized()} slot - will be called when state \c s3 is entered, and the button's \l {QPushButton::}{showMinimized()} - slot will be called when \c s3 is exited: - - \snippet statemachine/main.cpp 5 - - Custom states can reimplement QAbstractState::onEntry() and - QAbstractState::onExit(). - - \section1 State Machines That Finish - - The state machine defined in the previous section never finishes. In order - for a state machine to be able to finish, it needs to have a top-level \e - final state (QFinalState object). When the state machine enters a top-level - final state, the machine will emit the QStateMachine::finished() signal and - halt. - - All you need to do to introduce a final state in the graph is create a - QFinalState object and use it as the target of one or more transitions. - - \section1 Sharing Transitions By Grouping States - - Assume we wanted the user to be able to quit the application at any time by - clicking a Quit button. In order to achieve this, we need to create a final - state and make it the target of a transition associated with the Quit - button's \l{QPushButton::}{clicked()} signal. We could add a transition from each of \c s1, \c - s2 and \c s3; however, this seems redundant, and one would also have to - remember to add such a transition from every new state that is added in the - future. - - We can achieve the same behavior (namely that clicking the Quit button quits - the state machine, regardless of which state the state machine is in) by - grouping states \c s1, \c s2 and \c s3. This is done by creating a new - top-level state and making the three original states children of the new - state. The following diagram shows the new state machine. - - \image statemachine-button-nested.png - \omit - \caption This is a caption - \endomit - - The three original states have been renamed \c s11, \c s12 and \c s13 to - reflect that they are now children of the new top-level state, \c s1. Child - states implicitly inherit the transitions of their parent state. This means - it is now sufficient to add a single transition from \c s1 to the final - state \c s2. New states added to \c s1 will also automatically inherit this - transition. - - All that's needed to group states is to specify the proper parent when the - state is created. You also need to specify which of the child states is the - initial one (i.e. which child state the state machine should enter when the - parent state is the target of a transition). - - \snippet statemachine/main2.cpp 0 - - \snippet statemachine/main2.cpp 1 - - In this case we want the application to quit when the state machine is - finished, so the machine's \l {QStateMachine::}{finished()} signal is connected to the - application's \l {QCoreApplication::}{quit()} slot. - - A child state can override an inherited transition. For example, the - following code adds a transition that effectively causes the Quit button to - be ignored when the state machine is in state \c s12. - - \snippet statemachine/main2.cpp 2 - - A transition can have any state as its target, i.e. the target state does - not have to be on the same level in the state hierarchy as the source state. - - \section1 Using History States to Save and Restore the Current State - - Imagine that we wanted to add an "interrupt" mechanism to the example - discussed in the previous section; the user should be able to click a button - to have the state machine perform some non-related task, after which the - state machine should resume whatever it was doing before (i.e. return to the - old state, which is one of \c s11, \c s12 and \c s13 in this case). - - Such behavior can easily be modeled using \e{history states}. A history - state (QHistoryState object) is a pseudo-state that represents the child - state that the parent state was in the last time the parent state was - exited. - - A history state is created as a child of the state for which we wish to - record the current child state; when the state machine detects the presence - of such a state at runtime, it automatically records the current (real) - child state when the parent state is exited. A transition to the history - state is in fact a transition to the child state that the state machine had - previously saved; the state machine automatically "forwards" the transition - to the real child state. - - The following diagram shows the state machine after the interrupt mechanism - has been added. - - \image statemachine-button-history.png - \omit - \caption This is a caption - \endomit - - The following code shows how it can be implemented; in this example we - simply display a message box when \c s3 is entered, then immediately return - to the previous child state of \c s1 via the history state. - - \snippet statemachine/main2.cpp 3 - - \section1 Using Parallel States to Avoid a Combinatorial Explosion of States - - Assume that you wanted to model a set of mutually exclusive properties of a - car in a single state machine. Let's say the properties we are interested in - are Clean vs Dirty, and Moving vs Not moving. It would take four mutually - exclusive states and eight transitions to be able to represent and freely - move between all possible combinations. - - \image statemachine-nonparallel.png - \omit - \caption This is a caption - \endomit - - If we added a third property (say, Red vs Blue), the total number of states - would double, to eight; and if we added a fourth property (say, Enclosed vs - Convertible), the total number of states would double again, to 16. - - Using parallel states, the total number of states and transitions grows - linearly as we add more properties, instead of exponentially. Furthermore, - states can be added to or removed from the parallel state without affecting - any of their sibling states. - - \image statemachine-parallel.png - \omit - \caption This is a caption - \endomit - - To create a parallel state group, pass QState::ParallelStates to the QState - constructor. - - \snippet statemachine/main3.cpp 0 - - When a parallel state group is entered, all its child states will be - simultaneously entered. Transitions within the individual child states - operate normally. However, any of the child states may take a transition which exits the parent - state. When this happens, the parent state and all of its child states are exited. - - The parallelism in the State Machine framework follows an interleaved semantics. All parallel - operations will be executed in a single, atomic step of the event processing, so no event can - interrupt the parallel operations. However, events will still be processed sequentially, since - the machine itself is single threaded. As an example: Consider the situation where there are two - transitions that exit the same parallel state group, and their conditions become true - simultaneously. In this case, the event that is processed last of the two will not have any - effect, since the first event will already have caused the machine to exit from the parallel - state. - - \section1 Detecting that a Composite State has Finished - - A child state can be final (a QFinalState object); when a final child state - is entered, the parent state emits the QState::finished() signal. The - following diagram shows a composite state \c s1 which does some processing - before entering a final state: - - \image statemachine-finished.png - \omit - \caption This is a caption - \endomit - - When \c s1 's final state is entered, \c s1 will automatically emit - \l {QState::}{finished()}. We use a signal transition to cause this event to trigger a - state change: - - \snippet statemachine/main3.cpp 1 - - Using final states in composite states is useful when you want to hide the - internal details of a composite state; i.e. the only thing the outside world - should be able to do is enter the state, and get a notification when the - state has completed its work. This is a very powerful abstraction and - encapsulation mechanism when building complex (deeply nested) state - machines. (In the above example, you could of course create a transition - directly from \c s1 's \c done state rather than relying on \c s1 's - \l {QState::}{finished()} signal, but with the consequence that implementation details of - \c s1 are exposed and depended on). - - For parallel state groups, the QState::finished() signal is emitted when \e - all the child states have entered final states. - - \section1 Targetless Transitions - - A transition need not have a target state. A transition without a target can - be triggered the same way as any other transition; the difference is that - when a targetless transition is triggered, it doesn't cause any state - changes. This allows you to react to a signal or event when your machine is - in a certain state, without having to leave that state. Example: - - \code - QStateMachine machine; - QState *s1 = new QState(&machine); - - QPushButton button; - QSignalTransition *trans = new QSignalTransition(&button, &QPushButton::clicked); - s1->addTransition(trans); - - QMessageBox msgBox; - msgBox.setText("The button was clicked; carry on."); - QObject::connect(trans, QSignalTransition::triggered, &msgBox, &QMessageBox::exec); - - machine.setInitialState(s1); - \endcode - - The message box will be displayed each time the button is clicked, but the - state machine will remain in its current state (s1). If the target state - were explicitly set to s1, however, s1 would be exited and re-entered each - time (e.g. the QAbstractState::entered() and QAbstractState::exited() - signals would be emitted). - - \section1 Events, Transitions and Guards - - A QStateMachine runs its own event loop. For signal transitions - (QSignalTransition objects), QStateMachine automatically posts a - QStateMachine::SignalEvent to itself when it intercepts the corresponding - signal; similarly, for QObject event transitions (QEventTransition objects) - a QStateMachine::WrappedEvent is posted. - - You can post your own events to the state machine using - QStateMachine::postEvent(). - - When posting a custom event to the state machine, you typically also have - one or more custom transitions that can be triggered from events of that - type. To create such a transition, you subclass QAbstractTransition and - reimplement QAbstractTransition::eventTest(), where you check if an event - matches your event type (and optionally other criteria, e.g. attributes of - the event object). - - Here we define our own custom event type, \c StringEvent, for posting - strings to the state machine: - - \snippet statemachine/main4.cpp 0 - - Next, we define a transition that only triggers when the event's string - matches a particular string (a \e guarded transition): - - \snippet statemachine/main4.cpp 1 - - In the \l {QAbstractTransition::}{eventTest()} reimplementation, we first check if the event type is the - desired one; if so, we cast the event to a \c StringEvent and perform the - string comparison. - - The following is a statechart that uses the custom event and transition: - - \image statemachine-customevents.png - \omit - \caption This is a caption - \endomit - - Here's what the implementation of the statechart looks like: - - \snippet statemachine/main4.cpp 2 - - Once the machine is started, we can post events to it. - - \snippet statemachine/main4.cpp 3 - - An event that is not handled by any relevant transition will be silently - consumed by the state machine. It can be useful to group states and provide - a default handling of such events; for example, as illustrated in the - following statechart: - - \image statemachine-customevents2.png - \omit - \caption This is a caption - \endomit - - For deeply nested statecharts, you can add such "fallback" transitions at - the level of granularity that's most appropriate. - - \section1 Using Restore Policy To Automatically Restore Properties - - In some state machines it can be useful to focus the attention on assigning properties in states, - not on restoring them when the state is no longer active. If you know that a property should - always be restored to its initial value when the machine enters a state that does not explicitly - give the property a value, you can set the global restore policy to - QStateMachine::RestoreProperties. - - \code - QStateMachine machine; - machine.setGlobalRestorePolicy(QStateMachine::RestoreProperties); - \endcode - - When this restore policy is set, the machine will automatically restore all properties. If it - enters a state where a given property is not set, it will first search the hierarchy of ancestors - to see if the property is defined there. If it is, the property will be restored to the value - defined by the closest ancestor. If not, it will be restored to its initial value (i.e. the - value of the property before any property assignments in states were executed.) - - Take the following code: - - \snippet statemachine/main5.cpp 0 - - Lets say the property \c fooBar is 0.0 when the machine starts. When the machine is in state - \c s1, the property will be 1.0, since the state explicitly assigns this value to it. When the - machine is in state \c s2, no value is explicitly defined for the property, so it will implicitly - be restored to 0.0. - - If we are using nested states, the parent defines a value for the property which is inherited by - all descendants that do not explicitly assign a value to the property. - - \snippet statemachine/main5.cpp 2 - - Here \c s1 has two children: \c s2 and \c s3. When \c s2 is entered, the property \c fooBar - will have the value 2.0, since this is explicitly defined for the state. When the machine is in - state \c s3, no value is defined for the state, but \c s1 defines the property to be 1.0, so this - is the value that will be assigned to \c fooBar. - - \section1 Animating Property Assignments - - The State Machine API connects with the Animation API in Qt to allow automatically animating - properties as they are assigned in states. - - Say we have the following code: - - \snippet statemachine/main5.cpp 3 - - Here we define two states of a user interface. In \c s1 the \c button is small, and in \c s2 - it is bigger. If we click the button to transition from \c s1 to \c s2, the geometry of the button - will be set immediately when a given state has been entered. If we want the transition to be - smooth, however, all we need to do is make a QPropertyAnimation and add this to the transition - object. - - \snippet statemachine/main5.cpp 4 - - Adding an animation for the property in question means that the property assignment will no - longer take immediate effect when the state has been entered. Instead, the animation will start - playing when the state has been entered and smoothly animate the property assignment. Since we - do not set the start value or end value of the animation, these will be set implicitly. The - start value of the animation will be the property's current value when the animation starts, and - the end value will be set based on the property assignments defined for the state. - - If the global restore policy of the state machine is set to QStateMachine::RestoreProperties, - it is possible to also add animations for the property restorations. - - \section1 Detecting That All Properties Have Been Set In A State - - When animations are used to assign properties, a state no longer defines the exact values that a - property will have when the machine is in the given state. While the animation is running, the - property can potentially have any value, depending on the animation. - - In some cases, it can be useful to be able to detect when the property has actually been assigned - the value defined by a state. - - Say we have the following code: - - \snippet statemachine/main5.cpp 5 - - When \c button is clicked, the machine will transition into state \c s2, which will set the - geometry of the button, and then pop up a message box to alert the user that the geometry has - been changed. - - In the normal case, where animations are not used, this will operate as expected. However, if - an animation for the \c geometry of \c button is set on the transition between \c s1 and \c s2, - the animation will be started when \c s2 is entered, but the \c geometry property will not - actually reach its defined value before the animation is finished running. In this case, the - message box will pop up before the geometry of the button has actually been set. - - To ensure that the message box does not pop up until the geometry actually reaches its final - value, we can use the state's \l {QState::}{propertiesAssigned()} signal. The \l {QState::}{propertiesAssigned()} signal will be - emitted when the property is assigned its final value, whether this is done immediately or - after the animation has finished playing. - - \snippet statemachine/main5.cpp 6 - - In this example, when \c button is clicked, the machine will enter \c s2. It will remain in state - \c s2 until the \c geometry property has been set to \c QRect(0, 0, 50, 50). Then it will - transition into \c s3. When \c s3 is entered, the message box will pop up. If the transition into - \c s2 has an animation for the \c geometry property, then the machine will stay in \c s2 until the - animation has finished playing. If there is no such animation, it will simply set the property and - immediately enter state \c s3. - - Either way, when the machine is in state \c s3, you are guaranteed that the property \c geometry - has been assigned the defined value. - - If the global restore policy is set to QStateMachine::RestoreProperties, the state will not emit - the \l {QState::}{propertiesAssigned()} signal until these have been executed as well. - - \section1 What Happens If A State Is Exited Before The Animation Has Finished - - If a state has property assignments, and the transition into the state has animations for the - properties, the state can potentially be exited before the properties have been assigned to the - values defines by the state. This is true in particular when there are transitions out from the - state that do not depend on the \l {QState::}{propertiesAssigned()} signal, as described in the previous section. - - The State Machine API guarantees that a property assigned by the state machine either: - \list - \li Has a value explicitly assigned to the property. - \li Is currently being animated into a value explicitly assigned to the property. - \endlist - - When a state is exited prior to the animation finishing, the behavior of the state machine depends - on the target state of the transition. If the target state explicitly assigns a value to the - property, no additional action will be taken. The property will be assigned the value defined by - the target state. - - If the target state does not assign any value to the property, there are two - options: By default, the property will be assigned the value defined by the state it is leaving - (the value it would have been assigned if the animation had been permitted to finish playing). If - a global restore policy is set, however, this will take precedence, and the property will be - restored as usual. - - \section1 Default Animations - - As described earlier, you can add animations to transitions to make sure property assignments - in the target state are animated. If you want a specific animation to be used for a given property - regardless of which transition is taken, you can add it as a default animation to the state - machine. This is in particular useful when the properties assigned (or restored) by specific - states is not known when the machine is constructed. - - \code - QState *s1 = new QState(); - QState *s2 = new QState(); - - s2->assignProperty(object, "fooBar", 2.0); - s1->addTransition(s2); - - QStateMachine machine; - machine.setInitialState(s1); - machine.addDefaultAnimation(new QPropertyAnimation(object, "fooBar")); - \endcode - - When the machine is in state \c s2, the machine will play the default animation for the - property \c fooBar since this property is assigned by \c s2. - - Note that animations explicitly set on transitions will take precedence over any default - animation for the given property. - - \section1 Nesting State Machines - - QStateMachine is a subclass of QState. This allows for a state machine to be a child state of - another machine. QStateMachine reimplements QState::onEntry() and calls QStateMachine::start(), - so that when the child state machine is entered, it will automatically start running. - - The parent state machine treats the child machine as an \e atomic state in the state machine - algorithm. The child state machine is self-contained; it maintains its own event queue and - configuration. In particular, note that the \l{QStateMachine::}{configuration()} - of the child machine is not part of the parent machine's configuration (only the child machine - itself is). - - States of the child state machine cannot be specified as targets of transitions in the parent - state machine; only the child state machine itself can. Conversely, states of the parent state - machine cannot be specified as targets of transitions in the child state machine. The child - state machine's \l{QState::}{finished}() signal can be used to trigger a transition - in the parent machine. -*/ diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp index 303190ae697..ab1d5000871 100644 --- a/src/corelib/kernel/qcoreapplication.cpp +++ b/src/corelib/kernel/qcoreapplication.cpp @@ -2207,6 +2207,22 @@ void QCoreApplicationPrivate::setApplicationFilePath(const QString &path) QCoreApplicationPrivate::cachedApplicationFilePath = new QString(path); } +#ifndef QT_NO_QOBJECT +QEvent *QCoreApplicationPrivate::cloneEvent(QEvent *e) +{ + switch (e->type()) { + case QEvent::None: + return new QEvent(*e); + case QEvent::Timer: + return new QTimerEvent(*static_cast(e)); + default: + Q_ASSERT_X(false, "cloneEvent()", "not implemented"); + break; + } + return nullptr; +} +#endif + /*! Returns the directory that contains the application executable. diff --git a/src/corelib/kernel/qcoreapplication_p.h b/src/corelib/kernel/qcoreapplication_p.h index cb3a5a8a4f4..08a7e974ea2 100644 --- a/src/corelib/kernel/qcoreapplication_p.h +++ b/src/corelib/kernel/qcoreapplication_p.h @@ -74,6 +74,10 @@ typedef QList QTranslatorList; class QAbstractEventDispatcher; +#ifndef QT_NO_QOBJECT +class QEvent; +#endif + class Q_CORE_EXPORT QCoreApplicationPrivate #ifndef QT_NO_QOBJECT : public QObjectPrivate @@ -197,6 +201,10 @@ public: #ifdef QT_NO_QOBJECT QCoreApplication *q_ptr; #endif + +#ifndef QT_NO_QOBJECT + virtual QEvent *cloneEvent(QEvent *e); +#endif }; QT_END_NAMESPACE diff --git a/src/corelib/statemachine/qabstractstate.cpp b/src/corelib/statemachine/qabstractstate.cpp deleted file mode 100644 index 10f54c3e182..00000000000 --- a/src/corelib/statemachine/qabstractstate.cpp +++ /dev/null @@ -1,239 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qabstractstate.h" -#include "qabstractstate_p.h" -#include "qstate.h" -#include "qstate_p.h" -#include "qstatemachine.h" -#include "qstatemachine_p.h" - -QT_BEGIN_NAMESPACE - -/*! - \class QAbstractState - \inmodule QtCore - - \brief The QAbstractState class is the base class of states of a QStateMachine. - - \since 4.6 - \ingroup statemachine - - The QAbstractState class is the abstract base class of states that are part - of a QStateMachine. It defines the interface that all state objects have in - common. QAbstractState is part of \l{The State Machine Framework}. - - The entered() signal is emitted when the state has been entered. The - exited() signal is emitted when the state has been exited. - - The parentState() function returns the state's parent state. The machine() - function returns the state machine that the state is part of. - - \section1 Subclassing - - The onEntry() function is called when the state is entered; reimplement this - function to perform custom processing when the state is entered. - - The onExit() function is called when the state is exited; reimplement this - function to perform custom processing when the state is exited. -*/ - -/*! - \property QAbstractState::active - \since 5.4 - - \brief the active property of this state. A state is active between - entered() and exited() signals. -*/ - - -QAbstractStatePrivate::QAbstractStatePrivate(StateType type) - : stateType(type), isMachine(false), active(false), parentState(nullptr) -{ -} - -QStateMachine *QAbstractStatePrivate::machine() const -{ - QObject *par = parent; - while (par != nullptr) { - if (QStateMachine *mach = qobject_cast(par)) - return mach; - par = par->parent(); - } - return nullptr; -} - -void QAbstractStatePrivate::callOnEntry(QEvent *e) -{ - Q_Q(QAbstractState); - q->onEntry(e); -} - -void QAbstractStatePrivate::callOnExit(QEvent *e) -{ - Q_Q(QAbstractState); - q->onExit(e); -} - -void QAbstractStatePrivate::emitEntered() -{ - Q_Q(QAbstractState); - emit q->entered(QAbstractState::QPrivateSignal()); - if (!active) { - active = true; - emit q->activeChanged(true); - } -} - -void QAbstractStatePrivate::emitExited() -{ - Q_Q(QAbstractState); - if (active) { - active = false; - emit q->activeChanged(false); - } - emit q->exited(QAbstractState::QPrivateSignal()); -} - -/*! - Constructs a new state with the given \a parent state. -*/ -QAbstractState::QAbstractState(QState *parent) - : QObject(*new QAbstractStatePrivate(QAbstractStatePrivate::AbstractState), parent) -{ -} - -/*! - \internal -*/ -QAbstractState::QAbstractState(QAbstractStatePrivate &dd, QState *parent) - : QObject(dd, parent) -{ -} - -/*! - Destroys this state. -*/ -QAbstractState::~QAbstractState() -{ -} - -/*! - Returns this state's parent state, or \nullptr if the state has no - parent state. -*/ -QState *QAbstractState::parentState() const -{ - Q_D(const QAbstractState); - if (d->parentState != parent()) - d->parentState = qobject_cast(parent()); - return d->parentState; -} - -/*! - Returns the state machine that this state is part of, or \nullptr if - the state is not part of a state machine. -*/ -QStateMachine *QAbstractState::machine() const -{ - Q_D(const QAbstractState); - return d->machine(); -} - -/*! - Returns whether this state is active. - - \sa activeChanged(bool), entered(), exited() -*/ -bool QAbstractState::active() const -{ - Q_D(const QAbstractState); - return d->active; -} - -/*! - \fn QAbstractState::onExit(QEvent *event) - - This function is called when the state is exited. The given \a event is what - caused the state to be exited. Reimplement this function to perform custom - processing when the state is exited. -*/ - -/*! - \fn QAbstractState::onEntry(QEvent *event) - - This function is called when the state is entered. The given \a event is - what caused the state to be entered. Reimplement this function to perform - custom processing when the state is entered. -*/ - -/*! - \fn QAbstractState::entered() - - This signal is emitted when the state has been entered (after onEntry() has - been called). -*/ - -/*! - \fn QAbstractState::exited() - - This signal is emitted when the state has been exited (after onExit() has - been called). -*/ - -/*! - \fn QAbstractState::activeChanged(bool active) - \since 5.4 - - This signal is emitted when the active property is changed with \a active as argument. - - \sa QAbstractState::active, entered(), exited() -*/ - -/*! - \reimp -*/ -bool QAbstractState::event(QEvent *e) -{ - return QObject::event(e); -} - -QT_END_NAMESPACE - -#include "moc_qabstractstate.cpp" diff --git a/src/corelib/statemachine/qabstractstate.h b/src/corelib/statemachine/qabstractstate.h deleted file mode 100644 index ffc2eaae132..00000000000 --- a/src/corelib/statemachine/qabstractstate.h +++ /dev/null @@ -1,88 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QABSTRACTSTATE_H -#define QABSTRACTSTATE_H - -#include - -QT_REQUIRE_CONFIG(statemachine); - -QT_BEGIN_NAMESPACE - -class QState; -class QStateMachine; - -class QAbstractStatePrivate; -class Q_CORE_EXPORT QAbstractState : public QObject -{ - Q_OBJECT - Q_PROPERTY(bool active READ active NOTIFY activeChanged) -public: - ~QAbstractState(); - - QState *parentState() const; - QStateMachine *machine() const; - - bool active() const; - -Q_SIGNALS: - void entered(QPrivateSignal); - void exited(QPrivateSignal); - void activeChanged(bool active); - -protected: - QAbstractState(QState *parent = nullptr); - - virtual void onEntry(QEvent *event) = 0; - virtual void onExit(QEvent *event) = 0; - - bool event(QEvent *e) override; - -protected: - QAbstractState(QAbstractStatePrivate &dd, QState *parent); - -private: - Q_DISABLE_COPY(QAbstractState) - Q_DECLARE_PRIVATE(QAbstractState) -}; - -QT_END_NAMESPACE - -#endif diff --git a/src/corelib/statemachine/qabstractstate_p.h b/src/corelib/statemachine/qabstractstate_p.h deleted file mode 100644 index 11befc187ee..00000000000 --- a/src/corelib/statemachine/qabstractstate_p.h +++ /dev/null @@ -1,99 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QABSTRACTSTATE_P_H -#define QABSTRACTSTATE_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include -#include - -QT_REQUIRE_CONFIG(statemachine); - -QT_BEGIN_NAMESPACE - -class QStateMachine; - -class QState; -class QAbstractStatePrivate : public QObjectPrivate -{ - Q_DECLARE_PUBLIC(QAbstractState) - -public: - enum StateType { - AbstractState, - StandardState, - FinalState, - HistoryState - }; - - QAbstractStatePrivate(StateType type); - - static QAbstractStatePrivate *get(QAbstractState *q) - { return q->d_func(); } - static const QAbstractStatePrivate *get(const QAbstractState *q) - { return q->d_func(); } - - QStateMachine *machine() const; - - void callOnEntry(QEvent *e); - void callOnExit(QEvent *e); - - void emitEntered(); - void emitExited(); - - uint stateType:30; - uint isMachine:1; - bool active:1; - mutable QState *parentState; -}; - -QT_END_NAMESPACE - -#endif // QABSTRACTSTATE_P_H diff --git a/src/corelib/statemachine/qabstracttransition.cpp b/src/corelib/statemachine/qabstracttransition.cpp deleted file mode 100644 index b1cbc1c5168..00000000000 --- a/src/corelib/statemachine/qabstracttransition.cpp +++ /dev/null @@ -1,435 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qabstracttransition.h" -#include "qabstracttransition_p.h" -#include "qabstractstate.h" -#include "qhistorystate.h" -#include "qstate.h" -#include "qstatemachine.h" - -QT_BEGIN_NAMESPACE - -/*! - \class QAbstractTransition - \inmodule QtCore - - \brief The QAbstractTransition class is the base class of transitions between QAbstractState objects. - - \since 4.6 - \ingroup statemachine - - The QAbstractTransition class is the abstract base class of transitions - between states (QAbstractState objects) of a - QStateMachine. QAbstractTransition is part of \l{The State Machine - Framework}. - - The sourceState() function returns the source of the transition. The - targetStates() function returns the targets of the transition. The machine() - function returns the state machine that the transition is part of. - - The triggered() signal is emitted when the transition has been triggered. - - Transitions can cause animations to be played. Use the addAnimation() - function to add an animation to the transition. - - \section1 Subclassing - - The eventTest() function is called by the state machine to determine whether - an event should trigger the transition. In your reimplementation you - typically check the event type and cast the event object to the proper type, - and check that one or more properties of the event meet your criteria. - - The onTransition() function is called when the transition is triggered; - reimplement this function to perform custom processing for the transition. -*/ - -/*! - \property QAbstractTransition::sourceState - - \brief the source state (parent) of this transition -*/ - -/*! - \property QAbstractTransition::targetState - - \brief the target state of this transition - - If a transition has no target state, the transition may still be - triggered, but this will not cause the state machine's configuration to - change (i.e. the current state will not be exited and re-entered). -*/ - -/*! - \property QAbstractTransition::targetStates - - \brief the target states of this transition - - If multiple states are specified, all must be descendants of the same - parallel group state. -*/ - -/*! - \property QAbstractTransition::transitionType - - \brief indicates whether this transition is an internal transition, or an external transition. - - Internal and external transitions behave the same, except for the case of a transition whose - source state is a compound state and whose target(s) is a descendant of the source. In such a - case, an internal transition will not exit and re-enter its source state, while an external one - will. - - By default, the type is an external transition. -*/ - -/*! - \enum QAbstractTransition::TransitionType - - This enum specifies the kind of transition. By default, the type is an external transition. - - \value ExternalTransition Any state that is the source state of a transition (which is not a - target-less transition) is left, and re-entered when necessary. - \value InternalTransition If the target state of a transition is a sub-state of a compound state, - and that compound state is the source state, an internal transition will - not leave the source state. - - \sa QAbstractTransition::transitionType -*/ - -QAbstractTransitionPrivate::QAbstractTransitionPrivate() - : transitionType(QAbstractTransition::ExternalTransition) -{ -} - -QStateMachine *QAbstractTransitionPrivate::machine() const -{ - if (QState *source = sourceState()) - return source->machine(); - Q_Q(const QAbstractTransition); - if (QHistoryState *parent = qobject_cast(q->parent())) - return parent->machine(); - return nullptr; -} - -bool QAbstractTransitionPrivate::callEventTest(QEvent *e) -{ - Q_Q(QAbstractTransition); - return q->eventTest(e); -} - -void QAbstractTransitionPrivate::callOnTransition(QEvent *e) -{ - Q_Q(QAbstractTransition); - q->onTransition(e); -} - -QState *QAbstractTransitionPrivate::sourceState() const -{ - return qobject_cast(parent); -} - -void QAbstractTransitionPrivate::emitTriggered() -{ - Q_Q(QAbstractTransition); - emit q->triggered(QAbstractTransition::QPrivateSignal()); -} - -/*! - Constructs a new QAbstractTransition object with the given \a sourceState. -*/ -QAbstractTransition::QAbstractTransition(QState *sourceState) - : QObject(*new QAbstractTransitionPrivate, sourceState) -{ -} - -/*! - \internal -*/ -QAbstractTransition::QAbstractTransition(QAbstractTransitionPrivate &dd, - QState *parent) - : QObject(dd, parent) -{ -} - -/*! - Destroys this transition. -*/ -QAbstractTransition::~QAbstractTransition() -{ -} - -/*! - Returns the source state of this transition, or \nullptr if this - transition has no source state. -*/ -QState *QAbstractTransition::sourceState() const -{ - Q_D(const QAbstractTransition); - return d->sourceState(); -} - -/*! - Returns the target state of this transition, or \nullptr if the - transition has no target. -*/ -QAbstractState *QAbstractTransition::targetState() const -{ - Q_D(const QAbstractTransition); - if (d->targetStates.isEmpty()) - return nullptr; - return d->targetStates.first().data(); -} - -/*! - Sets the \a target state of this transition. -*/ -void QAbstractTransition::setTargetState(QAbstractState* target) -{ - Q_D(QAbstractTransition); - if ((d->targetStates.size() == 1 && target == d->targetStates.at(0).data()) || - (d->targetStates.isEmpty() && target == nullptr)) { - return; - } - if (!target) - d->targetStates.clear(); - else - setTargetStates(QList() << target); - emit targetStateChanged(QPrivateSignal()); -} - -/*! - Returns the target states of this transition, or an empty list if this - transition has no target states. -*/ -QList QAbstractTransition::targetStates() const -{ - Q_D(const QAbstractTransition); - QList result; - for (int i = 0; i < d->targetStates.size(); ++i) { - QAbstractState *target = d->targetStates.at(i).data(); - if (target) - result.append(target); - } - return result; -} - -/*! - Sets the target states of this transition to be the given \a targets. -*/ -void QAbstractTransition::setTargetStates(const QList &targets) -{ - Q_D(QAbstractTransition); - - // Verify if any of the new target states is a null-pointer: - for (int i = 0; i < targets.size(); ++i) { - if (targets.at(i) == nullptr) { - qWarning("QAbstractTransition::setTargetStates: target state(s) cannot be null"); - return; - } - } - - // First clean out any target states that got destroyed, but for which we still have a QPointer - // around. - for (int i = 0; i < d->targetStates.size(); ) { - if (d->targetStates.at(i).isNull()) { - d->targetStates.remove(i); - } else { - ++i; - } - } - - // Easy check: if both lists are empty, we're done. - if (targets.isEmpty() && d->targetStates.isEmpty()) - return; - - bool sameList = true; - - if (targets.size() != d->targetStates.size()) { - // If the sizes of the lists are different, we don't need to be smart: they're different. So - // we can just set the new list as the targetStates. - sameList = false; - } else { - QList> copy(d->targetStates); - for (int i = 0; i < targets.size(); ++i) { - sameList &= copy.removeOne(targets.at(i)); - if (!sameList) - break; // ok, we now know the lists are not the same, so stop the loop. - } - - sameList &= copy.isEmpty(); - } - - if (sameList) - return; - - d->targetStates.resize(targets.size()); - for (int i = 0; i < targets.size(); ++i) { - d->targetStates[i] = targets.at(i); - } - - emit targetStatesChanged(QPrivateSignal()); -} - -/*! - Returns the type of the transition. -*/ -QAbstractTransition::TransitionType QAbstractTransition::transitionType() const -{ - Q_D(const QAbstractTransition); - return d->transitionType; -} - -/*! - Sets the type of the transition to \a type. -*/ -void QAbstractTransition::setTransitionType(TransitionType type) -{ - Q_D(QAbstractTransition); - d->transitionType = type; -} - -/*! - Returns the state machine that this transition is part of, or - \nullptr if the transition is not part of a state machine. -*/ -QStateMachine *QAbstractTransition::machine() const -{ - Q_D(const QAbstractTransition); - return d->machine(); -} - -#if QT_CONFIG(animation) - -/*! - Adds the given \a animation to this transition. - The transition does not take ownership of the animation. - - \sa removeAnimation(), animations() -*/ -void QAbstractTransition::addAnimation(QAbstractAnimation *animation) -{ - Q_D(QAbstractTransition); - if (!animation) { - qWarning("QAbstractTransition::addAnimation: cannot add null animation"); - return; - } - d->animations.append(animation); -} - -/*! - Removes the given \a animation from this transition. - - \sa addAnimation() -*/ -void QAbstractTransition::removeAnimation(QAbstractAnimation *animation) -{ - Q_D(QAbstractTransition); - if (!animation) { - qWarning("QAbstractTransition::removeAnimation: cannot remove null animation"); - return; - } - d->animations.removeOne(animation); -} - -/*! - Returns the list of animations associated with this transition, or an empty - list if it has no animations. - - \sa addAnimation() -*/ -QList QAbstractTransition::animations() const -{ - Q_D(const QAbstractTransition); - return d->animations; -} - -#endif - -/*! - \fn QAbstractTransition::eventTest(QEvent *event) - - This function is called to determine whether the given \a event should cause - this transition to trigger. Reimplement this function and return true if the - event should trigger the transition, otherwise return false. -*/ - -/*! - \fn QAbstractTransition::onTransition(QEvent *event) - - This function is called when the transition is triggered. The given \a event - is what caused the transition to trigger. Reimplement this function to - perform custom processing when the transition is triggered. -*/ - -/*! - \fn QAbstractTransition::triggered() - - This signal is emitted when the transition has been triggered (after - onTransition() has been called). -*/ - -/*! - \fn QAbstractTransition::targetStateChanged() - \since 5.4 - - This signal is emitted when the targetState property is changed. - - \sa QAbstractTransition::targetState -*/ - -/*! - \fn QAbstractTransition::targetStatesChanged() - \since 5.4 - - This signal is emitted when the targetStates property is changed. - - \sa QAbstractTransition::targetStates -*/ - -/*! - \reimp -*/ -bool QAbstractTransition::event(QEvent *e) -{ - return QObject::event(e); -} - -QT_END_NAMESPACE - -#include "moc_qabstracttransition.cpp" diff --git a/src/corelib/statemachine/qabstracttransition.h b/src/corelib/statemachine/qabstracttransition.h deleted file mode 100644 index 357e829b6a2..00000000000 --- a/src/corelib/statemachine/qabstracttransition.h +++ /dev/null @@ -1,117 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QABSTRACTTRANSITION_H -#define QABSTRACTTRANSITION_H - -#include - -#include - -QT_REQUIRE_CONFIG(statemachine); - -QT_BEGIN_NAMESPACE - -class QEvent; -class QAbstractState; -class QState; -class QStateMachine; - -#if QT_CONFIG(animation) -class QAbstractAnimation; -#endif - -class QAbstractTransitionPrivate; -class Q_CORE_EXPORT QAbstractTransition : public QObject -{ - Q_OBJECT - Q_PROPERTY(QState* sourceState READ sourceState) - Q_PROPERTY(QAbstractState* targetState READ targetState WRITE setTargetState NOTIFY targetStateChanged) - Q_PROPERTY(QList targetStates READ targetStates WRITE setTargetStates NOTIFY targetStatesChanged) - Q_PROPERTY(TransitionType transitionType READ transitionType WRITE setTransitionType REVISION(1, 1)) -public: - enum TransitionType { - ExternalTransition, - InternalTransition - }; - Q_ENUM(TransitionType) - - QAbstractTransition(QState *sourceState = nullptr); - virtual ~QAbstractTransition(); - - QState *sourceState() const; - QAbstractState *targetState() const; - void setTargetState(QAbstractState* target); - QList targetStates() const; - void setTargetStates(const QList &targets); - - TransitionType transitionType() const; - void setTransitionType(TransitionType type); - - QStateMachine *machine() const; - -#if QT_CONFIG(animation) - void addAnimation(QAbstractAnimation *animation); - void removeAnimation(QAbstractAnimation *animation); - QList animations() const; -#endif - -Q_SIGNALS: - void triggered(QPrivateSignal); - void targetStateChanged(QPrivateSignal); - void targetStatesChanged(QPrivateSignal); - -protected: - virtual bool eventTest(QEvent *event) = 0; - - virtual void onTransition(QEvent *event) = 0; - - bool event(QEvent *e) override; - -protected: - QAbstractTransition(QAbstractTransitionPrivate &dd, QState *parent); - -private: - Q_DISABLE_COPY(QAbstractTransition) - Q_DECLARE_PRIVATE(QAbstractTransition) -}; - -QT_END_NAMESPACE - -#endif diff --git a/src/corelib/statemachine/qabstracttransition_p.h b/src/corelib/statemachine/qabstracttransition_p.h deleted file mode 100644 index 435488848f8..00000000000 --- a/src/corelib/statemachine/qabstracttransition_p.h +++ /dev/null @@ -1,94 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QABSTRACTTRANSITION_P_H -#define QABSTRACTTRANSITION_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include - -#include -#include - -QT_REQUIRE_CONFIG(statemachine); - -QT_BEGIN_NAMESPACE - -class QAbstractState; -class QState; -class QStateMachine; - -class QAbstractTransition; -class Q_CORE_EXPORT QAbstractTransitionPrivate - : public QObjectPrivate -{ - Q_DECLARE_PUBLIC(QAbstractTransition) -public: - QAbstractTransitionPrivate(); - - static QAbstractTransitionPrivate *get(QAbstractTransition *q) - { return q->d_func(); } - - bool callEventTest(QEvent *e); - virtual void callOnTransition(QEvent *e); - QState *sourceState() const; - QStateMachine *machine() const; - void emitTriggered(); - - QList> targetStates; - QAbstractTransition::TransitionType transitionType; - -#if QT_CONFIG(animation) - QList animations; -#endif -}; - -QT_END_NAMESPACE - -#endif diff --git a/src/corelib/statemachine/qeventtransition.cpp b/src/corelib/statemachine/qeventtransition.cpp deleted file mode 100644 index 5dcbcfff470..00000000000 --- a/src/corelib/statemachine/qeventtransition.cpp +++ /dev/null @@ -1,256 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qeventtransition.h" -#include "qeventtransition_p.h" -#include "qstate.h" -#include "qstate_p.h" -#include "qstatemachine.h" -#include "qstatemachine_p.h" -#include - -QT_BEGIN_NAMESPACE - -/*! - \class QEventTransition - \inmodule QtCore - - \brief The QEventTransition class provides a QObject-specific transition for Qt events. - - \since 4.6 - \ingroup statemachine - - A QEventTransition object binds an event to a particular QObject. - QEventTransition is part of \l{The State Machine Framework}. - - Example: - - \code - QPushButton *button = ...; - QState *s1 = ...; - QState *s2 = ...; - // If in s1 and the button receives an Enter event, transition to s2 - QEventTransition *enterTransition = new QEventTransition(button, QEvent::Enter); - enterTransition->setTargetState(s2); - s1->addTransition(enterTransition); - // If in s2 and the button receives an Exit event, transition back to s1 - QEventTransition *leaveTransition = new QEventTransition(button, QEvent::Leave); - leaveTransition->setTargetState(s1); - s2->addTransition(leaveTransition); - \endcode - - \section1 Subclassing - - When reimplementing the eventTest() function, you should first call the base - implementation to verify that the event is a QStateMachine::WrappedEvent for - the proper object and event type. You may then cast the event to a - QStateMachine::WrappedEvent and get the original event by calling - QStateMachine::WrappedEvent::event(), and perform additional checks on that - object. - - \sa QState::addTransition() -*/ - -/*! - \property QEventTransition::eventSource - - \brief the event source that this event transition is associated with -*/ - -/*! - \property QEventTransition::eventType - - \brief the type of event that this event transition is associated with -*/ -QEventTransitionPrivate::QEventTransitionPrivate() -{ - object = nullptr; - eventType = QEvent::None; - registered = false; -} - -QEventTransitionPrivate::~QEventTransitionPrivate() -{ -} - -void QEventTransitionPrivate::unregister() -{ - Q_Q(QEventTransition); - if (!registered || !machine()) - return; - QStateMachinePrivate::get(machine())->unregisterEventTransition(q); -} - -void QEventTransitionPrivate::maybeRegister() -{ - Q_Q(QEventTransition); - if (QStateMachine *mach = machine()) - QStateMachinePrivate::get(mach)->maybeRegisterEventTransition(q); -} - -/*! - Constructs a new QEventTransition object with the given \a sourceState. -*/ -QEventTransition::QEventTransition(QState *sourceState) - : QAbstractTransition(*new QEventTransitionPrivate, sourceState) -{ -} - -/*! - Constructs a new QEventTransition object associated with events of the given - \a type for the given \a object, and with the given \a sourceState. -*/ -QEventTransition::QEventTransition(QObject *object, QEvent::Type type, - QState *sourceState) - : QAbstractTransition(*new QEventTransitionPrivate, sourceState) -{ - Q_D(QEventTransition); - d->registered = false; - d->object = object; - d->eventType = type; - d->maybeRegister(); -} - -/*! - \internal -*/ -QEventTransition::QEventTransition(QEventTransitionPrivate &dd, QState *parent) - : QAbstractTransition(dd, parent) -{ -} - -/*! - \internal -*/ -QEventTransition::QEventTransition(QEventTransitionPrivate &dd, QObject *object, - QEvent::Type type, QState *parent) - : QAbstractTransition(dd, parent) -{ - Q_D(QEventTransition); - d->registered = false; - d->object = object; - d->eventType = type; - d->maybeRegister(); -} - -/*! - Destroys this QObject event transition. -*/ -QEventTransition::~QEventTransition() -{ -} - -/*! - Returns the event type that this event transition is associated with. -*/ -QEvent::Type QEventTransition::eventType() const -{ - Q_D(const QEventTransition); - return d->eventType; -} - -/*! - Sets the event \a type that this event transition is associated with. -*/ -void QEventTransition::setEventType(QEvent::Type type) -{ - Q_D(QEventTransition); - if (d->eventType == type) - return; - d->unregister(); - d->eventType = type; - d->maybeRegister(); -} - -/*! - Returns the event source associated with this event transition. -*/ -QObject *QEventTransition::eventSource() const -{ - Q_D(const QEventTransition); - return d->object; -} - -/*! - Sets the event source associated with this event transition to be the given - \a object. -*/ -void QEventTransition::setEventSource(QObject *object) -{ - Q_D(QEventTransition); - if (d->object == object) - return; - d->unregister(); - d->object = object; - d->maybeRegister(); -} - -/*! - \reimp -*/ -bool QEventTransition::eventTest(QEvent *event) -{ - Q_D(const QEventTransition); - if (event->type() == QEvent::StateMachineWrapped) { - QStateMachine::WrappedEvent *we = static_cast(event); - return (we->object() == d->object) - && (we->event()->type() == d->eventType); - } - return false; -} - -/*! - \reimp -*/ -void QEventTransition::onTransition(QEvent *event) -{ - Q_UNUSED(event); -} - -/*! - \reimp -*/ -bool QEventTransition::event(QEvent *e) -{ - return QAbstractTransition::event(e); -} - -QT_END_NAMESPACE - -#include "moc_qeventtransition.cpp" diff --git a/src/corelib/statemachine/qeventtransition.h b/src/corelib/statemachine/qeventtransition.h deleted file mode 100644 index ff4a9911621..00000000000 --- a/src/corelib/statemachine/qeventtransition.h +++ /dev/null @@ -1,85 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QEVENTTRANSITION_H -#define QEVENTTRANSITION_H - -#include -#include - -QT_REQUIRE_CONFIG(qeventtransition); - -QT_BEGIN_NAMESPACE - -class QEventTransitionPrivate; -class Q_CORE_EXPORT QEventTransition : public QAbstractTransition -{ - Q_OBJECT - Q_PROPERTY(QObject* eventSource READ eventSource WRITE setEventSource) - Q_PROPERTY(QEvent::Type eventType READ eventType WRITE setEventType) -public: - QEventTransition(QState *sourceState = nullptr); - QEventTransition(QObject *object, QEvent::Type type, QState *sourceState = nullptr); - ~QEventTransition(); - - QObject *eventSource() const; - void setEventSource(QObject *object); - - QEvent::Type eventType() const; - void setEventType(QEvent::Type type); - -protected: - bool eventTest(QEvent *event) override; - void onTransition(QEvent *event) override; - - bool event(QEvent *e) override; - -protected: - QEventTransition(QEventTransitionPrivate &dd, QState *parent); - QEventTransition(QEventTransitionPrivate &dd, QObject *object, - QEvent::Type type, QState *parent); - -private: - Q_DISABLE_COPY(QEventTransition) - Q_DECLARE_PRIVATE(QEventTransition) -}; - -QT_END_NAMESPACE - -#endif diff --git a/src/corelib/statemachine/qeventtransition_p.h b/src/corelib/statemachine/qeventtransition_p.h deleted file mode 100644 index e30e12bc8d0..00000000000 --- a/src/corelib/statemachine/qeventtransition_p.h +++ /dev/null @@ -1,81 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QEVENTTRANSITION_P_H -#define QEVENTTRANSITION_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include "private/qabstracttransition_p.h" - -QT_REQUIRE_CONFIG(qeventtransition); - -QT_BEGIN_NAMESPACE - -class QEventTransition; -class Q_CORE_EXPORT QEventTransitionPrivate : public QAbstractTransitionPrivate -{ - Q_DECLARE_PUBLIC(QEventTransition) -public: - QEventTransitionPrivate(); - ~QEventTransitionPrivate(); - - static QEventTransitionPrivate *get(QEventTransition *q) - { return q->d_func(); } - - void unregister(); - void maybeRegister(); - - QObject *object; - bool registered; - QEvent::Type eventType; -}; - -QT_END_NAMESPACE - -#endif diff --git a/src/corelib/statemachine/qfinalstate.cpp b/src/corelib/statemachine/qfinalstate.cpp deleted file mode 100644 index d8bfd309747..00000000000 --- a/src/corelib/statemachine/qfinalstate.cpp +++ /dev/null @@ -1,141 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qfinalstate_p.h" - -QT_BEGIN_NAMESPACE - -/*! - \class QFinalState - \inmodule QtCore - - \brief The QFinalState class provides a final state. - - \since 4.6 - \ingroup statemachine - - A final state is used to communicate that (part of) a QStateMachine has - finished its work. When a final top-level state is entered, the state - machine's \l{QStateMachine::finished()}{finished}() signal is emitted. In - general, when a final substate (a child of a QState) is entered, the parent - state's \l{QState::finished()}{finished}() signal is emitted. QFinalState - is part of \l{The State Machine Framework}. - - To use a final state, you create a QFinalState object and add a transition - to it from another state. Example: - - \code - QPushButton button; - - QStateMachine machine; - QState *s1 = new QState(); - QFinalState *s2 = new QFinalState(); - s1->addTransition(&button, SIGNAL(clicked()), s2); - machine.addState(s1); - machine.addState(s2); - - QObject::connect(&machine, SIGNAL(finished()), QApplication::instance(), SLOT(quit())); - machine.setInitialState(s1); - machine.start(); - \endcode - - \sa QState::finished() -*/ - -QFinalStatePrivate::QFinalStatePrivate() - : QAbstractStatePrivate(FinalState) -{ -} - -QFinalStatePrivate::~QFinalStatePrivate() -{ - // to prevent vtables being generated in every file that includes the private header -} - -/*! - Constructs a new QFinalState object with the given \a parent state. -*/ -QFinalState::QFinalState(QState *parent) - : QAbstractState(*new QFinalStatePrivate, parent) -{ -} - -/*! - \internal - */ -QFinalState::QFinalState(QFinalStatePrivate &dd, QState *parent) - : QAbstractState(dd, parent) -{ -} - - -/*! - Destroys this final state. -*/ -QFinalState::~QFinalState() -{ -} - -/*! - \reimp -*/ -void QFinalState::onEntry(QEvent *event) -{ - Q_UNUSED(event); -} - -/*! - \reimp -*/ -void QFinalState::onExit(QEvent *event) -{ - Q_UNUSED(event); -} - -/*! - \reimp -*/ -bool QFinalState::event(QEvent *e) -{ - return QAbstractState::event(e); -} - -QT_END_NAMESPACE - -#include "moc_qfinalstate.cpp" diff --git a/src/corelib/statemachine/qfinalstate.h b/src/corelib/statemachine/qfinalstate.h deleted file mode 100644 index 1e52a0411da..00000000000 --- a/src/corelib/statemachine/qfinalstate.h +++ /dev/null @@ -1,73 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QFINALSTATE_H -#define QFINALSTATE_H - -#include - -QT_REQUIRE_CONFIG(statemachine); - -QT_BEGIN_NAMESPACE - -class QFinalStatePrivate; -class Q_CORE_EXPORT QFinalState : public QAbstractState -{ - Q_OBJECT -public: - QFinalState(QState *parent = nullptr); - ~QFinalState(); - -protected: - void onEntry(QEvent *event) override; - void onExit(QEvent *event) override; - - bool event(QEvent *e) override; - -protected: - explicit QFinalState(QFinalStatePrivate &dd, QState *parent); - -private: - Q_DISABLE_COPY(QFinalState) - Q_DECLARE_PRIVATE(QFinalState) -}; - -QT_END_NAMESPACE - -#endif diff --git a/src/corelib/statemachine/qfinalstate_p.h b/src/corelib/statemachine/qfinalstate_p.h deleted file mode 100644 index 65598f6c196..00000000000 --- a/src/corelib/statemachine/qfinalstate_p.h +++ /dev/null @@ -1,72 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QFINALSTATE_P_H -#define QFINALSTATE_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include "qfinalstate.h" -#include "private/qabstractstate_p.h" - -QT_REQUIRE_CONFIG(statemachine); - -QT_BEGIN_NAMESPACE - -class Q_CORE_EXPORT QFinalStatePrivate : public QAbstractStatePrivate -{ - Q_DECLARE_PUBLIC(QFinalState) - -public: - QFinalStatePrivate(); - ~QFinalStatePrivate(); -}; - -QT_END_NAMESPACE - -#endif // QFINALSTATE_P_H diff --git a/src/corelib/statemachine/qhistorystate.cpp b/src/corelib/statemachine/qhistorystate.cpp deleted file mode 100644 index e5b8075b965..00000000000 --- a/src/corelib/statemachine/qhistorystate.cpp +++ /dev/null @@ -1,334 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qhistorystate.h" -#include "qhistorystate_p.h" - -QT_BEGIN_NAMESPACE - -/*! - \class QHistoryState - \inmodule QtCore - - \brief The QHistoryState class provides a means of returning to a previously active substate. - - \since 4.6 - \ingroup statemachine - - A history state is a pseudo-state that represents the child state that the - parent state was in the last time the parent state was exited. A transition - with a history state as its target is in fact a transition to one or more - other child states of the parent state. QHistoryState is part of \l{The - State Machine Framework}. - - Use the setDefaultState() function to set the state that should be entered - if the parent state has never been entered. Example: - - \code - QStateMachine machine; - - QState *s1 = new QState(); - QState *s11 = new QState(s1); - QState *s12 = new QState(s1); - - QHistoryState *s1h = new QHistoryState(s1); - s1h->setDefaultState(s11); - - machine.addState(s1); - - QState *s2 = new QState(); - machine.addState(s2); - - QPushButton *button = new QPushButton(); - // Clicking the button will cause the state machine to enter the child state - // that s1 was in the last time s1 was exited, or the history state's default - // state if s1 has never been entered. - s1->addTransition(button, SIGNAL(clicked()), s1h); - \endcode - - If more than one default state has to be entered, or if the transition to the default state(s) - has to be acted upon, the defaultTransition should be set instead. Note that the eventTest() - method of that transition will never be called: the selection and execution of the transition is - done automatically when entering the history state. - - By default a history state is shallow, meaning that it won't remember nested - states. This can be configured through the historyType property. -*/ - -/*! - \property QHistoryState::defaultTransition - - \brief the default transition of this history state -*/ - -/*! - \property QHistoryState::defaultState - - \brief the default state of this history state -*/ - -/*! - \property QHistoryState::historyType - - \brief the type of history that this history state records - - The default value of this property is QHistoryState::ShallowHistory. -*/ - -/*! - \enum QHistoryState::HistoryType - - This enum specifies the type of history that a QHistoryState records. - - \value ShallowHistory Only the immediate child states of the parent state - are recorded. In this case a transition with the history state as its - target will end up in the immediate child state that the parent was in the - last time it was exited. This is the default. - - \value DeepHistory Nested states are recorded. In this case a transition - with the history state as its target will end up in the most deeply nested - descendant state the parent was in the last time it was exited. -*/ - -namespace { -class DefaultStateTransition: public QAbstractTransition -{ - Q_OBJECT - -public: - DefaultStateTransition(QHistoryState *source, QAbstractState *target); - -protected: - // It doesn't matter whether this transition matches any event or not. It is always associated - // with a QHistoryState, and as soon as the state-machine detects that it enters a history - // state, it will handle this transition as a special case. The history state itself is never - // entered either: either the stored configuration will be used, or the target(s) of this - // transition are used. - bool eventTest(QEvent *event) override { Q_UNUSED(event); return false; } - void onTransition(QEvent *event) override { Q_UNUSED(event); } -}; -} - -QHistoryStatePrivate::QHistoryStatePrivate() - : QAbstractStatePrivate(HistoryState) - , defaultTransition(nullptr) - , historyType(QHistoryState::ShallowHistory) -{ -} - -DefaultStateTransition::DefaultStateTransition(QHistoryState *source, QAbstractState *target) - : QAbstractTransition() -{ - setParent(source); - setTargetState(target); -} - -/*! - Constructs a new shallow history state with the given \a parent state. -*/ -QHistoryState::QHistoryState(QState *parent) - : QAbstractState(*new QHistoryStatePrivate, parent) -{ -} -/*! - Constructs a new history state of the given \a type, with the given \a - parent state. -*/ -QHistoryState::QHistoryState(HistoryType type, QState *parent) - : QAbstractState(*new QHistoryStatePrivate, parent) -{ - Q_D(QHistoryState); - d->historyType = type; -} - -/*! - Destroys this history state. -*/ -QHistoryState::~QHistoryState() -{ -} - -/*! - Returns this history state's default transition. The default transition is - taken when the history state has never been entered before. The target states - of the default transition therefore make up the default state. - - \since 5.6 -*/ -QAbstractTransition *QHistoryState::defaultTransition() const -{ - Q_D(const QHistoryState); - return d->defaultTransition; -} - -/*! - Sets this history state's default transition to be the given \a transition. - This will set the source state of the \a transition to the history state. - - Note that the eventTest method of the \a transition will never be called. - - \since 5.6 -*/ -void QHistoryState::setDefaultTransition(QAbstractTransition *transition) -{ - Q_D(QHistoryState); - if (d->defaultTransition != transition) { - d->defaultTransition = transition; - transition->setParent(this); - emit defaultTransitionChanged(QHistoryState::QPrivateSignal()); - } -} - -/*! - Returns this history state's default state. The default state indicates the - state to transition to if the parent state has never been entered before. -*/ -QAbstractState *QHistoryState::defaultState() const -{ - Q_D(const QHistoryState); - return d->defaultTransition ? d->defaultTransition->targetState() : nullptr; -} - -static inline bool isSoleEntry(const QList &states, const QAbstractState * state) -{ - return states.size() == 1 && states.first() == state; -} - -/*! - Sets this history state's default state to be the given \a state. - \a state must be a sibling of this history state. - - Note that this function does not set \a state as the initial state - of its parent. -*/ -void QHistoryState::setDefaultState(QAbstractState *state) -{ - Q_D(QHistoryState); - if (state && state->parentState() != parentState()) { - qWarning("QHistoryState::setDefaultState: state %p does not belong " - "to this history state's group (%p)", state, parentState()); - return; - } - if (!d->defaultTransition || !isSoleEntry(d->defaultTransition->targetStates(), state)) { - if (!d->defaultTransition || !qobject_cast(d->defaultTransition)) { - d->defaultTransition = new DefaultStateTransition(this, state); - emit defaultTransitionChanged(QHistoryState::QPrivateSignal()); - } else { - d->defaultTransition->setTargetState(state); - } - emit defaultStateChanged(QHistoryState::QPrivateSignal()); - } -} - -/*! - Returns the type of history that this history state records. -*/ -QHistoryState::HistoryType QHistoryState::historyType() const -{ - Q_D(const QHistoryState); - return d->historyType; -} - -/*! - Sets the \a type of history that this history state records. -*/ -void QHistoryState::setHistoryType(HistoryType type) -{ - Q_D(QHistoryState); - if (d->historyType != type) { - d->historyType = type; - emit historyTypeChanged(QHistoryState::QPrivateSignal()); - } -} - -/*! - \reimp -*/ -void QHistoryState::onEntry(QEvent *event) -{ - Q_UNUSED(event); -} - -/*! - \reimp -*/ -void QHistoryState::onExit(QEvent *event) -{ - Q_UNUSED(event); -} - -/*! - \reimp -*/ -bool QHistoryState::event(QEvent *e) -{ - return QAbstractState::event(e); -} - -/*! - \fn QHistoryState::defaultStateChanged() - \since 5.4 - - This signal is emitted when the defaultState property is changed. - - \sa QHistoryState::defaultState -*/ - -/*! - \fn QHistoryState::historyTypeChanged() - \since 5.4 - - This signal is emitted when the historyType property is changed. - - \sa QHistoryState::historyType -*/ - -/*! - \fn QHistoryState::defaultTransitionChanged() - \since 5.6 - - This signal is emitted when the defaultTransition property is changed. - - \sa QHistoryState::defaultTransition -*/ - -QT_END_NAMESPACE - -#include "moc_qhistorystate.cpp" -#include "qhistorystate.moc" diff --git a/src/corelib/statemachine/qhistorystate.h b/src/corelib/statemachine/qhistorystate.h deleted file mode 100644 index 44f4c5d6d49..00000000000 --- a/src/corelib/statemachine/qhistorystate.h +++ /dev/null @@ -1,95 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QHISTORYSTATE_H -#define QHISTORYSTATE_H - -#include - -QT_REQUIRE_CONFIG(statemachine); - -QT_BEGIN_NAMESPACE - -class QAbstractTransition; -class QHistoryStatePrivate; -class Q_CORE_EXPORT QHistoryState : public QAbstractState -{ - Q_OBJECT - Q_PROPERTY(QAbstractState* defaultState READ defaultState WRITE setDefaultState NOTIFY defaultStateChanged) - Q_PROPERTY(QAbstractTransition* defaultTransition READ defaultTransition WRITE setDefaultTransition NOTIFY defaultTransitionChanged) - Q_PROPERTY(HistoryType historyType READ historyType WRITE setHistoryType NOTIFY historyTypeChanged) -public: - enum HistoryType { - ShallowHistory, - DeepHistory - }; - Q_ENUM(HistoryType) - - QHistoryState(QState *parent = nullptr); - QHistoryState(HistoryType type, QState *parent = nullptr); - ~QHistoryState(); - - QAbstractTransition *defaultTransition() const; - void setDefaultTransition(QAbstractTransition *transition); - - QAbstractState *defaultState() const; - void setDefaultState(QAbstractState *state); - - HistoryType historyType() const; - void setHistoryType(HistoryType type); - -Q_SIGNALS: - void defaultTransitionChanged(QPrivateSignal); - void defaultStateChanged(QPrivateSignal); - void historyTypeChanged(QPrivateSignal); - -protected: - void onEntry(QEvent *event) override; - void onExit(QEvent *event) override; - - bool event(QEvent *e) override; - -private: - Q_DISABLE_COPY(QHistoryState) - Q_DECLARE_PRIVATE(QHistoryState) -}; - -QT_END_NAMESPACE - -#endif diff --git a/src/corelib/statemachine/qhistorystate_p.h b/src/corelib/statemachine/qhistorystate_p.h deleted file mode 100644 index 18d571feb7d..00000000000 --- a/src/corelib/statemachine/qhistorystate_p.h +++ /dev/null @@ -1,80 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QHISTORYSTATE_P_H -#define QHISTORYSTATE_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include "private/qabstractstate_p.h" -#include -#include -#include - -QT_REQUIRE_CONFIG(statemachine); - -QT_BEGIN_NAMESPACE - -class QHistoryStatePrivate : public QAbstractStatePrivate -{ - Q_DECLARE_PUBLIC(QHistoryState) - -public: - QHistoryStatePrivate(); - - static QHistoryStatePrivate *get(QHistoryState *q) - { return q->d_func(); } - - QAbstractTransition *defaultTransition; - QHistoryState::HistoryType historyType; - QList configuration; -}; - -QT_END_NAMESPACE - -#endif // QHISTORYSTATE_P_H diff --git a/src/corelib/statemachine/qsignaleventgenerator_p.h b/src/corelib/statemachine/qsignaleventgenerator_p.h deleted file mode 100644 index a9d5b96920d..00000000000 --- a/src/corelib/statemachine/qsignaleventgenerator_p.h +++ /dev/null @@ -1,78 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSIGNALEVENTGENERATOR_P_H -#define QSIGNALEVENTGENERATOR_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include -#include - -QT_REQUIRE_CONFIG(statemachine); - -QT_BEGIN_NAMESPACE - -class QStateMachine; - -class QSignalEventGenerator : public QObject -{ - Q_OBJECT -public: - QSignalEventGenerator(QStateMachine *parent); - -private Q_SLOTS: - void execute(QMethodRawArguments a); - -private: - Q_DISABLE_COPY_MOVE(QSignalEventGenerator) -}; - -QT_END_NAMESPACE - -#endif diff --git a/src/corelib/statemachine/qsignaltransition.cpp b/src/corelib/statemachine/qsignaltransition.cpp deleted file mode 100644 index 8e57695fd7d..00000000000 --- a/src/corelib/statemachine/qsignaltransition.cpp +++ /dev/null @@ -1,287 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qsignaltransition.h" -#include "qsignaltransition_p.h" -#include "qstate.h" -#include "qstate_p.h" -#include "qstatemachine.h" -#include "qstatemachine_p.h" -#include - -QT_BEGIN_NAMESPACE - -/*! - \class QSignalTransition - \inmodule QtCore - - \brief The QSignalTransition class provides a transition based on a Qt signal. - - \since 4.6 - \ingroup statemachine - - Typically you would use the overload of QState::addTransition() that takes a - sender and signal as arguments, rather than creating QSignalTransition - objects directly. QSignalTransition is part of \l{The State Machine - Framework}. - - You can subclass QSignalTransition and reimplement eventTest() to make a - signal transition conditional; the event object passed to eventTest() will - be a QStateMachine::SignalEvent object. Example: - - \code - class CheckedTransition : public QSignalTransition - { - public: - CheckedTransition(QCheckBox *check) - : QSignalTransition(check, SIGNAL(stateChanged(int))) {} - protected: - bool eventTest(QEvent *e) { - if (!QSignalTransition::eventTest(e)) - return false; - QStateMachine::SignalEvent *se = static_cast(e); - return (se->arguments().at(0).toInt() == Qt::Checked); - } - }; - - ... - - QCheckBox *check = new QCheckBox(); - check->setTristate(true); - - QState *s1 = new QState(); - QState *s2 = new QState(); - CheckedTransition *t1 = new CheckedTransition(check); - t1->setTargetState(s2); - s1->addTransition(t1); - \endcode -*/ - -/*! - \property QSignalTransition::senderObject - - \brief the sender object that this signal transition is associated with -*/ - -/*! - \property QSignalTransition::signal - - \brief the signal that this signal transition is associated with -*/ - -QSignalTransitionPrivate::QSignalTransitionPrivate() -{ - sender = nullptr; - signalIndex = -1; -} - -void QSignalTransitionPrivate::unregister() -{ - Q_Q(QSignalTransition); - if ((signalIndex == -1) || !machine()) - return; - QStateMachinePrivate::get(machine())->unregisterSignalTransition(q); -} - -void QSignalTransitionPrivate::maybeRegister() -{ - Q_Q(QSignalTransition); - if (QStateMachine *mach = machine()) - QStateMachinePrivate::get(mach)->maybeRegisterSignalTransition(q); -} - -/*! - Constructs a new signal transition with the given \a sourceState. -*/ -QSignalTransition::QSignalTransition(QState *sourceState) - : QAbstractTransition(*new QSignalTransitionPrivate, sourceState) -{ -} - -/*! - Constructs a new signal transition associated with the given \a signal of - the given \a sender, and with the given \a sourceState. -*/ -QSignalTransition::QSignalTransition(const QObject *sender, const char *signal, - QState *sourceState) - : QAbstractTransition(*new QSignalTransitionPrivate, sourceState) -{ - Q_D(QSignalTransition); - d->sender = sender; - d->signal = signal; - d->maybeRegister(); -} - -/*! - \fn template QSignalTransition::QSignalTransition(const QObject *sender, PointerToMemberFunction signal, QState *sourceState) - \since 5.7 - \overload - - Constructs a new signal transition associated with the given \a signal of - the given \a sender object and with the given \a sourceState. - This constructor is enabled if the compiler supports delegating constructors, - as indicated by the presence of the macro Q_COMPILER_DELEGATING_CONSTRUCTORS. -*/ - -/*! - Destroys this signal transition. -*/ -QSignalTransition::~QSignalTransition() -{ -} - -/*! - Returns the sender object associated with this signal transition. -*/ -QObject *QSignalTransition::senderObject() const -{ - Q_D(const QSignalTransition); - return const_cast(d->sender); -} - -/*! - Sets the \a sender object associated with this signal transition. -*/ -void QSignalTransition::setSenderObject(const QObject *sender) -{ - Q_D(QSignalTransition); - if (sender == d->sender) - return; - d->unregister(); - d->sender = sender; - d->maybeRegister(); - emit senderObjectChanged(QPrivateSignal()); -} - -/*! - Returns the signal associated with this signal transition. -*/ -QByteArray QSignalTransition::signal() const -{ - Q_D(const QSignalTransition); - return d->signal; -} - -/*! - Sets the \a signal associated with this signal transition. -*/ -void QSignalTransition::setSignal(const QByteArray &signal) -{ - Q_D(QSignalTransition); - if (signal == d->signal) - return; - d->unregister(); - d->signal = signal; - d->maybeRegister(); - emit signalChanged(QPrivateSignal()); -} - -/*! - \reimp - - The default implementation returns \c true if the \a event is a - QStateMachine::SignalEvent object and the event's sender and signal index - match this transition, and returns \c false otherwise. -*/ -bool QSignalTransition::eventTest(QEvent *event) -{ - Q_D(const QSignalTransition); - if (event->type() == QEvent::StateMachineSignal) { - if (d->signalIndex == -1) - return false; - QStateMachine::SignalEvent *se = static_cast(event); - return (se->sender() == d->sender) - && (se->signalIndex() == d->signalIndex); - } - return false; -} - -/*! - \reimp -*/ -void QSignalTransition::onTransition(QEvent *event) -{ - Q_UNUSED(event); -} - -/*! - \reimp -*/ -bool QSignalTransition::event(QEvent *e) -{ - return QAbstractTransition::event(e); -} - -/*! - \fn QSignalTransition::senderObjectChanged() - \since 5.4 - - This signal is emitted when the senderObject property is changed. - - \sa QSignalTransition::senderObject -*/ - -/*! - \fn QSignalTransition::signalChanged() - \since 5.4 - - This signal is emitted when the signal property is changed. - - \sa QSignalTransition::signal -*/ - -void QSignalTransitionPrivate::callOnTransition(QEvent *e) -{ - Q_Q(QSignalTransition); - - if (e->type() == QEvent::StateMachineSignal) { - QStateMachine::SignalEvent *se = static_cast(e); - int savedSignalIndex = se->m_signalIndex; - se->m_signalIndex = originalSignalIndex; - q->onTransition(e); - se->m_signalIndex = savedSignalIndex; - } else { - q->onTransition(e); - } -} - - -QT_END_NAMESPACE - -#include "moc_qsignaltransition.cpp" diff --git a/src/corelib/statemachine/qsignaltransition.h b/src/corelib/statemachine/qsignaltransition.h deleted file mode 100644 index e785a18c738..00000000000 --- a/src/corelib/statemachine/qsignaltransition.h +++ /dev/null @@ -1,99 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSIGNALTRANSITION_H -#define QSIGNALTRANSITION_H - -#include -#include - -QT_REQUIRE_CONFIG(statemachine); - -QT_BEGIN_NAMESPACE - -class QSignalTransitionPrivate; -class Q_CORE_EXPORT QSignalTransition : public QAbstractTransition -{ - Q_OBJECT - Q_PROPERTY(QObject* senderObject READ senderObject WRITE setSenderObject NOTIFY senderObjectChanged) - Q_PROPERTY(QByteArray signal READ signal WRITE setSignal NOTIFY signalChanged) - -public: - QSignalTransition(QState *sourceState = nullptr); - QSignalTransition(const QObject *sender, const char *signal, - QState *sourceState = nullptr); -#ifdef Q_QDOC - template - QSignalTransition(const QObject *object, PointerToMemberFunction signal, - QState *sourceState = nullptr); -#elif defined(Q_COMPILER_DELEGATING_CONSTRUCTORS) - template - QSignalTransition(const typename QtPrivate::FunctionPointer::Object *obj, - Func sig, QState *srcState = nullptr) - : QSignalTransition(obj, QMetaMethod::fromSignal(sig).methodSignature().constData(), srcState) - { - } -#endif - - ~QSignalTransition(); - - QObject *senderObject() const; - void setSenderObject(const QObject *sender); - - QByteArray signal() const; - void setSignal(const QByteArray &signal); - -protected: - bool eventTest(QEvent *event) override; - void onTransition(QEvent *event) override; - - bool event(QEvent *e) override; - -Q_SIGNALS: - void senderObjectChanged(QPrivateSignal); - void signalChanged(QPrivateSignal); - -private: - Q_DISABLE_COPY(QSignalTransition) - Q_DECLARE_PRIVATE(QSignalTransition) -}; - -QT_END_NAMESPACE - -#endif diff --git a/src/corelib/statemachine/qsignaltransition_p.h b/src/corelib/statemachine/qsignaltransition_p.h deleted file mode 100644 index b3de3346770..00000000000 --- a/src/corelib/statemachine/qsignaltransition_p.h +++ /dev/null @@ -1,83 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSIGNALTRANSITION_P_H -#define QSIGNALTRANSITION_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include "private/qabstracttransition_p.h" - -QT_REQUIRE_CONFIG(statemachine); - -QT_BEGIN_NAMESPACE - -class QSignalTransition; -class QSignalTransitionPrivate : public QAbstractTransitionPrivate -{ - Q_DECLARE_PUBLIC(QSignalTransition) -public: - QSignalTransitionPrivate(); - - static QSignalTransitionPrivate *get(QSignalTransition *q) - { return q->d_func(); } - - void unregister(); - void maybeRegister(); - - void callOnTransition(QEvent *e) override; - - const QObject *sender; - QByteArray signal; - int signalIndex; - int originalSignalIndex; -}; - -QT_END_NAMESPACE - -#endif diff --git a/src/corelib/statemachine/qstate.cpp b/src/corelib/statemachine/qstate.cpp deleted file mode 100644 index dd92bfe7baa..00000000000 --- a/src/corelib/statemachine/qstate.cpp +++ /dev/null @@ -1,603 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qstate_p.h" -#include "qhistorystate.h" -#include "qhistorystate_p.h" -#include "qabstracttransition.h" -#include "qabstracttransition_p.h" -#include "qsignaltransition.h" -#include "qstatemachine.h" -#include "qstatemachine_p.h" - -QT_BEGIN_NAMESPACE - -/*! - \class QState - \inmodule QtCore - - \brief The QState class provides a general-purpose state for QStateMachine. - - \since 4.6 - \ingroup statemachine - - QState objects can have child states, and can have transitions to other - states. QState is part of \l{The State Machine Framework}. - - The addTransition() function adds a transition. The removeTransition() - function removes a transition. The transitions() function returns the - state's outgoing transitions. - - The assignProperty() function is used for defining property assignments that - should be performed when a state is entered. - - Top-level states must be passed a QStateMachine object as their parent - state, or added to a state machine using QStateMachine::addState(). - - \section1 States with Child States - - The childMode property determines how child states are treated. For - non-parallel state groups, the setInitialState() function must be called to - set the initial state. The child states are mutually exclusive states, and - the state machine needs to know which child state to enter when the parent - state is the target of a transition. - - The state emits the QState::finished() signal when a final child state - (QFinalState) is entered. - - The setErrorState() sets the state's error state. The error state is the - state that the state machine will transition to if an error is detected when - attempting to enter the state (e.g. because no initial state has been set). - -*/ - -/*! - \property QState::initialState - - \brief the initial state of this state (one of its child states) -*/ - -/*! - \property QState::errorState - - \brief the error state of this state -*/ - -/*! - \property QState::childMode - - \brief the child mode of this state - - The default value of this property is QState::ExclusiveStates. -*/ - -/*! - \enum QState::ChildMode - - This enum specifies how a state's child states are treated. - - \value ExclusiveStates The child states are mutually exclusive and an - initial state must be set by calling QState::setInitialState(). - - \value ParallelStates The child states are parallel. When the parent state - is entered, all its child states are entered in parallel. -*/ - -/*! - \enum QState::RestorePolicy - - This enum specifies the restore policy type. The restore policy - takes effect when the machine enters a state which sets one or more - properties. If the restore policy is set to RestoreProperties, - the state machine will save the original value of the property before the - new value is set. - - Later, when the machine either enters a state which does not set - a value for the given property, the property will automatically be restored - to its initial value. - - Only one initial value will be saved for any given property. If a value for a property has - already been saved by the state machine, it will not be overwritten until the property has been - successfully restored. - - \value DontRestoreProperties The state machine should not save the initial values of properties - and restore them later. - \value RestoreProperties The state machine should save the initial values of properties - and restore them later. - - \sa QStateMachine::globalRestorePolicy, QState::assignProperty() -*/ - -QStatePrivate::QStatePrivate() - : QAbstractStatePrivate(StandardState), - errorState(nullptr), initialState(nullptr), childMode(QState::ExclusiveStates), - childStatesListNeedsRefresh(true), transitionsListNeedsRefresh(true) -{ -} - -QStatePrivate::~QStatePrivate() -{ -} - -void QStatePrivate::emitFinished() -{ - Q_Q(QState); - emit q->finished(QState::QPrivateSignal()); -} - -void QStatePrivate::emitPropertiesAssigned() -{ - Q_Q(QState); - emit q->propertiesAssigned(QState::QPrivateSignal()); -} - -/*! - Constructs a new state with the given \a parent state. -*/ -QState::QState(QState *parent) - : QAbstractState(*new QStatePrivate, parent) -{ -} - -/*! - Constructs a new state with the given \a childMode and the given \a parent - state. -*/ -QState::QState(ChildMode childMode, QState *parent) - : QAbstractState(*new QStatePrivate, parent) -{ - Q_D(QState); - d->childMode = childMode; -} - -/*! - \internal -*/ -QState::QState(QStatePrivate &dd, QState *parent) - : QAbstractState(dd, parent) -{ -} - -/*! - Destroys this state. -*/ -QState::~QState() -{ -} - -QList QStatePrivate::childStates() const -{ - if (childStatesListNeedsRefresh) { - childStatesList.clear(); - QList::const_iterator it; - for (it = children.constBegin(); it != children.constEnd(); ++it) { - QAbstractState *s = qobject_cast(*it); - if (!s || qobject_cast(s)) - continue; - childStatesList.append(s); - } - childStatesListNeedsRefresh = false; - } - return childStatesList; -} - -QList QStatePrivate::historyStates() const -{ - QList result; - QList::const_iterator it; - for (it = children.constBegin(); it != children.constEnd(); ++it) { - QHistoryState *h = qobject_cast(*it); - if (h) - result.append(h); - } - return result; -} - -QList QStatePrivate::transitions() const -{ - if (transitionsListNeedsRefresh) { - transitionsList.clear(); - QList::const_iterator it; - for (it = children.constBegin(); it != children.constEnd(); ++it) { - QAbstractTransition *t = qobject_cast(*it); - if (t) - transitionsList.append(t); - } - transitionsListNeedsRefresh = false; - } - return transitionsList; -} - -#ifndef QT_NO_PROPERTIES - -/*! - Instructs this state to set the property with the given \a name of the given - \a object to the given \a value when the state is entered. - - \sa propertiesAssigned() -*/ -void QState::assignProperty(QObject *object, const char *name, - const QVariant &value) -{ - Q_D(QState); - if (!object) { - qWarning("QState::assignProperty: cannot assign property '%s' of null object", name); - return; - } - for (int i = 0; i < d->propertyAssignments.size(); ++i) { - QPropertyAssignment &assn = d->propertyAssignments[i]; - if (assn.hasTarget(object, name)) { - assn.value = value; - return; - } - } - d->propertyAssignments.append(QPropertyAssignment(object, name, value)); -} - -#endif // QT_NO_PROPERTIES - -/*! - Returns this state's error state. - - \sa QStateMachine::error() -*/ -QAbstractState *QState::errorState() const -{ - Q_D(const QState); - return d->errorState; -} - -/*! - Sets this state's error state to be the given \a state. If the error state - is not set, or if it is set to \nullptr, the state will inherit its parent's error - state recursively. If no error state is set for the state itself or any of - its ancestors, an error will cause the machine to stop executing and an error - will be printed to the console. -*/ -void QState::setErrorState(QAbstractState *state) -{ - Q_D(QState); - if (state != nullptr && qobject_cast(state)) { - qWarning("QStateMachine::setErrorState: root state cannot be error state"); - return; - } - if (state != nullptr && (!state->machine() || ((state->machine() != machine()) && !qobject_cast(this)))) { - qWarning("QState::setErrorState: error state cannot belong " - "to a different state machine"); - return; - } - - if (d->errorState != state) { - d->errorState = state; - emit errorStateChanged(QState::QPrivateSignal()); - } -} - -/*! - Adds the given \a transition. The transition has this state as the source. - This state takes ownership of the transition. -*/ -void QState::addTransition(QAbstractTransition *transition) -{ - Q_D(QState); - if (!transition) { - qWarning("QState::addTransition: cannot add null transition"); - return ; - } - - transition->setParent(this); - const QList> &targets = QAbstractTransitionPrivate::get(transition)->targetStates; - for (int i = 0; i < targets.size(); ++i) { - QAbstractState *t = targets.at(i).data(); - if (!t) { - qWarning("QState::addTransition: cannot add transition to null state"); - return ; - } - if ((QAbstractStatePrivate::get(t)->machine() != d->machine()) - && QAbstractStatePrivate::get(t)->machine() && d->machine()) { - qWarning("QState::addTransition: cannot add transition " - "to a state in a different state machine"); - return ; - } - } - if (QStateMachine *mach = machine()) - QStateMachinePrivate::get(mach)->maybeRegisterTransition(transition); -} - -/*! - \fn template QState::addTransition(const QObject *sender, PointerToMemberFunction signal, QAbstractState *target); - \since 5.5 - \overload - - Adds a transition associated with the given \a signal of the given \a sender - object, and returns the new QSignalTransition object. The transition has - this state as the source, and the given \a target as the target state. -*/ - -/*! - Adds a transition associated with the given \a signal of the given \a sender - object, and returns the new QSignalTransition object. The transition has - this state as the source, and the given \a target as the target state. -*/ -QSignalTransition *QState::addTransition(const QObject *sender, const char *signal, - QAbstractState *target) -{ - if (!sender) { - qWarning("QState::addTransition: sender cannot be null"); - return nullptr; - } - if (!signal) { - qWarning("QState::addTransition: signal cannot be null"); - return nullptr; - } - if (!target) { - qWarning("QState::addTransition: cannot add transition to null state"); - return nullptr; - } - int offset = (*signal == '0'+QSIGNAL_CODE) ? 1 : 0; - const QMetaObject *meta = sender->metaObject(); - if (meta->indexOfSignal(signal+offset) == -1) { - if (meta->indexOfSignal(QMetaObject::normalizedSignature(signal+offset)) == -1) { - qWarning("QState::addTransition: no such signal %s::%s", - meta->className(), signal+offset); - return nullptr; - } - } - QSignalTransition *trans = new QSignalTransition(sender, signal); - trans->setTargetState(target); - addTransition(trans); - return trans; -} - -namespace { - -// ### Make public? -class UnconditionalTransition : public QAbstractTransition -{ -public: - UnconditionalTransition(QAbstractState *target) - : QAbstractTransition() - { setTargetState(target); } -protected: - void onTransition(QEvent *) override {} - bool eventTest(QEvent *) override { return true; } -}; - -} // namespace - -/*! - Adds an unconditional transition from this state to the given \a target - state, and returns then new transition object. -*/ -QAbstractTransition *QState::addTransition(QAbstractState *target) -{ - if (!target) { - qWarning("QState::addTransition: cannot add transition to null state"); - return nullptr; - } - UnconditionalTransition *trans = new UnconditionalTransition(target); - addTransition(trans); - return trans; -} - -/*! - Removes the given \a transition from this state. The state releases - ownership of the transition. - - \sa addTransition() -*/ -void QState::removeTransition(QAbstractTransition *transition) -{ - Q_D(QState); - if (!transition) { - qWarning("QState::removeTransition: cannot remove null transition"); - return; - } - if (transition->sourceState() != this) { - qWarning("QState::removeTransition: transition %p's source state (%p)" - " is different from this state (%p)", - transition, transition->sourceState(), this); - return; - } - QStateMachinePrivate *mach = QStateMachinePrivate::get(d->machine()); - if (mach) - mach->unregisterTransition(transition); - transition->setParent(nullptr); -} - -/*! - \since 4.7 - - Returns this state's outgoing transitions (i.e. transitions where - this state is the \l{QAbstractTransition::sourceState()}{source - state}), or an empty list if this state has no outgoing transitions. - - \sa addTransition() -*/ -QList QState::transitions() const -{ - Q_D(const QState); - return d->transitions(); -} - -/*! - \reimp -*/ -void QState::onEntry(QEvent *event) -{ - Q_UNUSED(event); -} - -/*! - \reimp -*/ -void QState::onExit(QEvent *event) -{ - Q_UNUSED(event); -} - -/*! - Returns this state's initial state, or \nullptr if the state has no - initial state. -*/ -QAbstractState *QState::initialState() const -{ - Q_D(const QState); - return d->initialState; -} - -/*! - Sets this state's initial state to be the given \a state. - \a state has to be a child of this state. -*/ -void QState::setInitialState(QAbstractState *state) -{ - Q_D(QState); - if (d->childMode == QState::ParallelStates) { - qWarning("QState::setInitialState: ignoring attempt to set initial state " - "of parallel state group %p", this); - return; - } - if (state && (state->parentState() != this)) { - qWarning("QState::setInitialState: state %p is not a child of this state (%p)", - state, this); - return; - } - if (d->initialState != state) { - d->initialState = state; - emit initialStateChanged(QState::QPrivateSignal()); - } -} - -/*! - Returns the child mode of this state. -*/ -QState::ChildMode QState::childMode() const -{ - Q_D(const QState); - return d->childMode; -} - -/*! - Sets the child \a mode of this state. -*/ -void QState::setChildMode(ChildMode mode) -{ - Q_D(QState); - - if (mode == QState::ParallelStates && d->initialState) { - qWarning("QState::setChildMode: setting the child-mode of state %p to " - "parallel removes the initial state", this); - d->initialState = nullptr; - emit initialStateChanged(QState::QPrivateSignal()); - } - - if (d->childMode != mode) { - d->childMode = mode; - emit childModeChanged(QState::QPrivateSignal()); - } -} - -/*! - \reimp -*/ -bool QState::event(QEvent *e) -{ - Q_D(QState); - if ((e->type() == QEvent::ChildAdded) || (e->type() == QEvent::ChildRemoved)) { - d->childStatesListNeedsRefresh = true; - d->transitionsListNeedsRefresh = true; - if ((e->type() == QEvent::ChildRemoved) && (static_cast(e)->child() == d->initialState)) - d->initialState = nullptr; - } - return QAbstractState::event(e); -} - -/*! - \fn QState::finished() - - This signal is emitted when a final child state of this state is entered. - - \sa QFinalState -*/ - -/*! - \fn QState::propertiesAssigned() - - This signal is emitted when all properties have been assigned their final value. If the state - assigns a value to one or more properties for which an animation exists (either set on the - transition or as a default animation on the state machine), then the signal will not be emitted - until all such animations have finished playing. - - If there are no relevant animations, or no property assignments defined for the state, then - the signal will be emitted immediately before the state is entered. - - \sa QState::assignProperty(), QAbstractTransition::addAnimation() -*/ - -/*! - \fn QState::childModeChanged() - \since 5.4 - - This signal is emitted when the childMode property is changed. - - \sa QState::childMode -*/ - -/*! - \fn QState::initialStateChanged() - \since 5.4 - - This signal is emitted when the initialState property is changed. - - \sa QState::initialState -*/ - -/*! - \fn QState::errorStateChanged() - \since 5.4 - - This signal is emitted when the errorState property is changed. - - \sa QState::errorState -*/ - -QT_END_NAMESPACE - -#include "moc_qstate.cpp" diff --git a/src/corelib/statemachine/qstate.h b/src/corelib/statemachine/qstate.h deleted file mode 100644 index 9f1f07dfcc6..00000000000 --- a/src/corelib/statemachine/qstate.h +++ /dev/null @@ -1,134 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSTATE_H -#define QSTATE_H - -#include -#include -#include - -QT_REQUIRE_CONFIG(statemachine); - -QT_BEGIN_NAMESPACE - -class QAbstractTransition; -class QSignalTransition; - -class QStatePrivate; -class Q_CORE_EXPORT QState : public QAbstractState -{ - Q_OBJECT - Q_PROPERTY(QAbstractState* initialState READ initialState WRITE setInitialState NOTIFY initialStateChanged) - Q_PROPERTY(QAbstractState* errorState READ errorState WRITE setErrorState NOTIFY errorStateChanged) - Q_PROPERTY(ChildMode childMode READ childMode WRITE setChildMode NOTIFY childModeChanged) -public: - enum ChildMode { - ExclusiveStates, - ParallelStates - }; - Q_ENUM(ChildMode) - - enum RestorePolicy { - DontRestoreProperties, - RestoreProperties - }; - Q_ENUM(RestorePolicy) - - QState(QState *parent = nullptr); - QState(ChildMode childMode, QState *parent = nullptr); - ~QState(); - - QAbstractState *errorState() const; - void setErrorState(QAbstractState *state); - - void addTransition(QAbstractTransition *transition); - QSignalTransition *addTransition(const QObject *sender, const char *signal, QAbstractState *target); -#ifdef Q_QDOC - template - QSignalTransition *addTransition(const QObject *sender, PointerToMemberFunction signal, - QAbstractState *target); -#else - template - QSignalTransition *addTransition(const typename QtPrivate::FunctionPointer::Object *obj, - Func signal, QAbstractState *target) - { - const QMetaMethod signalMetaMethod = QMetaMethod::fromSignal(signal); - return addTransition(obj, signalMetaMethod.methodSignature().constData(), target); - } -#endif // Q_QDOC - QAbstractTransition *addTransition(QAbstractState *target); - void removeTransition(QAbstractTransition *transition); - QList transitions() const; - - QAbstractState *initialState() const; - void setInitialState(QAbstractState *state); - - ChildMode childMode() const; - void setChildMode(ChildMode mode); - -#ifndef QT_NO_PROPERTIES - void assignProperty(QObject *object, const char *name, - const QVariant &value); -#endif - -Q_SIGNALS: - void finished(QPrivateSignal); - void propertiesAssigned(QPrivateSignal); - void childModeChanged(QPrivateSignal); - void initialStateChanged(QPrivateSignal); - void errorStateChanged(QPrivateSignal); - -protected: - void onEntry(QEvent *event) override; - void onExit(QEvent *event) override; - - bool event(QEvent *e) override; - -protected: - QState(QStatePrivate &dd, QState *parent); - -private: - Q_DISABLE_COPY(QState) - Q_DECLARE_PRIVATE(QState) -}; - -QT_END_NAMESPACE - -#endif diff --git a/src/corelib/statemachine/qstate_p.h b/src/corelib/statemachine/qstate_p.h deleted file mode 100644 index 25393a04b43..00000000000 --- a/src/corelib/statemachine/qstate_p.h +++ /dev/null @@ -1,127 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSTATE_P_H -#define QSTATE_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include "qstate.h" -#include "private/qabstractstate_p.h" - -#include -#include -#include -#include - -QT_REQUIRE_CONFIG(statemachine); - -QT_BEGIN_NAMESPACE - -#ifndef QT_NO_PROPERTIES - -struct QPropertyAssignment -{ - QPropertyAssignment() - : object(nullptr), explicitlySet(true) {} - QPropertyAssignment(QObject *o, const QByteArray &n, - const QVariant &v, bool es = true) - : object(o), propertyName(n), value(v), explicitlySet(es) - {} - - bool objectDeleted() const { return !object; } - void write() const { Q_ASSERT(object != nullptr); object->setProperty(propertyName, value); } - bool hasTarget(QObject *o, const QByteArray &pn) const - { return object == o && propertyName == pn; } - - QPointer object; - QByteArray propertyName; - QVariant value; - bool explicitlySet; // false means the property is being restored to its old value -}; -Q_DECLARE_TYPEINFO(QPropertyAssignment, Q_MOVABLE_TYPE); - -#endif // QT_NO_PROPERTIES - -class QAbstractTransition; -class QHistoryState; - -class QState; -class Q_CORE_EXPORT QStatePrivate : public QAbstractStatePrivate -{ - Q_DECLARE_PUBLIC(QState) -public: - QStatePrivate(); - ~QStatePrivate(); - - static QStatePrivate *get(QState *q) { return q ? q->d_func() : nullptr; } - static const QStatePrivate *get(const QState *q) { return q? q->d_func() : nullptr; } - - QList childStates() const; - QList historyStates() const; - QList transitions() const; - - void emitFinished(); - void emitPropertiesAssigned(); - - QAbstractState *errorState; - QAbstractState *initialState; - QState::ChildMode childMode; - mutable bool childStatesListNeedsRefresh; - mutable bool transitionsListNeedsRefresh; - mutable QList childStatesList; - mutable QList transitionsList; - -#ifndef QT_NO_PROPERTIES - QList propertyAssignments; -#endif -}; - -QT_END_NAMESPACE - -#endif diff --git a/src/corelib/statemachine/qstatemachine.cpp b/src/corelib/statemachine/qstatemachine.cpp deleted file mode 100644 index 873892552f5..00000000000 --- a/src/corelib/statemachine/qstatemachine.cpp +++ /dev/null @@ -1,3208 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qstatemachine.h" -#include "qstate.h" -#include "qstate_p.h" -#include "qstatemachine_p.h" -#include "qabstracttransition.h" -#include "qabstracttransition_p.h" -#include "qsignaltransition.h" -#include "qsignaltransition_p.h" -#include "qsignaleventgenerator_p.h" -#include "qabstractstate.h" -#include "qabstractstate_p.h" -#include "qfinalstate.h" -#include "qhistorystate.h" -#include "qhistorystate_p.h" -#include "private/qobject_p.h" -#include "private/qthread_p.h" - -#if QT_CONFIG(qeventtransition) -#include "qeventtransition.h" -#include "qeventtransition_p.h" -#endif - -#if QT_CONFIG(animation) -#include "qpropertyanimation.h" -#include "qanimationgroup.h" -#include -#endif - -#include -#include - -#include - -QT_BEGIN_NAMESPACE - -/*! - \class QStateMachine - \inmodule QtCore - \reentrant - - \brief The QStateMachine class provides a hierarchical finite state machine. - - \since 4.6 - \ingroup statemachine - - QStateMachine is based on the concepts and notation of - \l{http://www.wisdom.weizmann.ac.il/~dharel/SCANNED.PAPERS/Statecharts.pdf}{Statecharts}. - QStateMachine is part of \l{The State Machine Framework}. - - A state machine manages a set of states (classes that inherit from - QAbstractState) and transitions (descendants of - QAbstractTransition) between those states; these states and - transitions define a state graph. Once a state graph has been - built, the state machine can execute it. QStateMachine's - execution algorithm is based on the \l{http://www.w3.org/TR/scxml/}{State Chart XML (SCXML)} - algorithm. The framework's \l{The State Machine - Framework}{overview} gives several state graphs and the code to - build them. - - Use the addState() function to add a top-level state to the state machine. - States are removed with the removeState() function. Removing states while - the machine is running is discouraged. - - Before the machine can be started, the \l{initialState}{initial - state} must be set. The initial state is the state that the - machine enters when started. You can then start() the state - machine. The started() signal is emitted when the initial state is - entered. - - The machine is event driven and keeps its own event loop. Events - are posted to the machine through postEvent(). Note that this - means that it executes asynchronously, and that it will not - progress without a running event loop. You will normally not have - to post events to the machine directly as Qt's transitions, e.g., - QEventTransition and its subclasses, handle this. But for custom - transitions triggered by events, postEvent() is useful. - - The state machine processes events and takes transitions until a - top-level final state is entered; the state machine then emits the - finished() signal. You can also stop() the state machine - explicitly. The stopped() signal is emitted in this case. - - The following snippet shows a state machine that will finish when a button - is clicked: - - \snippet code/src_corelib_statemachine_qstatemachine.cpp simple state machine - - This code example uses QState, which inherits QAbstractState. The - QState class provides a state that you can use to set properties - and invoke methods on \l{QObject}s when the state is entered or - exited. It also contains convenience functions for adding - transitions, e.g., \l{QSignalTransition}s as in this example. See - the QState class description for further details. - - If an error is encountered, the machine will look for an - \l{errorState}{error state}, and if one is available, it will - enter this state. The types of errors possible are described by the - \l{QStateMachine::}{Error} enum. After the error state is entered, - the type of the error can be retrieved with error(). The execution - of the state graph will not stop when the error state is entered. If - no error state applies to the erroneous state, the machine will stop - executing and an error message will be printed to the console. - - \note Important: setting the \l{ChildMode} of a state machine to parallel (\l{ParallelStates}) - results in an invalid state machine. It can only be set to (or kept as) - \l{ExclusiveStates}. - - \sa QAbstractState, QAbstractTransition, QState, {The State Machine Framework} -*/ - -/*! - \property QStateMachine::errorString - - \brief the error string of this state machine -*/ - -/*! - \property QStateMachine::globalRestorePolicy - - \brief the restore policy for states of this state machine. - - The default value of this property is - QState::DontRestoreProperties. -*/ - -/*! - \property QStateMachine::running - \since 5.4 - - \brief the running state of this state machine - - \sa start(), stop(), started(), stopped(), runningChanged() -*/ - -#if QT_CONFIG(animation) -/*! - \property QStateMachine::animated - - \brief whether animations are enabled - - The default value of this property is \c true. - - \sa QAbstractTransition::addAnimation() -*/ -#endif - -// #define QSTATEMACHINE_DEBUG -// #define QSTATEMACHINE_RESTORE_PROPERTIES_DEBUG - -struct CalculationCache { - struct TransitionInfo { - QList effectiveTargetStates; - QSet exitSet; - QAbstractState *transitionDomain; - - bool effectiveTargetStatesIsKnown: 1; - bool exitSetIsKnown : 1; - bool transitionDomainIsKnown : 1; - - TransitionInfo() - : transitionDomain(nullptr) - , effectiveTargetStatesIsKnown(false) - , exitSetIsKnown(false) - , transitionDomainIsKnown(false) - {} - }; - - typedef QHash TransitionInfoCache; - TransitionInfoCache cache; - - bool effectiveTargetStates(QAbstractTransition *t, QList *targets) const - { - Q_ASSERT(targets); - - TransitionInfoCache::const_iterator cacheIt = cache.find(t); - if (cacheIt == cache.end() || !cacheIt->effectiveTargetStatesIsKnown) - return false; - - *targets = cacheIt->effectiveTargetStates; - return true; - } - - void insert(QAbstractTransition *t, const QList &targets) - { - TransitionInfoCache::iterator cacheIt = cache.find(t); - TransitionInfo &ti = cacheIt == cache.end() - ? *cache.insert(t, TransitionInfo()) - : *cacheIt; - - Q_ASSERT(!ti.effectiveTargetStatesIsKnown); - ti.effectiveTargetStates = targets; - ti.effectiveTargetStatesIsKnown = true; - } - - bool exitSet(QAbstractTransition *t, QSet *exits) const - { - Q_ASSERT(exits); - - TransitionInfoCache::const_iterator cacheIt = cache.find(t); - if (cacheIt == cache.end() || !cacheIt->exitSetIsKnown) - return false; - - *exits = cacheIt->exitSet; - return true; - } - - void insert(QAbstractTransition *t, const QSet &exits) - { - TransitionInfoCache::iterator cacheIt = cache.find(t); - TransitionInfo &ti = cacheIt == cache.end() - ? *cache.insert(t, TransitionInfo()) - : *cacheIt; - - Q_ASSERT(!ti.exitSetIsKnown); - ti.exitSet = exits; - ti.exitSetIsKnown = true; - } - - bool transitionDomain(QAbstractTransition *t, QAbstractState **domain) const - { - Q_ASSERT(domain); - - TransitionInfoCache::const_iterator cacheIt = cache.find(t); - if (cacheIt == cache.end() || !cacheIt->transitionDomainIsKnown) - return false; - - *domain = cacheIt->transitionDomain; - return true; - } - - void insert(QAbstractTransition *t, QAbstractState *domain) - { - TransitionInfoCache::iterator cacheIt = cache.find(t); - TransitionInfo &ti = cacheIt == cache.end() - ? *cache.insert(t, TransitionInfo()) - : *cacheIt; - - Q_ASSERT(!ti.transitionDomainIsKnown); - ti.transitionDomain = domain; - ti.transitionDomainIsKnown = true; - } -}; - -/* The function as described in http://www.w3.org/TR/2014/WD-scxml-20140529/ : - -function isDescendant(state1, state2) - -Returns 'true' if state1 is a descendant of state2 (a child, or a child of a child, or a child of a -child of a child, etc.) Otherwise returns 'false'. -*/ -static inline bool isDescendant(const QAbstractState *state1, const QAbstractState *state2) -{ - Q_ASSERT(state1 != nullptr); - - for (QAbstractState *it = state1->parentState(); it != nullptr; it = it->parentState()) { - if (it == state2) - return true; - } - - return false; -} - -static bool containsDecendantOf(const QSet &states, const QAbstractState *node) -{ - for (QAbstractState *s : states) - if (isDescendant(s, node)) - return true; - - return false; -} - -static int descendantDepth(const QAbstractState *state, const QAbstractState *ancestor) -{ - int depth = 0; - for (const QAbstractState *it = state; it != nullptr; it = it->parentState()) { - if (it == ancestor) - break; - ++depth; - } - return depth; -} - -/* The function as described in http://www.w3.org/TR/2014/WD-scxml-20140529/ : - -function getProperAncestors(state1, state2) - -If state2 is null, returns the set of all ancestors of state1 in ancestry order (state1's parent -followed by the parent's parent, etc. up to an including the element). If state2 is -non-null, returns in ancestry order the set of all ancestors of state1, up to but not including -state2. (A "proper ancestor" of a state is its parent, or the parent's parent, or the parent's -parent's parent, etc.))If state2 is state1's parent, or equal to state1, or a descendant of state1, -this returns the empty set. -*/ -static QList getProperAncestors(const QAbstractState *state, const QAbstractState *upperBound) -{ - Q_ASSERT(state != nullptr); - QList result; - result.reserve(16); - for (QState *it = state->parentState(); it && it != upperBound; it = it->parentState()) { - result.append(it); - } - return result; -} - -/* The function as described in http://www.w3.org/TR/2014/WD-scxml-20140529/ : - -function getEffectiveTargetStates(transition) - -Returns the states that will be the target when 'transition' is taken, dereferencing any history states. - -function getEffectiveTargetStates(transition) - targets = new OrderedSet() - for s in transition.target - if isHistoryState(s): - if historyValue[s.id]: - targets.union(historyValue[s.id]) - else: - targets.union(getEffectiveTargetStates(s.transition)) - else: - targets.add(s) - return targets -*/ -static QList getEffectiveTargetStates(QAbstractTransition *transition, CalculationCache *cache) -{ - Q_ASSERT(cache); - - QList targetsList; - if (cache->effectiveTargetStates(transition, &targetsList)) - return targetsList; - - QSet targets; - const auto targetStates = transition->targetStates(); - for (QAbstractState *s : targetStates) { - if (QHistoryState *historyState = QStateMachinePrivate::toHistoryState(s)) { - QList historyConfiguration = QHistoryStatePrivate::get(historyState)->configuration; - if (!historyConfiguration.isEmpty()) { - // There is a saved history, so apply that. - targets.unite(QSet(historyConfiguration.constBegin(), historyConfiguration.constEnd())); - } else if (QAbstractTransition *defaultTransition = historyState->defaultTransition()) { - // No saved history, take all default transition targets. - const auto &targetStates = defaultTransition->targetStates(); - targets.unite(QSet(targetStates.constBegin(), targetStates.constEnd())); - } else { - // Woops, we found a history state without a default state. That's not valid! - QStateMachinePrivate *m = QStateMachinePrivate::get(historyState->machine()); - m->setError(QStateMachine::NoDefaultStateInHistoryStateError, historyState); - } - } else { - targets.insert(s); - } - } - - targetsList = targets.values(); - cache->insert(transition, targetsList); - return targetsList; -} - -QStateMachinePrivate::QStateMachinePrivate() -{ - isMachine = true; - - state = NotRunning; - processing = false; - processingScheduled = false; - stop = false; - stopProcessingReason = EventQueueEmpty; - error = QStateMachine::NoError; - globalRestorePolicy = QState::DontRestoreProperties; - signalEventGenerator = nullptr; -#if QT_CONFIG(animation) - animated = true; -#endif -} - -QStateMachinePrivate::~QStateMachinePrivate() -{ - qDeleteAll(internalEventQueue); - qDeleteAll(externalEventQueue); - - for (QHash::const_iterator it = delayedEvents.cbegin(), eit = delayedEvents.cend(); it != eit; ++it) { - delete it.value().event; - } -} - -QState *QStateMachinePrivate::rootState() const -{ - return const_cast(q_func()); -} - -static QEvent *cloneEvent(QEvent *e) -{ - switch (e->type()) { - case QEvent::None: - return new QEvent(*e); - case QEvent::Timer: - return new QTimerEvent(*static_cast(e)); - default: - Q_ASSERT_X(false, "cloneEvent()", "not implemented"); - break; - } - return nullptr; -} - -const QStateMachinePrivate::Handler qt_kernel_statemachine_handler = { - cloneEvent -}; - -const QStateMachinePrivate::Handler *QStateMachinePrivate::handler = &qt_kernel_statemachine_handler; - -Q_CORE_EXPORT const QStateMachinePrivate::Handler *qcoreStateMachineHandler() -{ - return &qt_kernel_statemachine_handler; -} - -static int indexOfDescendant(QState *s, QAbstractState *desc) -{ - QList childStates = QStatePrivate::get(s)->childStates(); - for (int i = 0; i < childStates.size(); ++i) { - QAbstractState *c = childStates.at(i); - if ((c == desc) || isDescendant(desc, c)) { - return i; - } - } - return -1; -} - -bool QStateMachinePrivate::transitionStateEntryLessThan(QAbstractTransition *t1, QAbstractTransition *t2) -{ - QState *s1 = t1->sourceState(), *s2 = t2->sourceState(); - if (s1 == s2) { - QList transitions = QStatePrivate::get(s1)->transitions(); - return transitions.indexOf(t1) < transitions.indexOf(t2); - } else if (isDescendant(s1, s2)) { - return true; - } else if (isDescendant(s2, s1)) { - return false; - } else { - Q_ASSERT(s1->machine() != nullptr); - QStateMachinePrivate *mach = QStateMachinePrivate::get(s1->machine()); - QState *lca = mach->findLCA(QList() << s1 << s2); - Q_ASSERT(lca != nullptr); - int s1Depth = descendantDepth(s1, lca); - int s2Depth = descendantDepth(s2, lca); - if (s1Depth == s2Depth) - return (indexOfDescendant(lca, s1) < indexOfDescendant(lca, s2)); - else - return s1Depth > s2Depth; - } -} - -bool QStateMachinePrivate::stateEntryLessThan(QAbstractState *s1, QAbstractState *s2) -{ - if (s1->parent() == s2->parent()) { - return s1->parent()->children().indexOf(s1) - < s2->parent()->children().indexOf(s2); - } else if (isDescendant(s1, s2)) { - return false; - } else if (isDescendant(s2, s1)) { - return true; - } else { - Q_ASSERT(s1->machine() != nullptr); - QStateMachinePrivate *mach = QStateMachinePrivate::get(s1->machine()); - QState *lca = mach->findLCA(QList() << s1 << s2); - Q_ASSERT(lca != nullptr); - return (indexOfDescendant(lca, s1) < indexOfDescendant(lca, s2)); - } -} - -bool QStateMachinePrivate::stateExitLessThan(QAbstractState *s1, QAbstractState *s2) -{ - if (s1->parent() == s2->parent()) { - return s2->parent()->children().indexOf(s2) - < s1->parent()->children().indexOf(s1); - } else if (isDescendant(s1, s2)) { - return true; - } else if (isDescendant(s2, s1)) { - return false; - } else { - Q_ASSERT(s1->machine() != nullptr); - QStateMachinePrivate *mach = QStateMachinePrivate::get(s1->machine()); - QState *lca = mach->findLCA(QList() << s1 << s2); - Q_ASSERT(lca != nullptr); - return (indexOfDescendant(lca, s2) < indexOfDescendant(lca, s1)); - } -} - -QState *QStateMachinePrivate::findLCA(const QList &states, bool onlyCompound) -{ - if (states.isEmpty()) - return nullptr; - QList ancestors = getProperAncestors(states.at(0), rootState()->parentState()); - for (int i = 0; i < ancestors.size(); ++i) { - QState *anc = ancestors.at(i); - if (onlyCompound && !isCompound(anc)) - continue; - - bool ok = true; - for (int j = states.size() - 1; (j > 0) && ok; --j) { - const QAbstractState *s = states.at(j); - if (!isDescendant(s, anc)) - ok = false; - } - if (ok) - return anc; - } - - // Oops, this should never happen! The state machine itself is a common ancestor of all states, - // no matter what. But, for the onlyCompound case: we probably have a state machine whose - // childMode is set to parallel, which is illegal. However, we're stuck with it (and with - // exposing this invalid/dangerous API to users), so recover in the least horrible way. - setError(QStateMachine::StateMachineChildModeSetToParallelError, q_func()); - return q_func(); // make the statemachine the LCA/LCCA (which it should have been anyway) -} - -QState *QStateMachinePrivate::findLCCA(const QList &states) -{ - return findLCA(states, true); -} - -QList QStateMachinePrivate::selectTransitions(QEvent *event, CalculationCache *cache) -{ - Q_ASSERT(cache); - Q_Q(const QStateMachine); - - QVarLengthArray configuration_sorted; - for (QAbstractState *s : qAsConst(configuration)) { - if (isAtomic(s)) - configuration_sorted.append(s); - } - std::sort(configuration_sorted.begin(), configuration_sorted.end(), stateEntryLessThan); - - QList enabledTransitions; - const_cast(q)->beginSelectTransitions(event); - for (QAbstractState *state : qAsConst(configuration_sorted)) { - QList lst = getProperAncestors(state, nullptr); - if (QState *grp = toStandardState(state)) - lst.prepend(grp); - bool found = false; - for (int j = 0; (j < lst.size()) && !found; ++j) { - QState *s = lst.at(j); - QList transitions = QStatePrivate::get(s)->transitions(); - for (int k = 0; k < transitions.size(); ++k) { - QAbstractTransition *t = transitions.at(k); - if (QAbstractTransitionPrivate::get(t)->callEventTest(event)) { -#ifdef QSTATEMACHINE_DEBUG - qDebug() << q << ": selecting transition" << t; -#endif - enabledTransitions.append(t); - found = true; - break; - } - } - } - } - - if (!enabledTransitions.isEmpty()) { - removeConflictingTransitions(enabledTransitions, cache); -#ifdef QSTATEMACHINE_DEBUG - qDebug() << q << ": enabled transitions after removing conflicts:" << enabledTransitions; -#endif - } - const_cast(q)->endSelectTransitions(event); - return enabledTransitions; -} - -/* The function as described in http://www.w3.org/TR/2014/WD-scxml-20140529/ : - -function removeConflictingTransitions(enabledTransitions): - filteredTransitions = new OrderedSet() - // toList sorts the transitions in the order of the states that selected them - for t1 in enabledTransitions.toList(): - t1Preempted = false; - transitionsToRemove = new OrderedSet() - for t2 in filteredTransitions.toList(): - if computeExitSet([t1]).hasIntersection(computeExitSet([t2])): - if isDescendant(t1.source, t2.source): - transitionsToRemove.add(t2) - else: - t1Preempted = true - break - if not t1Preempted: - for t3 in transitionsToRemove.toList(): - filteredTransitions.delete(t3) - filteredTransitions.add(t1) - - return filteredTransitions - -Note: the implementation below does not build the transitionsToRemove, but removes them in-place. -*/ -void QStateMachinePrivate::removeConflictingTransitions(QList &enabledTransitions, CalculationCache *cache) -{ - Q_ASSERT(cache); - - if (enabledTransitions.size() < 2) - return; // There is no transition to conflict with. - - QList filteredTransitions; - filteredTransitions.reserve(enabledTransitions.size()); - std::sort(enabledTransitions.begin(), enabledTransitions.end(), transitionStateEntryLessThan); - - for (QAbstractTransition *t1 : qAsConst(enabledTransitions)) { - bool t1Preempted = false; - const QSet exitSetT1 = computeExitSet_Unordered(t1, cache); - QList::iterator t2It = filteredTransitions.begin(); - while (t2It != filteredTransitions.end()) { - QAbstractTransition *t2 = *t2It; - if (t1 == t2) { - // Special case: someone added the same transition object to a state twice. In this - // case, t2 (which is already in the list) "preempts" t1. - t1Preempted = true; - break; - } - - QSet exitSetT2 = computeExitSet_Unordered(t2, cache); - if (!exitSetT1.intersects(exitSetT2)) { - // No conflict, no cry. Next patient please. - ++t2It; - } else { - // Houston, we have a conflict. Check which transition can be removed. - if (isDescendant(t1->sourceState(), t2->sourceState())) { - // t1 preempts t2, so we can remove t2 - t2It = filteredTransitions.erase(t2It); - } else { - // t2 preempts t1, so there's no use in looking further and we don't need to add - // t1 to the list. - t1Preempted = true; - break; - } - } - } - if (!t1Preempted) - filteredTransitions.append(t1); - } - - enabledTransitions = filteredTransitions; -} - -void QStateMachinePrivate::microstep(QEvent *event, const QList &enabledTransitions, - CalculationCache *cache) -{ - Q_ASSERT(cache); - -#ifdef QSTATEMACHINE_DEBUG - qDebug() << q_func() << ": begin microstep( enabledTransitions:" << enabledTransitions << ')'; - qDebug() << q_func() << ": configuration before exiting states:" << configuration; -#endif - QList exitedStates = computeExitSet(enabledTransitions, cache); - QHash pendingRestorables = computePendingRestorables(exitedStates); - - QSet statesForDefaultEntry; - QList enteredStates = computeEntrySet(enabledTransitions, statesForDefaultEntry, cache); - -#ifdef QSTATEMACHINE_DEBUG - qDebug() << q_func() << ": computed exit set:" << exitedStates; - qDebug() << q_func() << ": computed entry set:" << enteredStates; -#endif - - QHash> assignmentsForEnteredStates = - computePropertyAssignments(enteredStates, pendingRestorables); - if (!pendingRestorables.isEmpty()) { - // Add "implicit" assignments for restored properties to the first - // (outermost) entered state - Q_ASSERT(!enteredStates.isEmpty()); - QAbstractState *s = enteredStates.constFirst(); - assignmentsForEnteredStates[s] << restorablesToPropertyList(pendingRestorables); - } - - exitStates(event, exitedStates, assignmentsForEnteredStates); -#ifdef QSTATEMACHINE_DEBUG - qDebug() << q_func() << ": configuration after exiting states:" << configuration; -#endif - - executeTransitionContent(event, enabledTransitions); - -#if QT_CONFIG(animation) - QList selectedAnimations = selectAnimations(enabledTransitions); -#endif - - enterStates(event, exitedStates, enteredStates, statesForDefaultEntry, assignmentsForEnteredStates -#if QT_CONFIG(animation) - , selectedAnimations -#endif - ); -#ifdef QSTATEMACHINE_DEBUG - qDebug() << q_func() << ": configuration after entering states:" << configuration; - qDebug() << q_func() << ": end microstep"; -#endif -} - -/* The function as described in http://www.w3.org/TR/2014/WD-scxml-20140529/ : - -procedure computeExitSet(enabledTransitions) - -For each transition t in enabledTransitions, if t is targetless then do nothing, else compute the -transition's domain. (This will be the source state in the case of internal transitions) or the -least common compound ancestor state of the source state and target states of t (in the case of -external transitions. Add to the statesToExit set all states in the configuration that are -descendants of the domain. - -function computeExitSet(transitions) - statesToExit = new OrderedSet - for t in transitions: - if (t.target): - domain = getTransitionDomain(t) - for s in configuration: - if isDescendant(s,domain): - statesToExit.add(s) - return statesToExit -*/ -QList QStateMachinePrivate::computeExitSet(const QList &enabledTransitions, - CalculationCache *cache) -{ - Q_ASSERT(cache); - - QList statesToExit_sorted = computeExitSet_Unordered(enabledTransitions, cache).values(); - std::sort(statesToExit_sorted.begin(), statesToExit_sorted.end(), stateExitLessThan); - return statesToExit_sorted; -} - -QSet QStateMachinePrivate::computeExitSet_Unordered(const QList &enabledTransitions, - CalculationCache *cache) -{ - Q_ASSERT(cache); - - QSet statesToExit; - for (QAbstractTransition *t : enabledTransitions) - statesToExit.unite(computeExitSet_Unordered(t, cache)); - return statesToExit; -} - -QSet QStateMachinePrivate::computeExitSet_Unordered(QAbstractTransition *t, - CalculationCache *cache) -{ - Q_ASSERT(cache); - - QSet statesToExit; - if (cache->exitSet(t, &statesToExit)) - return statesToExit; - - QList effectiveTargetStates = getEffectiveTargetStates(t, cache); - QAbstractState *domain = getTransitionDomain(t, effectiveTargetStates, cache); - if (domain == nullptr && !t->targetStates().isEmpty()) { - // So we didn't find the least common ancestor for the source and target states of the - // transition. If there were not target states, that would be fine: then the transition - // will fire any events or signals, but not exit the state. - // - // However, there are target states, so it's either a node without a parent (or parent's - // parent, etc), or the state belongs to a different state machine. Either way, this - // makes the state machine invalid. - if (error == QStateMachine::NoError) - setError(QStateMachine::NoCommonAncestorForTransitionError, t->sourceState()); - QList lst = pendingErrorStates.values(); - lst.prepend(t->sourceState()); - - domain = findLCCA(lst); - Q_ASSERT(domain != nullptr); - } - - for (QAbstractState* s : qAsConst(configuration)) { - if (isDescendant(s, domain)) - statesToExit.insert(s); - } - - cache->insert(t, statesToExit); - return statesToExit; -} - -void QStateMachinePrivate::exitStates(QEvent *event, const QList &statesToExit_sorted, - const QHash> &assignmentsForEnteredStates) -{ - for (int i = 0; i < statesToExit_sorted.size(); ++i) { - QAbstractState *s = statesToExit_sorted.at(i); - if (QState *grp = toStandardState(s)) { - QList hlst = QStatePrivate::get(grp)->historyStates(); - for (int j = 0; j < hlst.size(); ++j) { - QHistoryState *h = hlst.at(j); - QHistoryStatePrivate::get(h)->configuration.clear(); - QSet::const_iterator it; - for (it = configuration.constBegin(); it != configuration.constEnd(); ++it) { - QAbstractState *s0 = *it; - if (QHistoryStatePrivate::get(h)->historyType == QHistoryState::DeepHistory) { - if (isAtomic(s0) && isDescendant(s0, s)) - QHistoryStatePrivate::get(h)->configuration.append(s0); - } else if (s0->parentState() == s) { - QHistoryStatePrivate::get(h)->configuration.append(s0); - } - } -#ifdef QSTATEMACHINE_DEBUG - qDebug() << q_func() << ": recorded" << ((QHistoryStatePrivate::get(h)->historyType == QHistoryState::DeepHistory) ? "deep" : "shallow") - << "history for" << s << "in" << h << ':' << QHistoryStatePrivate::get(h)->configuration; -#endif - } - } - } - for (int i = 0; i < statesToExit_sorted.size(); ++i) { - QAbstractState *s = statesToExit_sorted.at(i); -#ifdef QSTATEMACHINE_DEBUG - qDebug() << q_func() << ": exiting" << s; -#endif - QAbstractStatePrivate::get(s)->callOnExit(event); - -#if QT_CONFIG(animation) - terminateActiveAnimations(s, assignmentsForEnteredStates); -#else - Q_UNUSED(assignmentsForEnteredStates); -#endif - - configuration.remove(s); - QAbstractStatePrivate::get(s)->emitExited(); - } -} - -void QStateMachinePrivate::executeTransitionContent(QEvent *event, const QList &enabledTransitions) -{ - for (int i = 0; i < enabledTransitions.size(); ++i) { - QAbstractTransition *t = enabledTransitions.at(i); -#ifdef QSTATEMACHINE_DEBUG - qDebug() << q_func() << ": triggering" << t; -#endif - QAbstractTransitionPrivate::get(t)->callOnTransition(event); - QAbstractTransitionPrivate::get(t)->emitTriggered(); - } -} - -QList QStateMachinePrivate::computeEntrySet(const QList &enabledTransitions, - QSet &statesForDefaultEntry, - CalculationCache *cache) -{ - Q_ASSERT(cache); - - QSet statesToEnter; - if (pendingErrorStates.isEmpty()) { - for (QAbstractTransition *t : enabledTransitions) { - const auto targetStates = t->targetStates(); - for (QAbstractState *s : targetStates) - addDescendantStatesToEnter(s, statesToEnter, statesForDefaultEntry); - - const QList effectiveTargetStates = getEffectiveTargetStates(t, cache); - QAbstractState *ancestor = getTransitionDomain(t, effectiveTargetStates, cache); - for (QAbstractState *s : effectiveTargetStates) - addAncestorStatesToEnter(s, ancestor, statesToEnter, statesForDefaultEntry); - } - } - - // Did an error occur while selecting transitions? Then we enter the error state. - if (!pendingErrorStates.isEmpty()) { - statesToEnter.clear(); - statesToEnter = pendingErrorStates; - statesForDefaultEntry = pendingErrorStatesForDefaultEntry; - pendingErrorStates.clear(); - pendingErrorStatesForDefaultEntry.clear(); - } - - QList statesToEnter_sorted = statesToEnter.values(); - std::sort(statesToEnter_sorted.begin(), statesToEnter_sorted.end(), stateEntryLessThan); - return statesToEnter_sorted; -} - -/* The algorithm as described in http://www.w3.org/TR/2014/WD-scxml-20140529/ : - -function getTransitionDomain(transition) - -Return the compound state such that 1) all states that are exited or entered as a result of taking -'transition' are descendants of it 2) no descendant of it has this property. - -function getTransitionDomain(t) - tstates = getEffectiveTargetStates(t) - if not tstates: - return null - elif t.type == "internal" and isCompoundState(t.source) and tstates.every(lambda s: isDescendant(s,t.source)): - return t.source - else: - return findLCCA([t.source].append(tstates)) -*/ -QAbstractState *QStateMachinePrivate::getTransitionDomain(QAbstractTransition *t, - const QList &effectiveTargetStates, - CalculationCache *cache) -{ - Q_ASSERT(cache); - - if (effectiveTargetStates.isEmpty()) - return nullptr; - - QAbstractState *domain = nullptr; - if (cache->transitionDomain(t, &domain)) - return domain; - - if (t->transitionType() == QAbstractTransition::InternalTransition) { - if (QState *tSource = t->sourceState()) { - if (isCompound(tSource)) { - bool allDescendants = true; - for (QAbstractState *s : effectiveTargetStates) { - if (!isDescendant(s, tSource)) { - allDescendants = false; - break; - } - } - - if (allDescendants) - return tSource; - } - } - } - - QList states(effectiveTargetStates); - if (QAbstractState *src = t->sourceState()) - states.prepend(src); - domain = findLCCA(states); - cache->insert(t, domain); - return domain; -} - -void QStateMachinePrivate::enterStates(QEvent *event, const QList &exitedStates_sorted, - const QList &statesToEnter_sorted, - const QSet &statesForDefaultEntry, - QHash> &propertyAssignmentsForState -#if QT_CONFIG(animation) - , const QList &selectedAnimations -#endif - ) -{ -#ifdef QSTATEMACHINE_DEBUG - Q_Q(QStateMachine); -#endif - for (int i = 0; i < statesToEnter_sorted.size(); ++i) { - QAbstractState *s = statesToEnter_sorted.at(i); -#ifdef QSTATEMACHINE_DEBUG - qDebug() << q << ": entering" << s; -#endif - configuration.insert(s); - registerTransitions(s); - -#if QT_CONFIG(animation) - initializeAnimations(s, selectedAnimations, exitedStates_sorted, propertyAssignmentsForState); -#endif - - // Immediately set the properties that are not animated. - { - const auto assignments = propertyAssignmentsForState.value(s); - for (const auto &assn : assignments) { - if (globalRestorePolicy == QState::RestoreProperties) { - if (assn.explicitlySet) { - if (!hasRestorable(s, assn.object, assn.propertyName)) { - QVariant value = savedValueForRestorable(exitedStates_sorted, assn.object, assn.propertyName); - unregisterRestorables(exitedStates_sorted, assn.object, assn.propertyName); - registerRestorable(s, assn.object, assn.propertyName, value); - } - } else { - // The property is being restored, hence no need to - // save the current value. Discard any saved values in - // exited states, since those are now stale. - unregisterRestorables(exitedStates_sorted, assn.object, assn.propertyName); - } - } - assn.write(); - } - } - - QAbstractStatePrivate::get(s)->callOnEntry(event); - QAbstractStatePrivate::get(s)->emitEntered(); - - // FIXME: - // See the "initial transitions" comment in addDescendantStatesToEnter first, then implement: -// if (statesForDefaultEntry.contains(s)) { -// // ### executeContent(s.initial.transition.children()) -// } - Q_UNUSED(statesForDefaultEntry); - - if (QHistoryState *h = toHistoryState(s)) - QAbstractTransitionPrivate::get(h->defaultTransition())->callOnTransition(event); - - // Emit propertiesAssigned signal if the state has no animated properties. - { - QState *ss = toStandardState(s); - if (ss - #if QT_CONFIG(animation) - && !animationsForState.contains(s) - #endif - ) - QStatePrivate::get(ss)->emitPropertiesAssigned(); - } - - if (isFinal(s)) { - QState *parent = s->parentState(); - if (parent) { - if (parent != rootState()) { - QFinalState *finalState = qobject_cast(s); - Q_ASSERT(finalState); - emitStateFinished(parent, finalState); - } - QState *grandparent = parent->parentState(); - if (grandparent && isParallel(grandparent)) { - bool allChildStatesFinal = true; - QList childStates = QStatePrivate::get(grandparent)->childStates(); - for (int j = 0; j < childStates.size(); ++j) { - QAbstractState *cs = childStates.at(j); - if (!isInFinalState(cs)) { - allChildStatesFinal = false; - break; - } - } - if (allChildStatesFinal && (grandparent != rootState())) { - QFinalState *finalState = qobject_cast(s); - Q_ASSERT(finalState); - emitStateFinished(grandparent, finalState); - } - } - } - } - } - { - QSet::const_iterator it; - for (it = configuration.constBegin(); it != configuration.constEnd(); ++it) { - if (isFinal(*it)) { - QState *parent = (*it)->parentState(); - if (((parent == rootState()) - && (rootState()->childMode() == QState::ExclusiveStates)) - || ((parent->parentState() == rootState()) - && (rootState()->childMode() == QState::ParallelStates) - && isInFinalState(rootState()))) { - processing = false; - stopProcessingReason = Finished; - break; - } - } - } - } -// qDebug() << "configuration:" << configuration.toList(); -} - -/* The algorithm as described in http://www.w3.org/TR/2014/WD-scxml-20140529/ has a bug. See - * QTBUG-44963 for details. The algorithm here is as described in - * http://www.w3.org/Voice/2013/scxml-irp/SCXML.htm as of Friday March 13, 2015. - -procedure addDescendantStatesToEnter(state,statesToEnter,statesForDefaultEntry, defaultHistoryContent): - if isHistoryState(state): - if historyValue[state.id]: - for s in historyValue[state.id]: - addDescendantStatesToEnter(s,statesToEnter,statesForDefaultEntry, defaultHistoryContent) - for s in historyValue[state.id]: - addAncestorStatesToEnter(s, state.parent, statesToEnter, statesForDefaultEntry, defaultHistoryContent) - else: - defaultHistoryContent[state.parent.id] = state.transition.content - for s in state.transition.target: - addDescendantStatesToEnter(s,statesToEnter,statesForDefaultEntry, defaultHistoryContent) - for s in state.transition.target: - addAncestorStatesToEnter(s, state.parent, statesToEnter, statesForDefaultEntry, defaultHistoryContent) - else: - statesToEnter.add(state) - if isCompoundState(state): - statesForDefaultEntry.add(state) - for s in state.initial.transition.target: - addDescendantStatesToEnter(s,statesToEnter,statesForDefaultEntry, defaultHistoryContent) - for s in state.initial.transition.target: - addAncestorStatesToEnter(s, state, statesToEnter, statesForDefaultEntry, defaultHistoryContent) - else: - if isParallelState(state): - for child in getChildStates(state): - if not statesToEnter.some(lambda s: isDescendant(s,child)): - addDescendantStatesToEnter(child,statesToEnter,statesForDefaultEntry, defaultHistoryContent) -*/ -void QStateMachinePrivate::addDescendantStatesToEnter(QAbstractState *state, - QSet &statesToEnter, - QSet &statesForDefaultEntry) -{ - if (QHistoryState *h = toHistoryState(state)) { - const QList historyConfiguration = QHistoryStatePrivate::get(h)->configuration; - if (!historyConfiguration.isEmpty()) { - for (QAbstractState *s : historyConfiguration) - addDescendantStatesToEnter(s, statesToEnter, statesForDefaultEntry); - for (QAbstractState *s : historyConfiguration) - addAncestorStatesToEnter(s, state->parentState(), statesToEnter, statesForDefaultEntry); - -#ifdef QSTATEMACHINE_DEBUG - qDebug() << q_func() << ": restoring" - << ((QHistoryStatePrivate::get(h)->historyType == QHistoryState::DeepHistory) ? "deep" : "shallow") - << "history from" << state << ':' << historyConfiguration; -#endif - } else { - QList defaultHistoryContent; - if (QAbstractTransition *t = QHistoryStatePrivate::get(h)->defaultTransition) - defaultHistoryContent = t->targetStates(); - - if (defaultHistoryContent.isEmpty()) { - setError(QStateMachine::NoDefaultStateInHistoryStateError, h); - } else { - for (QAbstractState *s : qAsConst(defaultHistoryContent)) - addDescendantStatesToEnter(s, statesToEnter, statesForDefaultEntry); - for (QAbstractState *s : qAsConst(defaultHistoryContent)) - addAncestorStatesToEnter(s, state->parentState(), statesToEnter, statesForDefaultEntry); -#ifdef QSTATEMACHINE_DEBUG - qDebug() << q_func() << ": initial history targets for" << state << ':' << defaultHistoryContent; -#endif - } - } - } else { - if (state == rootState()) { - // Error has already been set by exitStates(). - Q_ASSERT(error != QStateMachine::NoError); - return; - } - statesToEnter.insert(state); - if (isCompound(state)) { - statesForDefaultEntry.insert(state); - if (QAbstractState *initial = toStandardState(state)->initialState()) { - Q_ASSERT(initial->machine() == q_func()); - - // FIXME: - // Qt does not support initial transitions (which is a problem for parallel states). - // The way it simulates this for other states, is by having a single initial state. - // See also the FIXME in enterStates. - statesForDefaultEntry.insert(initial); - - addDescendantStatesToEnter(initial, statesToEnter, statesForDefaultEntry); - addAncestorStatesToEnter(initial, state, statesToEnter, statesForDefaultEntry); - } else { - setError(QStateMachine::NoInitialStateError, state); - return; - } - } else if (isParallel(state)) { - QState *grp = toStandardState(state); - const auto childStates = QStatePrivate::get(grp)->childStates(); - for (QAbstractState *child : childStates) { - if (!containsDecendantOf(statesToEnter, child)) - addDescendantStatesToEnter(child, statesToEnter, statesForDefaultEntry); - } - } - } -} - - -/* The algorithm as described in http://www.w3.org/TR/2014/WD-scxml-20140529/ : - -procedure addAncestorStatesToEnter(state, ancestor, statesToEnter, statesForDefaultEntry, defaultHistoryContent) - for anc in getProperAncestors(state,ancestor): - statesToEnter.add(anc) - if isParallelState(anc): - for child in getChildStates(anc): - if not statesToEnter.some(lambda s: isDescendant(s,child)): - addDescendantStatesToEnter(child,statesToEnter,statesForDefaultEntry, defaultHistoryContent) -*/ -void QStateMachinePrivate::addAncestorStatesToEnter(QAbstractState *s, QAbstractState *ancestor, - QSet &statesToEnter, - QSet &statesForDefaultEntry) -{ - const auto properAncestors = getProperAncestors(s, ancestor); - for (QState *anc : properAncestors) { - if (!anc->parentState()) - continue; - statesToEnter.insert(anc); - if (isParallel(anc)) { - const auto childStates = QStatePrivate::get(anc)->childStates(); - for (QAbstractState *child : childStates) { - if (!containsDecendantOf(statesToEnter, child)) - addDescendantStatesToEnter(child, statesToEnter, statesForDefaultEntry); - } - } - } -} - -bool QStateMachinePrivate::isFinal(const QAbstractState *s) -{ - return s && (QAbstractStatePrivate::get(s)->stateType == QAbstractStatePrivate::FinalState); -} - -bool QStateMachinePrivate::isParallel(const QAbstractState *s) -{ - const QState *ss = toStandardState(s); - return ss && (QStatePrivate::get(ss)->childMode == QState::ParallelStates); -} - -bool QStateMachinePrivate::isCompound(const QAbstractState *s) const -{ - const QState *group = toStandardState(s); - if (!group) - return false; - bool isMachine = QStatePrivate::get(group)->isMachine; - // Don't treat the machine as compound if it's a sub-state of this machine - if (isMachine && (group != rootState())) - return false; - return (!isParallel(group) && !QStatePrivate::get(group)->childStates().isEmpty()); -} - -bool QStateMachinePrivate::isAtomic(const QAbstractState *s) const -{ - const QState *ss = toStandardState(s); - return (ss && QStatePrivate::get(ss)->childStates().isEmpty()) - || isFinal(s) - // Treat the machine as atomic if it's a sub-state of this machine - || (ss && QStatePrivate::get(ss)->isMachine && (ss != rootState())); -} - -QState *QStateMachinePrivate::toStandardState(QAbstractState *state) -{ - if (state && (QAbstractStatePrivate::get(state)->stateType == QAbstractStatePrivate::StandardState)) - return static_cast(state); - return nullptr; -} - -const QState *QStateMachinePrivate::toStandardState(const QAbstractState *state) -{ - if (state && (QAbstractStatePrivate::get(state)->stateType == QAbstractStatePrivate::StandardState)) - return static_cast(state); - return nullptr; -} - -QFinalState *QStateMachinePrivate::toFinalState(QAbstractState *state) -{ - if (state && (QAbstractStatePrivate::get(state)->stateType == QAbstractStatePrivate::FinalState)) - return static_cast(state); - return nullptr; -} - -QHistoryState *QStateMachinePrivate::toHistoryState(QAbstractState *state) -{ - if (state && (QAbstractStatePrivate::get(state)->stateType == QAbstractStatePrivate::HistoryState)) - return static_cast(state); - return nullptr; -} - -bool QStateMachinePrivate::isInFinalState(QAbstractState* s) const -{ - if (isCompound(s)) { - QState *grp = toStandardState(s); - QList lst = QStatePrivate::get(grp)->childStates(); - for (int i = 0; i < lst.size(); ++i) { - QAbstractState *cs = lst.at(i); - if (isFinal(cs) && configuration.contains(cs)) - return true; - } - return false; - } else if (isParallel(s)) { - QState *grp = toStandardState(s); - QList lst = QStatePrivate::get(grp)->childStates(); - for (int i = 0; i < lst.size(); ++i) { - QAbstractState *cs = lst.at(i); - if (!isInFinalState(cs)) - return false; - } - return true; - } - else - return false; -} - -#ifndef QT_NO_PROPERTIES - -/*! - \internal - Returns \c true if the given state has saved the value of the given property, - otherwise returns \c false. -*/ -bool QStateMachinePrivate::hasRestorable(QAbstractState *state, QObject *object, - const QByteArray &propertyName) const -{ - RestorableId id(object, propertyName); - return registeredRestorablesForState.value(state).contains(id); -} - -/*! - \internal - Returns the value to save for the property identified by \a id. - If an exited state (member of \a exitedStates_sorted) has saved a value for - the property, the saved value from the last (outermost) state that will be - exited is returned (in practice carrying the saved value on to the next - state). Otherwise, the current value of the property is returned. -*/ -QVariant QStateMachinePrivate::savedValueForRestorable(const QList &exitedStates_sorted, - QObject *object, const QByteArray &propertyName) const -{ -#ifdef QSTATEMACHINE_RESTORE_PROPERTIES_DEBUG - qDebug() << q_func() << ": savedValueForRestorable(" << exitedStates_sorted << object << propertyName << ')'; -#endif - for (int i = exitedStates_sorted.size() - 1; i >= 0; --i) { - QAbstractState *s = exitedStates_sorted.at(i); - QHash restorables = registeredRestorablesForState.value(s); - QHash::const_iterator it = restorables.constFind(RestorableId(object, propertyName)); - if (it != restorables.constEnd()) { -#ifdef QSTATEMACHINE_RESTORE_PROPERTIES_DEBUG - qDebug() << q_func() << ": using" << it.value() << "from" << s; -#endif - return it.value(); - } - } -#ifdef QSTATEMACHINE_RESTORE_PROPERTIES_DEBUG - qDebug() << q_func() << ": falling back to current value"; -#endif - return object->property(propertyName); -} - -void QStateMachinePrivate::registerRestorable(QAbstractState *state, QObject *object, const QByteArray &propertyName, - const QVariant &value) -{ -#ifdef QSTATEMACHINE_RESTORE_PROPERTIES_DEBUG - qDebug() << q_func() << ": registerRestorable(" << state << object << propertyName << value << ')'; -#endif - RestorableId id(object, propertyName); - QHash &restorables = registeredRestorablesForState[state]; - if (!restorables.contains(id)) - restorables.insert(id, value); -#ifdef QSTATEMACHINE_RESTORE_PROPERTIES_DEBUG - else - qDebug() << q_func() << ": (already registered)"; -#endif -} - -void QStateMachinePrivate::unregisterRestorables(const QList &states, QObject *object, - const QByteArray &propertyName) -{ -#ifdef QSTATEMACHINE_RESTORE_PROPERTIES_DEBUG - qDebug() << q_func() << ": unregisterRestorables(" << states << object << propertyName << ')'; -#endif - RestorableId id(object, propertyName); - for (int i = 0; i < states.size(); ++i) { - QAbstractState *s = states.at(i); - QHash >::iterator it; - it = registeredRestorablesForState.find(s); - if (it == registeredRestorablesForState.end()) - continue; - QHash &restorables = it.value(); - const auto it2 = restorables.constFind(id); - if (it2 == restorables.cend()) - continue; -#ifdef QSTATEMACHINE_RESTORE_PROPERTIES_DEBUG - qDebug() << q_func() << ": unregistered for" << s; -#endif - restorables.erase(it2); - if (restorables.isEmpty()) - registeredRestorablesForState.erase(it); - } -} - -QList QStateMachinePrivate::restorablesToPropertyList(const QHash &restorables) const -{ - QList result; - QHash::const_iterator it; - for (it = restorables.constBegin(); it != restorables.constEnd(); ++it) { - const RestorableId &id = it.key(); - if (!id.object()) { - // Property object was deleted - continue; - } -#ifdef QSTATEMACHINE_RESTORE_PROPERTIES_DEBUG - qDebug() << q_func() << ": restoring" << id.object() << id.proertyName() << "to" << it.value(); -#endif - result.append(QPropertyAssignment(id.object(), id.propertyName(), it.value(), /*explicitlySet=*/false)); - } - return result; -} - -/*! - \internal - Computes the set of properties whose values should be restored given that - the states \a statesToExit_sorted will be exited. - - If a particular (object, propertyName) pair occurs more than once (i.e., - because nested states are being exited), the value from the last (outermost) - exited state takes precedence. - - The result of this function must be filtered according to the explicit - property assignments (QState::assignProperty()) of the entered states - before the property restoration is actually performed; i.e., if an entered - state assigns to a property that would otherwise be restored, that property - should not be restored after all, but the saved value from the exited state - should be remembered by the entered state (see registerRestorable()). -*/ -QHash QStateMachinePrivate::computePendingRestorables( - const QList &statesToExit_sorted) const -{ - QHash restorables; - for (int i = statesToExit_sorted.size() - 1; i >= 0; --i) { - QAbstractState *s = statesToExit_sorted.at(i); - QHash rs = registeredRestorablesForState.value(s); - QHash::const_iterator it; - for (it = rs.constBegin(); it != rs.constEnd(); ++it) { - if (!restorables.contains(it.key())) - restorables.insert(it.key(), it.value()); - } - } - return restorables; -} - -/*! - \internal - Computes the ordered sets of property assignments for the states to be - entered, \a statesToEnter_sorted. Also filters \a pendingRestorables (removes - properties that should not be restored because they are assigned by an - entered state). -*/ -QHash> QStateMachinePrivate::computePropertyAssignments( - const QList &statesToEnter_sorted, QHash &pendingRestorables) const -{ - QHash> assignmentsForState; - for (int i = 0; i < statesToEnter_sorted.size(); ++i) { - QState *s = toStandardState(statesToEnter_sorted.at(i)); - if (!s) - continue; - - QList &assignments = QStatePrivate::get(s)->propertyAssignments; - for (int j = 0; j < assignments.size(); ++j) { - const QPropertyAssignment &assn = assignments.at(j); - if (assn.objectDeleted()) { - assignments.removeAt(j--); - } else { - pendingRestorables.remove(RestorableId(assn.object, assn.propertyName)); - assignmentsForState[s].append(assn); - } - } - } - return assignmentsForState; -} - -#endif // QT_NO_PROPERTIES - -QAbstractState *QStateMachinePrivate::findErrorState(QAbstractState *context) -{ - // Find error state recursively in parent hierarchy if not set explicitly for context state - QAbstractState *errorState = nullptr; - if (context != nullptr) { - QState *s = toStandardState(context); - if (s != nullptr) - errorState = s->errorState(); - - if (errorState == nullptr) - errorState = findErrorState(context->parentState()); - } - - return errorState; -} - -void QStateMachinePrivate::setError(QStateMachine::Error errorCode, QAbstractState *currentContext) -{ - Q_Q(QStateMachine); - - error = errorCode; - switch (errorCode) { - case QStateMachine::NoInitialStateError: - Q_ASSERT(currentContext != nullptr); - - errorString = QStateMachine::tr("Missing initial state in compound state '%1'") - .arg(currentContext->objectName()); - - break; - case QStateMachine::NoDefaultStateInHistoryStateError: - Q_ASSERT(currentContext != nullptr); - - errorString = QStateMachine::tr("Missing default state in history state '%1'") - .arg(currentContext->objectName()); - break; - - case QStateMachine::NoCommonAncestorForTransitionError: - Q_ASSERT(currentContext != nullptr); - - errorString = QStateMachine::tr("No common ancestor for targets and source of transition from state '%1'") - .arg(currentContext->objectName()); - break; - - case QStateMachine::StateMachineChildModeSetToParallelError: - Q_ASSERT(currentContext != nullptr); - - errorString = QStateMachine::tr("Child mode of state machine '%1' is not 'ExclusiveStates'.") - .arg(currentContext->objectName()); - break; - - default: - errorString = QStateMachine::tr("Unknown error"); - }; - - pendingErrorStates.clear(); - pendingErrorStatesForDefaultEntry.clear(); - - QAbstractState *currentErrorState = findErrorState(currentContext); - - // Avoid infinite loop if the error state itself has an error - if (currentContext == currentErrorState) - currentErrorState = nullptr; - - Q_ASSERT(currentErrorState != rootState()); - - if (currentErrorState != nullptr) { -#ifdef QSTATEMACHINE_DEBUG - qDebug() << q << ": entering error state" << currentErrorState << "from" << currentContext; -#endif - pendingErrorStates.insert(currentErrorState); - addDescendantStatesToEnter(currentErrorState, pendingErrorStates, pendingErrorStatesForDefaultEntry); - addAncestorStatesToEnter(currentErrorState, rootState(), pendingErrorStates, pendingErrorStatesForDefaultEntry); - pendingErrorStates -= configuration; - } else { - qWarning("Unrecoverable error detected in running state machine: %ls", - qUtf16Printable(errorString)); - q->stop(); - } -} - -#if QT_CONFIG(animation) - -QStateMachinePrivate::InitializeAnimationResult -QStateMachinePrivate::initializeAnimation(QAbstractAnimation *abstractAnimation, - const QPropertyAssignment &prop) -{ - InitializeAnimationResult result; - QAnimationGroup *group = qobject_cast(abstractAnimation); - if (group) { - for (int i = 0; i < group->animationCount(); ++i) { - QAbstractAnimation *animationChild = group->animationAt(i); - const auto ret = initializeAnimation(animationChild, prop); - result.handledAnimations << ret.handledAnimations; - result.localResetEndValues << ret.localResetEndValues; - } - } else { - QPropertyAnimation *animation = qobject_cast(abstractAnimation); - if (animation != nullptr - && prop.object == animation->targetObject() - && prop.propertyName == animation->propertyName()) { - - // Only change end value if it is undefined - if (!animation->endValue().isValid()) { - animation->setEndValue(prop.value); - result.localResetEndValues.append(animation); - } - result.handledAnimations.append(animation); - } - } - return result; -} - -void QStateMachinePrivate::_q_animationFinished() -{ - Q_Q(QStateMachine); - QAbstractAnimation *anim = qobject_cast(q->sender()); - Q_ASSERT(anim != nullptr); - QObject::disconnect(anim, SIGNAL(finished()), q, SLOT(_q_animationFinished())); - if (resetAnimationEndValues.contains(anim)) { - qobject_cast(anim)->setEndValue(QVariant()); // ### generalize - resetAnimationEndValues.remove(anim); - } - - QAbstractState *state = stateForAnimation.take(anim); - Q_ASSERT(state != nullptr); - -#ifndef QT_NO_PROPERTIES - // Set the final property value. - QPropertyAssignment assn = propertyForAnimation.take(anim); - assn.write(); - if (!assn.explicitlySet) - unregisterRestorables(QList() << state, assn.object, assn.propertyName); -#endif - - QHash >::iterator it; - it = animationsForState.find(state); - Q_ASSERT(it != animationsForState.end()); - QList &animations = it.value(); - animations.removeOne(anim); - if (animations.isEmpty()) { - animationsForState.erase(it); - QStatePrivate::get(toStandardState(state))->emitPropertiesAssigned(); - } -} - -QList QStateMachinePrivate::selectAnimations(const QList &transitionList) const -{ - QList selectedAnimations; - if (animated) { - for (int i = 0; i < transitionList.size(); ++i) { - QAbstractTransition *transition = transitionList.at(i); - - selectedAnimations << transition->animations(); - selectedAnimations << defaultAnimationsForSource.values(transition->sourceState()); - - QList targetStates = transition->targetStates(); - for (int j=0; j> &assignmentsForEnteredStates) -{ - Q_Q(QStateMachine); - QList animations = animationsForState.take(state); - for (int i = 0; i < animations.size(); ++i) { - QAbstractAnimation *anim = animations.at(i); - QObject::disconnect(anim, SIGNAL(finished()), q, SLOT(_q_animationFinished())); - stateForAnimation.remove(anim); - - // Stop the (top-level) animation. - // ### Stopping nested animation has weird behavior. - QAbstractAnimation *topLevelAnim = anim; - while (QAnimationGroup *group = topLevelAnim->group()) - topLevelAnim = group; - topLevelAnim->stop(); - - if (resetAnimationEndValues.contains(anim)) { - qobject_cast(anim)->setEndValue(QVariant()); // ### generalize - resetAnimationEndValues.remove(anim); - } - QPropertyAssignment assn = propertyForAnimation.take(anim); - Q_ASSERT(assn.object != nullptr); - // If there is no property assignment that sets this property, - // set the property to its target value. - bool found = false; - for (auto it = assignmentsForEnteredStates.constBegin(); it != assignmentsForEnteredStates.constEnd(); ++it) { - const QList &assignments = it.value(); - for (int j = 0; j < assignments.size(); ++j) { - if (assignments.at(j).hasTarget(assn.object, assn.propertyName)) { - found = true; - break; - } - } - } - if (!found) { - assn.write(); - if (!assn.explicitlySet) - unregisterRestorables(QList() << state, assn.object, assn.propertyName); - } - } -} - -void QStateMachinePrivate::initializeAnimations(QAbstractState *state, const QList &selectedAnimations, - const QList &exitedStates_sorted, - QHash> &assignmentsForEnteredStates) -{ - Q_Q(QStateMachine); - if (!assignmentsForEnteredStates.contains(state)) - return; - QList &assignments = assignmentsForEnteredStates[state]; - for (int i = 0; i < selectedAnimations.size(); ++i) { - QAbstractAnimation *anim = selectedAnimations.at(i); - for (auto it = assignments.begin(); it != assignments.end(); ) { - const QPropertyAssignment &assn = *it; - const auto ret = initializeAnimation(anim, assn); - if (!ret.handledAnimations.isEmpty()) { - for (int j = 0; j < ret.handledAnimations.size(); ++j) { - QAbstractAnimation *a = ret.handledAnimations.at(j); - propertyForAnimation.insert(a, assn); - stateForAnimation.insert(a, state); - animationsForState[state].append(a); - // ### connect to just the top-level animation? - QObject::connect(a, SIGNAL(finished()), q, SLOT(_q_animationFinished()), Qt::UniqueConnection); - } - if ((globalRestorePolicy == QState::RestoreProperties) - && !hasRestorable(state, assn.object, assn.propertyName)) { - QVariant value = savedValueForRestorable(exitedStates_sorted, assn.object, assn.propertyName); - unregisterRestorables(exitedStates_sorted, assn.object, assn.propertyName); - registerRestorable(state, assn.object, assn.propertyName, value); - } - it = assignments.erase(it); - } else { - ++it; - } - for (int j = 0; j < ret.localResetEndValues.size(); ++j) - resetAnimationEndValues.insert(ret.localResetEndValues.at(j)); - } - // We require that at least one animation is valid. - // ### generalize - QList variantAnims = anim->findChildren(); - if (QVariantAnimation *va = qobject_cast(anim)) - variantAnims.append(va); - - bool hasValidEndValue = false; - for (int j = 0; j < variantAnims.size(); ++j) { - if (variantAnims.at(j)->endValue().isValid()) { - hasValidEndValue = true; - break; - } - } - - if (hasValidEndValue) { - if (anim->state() == QAbstractAnimation::Running) { - // The animation is still running. This can happen if the - // animation is a group, and one of its children just finished, - // and that caused a state to emit its propertiesAssigned() signal, and - // that triggered a transition in the machine. - // Just stop the animation so it is correctly restarted again. - anim->stop(); - } - anim->start(); - } - - if (assignments.isEmpty()) { - assignmentsForEnteredStates.remove(state); - break; - } - } -} - -#endif // animation - -QAbstractTransition *QStateMachinePrivate::createInitialTransition() const -{ - class InitialTransition : public QAbstractTransition - { - public: - InitialTransition(const QList &targets) - : QAbstractTransition() - { setTargetStates(targets); } - protected: - bool eventTest(QEvent *) override { return true; } - void onTransition(QEvent *) override {} - }; - - QState *root = rootState(); - Q_ASSERT(root != nullptr); - QList targets; - switch (root->childMode()) { - case QState::ExclusiveStates: - targets.append(root->initialState()); - break; - case QState::ParallelStates: - targets = QStatePrivate::get(root)->childStates(); - break; - } - return new InitialTransition(targets); -} - -void QStateMachinePrivate::clearHistory() -{ - Q_Q(QStateMachine); - QList historyStates = q->findChildren(); - for (int i = 0; i < historyStates.size(); ++i) { - QHistoryState *h = historyStates.at(i); - QHistoryStatePrivate::get(h)->configuration.clear(); - } -} - -/*! - \internal - - Registers all signal transitions whose sender object lives in another thread. - - Normally, signal transitions are lazily registered (when a state becomes - active). But if the sender is in a different thread, the transition must be - registered early to keep the state machine from "dropping" signals; e.g., - a second (transition-bound) signal could be emitted on the sender thread - before the state machine gets to process the first signal. -*/ -void QStateMachinePrivate::registerMultiThreadedSignalTransitions() -{ - Q_Q(QStateMachine); - QList transitions = rootState()->findChildren(); - for (int i = 0; i < transitions.size(); ++i) { - QSignalTransition *t = transitions.at(i); - if ((t->machine() == q) && t->senderObject() && (t->senderObject()->thread() != q->thread())) - registerSignalTransition(t); - } -} - -void QStateMachinePrivate::_q_start() -{ - Q_Q(QStateMachine); - Q_ASSERT(state == Starting); - // iterate over a copy, since we emit signals which may cause - // 'configuration' to change, resulting in undefined behavior when - // iterating at the same time: - const auto config = configuration; - for (QAbstractState *state : config) { - QAbstractStatePrivate *abstractStatePrivate = QAbstractStatePrivate::get(state); - abstractStatePrivate->active = false; - emit state->activeChanged(false); - } - configuration.clear(); - qDeleteAll(internalEventQueue); - internalEventQueue.clear(); - qDeleteAll(externalEventQueue); - externalEventQueue.clear(); - clearHistory(); - - registerMultiThreadedSignalTransitions(); - - startupHook(); - -#ifdef QSTATEMACHINE_DEBUG - qDebug() << q << ": starting"; -#endif - state = Running; - processingScheduled = true; // we call _q_process() below - - QList transitions; - CalculationCache calculationCache; - QAbstractTransition *initialTransition = createInitialTransition(); - transitions.append(initialTransition); - - QEvent nullEvent(QEvent::None); - executeTransitionContent(&nullEvent, transitions); - QList exitedStates = QList(); - QSet statesForDefaultEntry; - QList enteredStates = computeEntrySet(transitions, statesForDefaultEntry, &calculationCache); - QHash pendingRestorables; - QHash> assignmentsForEnteredStates = - computePropertyAssignments(enteredStates, pendingRestorables); -#if QT_CONFIG(animation) - QList selectedAnimations = selectAnimations(transitions); -#endif - // enterStates() will set stopProcessingReason to Finished if a final - // state is entered. - stopProcessingReason = EventQueueEmpty; - enterStates(&nullEvent, exitedStates, enteredStates, statesForDefaultEntry, - assignmentsForEnteredStates -#if QT_CONFIG(animation) - , selectedAnimations -#endif - ); - delete initialTransition; - -#ifdef QSTATEMACHINE_DEBUG - qDebug() << q << ": initial configuration:" << configuration; -#endif - - emit q->started(QStateMachine::QPrivateSignal()); - emit q->runningChanged(true); - - if (stopProcessingReason == Finished) { - // The state machine immediately reached a final state. - processingScheduled = false; - state = NotRunning; - unregisterAllTransitions(); - emitFinished(); - emit q->runningChanged(false); - exitInterpreter(); - } else { - _q_process(); - } -} - -void QStateMachinePrivate::_q_process() -{ - Q_Q(QStateMachine); - Q_ASSERT(state == Running); - Q_ASSERT(!processing); - processing = true; - processingScheduled = false; - beginMacrostep(); -#ifdef QSTATEMACHINE_DEBUG - qDebug() << q << ": starting the event processing loop"; -#endif - bool didChange = false; - while (processing) { - if (stop) { - processing = false; - break; - } - QList enabledTransitions; - CalculationCache calculationCache; - - QEvent *e = new QEvent(QEvent::None); - enabledTransitions = selectTransitions(e, &calculationCache); - if (enabledTransitions.isEmpty()) { - delete e; - e = nullptr; - } - while (enabledTransitions.isEmpty() && ((e = dequeueInternalEvent()) != nullptr)) { -#ifdef QSTATEMACHINE_DEBUG - qDebug() << q << ": dequeued internal event" << e << "of type" << e->type(); -#endif - enabledTransitions = selectTransitions(e, &calculationCache); - if (enabledTransitions.isEmpty()) { - delete e; - e = nullptr; - } - } - while (enabledTransitions.isEmpty() && ((e = dequeueExternalEvent()) != nullptr)) { -#ifdef QSTATEMACHINE_DEBUG - qDebug() << q << ": dequeued external event" << e << "of type" << e->type(); -#endif - enabledTransitions = selectTransitions(e, &calculationCache); - if (enabledTransitions.isEmpty()) { - delete e; - e = nullptr; - } - } - if (enabledTransitions.isEmpty()) { - if (isInternalEventQueueEmpty()) { - processing = false; - stopProcessingReason = EventQueueEmpty; - noMicrostep(); -#ifdef QSTATEMACHINE_DEBUG - qDebug() << q << ": no transitions enabled"; -#endif - } - } else { - didChange = true; - q->beginMicrostep(e); - microstep(e, enabledTransitions, &calculationCache); - q->endMicrostep(e); - } - delete e; - } -#ifdef QSTATEMACHINE_DEBUG - qDebug() << q << ": finished the event processing loop"; -#endif - if (stop) { - stop = false; - stopProcessingReason = Stopped; - } - - switch (stopProcessingReason) { - case EventQueueEmpty: - processedPendingEvents(didChange); - break; - case Finished: - state = NotRunning; - cancelAllDelayedEvents(); - unregisterAllTransitions(); - emitFinished(); - emit q->runningChanged(false); - break; - case Stopped: - state = NotRunning; - cancelAllDelayedEvents(); - unregisterAllTransitions(); - emit q->stopped(QStateMachine::QPrivateSignal()); - emit q->runningChanged(false); - break; - } - endMacrostep(didChange); - if (stopProcessingReason == Finished) - exitInterpreter(); -} - -void QStateMachinePrivate::_q_startDelayedEventTimer(int id, int delay) -{ - Q_Q(QStateMachine); - QMutexLocker locker(&delayedEventsMutex); - QHash::iterator it = delayedEvents.find(id); - if (it != delayedEvents.end()) { - DelayedEvent &e = it.value(); - Q_ASSERT(!e.timerId); - e.timerId = q->startTimer(delay); - if (!e.timerId) { - qWarning("QStateMachine::postDelayedEvent: failed to start timer (id=%d, delay=%d)", id, delay); - delete e.event; - delayedEvents.erase(it); - delayedEventIdFreeList.release(id); - } else { - timerIdToDelayedEventId.insert(e.timerId, id); - } - } else { - // It's been cancelled already - delayedEventIdFreeList.release(id); - } -} - -void QStateMachinePrivate::_q_killDelayedEventTimer(int id, int timerId) -{ - Q_Q(QStateMachine); - q->killTimer(timerId); - QMutexLocker locker(&delayedEventsMutex); - delayedEventIdFreeList.release(id); -} - -void QStateMachinePrivate::postInternalEvent(QEvent *e) -{ - QMutexLocker locker(&internalEventMutex); - internalEventQueue.append(e); -} - -void QStateMachinePrivate::postExternalEvent(QEvent *e) -{ - QMutexLocker locker(&externalEventMutex); - externalEventQueue.append(e); -} - -QEvent *QStateMachinePrivate::dequeueInternalEvent() -{ - QMutexLocker locker(&internalEventMutex); - if (internalEventQueue.isEmpty()) - return nullptr; - return internalEventQueue.takeFirst(); -} - -QEvent *QStateMachinePrivate::dequeueExternalEvent() -{ - QMutexLocker locker(&externalEventMutex); - if (externalEventQueue.isEmpty()) - return nullptr; - return externalEventQueue.takeFirst(); -} - -bool QStateMachinePrivate::isInternalEventQueueEmpty() -{ - QMutexLocker locker(&internalEventMutex); - return internalEventQueue.isEmpty(); -} - -bool QStateMachinePrivate::isExternalEventQueueEmpty() -{ - QMutexLocker locker(&externalEventMutex); - return externalEventQueue.isEmpty(); -} - -void QStateMachinePrivate::processEvents(EventProcessingMode processingMode) -{ - Q_Q(QStateMachine); - if ((state != Running) || processing || processingScheduled) - return; - switch (processingMode) { - case DirectProcessing: - if (QThread::currentThread() == q->thread()) { - _q_process(); - break; - } - // processing must be done in the machine thread, so: - Q_FALLTHROUGH(); - case QueuedProcessing: - processingScheduled = true; - QMetaObject::invokeMethod(q, "_q_process", Qt::QueuedConnection); - break; - } -} - -void QStateMachinePrivate::cancelAllDelayedEvents() -{ - Q_Q(QStateMachine); - QMutexLocker locker(&delayedEventsMutex); - QHash::const_iterator it; - for (it = delayedEvents.constBegin(); it != delayedEvents.constEnd(); ++it) { - const DelayedEvent &e = it.value(); - if (e.timerId) { - timerIdToDelayedEventId.remove(e.timerId); - q->killTimer(e.timerId); - delayedEventIdFreeList.release(it.key()); - } else { - // Cancellation will be detected in pending _q_startDelayedEventTimer() call - } - delete e.event; - } - delayedEvents.clear(); -} - -/* - This function is called when the state machine is performing no - microstep because no transition is enabled (i.e. an event is ignored). - - The default implementation does nothing. -*/ -void QStateMachinePrivate::noMicrostep() -{ } - -/* - This function is called when the state machine has reached a stable - state (no pending events), and has not finished yet. - For each event the state machine receives it is guaranteed that - 1) beginMacrostep is called - 2) selectTransition is called at least once - 3) begin/endMicrostep is called at least once or noMicrostep is called - at least once (possibly both, but at least one) - 4) the state machine either enters an infinite loop, or stops (runningChanged(false), - and either finished or stopped are emitted), or processedPendingEvents() is called. - 5) if the machine is not in an infinite loop endMacrostep is called - 6) when the machine is finished and all processing (like signal emission) is done, - exitInterpreter() is called. (This is the same name as the SCXML specification uses.) - - didChange is set to true if at least one microstep was performed, it is possible - that the machine returned to exactly the same state as before, but some transitions - were triggered. - - The default implementation does nothing. -*/ -void QStateMachinePrivate::processedPendingEvents(bool didChange) -{ - Q_UNUSED(didChange); -} - -void QStateMachinePrivate::beginMacrostep() -{ } - -void QStateMachinePrivate::endMacrostep(bool didChange) -{ - Q_UNUSED(didChange); -} - -void QStateMachinePrivate::exitInterpreter() -{ -} - -void QStateMachinePrivate::emitStateFinished(QState *forState, QFinalState *guiltyState) -{ - Q_UNUSED(guiltyState); - Q_ASSERT(guiltyState); - -#ifdef QSTATEMACHINE_DEBUG - Q_Q(QStateMachine); - qDebug() << q << ": emitting finished signal for" << forState; -#endif - - QStatePrivate::get(forState)->emitFinished(); -} - -void QStateMachinePrivate::startupHook() -{ -} - -namespace _QStateMachine_Internal{ - -class GoToStateTransition : public QAbstractTransition -{ - Q_OBJECT -public: - GoToStateTransition(QAbstractState *target) - : QAbstractTransition() - { setTargetState(target); } -protected: - void onTransition(QEvent *) override { deleteLater(); } - bool eventTest(QEvent *) override { return true; } -}; - -} // namespace -// mingw compiler tries to export QObject::findChild(), -// which doesn't work if its in an anonymous namespace. -using namespace _QStateMachine_Internal; -/*! - \internal - - Causes this state machine to unconditionally transition to the given - \a targetState. - - Provides a backdoor for using the state machine "imperatively"; i.e. rather - than defining explicit transitions, you drive the machine's execution by - calling this function. It breaks the whole integrity of the - transition-driven model, but is provided for pragmatic reasons. -*/ -void QStateMachinePrivate::goToState(QAbstractState *targetState) -{ - if (!targetState) { - qWarning("QStateMachine::goToState(): cannot go to null state"); - return; - } - - if (configuration.contains(targetState)) - return; - - Q_ASSERT(state == Running); - QState *sourceState = nullptr; - QSet::const_iterator it; - for (it = configuration.constBegin(); it != configuration.constEnd(); ++it) { - sourceState = toStandardState(*it); - if (sourceState != nullptr) - break; - } - - Q_ASSERT(sourceState != nullptr); - // Reuse previous GoToStateTransition in case of several calls to - // goToState() in a row. - GoToStateTransition *trans = sourceState->findChild(); - if (!trans) { - trans = new GoToStateTransition(targetState); - sourceState->addTransition(trans); - } else { - trans->setTargetState(targetState); - } - - processEvents(QueuedProcessing); -} - -void QStateMachinePrivate::registerTransitions(QAbstractState *state) -{ - QState *group = toStandardState(state); - if (!group) - return; - QList transitions = QStatePrivate::get(group)->transitions(); - for (int i = 0; i < transitions.size(); ++i) { - QAbstractTransition *t = transitions.at(i); - registerTransition(t); - } -} - -void QStateMachinePrivate::maybeRegisterTransition(QAbstractTransition *transition) -{ - if (QSignalTransition *st = qobject_cast(transition)) { - maybeRegisterSignalTransition(st); - } -#if QT_CONFIG(qeventtransition) - else if (QEventTransition *et = qobject_cast(transition)) { - maybeRegisterEventTransition(et); - } -#endif -} - -void QStateMachinePrivate::registerTransition(QAbstractTransition *transition) -{ - if (QSignalTransition *st = qobject_cast(transition)) { - registerSignalTransition(st); - } -#if QT_CONFIG(qeventtransition) - else if (QEventTransition *oet = qobject_cast(transition)) { - registerEventTransition(oet); - } -#endif -} - -void QStateMachinePrivate::unregisterTransition(QAbstractTransition *transition) -{ - if (QSignalTransition *st = qobject_cast(transition)) { - unregisterSignalTransition(st); - } -#if QT_CONFIG(qeventtransition) - else if (QEventTransition *oet = qobject_cast(transition)) { - unregisterEventTransition(oet); - } -#endif -} - -void QStateMachinePrivate::maybeRegisterSignalTransition(QSignalTransition *transition) -{ - Q_Q(QStateMachine); - if ((state == Running) && (configuration.contains(transition->sourceState()) - || (transition->senderObject() && (transition->senderObject()->thread() != q->thread())))) { - registerSignalTransition(transition); - } -} - -void QStateMachinePrivate::registerSignalTransition(QSignalTransition *transition) -{ - Q_Q(QStateMachine); - if (QSignalTransitionPrivate::get(transition)->signalIndex != -1) - return; // already registered - const QObject *sender = QSignalTransitionPrivate::get(transition)->sender; - if (!sender) - return; - QByteArray signal = QSignalTransitionPrivate::get(transition)->signal; - if (signal.isEmpty()) - return; - if (signal.startsWith('0'+QSIGNAL_CODE)) - signal.remove(0, 1); - const QMetaObject *meta = sender->metaObject(); - int signalIndex = meta->indexOfSignal(signal); - int originalSignalIndex = signalIndex; - if (signalIndex == -1) { - signalIndex = meta->indexOfSignal(QMetaObject::normalizedSignature(signal)); - if (signalIndex == -1) { - qWarning("QSignalTransition: no such signal: %s::%s", - meta->className(), signal.constData()); - return; - } - originalSignalIndex = signalIndex; - } - // The signal index we actually want to connect to is the one - // that is going to be sent, i.e. the non-cloned original index. - while (meta->method(signalIndex).attributes() & QMetaMethod::Cloned) - --signalIndex; - - connectionsMutex.lock(); - QList &connectedSignalIndexes = connections[sender]; - if (connectedSignalIndexes.size() <= signalIndex) - connectedSignalIndexes.resize(signalIndex+1); - if (connectedSignalIndexes.at(signalIndex) == 0) { - if (!signalEventGenerator) - signalEventGenerator = new QSignalEventGenerator(q); - static const int generatorMethodOffset = QSignalEventGenerator::staticMetaObject.methodOffset(); - bool ok = QMetaObject::connect(sender, signalIndex, signalEventGenerator, generatorMethodOffset); - if (!ok) { -#ifdef QSTATEMACHINE_DEBUG - qDebug() << q << ": FAILED to add signal transition from" << transition->sourceState() - << ": ( sender =" << sender << ", signal =" << signal - << ", targets =" << transition->targetStates() << ')'; -#endif - return; - } - } - ++connectedSignalIndexes[signalIndex]; - connectionsMutex.unlock(); - - QSignalTransitionPrivate::get(transition)->signalIndex = signalIndex; - QSignalTransitionPrivate::get(transition)->originalSignalIndex = originalSignalIndex; -#ifdef QSTATEMACHINE_DEBUG - qDebug() << q << ": added signal transition from" << transition->sourceState() - << ": ( sender =" << sender << ", signal =" << signal - << ", targets =" << transition->targetStates() << ')'; -#endif -} - -void QStateMachinePrivate::unregisterSignalTransition(QSignalTransition *transition) -{ - int signalIndex = QSignalTransitionPrivate::get(transition)->signalIndex; - if (signalIndex == -1) - return; // not registered - const QObject *sender = QSignalTransitionPrivate::get(transition)->sender; - QSignalTransitionPrivate::get(transition)->signalIndex = -1; - - connectionsMutex.lock(); - QList &connectedSignalIndexes = connections[sender]; - Q_ASSERT(connectedSignalIndexes.size() > signalIndex); - Q_ASSERT(connectedSignalIndexes.at(signalIndex) != 0); - if (--connectedSignalIndexes[signalIndex] == 0) { - Q_ASSERT(signalEventGenerator != nullptr); - static const int generatorMethodOffset = QSignalEventGenerator::staticMetaObject.methodOffset(); - QMetaObject::disconnect(sender, signalIndex, signalEventGenerator, generatorMethodOffset); - int sum = 0; - for (int i = 0; i < connectedSignalIndexes.size(); ++i) - sum += connectedSignalIndexes.at(i); - if (sum == 0) - connections.remove(sender); - } - connectionsMutex.unlock(); -} - -void QStateMachinePrivate::unregisterAllTransitions() -{ - Q_Q(QStateMachine); - { - QList transitions = rootState()->findChildren(); - for (int i = 0; i < transitions.size(); ++i) { - QSignalTransition *t = transitions.at(i); - if (t->machine() == q) - unregisterSignalTransition(t); - } - } -#if QT_CONFIG(qeventtransition) - { - QList transitions = rootState()->findChildren(); - for (int i = 0; i < transitions.size(); ++i) { - QEventTransition *t = transitions.at(i); - if (t->machine() == q) - unregisterEventTransition(t); - } - } -#endif -} - -#if QT_CONFIG(qeventtransition) -void QStateMachinePrivate::maybeRegisterEventTransition(QEventTransition *transition) -{ - if ((state == Running) && configuration.contains(transition->sourceState())) - registerEventTransition(transition); -} - -void QStateMachinePrivate::registerEventTransition(QEventTransition *transition) -{ - Q_Q(QStateMachine); - if (QEventTransitionPrivate::get(transition)->registered) - return; - if (transition->eventType() >= QEvent::User) { - qWarning("QObject event transitions are not supported for custom types"); - return; - } - QObject *object = QEventTransitionPrivate::get(transition)->object; - if (!object) - return; - QObjectPrivate *od = QObjectPrivate::get(object); - if (!od->extraData || !od->extraData->eventFilters.contains(q)) - object->installEventFilter(q); - ++qobjectEvents[object][transition->eventType()]; - QEventTransitionPrivate::get(transition)->registered = true; -#ifdef QSTATEMACHINE_DEBUG - qDebug() << q << ": added event transition from" << transition->sourceState() - << ": ( object =" << object << ", event =" << transition->eventType() - << ", targets =" << transition->targetStates() << ')'; -#endif -} - -void QStateMachinePrivate::unregisterEventTransition(QEventTransition *transition) -{ - Q_Q(QStateMachine); - if (!QEventTransitionPrivate::get(transition)->registered) - return; - QObject *object = QEventTransitionPrivate::get(transition)->object; - QHash &events = qobjectEvents[object]; - Q_ASSERT(events.value(transition->eventType()) > 0); - if (--events[transition->eventType()] == 0) { - events.remove(transition->eventType()); - int sum = 0; - QHash::const_iterator it; - for (it = events.constBegin(); it != events.constEnd(); ++it) - sum += it.value(); - if (sum == 0) { - qobjectEvents.remove(object); - object->removeEventFilter(q); - } - } - QEventTransitionPrivate::get(transition)->registered = false; -} - -void QStateMachinePrivate::handleFilteredEvent(QObject *watched, QEvent *event) -{ - if (qobjectEvents.value(watched).contains(event->type())) { - postInternalEvent(new QStateMachine::WrappedEvent(watched, handler->cloneEvent(event))); - processEvents(DirectProcessing); - } -} -#endif - -void QStateMachinePrivate::handleTransitionSignal(QObject *sender, int signalIndex, - void **argv) -{ -#ifndef QT_NO_DEBUG - connectionsMutex.lock(); - Q_ASSERT(connections[sender].at(signalIndex) != 0); - connectionsMutex.unlock(); -#endif - const QMetaObject *meta = sender->metaObject(); - QMetaMethod method = meta->method(signalIndex); - int argc = method.parameterCount(); - QList vargs; - vargs.reserve(argc); - for (int i = 0; i < argc; ++i) { - auto type = method.parameterMetaType(i); - vargs.append(QVariant(type, argv[i+1])); - } - -#ifdef QSTATEMACHINE_DEBUG - qDebug() << q_func() << ": sending signal event ( sender =" << sender - << ", signal =" << method.methodSignature().constData() << ')'; -#endif - postInternalEvent(new QStateMachine::SignalEvent(sender, signalIndex, vargs)); - processEvents(DirectProcessing); -} - -/*! - Constructs a new state machine with the given \a parent. -*/ -QStateMachine::QStateMachine(QObject *parent) - : QState(*new QStateMachinePrivate, /*parentState=*/nullptr) -{ - // Can't pass the parent to the QState constructor, as it expects a QState - // But this works as expected regardless of whether parent is a QState or not - setParent(parent); -} - -/*! - \since 5.0 - \deprecated - - Constructs a new state machine with the given \a childMode - and \a parent. - - \warning Do not set the \a childMode to anything else than \l{ExclusiveStates}, otherwise the - state machine is invalid, and might work incorrectly. -*/ -QStateMachine::QStateMachine(QState::ChildMode childMode, QObject *parent) - : QState(*new QStateMachinePrivate, /*parentState=*/nullptr) -{ - Q_D(QStateMachine); - d->childMode = childMode; - setParent(parent); // See comment in constructor above - - if (childMode != ExclusiveStates) { - //### FIXME for Qt6: remove this constructor completely, and hide the childMode property. - // Yes, the StateMachine itself is conceptually a state, but it should only expose a limited - // number of properties. The execution algorithm (in the URL below) treats a state machine - // as a state, but from an API point of view, it's questionable if the QStateMachine should - // inherit from QState. - // - // See function findLCCA in https://www.w3.org/TR/2014/WD-scxml-20140529/#AlgorithmforSCXMLInterpretation - // to see where setting childMode to parallel will break down. - qWarning() << "Invalid childMode for QStateMachine" << this; - } -} - -/*! - \internal -*/ -QStateMachine::QStateMachine(QStateMachinePrivate &dd, QObject *parent) - : QState(dd, /*parentState=*/nullptr) -{ - setParent(parent); -} - -/*! - Destroys this state machine. -*/ -QStateMachine::~QStateMachine() -{ -} - -/*! - \enum QStateMachine::EventPriority - - This enum type specifies the priority of an event posted to the state - machine using postEvent(). - - Events of high priority are processed before events of normal priority. - - \value NormalPriority The event has normal priority. - \value HighPriority The event has high priority. -*/ - -/*! \enum QStateMachine::Error - - This enum type defines errors that can occur in the state machine at run time. When the state - machine encounters an unrecoverable error at run time, it will set the error code returned - by error(), the error message returned by errorString(), and enter an error state based on - the context of the error. - - \value NoError No error has occurred. - \value NoInitialStateError The machine has entered a QState with children which does not have an - initial state set. The context of this error is the state which is missing an initial - state. - \value NoDefaultStateInHistoryStateError The machine has entered a QHistoryState which does not have - a default state set. The context of this error is the QHistoryState which is missing a - default state. - \value NoCommonAncestorForTransitionError The machine has selected a transition whose source - and targets are not part of the same tree of states, and thus are not part of the same - state machine. Commonly, this could mean that one of the states has not been given - any parent or added to any machine. The context of this error is the source state of - the transition. - \value StateMachineChildModeSetToParallelError The machine's \l childMode - property was set to \l{QState::ParallelStates}. This is illegal. - Only states may be declared as parallel, not the state machine - itself. This enum value was added in Qt 5.14. - - \sa setErrorState() -*/ - -/*! - Returns the error code of the last error that occurred in the state machine. -*/ -QStateMachine::Error QStateMachine::error() const -{ - Q_D(const QStateMachine); - return d->error; -} - -/*! - Returns the error string of the last error that occurred in the state machine. -*/ -QString QStateMachine::errorString() const -{ - Q_D(const QStateMachine); - return d->errorString; -} - -/*! - Clears the error string and error code of the state machine. -*/ -void QStateMachine::clearError() -{ - Q_D(QStateMachine); - d->errorString.clear(); - d->error = NoError; -} - -/*! - Returns the restore policy of the state machine. - - \sa setGlobalRestorePolicy() -*/ -QState::RestorePolicy QStateMachine::globalRestorePolicy() const -{ - Q_D(const QStateMachine); - return d->globalRestorePolicy; -} - -/*! - Sets the restore policy of the state machine to \a restorePolicy. The default - restore policy is QState::DontRestoreProperties. - - \sa globalRestorePolicy() -*/ -void QStateMachine::setGlobalRestorePolicy(QState::RestorePolicy restorePolicy) -{ - Q_D(QStateMachine); - d->globalRestorePolicy = restorePolicy; -} - -/*! - Adds the given \a state to this state machine. The state becomes a top-level - state and the state machine takes ownership of the state. - - If the state is already in a different machine, it will first be removed - from its old machine, and then added to this machine. - - \sa removeState(), setInitialState() -*/ -void QStateMachine::addState(QAbstractState *state) -{ - if (!state) { - qWarning("QStateMachine::addState: cannot add null state"); - return; - } - if (QAbstractStatePrivate::get(state)->machine() == this) { - qWarning("QStateMachine::addState: state has already been added to this machine"); - return; - } - state->setParent(this); -} - -/*! - Removes the given \a state from this state machine. The state machine - releases ownership of the state. - - \sa addState() -*/ -void QStateMachine::removeState(QAbstractState *state) -{ - if (!state) { - qWarning("QStateMachine::removeState: cannot remove null state"); - return; - } - if (QAbstractStatePrivate::get(state)->machine() != this) { - qWarning("QStateMachine::removeState: state %p's machine (%p)" - " is different from this machine (%p)", - state, QAbstractStatePrivate::get(state)->machine(), this); - return; - } - state->setParent(nullptr); -} - -bool QStateMachine::isRunning() const -{ - Q_D(const QStateMachine); - return (d->state == QStateMachinePrivate::Running); -} - -/*! - Starts this state machine. The machine will reset its configuration and - transition to the initial state. When a final top-level state (QFinalState) - is entered, the machine will emit the finished() signal. - - \note A state machine will not run without a running event loop, such as - the main application event loop started with QCoreApplication::exec() or - QApplication::exec(). - - \sa started(), finished(), stop(), initialState(), setRunning() -*/ -void QStateMachine::start() -{ - Q_D(QStateMachine); - - if ((childMode() == QState::ExclusiveStates) && (initialState() == nullptr)) { - qWarning("QStateMachine::start: No initial state set for machine. Refusing to start."); - return; - } - - switch (d->state) { - case QStateMachinePrivate::NotRunning: - d->state = QStateMachinePrivate::Starting; - QMetaObject::invokeMethod(this, "_q_start", Qt::QueuedConnection); - break; - case QStateMachinePrivate::Starting: - break; - case QStateMachinePrivate::Running: - qWarning("QStateMachine::start(): already running"); - break; - } -} - -/*! - Stops this state machine. The state machine will stop processing events and - then emit the stopped() signal. - - \sa stopped(), start(), setRunning() -*/ -void QStateMachine::stop() -{ - Q_D(QStateMachine); - switch (d->state) { - case QStateMachinePrivate::NotRunning: - break; - case QStateMachinePrivate::Starting: - // the machine will exit as soon as it enters the event processing loop - d->stop = true; - break; - case QStateMachinePrivate::Running: - d->stop = true; - d->processEvents(QStateMachinePrivate::QueuedProcessing); - break; - } -} - -void QStateMachine::setRunning(bool running) -{ - if (running) - start(); - else - stop(); -} - -/*! - \threadsafe - - Posts the given \a event of the given \a priority for processing by this - state machine. - - This function returns immediately. The event is added to the state machine's - event queue. Events are processed in the order posted. The state machine - takes ownership of the event and deletes it once it has been processed. - - You can only post events when the state machine is running or when it is starting up. - - \sa postDelayedEvent() -*/ -void QStateMachine::postEvent(QEvent *event, EventPriority priority) -{ - Q_D(QStateMachine); - switch (d->state) { - case QStateMachinePrivate::Running: - case QStateMachinePrivate::Starting: - break; - default: - qWarning("QStateMachine::postEvent: cannot post event when the state machine is not running"); - return; - } - if (!event) { - qWarning("QStateMachine::postEvent: cannot post null event"); - return; - } -#ifdef QSTATEMACHINE_DEBUG - qDebug() << this << ": posting event" << event; -#endif - switch (priority) { - case NormalPriority: - d->postExternalEvent(event); - break; - case HighPriority: - d->postInternalEvent(event); - break; - } - d->processEvents(QStateMachinePrivate::QueuedProcessing); -} - -/*! - \threadsafe - - Posts the given \a event for processing by this state machine, with the - given \a delay in milliseconds. Returns an identifier associated with the - delayed event, or -1 if the event could not be posted. - - This function returns immediately. When the delay has expired, the event - will be added to the state machine's event queue for processing. The state - machine takes ownership of the event and deletes it once it has been - processed. - - You can only post events when the state machine is running. - - \sa cancelDelayedEvent(), postEvent() -*/ -int QStateMachine::postDelayedEvent(QEvent *event, int delay) -{ - Q_D(QStateMachine); - if (d->state != QStateMachinePrivate::Running) { - qWarning("QStateMachine::postDelayedEvent: cannot post event when the state machine is not running"); - return -1; - } - if (!event) { - qWarning("QStateMachine::postDelayedEvent: cannot post null event"); - return -1; - } - if (delay < 0) { - qWarning("QStateMachine::postDelayedEvent: delay cannot be negative"); - return -1; - } -#ifdef QSTATEMACHINE_DEBUG - qDebug() << this << ": posting event" << event << "with delay" << delay; -#endif - QMutexLocker locker(&d->delayedEventsMutex); - int id = d->delayedEventIdFreeList.next(); - bool inMachineThread = (QThread::currentThread() == thread()); - int timerId = inMachineThread ? startTimer(delay) : 0; - if (inMachineThread && !timerId) { - qWarning("QStateMachine::postDelayedEvent: failed to start timer with interval %d", delay); - d->delayedEventIdFreeList.release(id); - return -1; - } - QStateMachinePrivate::DelayedEvent delayedEvent(event, timerId); - d->delayedEvents.insert(id, delayedEvent); - if (timerId) { - d->timerIdToDelayedEventId.insert(timerId, id); - } else { - Q_ASSERT(!inMachineThread); - QMetaObject::invokeMethod(this, "_q_startDelayedEventTimer", - Qt::QueuedConnection, - Q_ARG(int, id), - Q_ARG(int, delay)); - } - return id; -} - -/*! - \threadsafe - - Cancels the delayed event identified by the given \a id. The id should be a - value returned by a call to postDelayedEvent(). Returns \c true if the event - was successfully cancelled, otherwise returns \c false. - - \sa postDelayedEvent() -*/ -bool QStateMachine::cancelDelayedEvent(int id) -{ - Q_D(QStateMachine); - if (d->state != QStateMachinePrivate::Running) { - qWarning("QStateMachine::cancelDelayedEvent: the machine is not running"); - return false; - } - QMutexLocker locker(&d->delayedEventsMutex); - QStateMachinePrivate::DelayedEvent e = d->delayedEvents.take(id); - if (!e.event) - return false; - if (e.timerId) { - d->timerIdToDelayedEventId.remove(e.timerId); - bool inMachineThread = (QThread::currentThread() == thread()); - if (inMachineThread) { - killTimer(e.timerId); - d->delayedEventIdFreeList.release(id); - } else { - QMetaObject::invokeMethod(this, "_q_killDelayedEventTimer", - Qt::QueuedConnection, - Q_ARG(int, id), - Q_ARG(int, e.timerId)); - } - } else { - // Cancellation will be detected in pending _q_startDelayedEventTimer() call - } - delete e.event; - return true; -} - -/*! - Returns the maximal consistent set of states (including parallel and final - states) that this state machine is currently in. If a state \c s is in the - configuration, it is always the case that the parent of \c s is also in - c. Note, however, that the machine itself is not an explicit member of the - configuration. -*/ -QSet QStateMachine::configuration() const -{ - Q_D(const QStateMachine); - return d->configuration; -} - -/*! - \fn QStateMachine::started() - - This signal is emitted when the state machine has entered its initial state - (QStateMachine::initialState). - - \sa QStateMachine::finished(), QStateMachine::start() -*/ - -/*! - \fn QStateMachine::stopped() - - This signal is emitted when the state machine has stopped. - - \sa QStateMachine::stop(), QStateMachine::finished() -*/ - -/*! - \reimp -*/ -bool QStateMachine::event(QEvent *e) -{ - Q_D(QStateMachine); - if (e->type() == QEvent::Timer) { - QTimerEvent *te = static_cast(e); - int tid = te->timerId(); - if (d->state != QStateMachinePrivate::Running) { - // This event has been cancelled already - QMutexLocker locker(&d->delayedEventsMutex); - Q_ASSERT(!d->timerIdToDelayedEventId.contains(tid)); - return true; - } - d->delayedEventsMutex.lock(); - int id = d->timerIdToDelayedEventId.take(tid); - QStateMachinePrivate::DelayedEvent ee = d->delayedEvents.take(id); - if (ee.event != nullptr) { - Q_ASSERT(ee.timerId == tid); - killTimer(tid); - d->delayedEventIdFreeList.release(id); - d->delayedEventsMutex.unlock(); - d->postExternalEvent(ee.event); - d->processEvents(QStateMachinePrivate::DirectProcessing); - return true; - } else { - d->delayedEventsMutex.unlock(); - } - } - return QState::event(e); -} - -#if QT_CONFIG(qeventtransition) -/*! - \reimp -*/ -bool QStateMachine::eventFilter(QObject *watched, QEvent *event) -{ - Q_D(QStateMachine); - d->handleFilteredEvent(watched, event); - return false; -} -#endif - -/*! - \internal - - This function is called when the state machine is about to select - transitions based on the given \a event. - - The default implementation does nothing. -*/ -void QStateMachine::beginSelectTransitions(QEvent *event) -{ - Q_UNUSED(event); -} - -/*! - \internal - - This function is called when the state machine has finished selecting - transitions based on the given \a event. - - The default implementation does nothing. -*/ -void QStateMachine::endSelectTransitions(QEvent *event) -{ - Q_UNUSED(event); -} - -/*! - \internal - - This function is called when the state machine is about to do a microstep. - - The default implementation does nothing. -*/ -void QStateMachine::beginMicrostep(QEvent *event) -{ - Q_UNUSED(event); -} - -/*! - \internal - - This function is called when the state machine has finished doing a - microstep. - - The default implementation does nothing. -*/ -void QStateMachine::endMicrostep(QEvent *event) -{ - Q_UNUSED(event); -} - -/*! - \reimp - This function will call start() to start the state machine. -*/ -void QStateMachine::onEntry(QEvent *event) -{ - start(); - QState::onEntry(event); -} - -/*! - \reimp - This function will call stop() to stop the state machine and - subsequently emit the stopped() signal. -*/ -void QStateMachine::onExit(QEvent *event) -{ - stop(); - QState::onExit(event); -} - -#if QT_CONFIG(animation) - -/*! - Returns whether animations are enabled for this state machine. -*/ -bool QStateMachine::isAnimated() const -{ - Q_D(const QStateMachine); - return d->animated; -} - -/*! - Sets whether animations are \a enabled for this state machine. -*/ -void QStateMachine::setAnimated(bool enabled) -{ - Q_D(QStateMachine); - d->animated = enabled; -} - -/*! - Adds a default \a animation to be considered for any transition. -*/ -void QStateMachine::addDefaultAnimation(QAbstractAnimation *animation) -{ - Q_D(QStateMachine); - d->defaultAnimations.append(animation); -} - -/*! - Returns the list of default animations that will be considered for any transition. -*/ -QList QStateMachine::defaultAnimations() const -{ - Q_D(const QStateMachine); - return d->defaultAnimations; -} - -/*! - Removes \a animation from the list of default animations. -*/ -void QStateMachine::removeDefaultAnimation(QAbstractAnimation *animation) -{ - Q_D(QStateMachine); - d->defaultAnimations.removeAll(animation); -} - -#endif // animation - -void QSignalEventGenerator::execute(QMethodRawArguments a) -{ - auto machinePrivate = QStateMachinePrivate::get(qobject_cast(parent())); - if (machinePrivate->state != QStateMachinePrivate::Running) - return; - int signalIndex = senderSignalIndex(); - Q_ASSERT(signalIndex != -1); - machinePrivate->handleTransitionSignal(sender(), signalIndex, a.arguments); -} - -QSignalEventGenerator::QSignalEventGenerator(QStateMachine *parent) - : QObject(parent) -{ -} - -/*! - \class QStateMachine::SignalEvent - \inmodule QtCore - - \brief The SignalEvent class represents a Qt signal event. - - \since 4.6 - \ingroup statemachine - - A signal event is generated by a QStateMachine in response to a Qt - signal. The QSignalTransition class provides a transition associated with a - signal event. QStateMachine::SignalEvent is part of \l{The State Machine Framework}. - - The sender() function returns the object that generated the signal. The - signalIndex() function returns the index of the signal. The arguments() - function returns the arguments of the signal. - - \sa QSignalTransition -*/ - -/*! - \internal - - Constructs a new SignalEvent object with the given \a sender, \a - signalIndex and \a arguments. -*/ -QStateMachine::SignalEvent::SignalEvent(QObject *sender, int signalIndex, - const QList &arguments) - : QEvent(QEvent::StateMachineSignal), m_sender(sender), - m_signalIndex(signalIndex), m_arguments(arguments) -{ -} - -/*! - Destroys this SignalEvent. -*/ -QStateMachine::SignalEvent::~SignalEvent() -{ -} - -/*! - \fn QStateMachine::SignalEvent::sender() const - - Returns the object that emitted the signal. - - \sa QObject::sender() -*/ - -/*! - \fn QStateMachine::SignalEvent::signalIndex() const - - Returns the index of the signal. - - \sa QMetaObject::indexOfSignal(), QMetaObject::method() -*/ - -/*! - \fn QStateMachine::SignalEvent::arguments() const - - Returns the arguments of the signal. -*/ - - -/*! - \class QStateMachine::WrappedEvent - \inmodule QtCore - - \brief The WrappedEvent class inherits QEvent and holds a clone of an event associated with a QObject. - - \since 4.6 - \ingroup statemachine - - A wrapped event is generated by a QStateMachine in response to a Qt - event. The QEventTransition class provides a transition associated with a - such an event. QStateMachine::WrappedEvent is part of \l{The State Machine - Framework}. - - The object() function returns the object that generated the event. The - event() function returns a clone of the original event. - - \sa QEventTransition -*/ - -/*! - \internal - - Constructs a new WrappedEvent object with the given \a object - and \a event. - - The WrappedEvent object takes ownership of \a event. -*/ -QStateMachine::WrappedEvent::WrappedEvent(QObject *object, QEvent *event) - : QEvent(QEvent::StateMachineWrapped), m_object(object), m_event(event) -{ -} - -/*! - Destroys this WrappedEvent. -*/ -QStateMachine::WrappedEvent::~WrappedEvent() -{ - delete m_event; -} - -/*! - \fn QStateMachine::WrappedEvent::object() const - - Returns the object that the event is associated with. -*/ - -/*! - \fn QStateMachine::WrappedEvent::event() const - - Returns a clone of the original event. -*/ - -/*! - \fn QStateMachine::runningChanged(bool running) - \since 5.4 - - This signal is emitted when the running property is changed with \a running as argument. - - \sa QStateMachine::running -*/ - -/*! - \fn QStateMachine::postDelayedEvent(QEvent *event, std::chrono::milliseconds delay) - \since 5.15 - \overload - \threadsafe - - Posts the given \a event for processing by this state machine, with the - given \a delay in milliseconds. Returns an identifier associated with the - delayed event, or -1 if the event could not be posted. - - This function returns immediately. When the delay has expired, the event - will be added to the state machine's event queue for processing. The state - machine takes ownership of the event and deletes it once it has been - processed. - - You can only post events when the state machine is running. - - \sa cancelDelayedEvent(), postEvent() -*/ - -QT_END_NAMESPACE - -#include "qstatemachine.moc" -#include "moc_qstatemachine.cpp" diff --git a/src/corelib/statemachine/qstatemachine.h b/src/corelib/statemachine/qstatemachine.h deleted file mode 100644 index b3c87a959b7..00000000000 --- a/src/corelib/statemachine/qstatemachine.h +++ /dev/null @@ -1,199 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSTATEMACHINE_H -#define QSTATEMACHINE_H - -#include - -#include -#include -#include -#include -#include - -#if __has_include() -# include -#endif - -QT_REQUIRE_CONFIG(statemachine); - -QT_BEGIN_NAMESPACE - -class QStateMachinePrivate; -class QAbstractAnimation; -class Q_CORE_EXPORT QStateMachine : public QState -{ - Q_OBJECT - Q_PROPERTY(QString errorString READ errorString) - Q_PROPERTY(QState::RestorePolicy globalRestorePolicy READ globalRestorePolicy WRITE setGlobalRestorePolicy) - Q_PROPERTY(bool running READ isRunning WRITE setRunning NOTIFY runningChanged) -#if QT_CONFIG(animation) - Q_PROPERTY(bool animated READ isAnimated WRITE setAnimated) -#endif -public: - class Q_CORE_EXPORT SignalEvent : public QEvent - { - public: - SignalEvent(QObject *sender, int signalIndex, - const QList &arguments); - ~SignalEvent(); - - inline QObject *sender() const { return m_sender; } - inline int signalIndex() const { return m_signalIndex; } - inline QList arguments() const { return m_arguments; } - - private: - QObject *m_sender; - int m_signalIndex; - QList m_arguments; - - friend class QSignalTransitionPrivate; - }; - - class Q_CORE_EXPORT WrappedEvent : public QEvent - { - public: - WrappedEvent(QObject *object, QEvent *event); - ~WrappedEvent(); - - inline QObject *object() const { return m_object; } - inline QEvent *event() const { return m_event; } - - private: - QObject *m_object; - QEvent *m_event; - }; - - enum EventPriority { - NormalPriority, - HighPriority - }; - - enum Error { - NoError, - NoInitialStateError, - NoDefaultStateInHistoryStateError, - NoCommonAncestorForTransitionError, - StateMachineChildModeSetToParallelError - }; - - explicit QStateMachine(QObject *parent = nullptr); - explicit QStateMachine(QState::ChildMode childMode, QObject *parent = nullptr); - ~QStateMachine(); - - void addState(QAbstractState *state); - void removeState(QAbstractState *state); - - Error error() const; - QString errorString() const; - void clearError(); - - bool isRunning() const; - -#if QT_CONFIG(animation) - bool isAnimated() const; - void setAnimated(bool enabled); - - void addDefaultAnimation(QAbstractAnimation *animation); - QList defaultAnimations() const; - void removeDefaultAnimation(QAbstractAnimation *animation); -#endif // animation - - QState::RestorePolicy globalRestorePolicy() const; - void setGlobalRestorePolicy(QState::RestorePolicy restorePolicy); - - void postEvent(QEvent *event, EventPriority priority = NormalPriority); - int postDelayedEvent(QEvent *event, int delay); - bool cancelDelayedEvent(int id); - - QSet configuration() const; - -#if QT_CONFIG(qeventtransition) - bool eventFilter(QObject *watched, QEvent *event) override; -#endif - -#if __has_include() || defined(Q_QDOC) - int postDelayedEvent(QEvent *event, std::chrono::milliseconds delay) - { - return postDelayedEvent(event, int(delay.count())); - } -#endif - -public Q_SLOTS: - void start(); - void stop(); - void setRunning(bool running); - -Q_SIGNALS: - void started(QPrivateSignal); - void stopped(QPrivateSignal); - void runningChanged(bool running); - - -protected: - void onEntry(QEvent *event) override; - void onExit(QEvent *event) override; - - virtual void beginSelectTransitions(QEvent *event); - virtual void endSelectTransitions(QEvent *event); - - virtual void beginMicrostep(QEvent *event); - virtual void endMicrostep(QEvent *event); - - bool event(QEvent *e) override; - -protected: - QStateMachine(QStateMachinePrivate &dd, QObject *parent); - -private: - Q_DISABLE_COPY(QStateMachine) - Q_DECLARE_PRIVATE(QStateMachine) - Q_PRIVATE_SLOT(d_func(), void _q_start()) - Q_PRIVATE_SLOT(d_func(), void _q_process()) -#if QT_CONFIG(animation) - Q_PRIVATE_SLOT(d_func(), void _q_animationFinished()) -#endif - Q_PRIVATE_SLOT(d_func(), void _q_startDelayedEventTimer(int, int)) - Q_PRIVATE_SLOT(d_func(), void _q_killDelayedEventTimer(int, int)) -}; - -QT_END_NAMESPACE - -#endif diff --git a/src/corelib/statemachine/qstatemachine_p.h b/src/corelib/statemachine/qstatemachine_p.h deleted file mode 100644 index d73313570ac..00000000000 --- a/src/corelib/statemachine/qstatemachine_p.h +++ /dev/null @@ -1,333 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSTATEMACHINE_P_H -#define QSTATEMACHINE_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include "private/qstate_p.h" - -#include -#include -#include -#include -#include -#include -#include -#include - -QT_REQUIRE_CONFIG(statemachine); - -QT_BEGIN_NAMESPACE - -class QEvent; -#if QT_CONFIG(qeventtransition) -class QEventTransition; -#endif -class QSignalEventGenerator; -class QSignalTransition; -class QAbstractState; -class QAbstractTransition; -class QFinalState; -class QHistoryState; -class QState; - -#if QT_CONFIG(animation) -class QAbstractAnimation; -#endif - -struct CalculationCache; -class QStateMachine; -class Q_CORE_EXPORT QStateMachinePrivate : public QStatePrivate -{ - Q_DECLARE_PUBLIC(QStateMachine) -public: - enum State { - NotRunning, - Starting, - Running - }; - enum EventProcessingMode { - DirectProcessing, - QueuedProcessing - }; - enum StopProcessingReason { - EventQueueEmpty, - Finished, - Stopped - }; - - QStateMachinePrivate(); - ~QStateMachinePrivate(); - - static QStateMachinePrivate *get(QStateMachine *q) - { return q ? q->d_func() : nullptr; } - - QState *findLCA(const QList &states, bool onlyCompound = false); - QState *findLCCA(const QList &states); - - static bool transitionStateEntryLessThan(QAbstractTransition *t1, QAbstractTransition *t2); - static bool stateEntryLessThan(QAbstractState *s1, QAbstractState *s2); - static bool stateExitLessThan(QAbstractState *s1, QAbstractState *s2); - - QAbstractState *findErrorState(QAbstractState *context); - void setError(QStateMachine::Error error, QAbstractState *currentContext); - - // private slots - void _q_start(); - void _q_process(); -#if QT_CONFIG(animation) - void _q_animationFinished(); -#endif - void _q_startDelayedEventTimer(int id, int delay); - void _q_killDelayedEventTimer(int id, int timerId); - - QState *rootState() const; - - void clearHistory(); - QAbstractTransition *createInitialTransition() const; - - void removeConflictingTransitions(QList &enabledTransitions, CalculationCache *cache); - void microstep(QEvent *event, const QList &transitionList, CalculationCache *cache); - QList selectTransitions(QEvent *event, CalculationCache *cache); - virtual void noMicrostep(); - virtual void processedPendingEvents(bool didChange); - virtual void beginMacrostep(); - virtual void endMacrostep(bool didChange); - virtual void exitInterpreter(); - virtual void exitStates(QEvent *event, const QList &statesToExit_sorted, - const QHash> &assignmentsForEnteredStates); - QList computeExitSet(const QList &enabledTransitions, CalculationCache *cache); - QSet computeExitSet_Unordered(const QList &enabledTransitions, CalculationCache *cache); - QSet computeExitSet_Unordered(QAbstractTransition *t, CalculationCache *cache); - void executeTransitionContent(QEvent *event, const QList &transitionList); - virtual void enterStates(QEvent *event, const QList &exitedStates_sorted, - const QList &statesToEnter_sorted, - const QSet &statesForDefaultEntry, - QHash> &propertyAssignmentsForState -#if QT_CONFIG(animation) - , const QList &selectedAnimations -#endif - ); - QList computeEntrySet(const QList &enabledTransitions, - QSet &statesForDefaultEntry, CalculationCache *cache); - QAbstractState *getTransitionDomain(QAbstractTransition *t, - const QList &effectiveTargetStates, - CalculationCache *cache); - void addDescendantStatesToEnter(QAbstractState *state, - QSet &statesToEnter, - QSet &statesForDefaultEntry); - void addAncestorStatesToEnter(QAbstractState *s, QAbstractState *ancestor, - QSet &statesToEnter, - QSet &statesForDefaultEntry); - - static QState *toStandardState(QAbstractState *state); - static const QState *toStandardState(const QAbstractState *state); - static QFinalState *toFinalState(QAbstractState *state); - static QHistoryState *toHistoryState(QAbstractState *state); - - bool isInFinalState(QAbstractState *s) const; - static bool isFinal(const QAbstractState *s); - static bool isParallel(const QAbstractState *s); - bool isCompound(const QAbstractState *s) const; - bool isAtomic(const QAbstractState *s) const; - - void goToState(QAbstractState *targetState); - - void registerTransitions(QAbstractState *state); - void maybeRegisterTransition(QAbstractTransition *transition); - void registerTransition(QAbstractTransition *transition); - void maybeRegisterSignalTransition(QSignalTransition *transition); - void registerSignalTransition(QSignalTransition *transition); - void unregisterSignalTransition(QSignalTransition *transition); - void registerMultiThreadedSignalTransitions(); -#if QT_CONFIG(qeventtransition) - void maybeRegisterEventTransition(QEventTransition *transition); - void registerEventTransition(QEventTransition *transition); - void unregisterEventTransition(QEventTransition *transition); - void handleFilteredEvent(QObject *watched, QEvent *event); -#endif - void unregisterTransition(QAbstractTransition *transition); - void unregisterAllTransitions(); - void handleTransitionSignal(QObject *sender, int signalIndex, - void **args); - - void postInternalEvent(QEvent *e); - void postExternalEvent(QEvent *e); - QEvent *dequeueInternalEvent(); - QEvent *dequeueExternalEvent(); - bool isInternalEventQueueEmpty(); - bool isExternalEventQueueEmpty(); - void processEvents(EventProcessingMode processingMode); - void cancelAllDelayedEvents(); - - virtual void emitStateFinished(QState *forState, QFinalState *guiltyState); - virtual void startupHook(); - -#ifndef QT_NO_PROPERTIES - class RestorableId { - QPointer guard; - QObject *obj; - QByteArray prop; - friend size_t qHash(const RestorableId &key, size_t seed) - noexcept(noexcept(qHash(std::declval()))) - { return qHash(qMakePair(key.obj, key.prop), seed); } - friend bool operator==(const RestorableId &lhs, const RestorableId &rhs) noexcept - { return lhs.obj == rhs.obj && lhs.prop == rhs.prop; } - friend bool operator!=(const RestorableId &lhs, const RestorableId &rhs) noexcept - { return !operator==(lhs, rhs); } - public: - explicit RestorableId(QObject *o, QByteArray p) noexcept : guard(o), obj(o), prop(std::move(p)) {} - QObject *object() const noexcept { return guard; } - QByteArray propertyName() const noexcept { return prop; } - }; - QHash > registeredRestorablesForState; - bool hasRestorable(QAbstractState *state, QObject *object, const QByteArray &propertyName) const; - QVariant savedValueForRestorable(const QList &exitedStates_sorted, - QObject *object, const QByteArray &propertyName) const; - void registerRestorable(QAbstractState *state, QObject *object, const QByteArray &propertyName, - const QVariant &value); - void unregisterRestorables(const QList &states, QObject *object, - const QByteArray &propertyName); - QList restorablesToPropertyList(const QHash &restorables) const; - QHash computePendingRestorables(const QList &statesToExit_sorted) const; - QHash> computePropertyAssignments( - const QList &statesToEnter_sorted, - QHash &pendingRestorables) const; -#endif - - State state; - bool processing; - bool processingScheduled; - bool stop; - StopProcessingReason stopProcessingReason; - QSet configuration; - QList internalEventQueue; - QList externalEventQueue; - QMutex internalEventMutex; - QMutex externalEventMutex; - - QStateMachine::Error error; - QState::RestorePolicy globalRestorePolicy; - - QString errorString; - QSet pendingErrorStates; - QSet pendingErrorStatesForDefaultEntry; - -#if QT_CONFIG(animation) - bool animated; - - struct InitializeAnimationResult { - QList handledAnimations; - QList localResetEndValues; - - void swap(InitializeAnimationResult &other) noexcept - { - qSwap(handledAnimations, other.handledAnimations); - qSwap(localResetEndValues, other.localResetEndValues); - } - }; - - InitializeAnimationResult - initializeAnimation(QAbstractAnimation *abstractAnimation, - const QPropertyAssignment &prop); - - QHash > animationsForState; - QHash propertyForAnimation; - QHash stateForAnimation; - QSet resetAnimationEndValues; - - QList defaultAnimations; - QMultiHash defaultAnimationsForSource; - QMultiHash defaultAnimationsForTarget; - - QList selectAnimations(const QList &transitionList) const; - void terminateActiveAnimations(QAbstractState *state, - const QHash> &assignmentsForEnteredStates); - void initializeAnimations(QAbstractState *state, const QList &selectedAnimations, - const QList &exitedStates_sorted, - QHash> &assignmentsForEnteredStates); -#endif // animation - - QSignalEventGenerator *signalEventGenerator; - - QHash> connections; - QMutex connectionsMutex; -#if QT_CONFIG(qeventtransition) - QHash > qobjectEvents; -#endif - QFreeList delayedEventIdFreeList; - struct DelayedEvent { - QEvent *event; - int timerId; - DelayedEvent(QEvent *e, int tid) - : event(e), timerId(tid) {} - DelayedEvent() - : event(nullptr), timerId(0) {} - }; - QHash delayedEvents; - QHash timerIdToDelayedEventId; - QMutex delayedEventsMutex; - - typedef QEvent* (*f_cloneEvent)(QEvent*); - struct Handler { - f_cloneEvent cloneEvent; - }; - - static const Handler *handler; -}; -#if QT_CONFIG(animation) -Q_DECLARE_SHARED(QStateMachinePrivate::InitializeAnimationResult) -#endif - -Q_CORE_EXPORT const QStateMachinePrivate::Handler *qcoreStateMachineHandler(); - -QT_END_NAMESPACE - -#endif diff --git a/src/corelib/statemachine/statemachine.pri b/src/corelib/statemachine/statemachine.pri deleted file mode 100644 index ee701ebc37d..00000000000 --- a/src/corelib/statemachine/statemachine.pri +++ /dev/null @@ -1,33 +0,0 @@ -!qtConfig(statemachine): return() - -HEADERS += $$PWD/qstatemachine.h \ - $$PWD/qstatemachine_p.h \ - $$PWD/qsignaleventgenerator_p.h \ - $$PWD/qabstractstate.h \ - $$PWD/qabstractstate_p.h \ - $$PWD/qstate.h \ - $$PWD/qstate_p.h \ - $$PWD/qfinalstate.h \ - $$PWD/qfinalstate_p.h \ - $$PWD/qhistorystate.h \ - $$PWD/qhistorystate_p.h \ - $$PWD/qabstracttransition.h \ - $$PWD/qabstracttransition_p.h \ - $$PWD/qsignaltransition.h \ - $$PWD/qsignaltransition_p.h - -SOURCES += $$PWD/qstatemachine.cpp \ - $$PWD/qabstractstate.cpp \ - $$PWD/qstate.cpp \ - $$PWD/qfinalstate.cpp \ - $$PWD/qhistorystate.cpp \ - $$PWD/qabstracttransition.cpp \ - $$PWD/qsignaltransition.cpp - -qtConfig(qeventtransition) { - HEADERS += \ - $$PWD/qeventtransition.h \ - $$PWD/qeventtransition_p.h - SOURCES += \ - $$PWD/qeventtransition.cpp -} diff --git a/src/gui/.prev_CMakeLists.txt b/src/gui/.prev_CMakeLists.txt index c161cedeaa9..8a93a8752af 100644 --- a/src/gui/.prev_CMakeLists.txt +++ b/src/gui/.prev_CMakeLists.txt @@ -39,6 +39,7 @@ qt_add_module(Gui kernel/qgenericplugin.cpp kernel/qgenericplugin.h kernel/qgenericpluginfactory.cpp kernel/qgenericpluginfactory.h kernel/qguiapplication.cpp kernel/qguiapplication.h kernel/qguiapplication_p.h + kernel/qguistatemachine.cpp kernel/qguivariant.cpp kernel/qhighdpiscaling.cpp kernel/qhighdpiscaling_p.h kernel/qinputdevice.cpp kernel/qinputdevice.h kernel/qinputdevice_p.h diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index d125d0dc0c7..79f3bafcd54 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -90,6 +90,7 @@ qt_add_module(Gui kernel/qgenericplugin.cpp kernel/qgenericplugin.h kernel/qgenericpluginfactory.cpp kernel/qgenericpluginfactory.h kernel/qguiapplication.cpp kernel/qguiapplication.h kernel/qguiapplication_p.h + kernel/qguistatemachine.cpp kernel/qguivariant.cpp kernel/qhighdpiscaling.cpp kernel/qhighdpiscaling_p.h kernel/qinputdevice.cpp kernel/qinputdevice.h kernel/qinputdevice_p.h diff --git a/src/gui/kernel/kernel.pri b/src/gui/kernel/kernel.pri index c86489e9faf..011e0ce00d7 100644 --- a/src/gui/kernel/kernel.pri +++ b/src/gui/kernel/kernel.pri @@ -128,7 +128,8 @@ SOURCES += \ kernel/qplatformgraphicsbufferhelper.cpp \ kernel/qinputdevicemanager.cpp \ kernel/qhighdpiscaling.cpp \ - kernel/qtestsupport_gui.cpp + kernel/qtestsupport_gui.cpp \ + kernel/qguistatemachine.cpp qtConfig(action) { HEADERS += \ diff --git a/src/gui/kernel/qguiapplication_p.h b/src/gui/kernel/qguiapplication_p.h index 48fe62ad980..7019c55fac0 100644 --- a/src/gui/kernel/qguiapplication_p.h +++ b/src/gui/kernel/qguiapplication_p.h @@ -331,6 +331,7 @@ public: #endif static void updatePalette(); + QEvent *cloneEvent(QEvent *e) override; protected: virtual void notifyThemeChanged(); diff --git a/src/widgets/statemachine/qguistatemachine.cpp b/src/gui/kernel/qguistatemachine.cpp similarity index 67% rename from src/widgets/statemachine/qguistatemachine.cpp rename to src/gui/kernel/qguistatemachine.cpp index b310da5781c..dacfa7793a2 100644 --- a/src/widgets/statemachine/qguistatemachine.cpp +++ b/src/gui/kernel/qguistatemachine.cpp @@ -37,19 +37,14 @@ ** ****************************************************************************/ -#include -#include #include -#include -#if QT_CONFIG(graphicsview) -#include -#endif +#include + +#include "private/qguiapplication_p.h" QT_BEGIN_NAMESPACE -Q_CORE_EXPORT const QStateMachinePrivate::Handler *qcoreStateMachineHandler(); - -static QEvent *cloneEvent(QEvent *e) +QEvent *QGuiApplicationPrivate::cloneEvent(QEvent *e) { switch (e->type()) { case QEvent::MouseButtonPress: @@ -226,10 +221,7 @@ static QEvent *cloneEvent(QEvent *e) return new QHelpEvent(*static_cast(e)); case QEvent::WhatsThis: return new QHelpEvent(*static_cast(e)); -#if QT_CONFIG(statustip) - case QEvent::StatusTip: - return new QStatusTipEvent(*static_cast(e)); -#endif // QT_CONFIG(statustip) + #ifndef QT_NO_ACTION case QEvent::ActionChanged: case QEvent::ActionAdded: @@ -251,11 +243,6 @@ static QEvent *cloneEvent(QEvent *e) return new QWhatsThisClickedEvent(*static_cast(e)); #endif // QT_CONFIG(whatsthis) -#if QT_CONFIG(toolbar) - case QEvent::ToolBarChange: - return new QToolBarChangeEvent(*static_cast(e)); -#endif // QT_CONFIG(toolbar) - case QEvent::ApplicationActivate: return new QEvent(*e); case QEvent::ApplicationDeactivate: @@ -288,87 +275,7 @@ static QEvent *cloneEvent(QEvent *e) case QEvent::ZeroTimerEvent: Q_ASSERT_X(false, "cloneEvent()", "not implemented"); break; -#if QT_CONFIG(graphicsview) - case QEvent::GraphicsSceneMouseMove: - case QEvent::GraphicsSceneMousePress: - case QEvent::GraphicsSceneMouseRelease: - case QEvent::GraphicsSceneMouseDoubleClick: { - QGraphicsSceneMouseEvent *me = static_cast(e); - QGraphicsSceneMouseEvent *me2 = new QGraphicsSceneMouseEvent(me->type()); - me2->setWidget(me->widget()); - me2->setPos(me->pos()); - me2->setScenePos(me->scenePos()); - me2->setScreenPos(me->screenPos()); -// ### for all buttons - me2->setButtonDownPos(Qt::LeftButton, me->buttonDownPos(Qt::LeftButton)); - me2->setButtonDownPos(Qt::RightButton, me->buttonDownPos(Qt::RightButton)); - me2->setButtonDownScreenPos(Qt::LeftButton, me->buttonDownScreenPos(Qt::LeftButton)); - me2->setButtonDownScreenPos(Qt::RightButton, me->buttonDownScreenPos(Qt::RightButton)); - me2->setLastPos(me->lastPos()); - me2->setLastScenePos(me->lastScenePos()); - me2->setLastScreenPos(me->lastScreenPos()); - me2->setButtons(me->buttons()); - me2->setButton(me->button()); - me2->setModifiers(me->modifiers()); - me2->setSource(me->source()); - me2->setFlags(me->flags()); - return me2; - } - case QEvent::GraphicsSceneContextMenu: { - QGraphicsSceneContextMenuEvent *me = static_cast(e); - QGraphicsSceneContextMenuEvent *me2 = new QGraphicsSceneContextMenuEvent(me->type()); - me2->setWidget(me->widget()); - me2->setPos(me->pos()); - me2->setScenePos(me->scenePos()); - me2->setScreenPos(me->screenPos()); - me2->setModifiers(me->modifiers()); - me2->setReason(me->reason()); - return me2; - } - - case QEvent::GraphicsSceneHoverEnter: - case QEvent::GraphicsSceneHoverMove: - case QEvent::GraphicsSceneHoverLeave: { - QGraphicsSceneHoverEvent *he = static_cast(e); - QGraphicsSceneHoverEvent *he2 = new QGraphicsSceneHoverEvent(he->type()); - he2->setPos(he->pos()); - he2->setScenePos(he->scenePos()); - he2->setScreenPos(he->screenPos()); - he2->setLastPos(he->lastPos()); - he2->setLastScenePos(he->lastScenePos()); - he2->setLastScreenPos(he->lastScreenPos()); - he2->setModifiers(he->modifiers()); - return he2; - } - case QEvent::GraphicsSceneHelp: - return new QHelpEvent(*static_cast(e)); - case QEvent::GraphicsSceneDragEnter: - case QEvent::GraphicsSceneDragMove: - case QEvent::GraphicsSceneDragLeave: - case QEvent::GraphicsSceneDrop: { - QGraphicsSceneDragDropEvent *dde = static_cast(e); - QGraphicsSceneDragDropEvent *dde2 = new QGraphicsSceneDragDropEvent(dde->type()); - dde2->setPos(dde->pos()); - dde2->setScenePos(dde->scenePos()); - dde2->setScreenPos(dde->screenPos()); - dde2->setButtons(dde->buttons()); - dde2->setModifiers(dde->modifiers()); - return dde2; - } - case QEvent::GraphicsSceneWheel: { - QGraphicsSceneWheelEvent *we = static_cast(e); - QGraphicsSceneWheelEvent *we2 = new QGraphicsSceneWheelEvent(we->type()); - we2->setPos(we->pos()); - we2->setScenePos(we->scenePos()); - we2->setScreenPos(we->screenPos()); - we2->setButtons(we->buttons()); - we2->setModifiers(we->modifiers()); - we2->setOrientation(we->orientation()); - we2->setDelta(we->delta()); - return we2; - } -#endif case QEvent::KeyboardLayoutChange: return new QEvent(*e); @@ -399,23 +306,6 @@ static QEvent *cloneEvent(QEvent *e) case QEvent::FutureCallOut: Q_ASSERT_X(false, "cloneEvent()", "not implemented"); break; -#if QT_CONFIG(graphicsview) - case QEvent::GraphicsSceneResize: { - QGraphicsSceneResizeEvent *re = static_cast(e); - QGraphicsSceneResizeEvent *re2 = new QGraphicsSceneResizeEvent(); - re2->setOldSize(re->oldSize()); - re2->setNewSize(re->newSize()); - return re2; - } - case QEvent::GraphicsSceneMove: { - QGraphicsSceneMoveEvent *me = static_cast(e); - QGraphicsSceneMoveEvent *me2 = new QGraphicsSceneMoveEvent(); - me2->setWidget(me->widget()); - me2->setNewPos(me->newPos()); - me2->setOldPos(me->oldPos()); - return me2; - } -#endif case QEvent::CursorChange: return new QEvent(*e); case QEvent::ToolTipChange: @@ -449,25 +339,7 @@ static QEvent *cloneEvent(QEvent *e) default: ; } - return qcoreStateMachineHandler()->cloneEvent(e); + return QCoreApplicationPrivate::cloneEvent(e); } -const QStateMachinePrivate::Handler qt_gui_statemachine_handler = { - cloneEvent -}; - -static const QStateMachinePrivate::Handler *qt_guistatemachine_last_handler = nullptr; -void qRegisterGuiStateMachine() -{ - qt_guistatemachine_last_handler = QStateMachinePrivate::handler; - QStateMachinePrivate::handler = &qt_gui_statemachine_handler; -} -Q_CONSTRUCTOR_FUNCTION(qRegisterGuiStateMachine) - -void qUnregisterGuiStateMachine() -{ - QStateMachinePrivate::handler = qt_guistatemachine_last_handler; -} -Q_DESTRUCTOR_FUNCTION(qUnregisterGuiStateMachine) - QT_END_NAMESPACE diff --git a/src/tools/uic/qclass_lib_map.h b/src/tools/uic/qclass_lib_map.h index 93141e747c5..797bcf6e764 100644 --- a/src/tools/uic/qclass_lib_map.h +++ b/src/tools/uic/qclass_lib_map.h @@ -129,14 +129,6 @@ QT_CLASS_LIB(QtPlugin, QtCore, qplugin.h) QT_CLASS_LIB(QtPluginInstanceFunction, QtCore, qplugin.h) QT_CLASS_LIB(QPluginLoader, QtCore, qpluginloader.h) QT_CLASS_LIB(QUuid, QtCore, quuid.h) -QT_CLASS_LIB(QAbstractState, QtCore, qabstractstate.h) -QT_CLASS_LIB(QAbstractTransition, QtCore, qabstracttransition.h) -QT_CLASS_LIB(QEventTransition, QtCore, qeventtransition.h) -QT_CLASS_LIB(QFinalState, QtCore, qfinalstate.h) -QT_CLASS_LIB(QHistoryState, QtCore, qhistorystate.h) -QT_CLASS_LIB(QSignalTransition, QtCore, qsignaltransition.h) -QT_CLASS_LIB(QState, QtCore, qstate.h) -QT_CLASS_LIB(QStateMachine, QtCore, qstatemachine.h) QT_CLASS_LIB(QAtomicInt, QtCore, qatomic.h) QT_CLASS_LIB(QAtomicPointer, QtCore, qatomic.h) QT_CLASS_LIB(QBasicAtomicInt, QtCore, qbasicatomic.h) @@ -771,8 +763,6 @@ QT_CLASS_LIB(QRgb, QtGui, qrgb.h) QT_CLASS_LIB(QStylePainter, QtGui, qstylepainter.h) QT_CLASS_LIB(QTransform, QtGui, qtransform.h) QT_CLASS_LIB(QWMatrix, QtGui, qwmatrix.h) -QT_CLASS_LIB(QKeyEventTransition, QtWidgets, qkeyeventtransition.h) -QT_CLASS_LIB(QMouseEventTransition, QtWidgets, qmouseeventtransition.h) QT_CLASS_LIB(QCommonStyle, QtWidgets, qcommonstyle.h) QT_CLASS_LIB(QProxyStyle, QtWidgets, qproxystyle.h) QT_CLASS_LIB(QStyle, QtWidgets, qstyle.h) diff --git a/src/widgets/.prev_CMakeLists.txt b/src/widgets/.prev_CMakeLists.txt index 971791c363f..b0c3af801a3 100644 --- a/src/widgets/.prev_CMakeLists.txt +++ b/src/widgets/.prev_CMakeLists.txt @@ -27,6 +27,7 @@ qt_add_module(Widgets kernel/qtwidgetsglobal.h kernel/qtwidgetsglobal_p.h kernel/qwidget.cpp kernel/qwidget.h kernel/qwidget_p.h kernel/qwidgetrepaintmanager.cpp kernel/qwidgetrepaintmanager_p.h + kernel/qwidgetstatemachine.cpp kernel/qwidgetsvariant.cpp kernel/qwidgetwindow.cpp kernel/qwidgetwindow_p.h kernel/qwindowcontainer.cpp kernel/qwindowcontainer_p.h @@ -804,19 +805,6 @@ qt_extend_target(Widgets CONDITION NOT QT_FEATURE_xcb util/qsystemtrayicon_qpa.cpp ) -qt_extend_target(Widgets CONDITION QT_FEATURE_statemachine - SOURCES - statemachine/qguistatemachine.cpp -) - -qt_extend_target(Widgets CONDITION QT_FEATURE_qeventtransition - SOURCES - statemachine/qbasickeyeventtransition.cpp statemachine/qbasickeyeventtransition_p.h - statemachine/qbasicmouseeventtransition.cpp statemachine/qbasicmouseeventtransition_p.h - statemachine/qkeyeventtransition.cpp statemachine/qkeyeventtransition.h - statemachine/qmouseeventtransition.cpp statemachine/qmouseeventtransition.h -) - qt_create_tracepoints(Widgets qtwidgets.tracepoints) qt_add_docs(Widgets diff --git a/src/widgets/CMakeLists.txt b/src/widgets/CMakeLists.txt index 84ed6f7fa9e..915fd7a99f3 100644 --- a/src/widgets/CMakeLists.txt +++ b/src/widgets/CMakeLists.txt @@ -27,6 +27,7 @@ qt_add_module(Widgets kernel/qtwidgetsglobal.h kernel/qtwidgetsglobal_p.h kernel/qwidget.cpp kernel/qwidget.h kernel/qwidget_p.h kernel/qwidgetrepaintmanager.cpp kernel/qwidgetrepaintmanager_p.h + kernel/qwidgetstatemachine.cpp kernel/qwidgetsvariant.cpp kernel/qwidgetwindow.cpp kernel/qwidgetwindow_p.h kernel/qwindowcontainer.cpp kernel/qwindowcontainer_p.h @@ -806,19 +807,6 @@ qt_extend_target(Widgets CONDITION NOT QT_FEATURE_xcb util/qsystemtrayicon_qpa.cpp ) -qt_extend_target(Widgets CONDITION QT_FEATURE_statemachine - SOURCES - statemachine/qguistatemachine.cpp -) - -qt_extend_target(Widgets CONDITION QT_FEATURE_qeventtransition - SOURCES - statemachine/qbasickeyeventtransition.cpp statemachine/qbasickeyeventtransition_p.h - statemachine/qbasicmouseeventtransition.cpp statemachine/qbasicmouseeventtransition_p.h - statemachine/qkeyeventtransition.cpp statemachine/qkeyeventtransition.h - statemachine/qmouseeventtransition.cpp statemachine/qmouseeventtransition.h -) - qt_create_tracepoints(Widgets qtwidgets.tracepoints) qt_add_docs(Widgets diff --git a/src/widgets/kernel/kernel.pri b/src/widgets/kernel/kernel.pri index 462897b886d..b00e220078e 100644 --- a/src/widgets/kernel/kernel.pri +++ b/src/widgets/kernel/kernel.pri @@ -49,7 +49,8 @@ SOURCES += \ kernel/qwidgetsvariant.cpp \ kernel/qwidgetwindow.cpp \ kernel/qwindowcontainer.cpp \ - kernel/qtestsupport_widgets.cpp + kernel/qtestsupport_widgets.cpp \ + kernel/qwidgetstatemachine.cpp macx: { HEADERS += kernel/qmacgesturerecognizer_p.h diff --git a/src/widgets/kernel/qapplication.cpp b/src/widgets/kernel/qapplication.cpp index 55c05e08dd2..fa64a3925d3 100644 --- a/src/widgets/kernel/qapplication.cpp +++ b/src/widgets/kernel/qapplication.cpp @@ -525,10 +525,6 @@ void qt_init_tooltip_palette() #endif } -#if QT_CONFIG(statemachine) -void qRegisterGuiStateMachine(); -void qUnregisterGuiStateMachine(); -#endif extern void qRegisterWidgetsVariant(); /*! @@ -563,10 +559,6 @@ void QApplicationPrivate::initialize() // Trigger default style if none was set already Q_UNUSED(QApplication::style()); } -#if QT_CONFIG(statemachine) - // trigger registering of QStateMachine's GUI types - qRegisterGuiStateMachine(); -#endif if (qEnvironmentVariableIntValue("QT_USE_NATIVE_WINDOWS") > 0) QCoreApplication::setAttribute(Qt::AA_NativeWindows); @@ -746,11 +738,6 @@ QApplication::~QApplication() QApplicationPrivate::enabledAnimations = QPlatformTheme::GeneralUiEffect; QApplicationPrivate::widgetCount = false; - -#if QT_CONFIG(statemachine) - // trigger unregistering of QStateMachine's GUI types - qUnregisterGuiStateMachine(); -#endif } void qt_cleanup() diff --git a/src/widgets/kernel/qapplication_p.h b/src/widgets/kernel/qapplication_p.h index 77182bf9dda..035d3e32203 100644 --- a/src/widgets/kernel/qapplication_p.h +++ b/src/widgets/kernel/qapplication_p.h @@ -258,6 +258,9 @@ public: static void translateTouchCancel(const QPointingDevice *device, ulong timestamp); QPixmap applyQIconStyleHelper(QIcon::Mode mode, const QPixmap& base) const override; + + QEvent *cloneEvent(QEvent *e) override; + private: static QApplicationPrivate *self; static bool tryCloseAllWidgetWindows(QWindowList *processedWindows); diff --git a/src/widgets/kernel/qwidgetstatemachine.cpp b/src/widgets/kernel/qwidgetstatemachine.cpp new file mode 100644 index 00000000000..f5ed7816717 --- /dev/null +++ b/src/widgets/kernel/qwidgetstatemachine.cpp @@ -0,0 +1,166 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtWidgets module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#if QT_CONFIG(graphicsview) +#include +#endif + +#include "private/qapplication_p.h" + +QT_BEGIN_NAMESPACE + +QEvent *QApplicationPrivate::cloneEvent(QEvent *e) +{ + switch (e->type()) { +#if QT_CONFIG(statustip) + case QEvent::StatusTip: + return new QStatusTipEvent(*static_cast(e)); +#endif // QT_CONFIG(statustip) + +#if QT_CONFIG(toolbar) + case QEvent::ToolBarChange: + return new QToolBarChangeEvent(*static_cast(e)); +#endif // QT_CONFIG(toolbar) + +#if QT_CONFIG(graphicsview) + case QEvent::GraphicsSceneMouseMove: + case QEvent::GraphicsSceneMousePress: + case QEvent::GraphicsSceneMouseRelease: + case QEvent::GraphicsSceneMouseDoubleClick: { + QGraphicsSceneMouseEvent *me = static_cast(e); + QGraphicsSceneMouseEvent *me2 = new QGraphicsSceneMouseEvent(me->type()); + me2->setWidget(me->widget()); + me2->setPos(me->pos()); + me2->setScenePos(me->scenePos()); + me2->setScreenPos(me->screenPos()); +// ### for all buttons + me2->setButtonDownPos(Qt::LeftButton, me->buttonDownPos(Qt::LeftButton)); + me2->setButtonDownPos(Qt::RightButton, me->buttonDownPos(Qt::RightButton)); + me2->setButtonDownScreenPos(Qt::LeftButton, me->buttonDownScreenPos(Qt::LeftButton)); + me2->setButtonDownScreenPos(Qt::RightButton, me->buttonDownScreenPos(Qt::RightButton)); + me2->setLastPos(me->lastPos()); + me2->setLastScenePos(me->lastScenePos()); + me2->setLastScreenPos(me->lastScreenPos()); + me2->setButtons(me->buttons()); + me2->setButton(me->button()); + me2->setModifiers(me->modifiers()); + me2->setSource(me->source()); + me2->setFlags(me->flags()); + return me2; + } + + case QEvent::GraphicsSceneContextMenu: { + QGraphicsSceneContextMenuEvent *me = static_cast(e); + QGraphicsSceneContextMenuEvent *me2 = new QGraphicsSceneContextMenuEvent(me->type()); + me2->setWidget(me->widget()); + me2->setPos(me->pos()); + me2->setScenePos(me->scenePos()); + me2->setScreenPos(me->screenPos()); + me2->setModifiers(me->modifiers()); + me2->setReason(me->reason()); + return me2; + } + + case QEvent::GraphicsSceneHoverEnter: + case QEvent::GraphicsSceneHoverMove: + case QEvent::GraphicsSceneHoverLeave: { + QGraphicsSceneHoverEvent *he = static_cast(e); + QGraphicsSceneHoverEvent *he2 = new QGraphicsSceneHoverEvent(he->type()); + he2->setPos(he->pos()); + he2->setScenePos(he->scenePos()); + he2->setScreenPos(he->screenPos()); + he2->setLastPos(he->lastPos()); + he2->setLastScenePos(he->lastScenePos()); + he2->setLastScreenPos(he->lastScreenPos()); + he2->setModifiers(he->modifiers()); + return he2; + } + case QEvent::GraphicsSceneHelp: + return new QHelpEvent(*static_cast(e)); + case QEvent::GraphicsSceneDragEnter: + case QEvent::GraphicsSceneDragMove: + case QEvent::GraphicsSceneDragLeave: + case QEvent::GraphicsSceneDrop: { + QGraphicsSceneDragDropEvent *dde = static_cast(e); + QGraphicsSceneDragDropEvent *dde2 = new QGraphicsSceneDragDropEvent(dde->type()); + dde2->setPos(dde->pos()); + dde2->setScenePos(dde->scenePos()); + dde2->setScreenPos(dde->screenPos()); + dde2->setButtons(dde->buttons()); + dde2->setModifiers(dde->modifiers()); + return dde2; + } + case QEvent::GraphicsSceneWheel: { + QGraphicsSceneWheelEvent *we = static_cast(e); + QGraphicsSceneWheelEvent *we2 = new QGraphicsSceneWheelEvent(we->type()); + we2->setPos(we->pos()); + we2->setScenePos(we->scenePos()); + we2->setScreenPos(we->screenPos()); + we2->setButtons(we->buttons()); + we2->setModifiers(we->modifiers()); + we2->setOrientation(we->orientation()); + we2->setDelta(we->delta()); + return we2; + } + + case QEvent::GraphicsSceneResize: { + QGraphicsSceneResizeEvent *re = static_cast(e); + QGraphicsSceneResizeEvent *re2 = new QGraphicsSceneResizeEvent(); + re2->setOldSize(re->oldSize()); + re2->setNewSize(re->newSize()); + return re2; + } + case QEvent::GraphicsSceneMove: { + QGraphicsSceneMoveEvent *me = static_cast(e); + QGraphicsSceneMoveEvent *me2 = new QGraphicsSceneMoveEvent(); + me2->setWidget(me->widget()); + me2->setNewPos(me->newPos()); + me2->setOldPos(me->oldPos()); + return me2; + } +#endif + default: + ; + } + return QApplicationPrivateBase::cloneEvent(e); +} + +QT_END_NAMESPACE diff --git a/src/widgets/statemachine/qbasickeyeventtransition.cpp b/src/widgets/statemachine/qbasickeyeventtransition.cpp deleted file mode 100644 index c833e648224..00000000000 --- a/src/widgets/statemachine/qbasickeyeventtransition.cpp +++ /dev/null @@ -1,204 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtWidgets module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qbasickeyeventtransition_p.h" - -#include -#include -#include - -QT_BEGIN_NAMESPACE - -/*! - \internal - \class QBasicKeyEventTransition - \since 4.6 - \ingroup statemachine - - \brief The QBasicKeyEventTransition class provides a transition for Qt key events. -*/ - -class QBasicKeyEventTransitionPrivate : public QAbstractTransitionPrivate -{ - Q_DECLARE_PUBLIC(QBasicKeyEventTransition) -public: - QBasicKeyEventTransitionPrivate(); - - static QBasicKeyEventTransitionPrivate *get(QBasicKeyEventTransition *q); - - QEvent::Type eventType; - int key; - Qt::KeyboardModifiers modifierMask; -}; - -QBasicKeyEventTransitionPrivate::QBasicKeyEventTransitionPrivate() -{ - eventType = QEvent::None; - key = 0; - modifierMask = Qt::NoModifier; -} - -QBasicKeyEventTransitionPrivate *QBasicKeyEventTransitionPrivate::get(QBasicKeyEventTransition *q) -{ - return q->d_func(); -} - -/*! - Constructs a new key event transition with the given \a sourceState. -*/ -QBasicKeyEventTransition::QBasicKeyEventTransition(QState *sourceState) - : QAbstractTransition(*new QBasicKeyEventTransitionPrivate, sourceState) -{ -} - -/*! - Constructs a new event transition for events of the given \a type for the - given \a key, with the given \a sourceState. -*/ -QBasicKeyEventTransition::QBasicKeyEventTransition(QEvent::Type type, int key, - QState *sourceState) - : QAbstractTransition(*new QBasicKeyEventTransitionPrivate, sourceState) -{ - Q_D(QBasicKeyEventTransition); - d->eventType = type; - d->key = key; -} - -/*! - Constructs a new event transition for events of the given \a type for the - given \a key, with the given \a modifierMask and \a sourceState. -*/ -QBasicKeyEventTransition::QBasicKeyEventTransition(QEvent::Type type, int key, - Qt::KeyboardModifiers modifierMask, - QState *sourceState) - : QAbstractTransition(*new QBasicKeyEventTransitionPrivate, sourceState) -{ - Q_D(QBasicKeyEventTransition); - d->eventType = type; - d->key = key; - d->modifierMask = modifierMask; -} - -/*! - Destroys this event transition. -*/ -QBasicKeyEventTransition::~QBasicKeyEventTransition() -{ -} - -/*! - Returns the event type that this key event transition is associated with. -*/ -QEvent::Type QBasicKeyEventTransition::eventType() const -{ - Q_D(const QBasicKeyEventTransition); - return d->eventType; -} - -/*! - Sets the event \a type that this key event transition is associated with. -*/ -void QBasicKeyEventTransition::setEventType(QEvent::Type type) -{ - Q_D(QBasicKeyEventTransition); - d->eventType = type; -} - -/*! - Returns the key that this key event transition checks for. -*/ -int QBasicKeyEventTransition::key() const -{ - Q_D(const QBasicKeyEventTransition); - return d->key; -} - -/*! - Sets the key that this key event transition will check for. -*/ -void QBasicKeyEventTransition::setKey(int key) -{ - Q_D(QBasicKeyEventTransition); - d->key = key; -} - -/*! - Returns the keyboard modifier mask that this key event transition checks - for. -*/ -Qt::KeyboardModifiers QBasicKeyEventTransition::modifierMask() const -{ - Q_D(const QBasicKeyEventTransition); - return d->modifierMask; -} - -/*! - Sets the keyboard modifier mask that this key event transition will check - for. -*/ -void QBasicKeyEventTransition::setModifierMask(Qt::KeyboardModifiers modifierMask) -{ - Q_D(QBasicKeyEventTransition); - d->modifierMask = modifierMask; -} - -/*! - \reimp -*/ -bool QBasicKeyEventTransition::eventTest(QEvent *event) -{ - Q_D(const QBasicKeyEventTransition); - if (event->type() == d->eventType) { - QKeyEvent *ke = static_cast(event); - return (ke->key() == d->key) - && ((ke->modifiers() & d->modifierMask) == d->modifierMask); - } - return false; -} - -/*! - \reimp -*/ -void QBasicKeyEventTransition::onTransition(QEvent *) -{ -} - -QT_END_NAMESPACE - -#include "moc_qbasickeyeventtransition_p.cpp" diff --git a/src/widgets/statemachine/qbasickeyeventtransition_p.h b/src/widgets/statemachine/qbasickeyeventtransition_p.h deleted file mode 100644 index f23c0785706..00000000000 --- a/src/widgets/statemachine/qbasickeyeventtransition_p.h +++ /dev/null @@ -1,93 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtWidgets module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QBASICKEYEVENTTRANSITION_P_H -#define QBASICKEYEVENTTRANSITION_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include -#include - -QT_REQUIRE_CONFIG(qeventtransition); - -QT_BEGIN_NAMESPACE - -class QBasicKeyEventTransitionPrivate; -class Q_AUTOTEST_EXPORT QBasicKeyEventTransition : public QAbstractTransition -{ - Q_OBJECT -public: - QBasicKeyEventTransition(QState *sourceState = nullptr); - QBasicKeyEventTransition(QEvent::Type type, int key, QState *sourceState = nullptr); - QBasicKeyEventTransition(QEvent::Type type, int key, - Qt::KeyboardModifiers modifierMask, - QState *sourceState = nullptr); - ~QBasicKeyEventTransition(); - - QEvent::Type eventType() const; - void setEventType(QEvent::Type type); - - int key() const; - void setKey(int key); - - Qt::KeyboardModifiers modifierMask() const; - void setModifierMask(Qt::KeyboardModifiers modifiers); - -protected: - bool eventTest(QEvent *event) override; - void onTransition(QEvent *) override; - -private: - Q_DISABLE_COPY_MOVE(QBasicKeyEventTransition) - Q_DECLARE_PRIVATE(QBasicKeyEventTransition) -}; - -QT_END_NAMESPACE - -#endif diff --git a/src/widgets/statemachine/qbasicmouseeventtransition.cpp b/src/widgets/statemachine/qbasicmouseeventtransition.cpp deleted file mode 100644 index 460abe9f500..00000000000 --- a/src/widgets/statemachine/qbasicmouseeventtransition.cpp +++ /dev/null @@ -1,208 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtWidgets module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qbasicmouseeventtransition_p.h" -#include -#include -#include -#include - -QT_BEGIN_NAMESPACE - -/*! - \internal - \class QBasicMouseEventTransition - \since 4.6 - \ingroup statemachine - - \brief The QBasicMouseEventTransition class provides a transition for Qt mouse events. -*/ - -class QBasicMouseEventTransitionPrivate : public QAbstractTransitionPrivate -{ - Q_DECLARE_PUBLIC(QBasicMouseEventTransition) -public: - QBasicMouseEventTransitionPrivate(); - - static QBasicMouseEventTransitionPrivate *get(QBasicMouseEventTransition *q); - - QEvent::Type eventType; - Qt::MouseButton button; - Qt::KeyboardModifiers modifierMask; - QPainterPath path; -}; - -QBasicMouseEventTransitionPrivate::QBasicMouseEventTransitionPrivate() -{ - eventType = QEvent::None; - button = Qt::NoButton; -} - -QBasicMouseEventTransitionPrivate *QBasicMouseEventTransitionPrivate::get(QBasicMouseEventTransition *q) -{ - return q->d_func(); -} - -/*! - Constructs a new mouse event transition with the given \a sourceState. -*/ -QBasicMouseEventTransition::QBasicMouseEventTransition(QState *sourceState) - : QAbstractTransition(*new QBasicMouseEventTransitionPrivate, sourceState) -{ -} - -/*! - Constructs a new mouse event transition for events of the given \a type. -*/ -QBasicMouseEventTransition::QBasicMouseEventTransition(QEvent::Type type, - Qt::MouseButton button, - QState *sourceState) - : QAbstractTransition(*new QBasicMouseEventTransitionPrivate, sourceState) -{ - Q_D(QBasicMouseEventTransition); - d->eventType = type; - d->button = button; -} - -/*! - Destroys this mouse event transition. -*/ -QBasicMouseEventTransition::~QBasicMouseEventTransition() -{ -} - -/*! - Returns the event type that this mouse event transition is associated with. -*/ -QEvent::Type QBasicMouseEventTransition::eventType() const -{ - Q_D(const QBasicMouseEventTransition); - return d->eventType; -} - -/*! - Sets the event \a type that this mouse event transition is associated with. -*/ -void QBasicMouseEventTransition::setEventType(QEvent::Type type) -{ - Q_D(QBasicMouseEventTransition); - d->eventType = type; -} - -/*! - Returns the button that this mouse event transition checks for. -*/ -Qt::MouseButton QBasicMouseEventTransition::button() const -{ - Q_D(const QBasicMouseEventTransition); - return d->button; -} - -/*! - Sets the button that this mouse event transition will check for. -*/ -void QBasicMouseEventTransition::setButton(Qt::MouseButton button) -{ - Q_D(QBasicMouseEventTransition); - d->button = button; -} - -/*! - Returns the keyboard modifier mask that this mouse event transition checks - for. -*/ -Qt::KeyboardModifiers QBasicMouseEventTransition::modifierMask() const -{ - Q_D(const QBasicMouseEventTransition); - return d->modifierMask; -} - -/*! - Sets the keyboard modifier mask that this mouse event transition will check - for. -*/ -void QBasicMouseEventTransition::setModifierMask(Qt::KeyboardModifiers modifierMask) -{ - Q_D(QBasicMouseEventTransition); - d->modifierMask = modifierMask; -} - -/*! - Returns the hit test path for this mouse event transition. -*/ -QPainterPath QBasicMouseEventTransition::hitTestPath() const -{ - Q_D(const QBasicMouseEventTransition); - return d->path; -} - -/*! - Sets the hit test path for this mouse event transition. -*/ -void QBasicMouseEventTransition::setHitTestPath(const QPainterPath &path) -{ - Q_D(QBasicMouseEventTransition); - d->path = path; -} - -/*! - \reimp -*/ -bool QBasicMouseEventTransition::eventTest(QEvent *event) -{ - Q_D(const QBasicMouseEventTransition); - if (event->type() == d->eventType) { - QMouseEvent *me = static_cast(event); - return (me->button() == d->button) - && ((me->modifiers() & d->modifierMask) == d->modifierMask) - && (d->path.isEmpty() || d->path.contains(me->position().toPoint())); - } - return false; -} - -/*! - \reimp -*/ -void QBasicMouseEventTransition::onTransition(QEvent *) -{ -} - -QT_END_NAMESPACE - -#include "moc_qbasicmouseeventtransition_p.cpp" diff --git a/src/widgets/statemachine/qbasicmouseeventtransition_p.h b/src/widgets/statemachine/qbasicmouseeventtransition_p.h deleted file mode 100644 index dd619d189c9..00000000000 --- a/src/widgets/statemachine/qbasicmouseeventtransition_p.h +++ /dev/null @@ -1,96 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtWidgets module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QBASICMOUSEEVENTTRANSITION_P_H -#define QBASICMOUSEEVENTTRANSITION_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include -#include - -QT_REQUIRE_CONFIG(qeventtransition); - -QT_BEGIN_NAMESPACE - -class QPainterPath; - -class QBasicMouseEventTransitionPrivate; -class Q_AUTOTEST_EXPORT QBasicMouseEventTransition : public QAbstractTransition -{ - Q_OBJECT -public: - QBasicMouseEventTransition(QState *sourceState = nullptr); - QBasicMouseEventTransition(QEvent::Type type, Qt::MouseButton button, - QState *sourceState = nullptr); - ~QBasicMouseEventTransition(); - - QEvent::Type eventType() const; - void setEventType(QEvent::Type type); - - Qt::MouseButton button() const; - void setButton(Qt::MouseButton button); - - Qt::KeyboardModifiers modifierMask() const; - void setModifierMask(Qt::KeyboardModifiers modifiers); - - QPainterPath hitTestPath() const; - void setHitTestPath(const QPainterPath &path); - -protected: - bool eventTest(QEvent *event) override; - void onTransition(QEvent *) override; - -private: - Q_DISABLE_COPY_MOVE(QBasicMouseEventTransition) - Q_DECLARE_PRIVATE(QBasicMouseEventTransition) -}; - -QT_END_NAMESPACE - -#endif diff --git a/src/widgets/statemachine/qkeyeventtransition.cpp b/src/widgets/statemachine/qkeyeventtransition.cpp deleted file mode 100644 index 1578f294d52..00000000000 --- a/src/widgets/statemachine/qkeyeventtransition.cpp +++ /dev/null @@ -1,174 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtWidgets module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qkeyeventtransition.h" -#include "qbasickeyeventtransition_p.h" -#include -#include - -QT_BEGIN_NAMESPACE - -/*! - \class QKeyEventTransition - - \brief The QKeyEventTransition class provides a transition for key events. - - \since 4.6 - \ingroup statemachine - \inmodule QtWidgets - - QKeyEventTransition is part of \l{The State Machine Framework}. - - \sa QState::addTransition() -*/ - -/*! - \property QKeyEventTransition::key - - \brief the key that this key event transition is associated with -*/ - -/*! - \property QKeyEventTransition::modifierMask - - \brief the keyboard modifier mask that this key event transition checks for -*/ - -class QKeyEventTransitionPrivate : public QEventTransitionPrivate -{ - Q_DECLARE_PUBLIC(QKeyEventTransition) -public: - QKeyEventTransitionPrivate() {} - - QBasicKeyEventTransition *transition; -}; - -/*! - Constructs a new key event transition with the given \a sourceState. -*/ -QKeyEventTransition::QKeyEventTransition(QState *sourceState) - : QEventTransition(*new QKeyEventTransitionPrivate, sourceState) -{ - Q_D(QKeyEventTransition); - d->transition = new QBasicKeyEventTransition(); -} - -/*! - Constructs a new key event transition for events of the given \a type for - the given \a object, with the given \a key and \a sourceState. -*/ -QKeyEventTransition::QKeyEventTransition(QObject *object, QEvent::Type type, - int key, QState *sourceState) - : QEventTransition(*new QKeyEventTransitionPrivate, object, type, sourceState) -{ - Q_D(QKeyEventTransition); - d->transition = new QBasicKeyEventTransition(type, key); -} - -/*! - Destroys this key event transition. -*/ -QKeyEventTransition::~QKeyEventTransition() -{ - Q_D(QKeyEventTransition); - delete d->transition; -} - -/*! - Returns the key that this key event transition checks for. -*/ -int QKeyEventTransition::key() const -{ - Q_D(const QKeyEventTransition); - return d->transition->key(); -} - -/*! - Sets the \a key that this key event transition will check for. -*/ -void QKeyEventTransition::setKey(int key) -{ - Q_D(QKeyEventTransition); - d->transition->setKey(key); -} - -/*! - Returns the keyboard modifier mask that this key event transition checks - for. -*/ -Qt::KeyboardModifiers QKeyEventTransition::modifierMask() const -{ - Q_D(const QKeyEventTransition); - return d->transition->modifierMask(); -} - -/*! - Sets the keyboard modifier mask that this key event transition will - check for to \a modifierMask. -*/ -void QKeyEventTransition::setModifierMask(Qt::KeyboardModifiers modifierMask) -{ - Q_D(QKeyEventTransition); - d->transition->setModifierMask(modifierMask); -} - -/*! - \reimp -*/ -bool QKeyEventTransition::eventTest(QEvent *event) -{ - Q_D(const QKeyEventTransition); - if (!QEventTransition::eventTest(event)) - return false; - QStateMachine::WrappedEvent *we = static_cast(event); - d->transition->setEventType(we->event()->type()); - return QAbstractTransitionPrivate::get(d->transition)->callEventTest(we->event()); -} - -/*! - \reimp -*/ -void QKeyEventTransition::onTransition(QEvent *event) -{ - QEventTransition::onTransition(event); -} - -QT_END_NAMESPACE - -#include "moc_qkeyeventtransition.cpp" diff --git a/src/widgets/statemachine/qkeyeventtransition.h b/src/widgets/statemachine/qkeyeventtransition.h deleted file mode 100644 index 676f5f7846a..00000000000 --- a/src/widgets/statemachine/qkeyeventtransition.h +++ /dev/null @@ -1,79 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtWidgets module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QKEYEVENTTRANSITION_H -#define QKEYEVENTTRANSITION_H - -#include -#include - -QT_REQUIRE_CONFIG(qeventtransition); - -QT_BEGIN_NAMESPACE - -class QKeyEventTransitionPrivate; -class Q_WIDGETS_EXPORT QKeyEventTransition : public QEventTransition -{ - Q_OBJECT - Q_PROPERTY(int key READ key WRITE setKey) - Q_PROPERTY(Qt::KeyboardModifiers modifierMask READ modifierMask WRITE setModifierMask) -public: - QKeyEventTransition(QState *sourceState = nullptr); - QKeyEventTransition(QObject *object, QEvent::Type type, int key, - QState *sourceState = nullptr); - ~QKeyEventTransition(); - - int key() const; - void setKey(int key); - - Qt::KeyboardModifiers modifierMask() const; - void setModifierMask(Qt::KeyboardModifiers modifiers); - -protected: - void onTransition(QEvent *event) override; - bool eventTest(QEvent *event) override; - -private: - Q_DISABLE_COPY(QKeyEventTransition) - Q_DECLARE_PRIVATE(QKeyEventTransition) -}; - -QT_END_NAMESPACE - -#endif diff --git a/src/widgets/statemachine/qmouseeventtransition.cpp b/src/widgets/statemachine/qmouseeventtransition.cpp deleted file mode 100644 index c58dae55a31..00000000000 --- a/src/widgets/statemachine/qmouseeventtransition.cpp +++ /dev/null @@ -1,202 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtWidgets module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qmouseeventtransition.h" -#include "qbasicmouseeventtransition_p.h" -#include -#include -#include - -QT_BEGIN_NAMESPACE - -/*! - \class QMouseEventTransition - - \brief The QMouseEventTransition class provides a transition for mouse events. - - \since 4.6 - \ingroup statemachine - \inmodule QtWidgets - - QMouseEventTransition is part of \l{The State Machine Framework}. - - \sa QState::addTransition() -*/ - -/*! - \property QMouseEventTransition::button - - \brief the button that this mouse event transition is associated with -*/ - -/*! - \property QMouseEventTransition::modifierMask - - \brief the keyboard modifier mask that this mouse event transition checks for -*/ - -class QMouseEventTransitionPrivate : public QEventTransitionPrivate -{ - Q_DECLARE_PUBLIC(QMouseEventTransition) -public: - QMouseEventTransitionPrivate(); - - QBasicMouseEventTransition *transition; -}; - -QMouseEventTransitionPrivate::QMouseEventTransitionPrivate() -{ -} - -/*! - Constructs a new mouse event transition with the given \a sourceState. -*/ -QMouseEventTransition::QMouseEventTransition(QState *sourceState) - : QEventTransition(*new QMouseEventTransitionPrivate, sourceState) -{ - Q_D(QMouseEventTransition); - d->transition = new QBasicMouseEventTransition(); -} - -/*! - Constructs a new mouse event transition for events of the given \a type for - the given \a object, with the given \a button and \a sourceState. -*/ -QMouseEventTransition::QMouseEventTransition(QObject *object, QEvent::Type type, - Qt::MouseButton button, - QState *sourceState) - : QEventTransition(*new QMouseEventTransitionPrivate, object, type, sourceState) -{ - Q_D(QMouseEventTransition); - d->transition = new QBasicMouseEventTransition(type, button); -} - -/*! - Destroys this mouse event transition. -*/ -QMouseEventTransition::~QMouseEventTransition() -{ - Q_D(QMouseEventTransition); - delete d->transition; -} - -/*! - Returns the button that this mouse event transition checks for. -*/ -Qt::MouseButton QMouseEventTransition::button() const -{ - Q_D(const QMouseEventTransition); - return d->transition->button(); -} - -/*! - Sets the \a button that this mouse event transition will check for. -*/ -void QMouseEventTransition::setButton(Qt::MouseButton button) -{ - Q_D(QMouseEventTransition); - d->transition->setButton(button); -} - -/*! - Returns the keyboard modifier mask that this mouse event transition checks - for. -*/ -Qt::KeyboardModifiers QMouseEventTransition::modifierMask() const -{ - Q_D(const QMouseEventTransition); - return d->transition->modifierMask(); -} - -/*! - Sets the keyboard modifier mask that this mouse event transition will - check for to \a modifierMask. -*/ -void QMouseEventTransition::setModifierMask(Qt::KeyboardModifiers modifierMask) -{ - Q_D(QMouseEventTransition); - d->transition->setModifierMask(modifierMask); -} - -/*! - Returns the hit test path for this mouse event transition. -*/ -QPainterPath QMouseEventTransition::hitTestPath() const -{ - Q_D(const QMouseEventTransition); - return d->transition->hitTestPath(); -} - -/*! - Sets the hit test path for this mouse event transition to \a path. - If a valid path has been set, the transition will only trigger if the mouse - event position (QMouseEvent::pos()) is inside the path. - - \sa QPainterPath::contains() -*/ -void QMouseEventTransition::setHitTestPath(const QPainterPath &path) -{ - Q_D(QMouseEventTransition); - d->transition->setHitTestPath(path); -} - -/*! - \reimp -*/ -bool QMouseEventTransition::eventTest(QEvent *event) -{ - Q_D(const QMouseEventTransition); - if (!QEventTransition::eventTest(event)) - return false; - QStateMachine::WrappedEvent *we = static_cast(event); - d->transition->setEventType(we->event()->type()); - return QAbstractTransitionPrivate::get(d->transition)->callEventTest(we->event()); -} - -/*! - \reimp -*/ -void QMouseEventTransition::onTransition(QEvent *event) -{ - QEventTransition::onTransition(event); -} - -QT_END_NAMESPACE - -#include "moc_qmouseeventtransition.cpp" diff --git a/src/widgets/statemachine/qmouseeventtransition.h b/src/widgets/statemachine/qmouseeventtransition.h deleted file mode 100644 index 41f738d894c..00000000000 --- a/src/widgets/statemachine/qmouseeventtransition.h +++ /dev/null @@ -1,83 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtWidgets module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QMOUSEEVENTTRANSITION_H -#define QMOUSEEVENTTRANSITION_H - -#include -#include - -QT_REQUIRE_CONFIG(qeventtransition); - -QT_BEGIN_NAMESPACE - -class QMouseEventTransitionPrivate; -class QPainterPath; -class Q_WIDGETS_EXPORT QMouseEventTransition : public QEventTransition -{ - Q_OBJECT - Q_PROPERTY(Qt::MouseButton button READ button WRITE setButton) - Q_PROPERTY(Qt::KeyboardModifiers modifierMask READ modifierMask WRITE setModifierMask) -public: - QMouseEventTransition(QState *sourceState = nullptr); - QMouseEventTransition(QObject *object, QEvent::Type type, - Qt::MouseButton button, QState *sourceState = nullptr); - ~QMouseEventTransition(); - - Qt::MouseButton button() const; - void setButton(Qt::MouseButton button); - - Qt::KeyboardModifiers modifierMask() const; - void setModifierMask(Qt::KeyboardModifiers modifiers); - - QPainterPath hitTestPath() const; - void setHitTestPath(const QPainterPath &path); - -protected: - void onTransition(QEvent *event) override; - bool eventTest(QEvent *event) override; - -private: - Q_DISABLE_COPY(QMouseEventTransition) - Q_DECLARE_PRIVATE(QMouseEventTransition) -}; - -QT_END_NAMESPACE - -#endif diff --git a/src/widgets/statemachine/statemachine.pri b/src/widgets/statemachine/statemachine.pri deleted file mode 100644 index 7b6407bde50..00000000000 --- a/src/widgets/statemachine/statemachine.pri +++ /dev/null @@ -1,16 +0,0 @@ - -qtConfig(statemachine): \ - SOURCES += $$PWD/qguistatemachine.cpp - -qtConfig(qeventtransition) { - HEADERS += \ - $$PWD/qkeyeventtransition.h \ - $$PWD/qmouseeventtransition.h \ - $$PWD/qbasickeyeventtransition_p.h \ - $$PWD/qbasicmouseeventtransition_p.h - SOURCES += \ - $$PWD/qkeyeventtransition.cpp \ - $$PWD/qmouseeventtransition.cpp \ - $$PWD/qbasickeyeventtransition.cpp \ - $$PWD/qbasicmouseeventtransition.cpp -} diff --git a/src/widgets/widgets.pro b/src/widgets/widgets.pro index 2d5ba05d405..35fe21e7887 100644 --- a/src/widgets/widgets.pro +++ b/src/widgets/widgets.pro @@ -24,7 +24,6 @@ include(accessible/accessible.pri) include(itemviews/itemviews.pri) include(graphicsview/graphicsview.pri) include(util/util.pri) -include(statemachine/statemachine.pri) qtConfig(graphicseffect) { include(effects/effects.pri) diff --git a/tests/auto/corelib/.prev_CMakeLists.txt b/tests/auto/corelib/.prev_CMakeLists.txt index 5d42ce2a6d6..bbfc0e7f179 100644 --- a/tests/auto/corelib/.prev_CMakeLists.txt +++ b/tests/auto/corelib/.prev_CMakeLists.txt @@ -9,7 +9,6 @@ if(NOT UIKIT) add_subdirectory(mimetypes) add_subdirectory(plugin) add_subdirectory(serialization) - add_subdirectory(statemachine) add_subdirectory(text) add_subdirectory(thread) add_subdirectory(time) diff --git a/tests/auto/corelib/CMakeLists.txt b/tests/auto/corelib/CMakeLists.txt index 5d42ce2a6d6..bbfc0e7f179 100644 --- a/tests/auto/corelib/CMakeLists.txt +++ b/tests/auto/corelib/CMakeLists.txt @@ -9,7 +9,6 @@ if(NOT UIKIT) add_subdirectory(mimetypes) add_subdirectory(plugin) add_subdirectory(serialization) - add_subdirectory(statemachine) add_subdirectory(text) add_subdirectory(thread) add_subdirectory(time) diff --git a/tests/auto/corelib/corelib.pro b/tests/auto/corelib/corelib.pro index bece87db4bb..3d5fb3d8e47 100644 --- a/tests/auto/corelib/corelib.pro +++ b/tests/auto/corelib/corelib.pro @@ -11,7 +11,6 @@ SUBDIRS = \ mimetypes \ plugin \ serialization \ - statemachine \ text \ thread \ time \ diff --git a/tests/auto/corelib/statemachine/CMakeLists.txt b/tests/auto/corelib/statemachine/CMakeLists.txt deleted file mode 100644 index 362bdbf113d..00000000000 --- a/tests/auto/corelib/statemachine/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -# Generated from statemachine.pro. - -add_subdirectory(qstate) -add_subdirectory(qstatemachine) diff --git a/tests/auto/corelib/statemachine/qstate/CMakeLists.txt b/tests/auto/corelib/statemachine/qstate/CMakeLists.txt deleted file mode 100644 index 515db3c167e..00000000000 --- a/tests/auto/corelib/statemachine/qstate/CMakeLists.txt +++ /dev/null @@ -1,10 +0,0 @@ -# Generated from qstate.pro. - -##################################################################### -## tst_qstate Test: -##################################################################### - -qt_add_test(tst_qstate - SOURCES - tst_qstate.cpp -) diff --git a/tests/auto/corelib/statemachine/qstate/qstate.pro b/tests/auto/corelib/statemachine/qstate/qstate.pro deleted file mode 100644 index e2251ded9d6..00000000000 --- a/tests/auto/corelib/statemachine/qstate/qstate.pro +++ /dev/null @@ -1,4 +0,0 @@ -CONFIG += testcase -TARGET = tst_qstate -QT = core testlib -SOURCES = tst_qstate.cpp diff --git a/tests/auto/corelib/statemachine/qstate/tst_qstate.cpp b/tests/auto/corelib/statemachine/qstate/tst_qstate.cpp deleted file mode 100644 index bbc3f890bd8..00000000000 --- a/tests/auto/corelib/statemachine/qstate/tst_qstate.cpp +++ /dev/null @@ -1,374 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include - -#include "qstate.h" -#include "qstatemachine.h" -#include "qsignaltransition.h" - -class tst_QState : public QObject -{ - Q_OBJECT - -private slots: - void assignProperty(); - void assignPropertyTwice(); - void historyInitialState(); - void transitions(); - void privateSignals(); - void parallelStateAndInitialState(); -}; - -class TestClass: public QObject -{ - Q_OBJECT -public: - TestClass() : called(false) {} - bool called; - -public slots: - void slot() { called = true; } - - -}; - -void tst_QState::assignProperty() -{ - QStateMachine machine; - - QObject object; - object.setProperty("fooBar", 10); - - QState *s1 = new QState(&machine); - s1->assignProperty(&object, "fooBar", 20); - - machine.setInitialState(s1); - machine.start(); - QCoreApplication::processEvents(); - - QCOMPARE(object.property("fooBar").toInt(), 20); -} - -void tst_QState::assignPropertyTwice() -{ - QStateMachine machine; - - QObject object; - object.setProperty("fooBar", 10); - - QState *s1 = new QState(&machine); - s1->assignProperty(&object, "fooBar", 20); - s1->assignProperty(&object, "fooBar", 30); - - machine.setInitialState(s1); - machine.start(); - QCoreApplication::processEvents(); - - QCOMPARE(object.property("fooBar").toInt(), 30); -} - -class EventTestTransition: public QAbstractTransition -{ -public: - EventTestTransition(QEvent::Type type, QState *targetState) - : QAbstractTransition(), m_type(type) - { - setTargetState(targetState); - } - -protected: - bool eventTest(QEvent *e) - { - return e->type() == m_type; - } - - void onTransition(QEvent *) {} - -private: - QEvent::Type m_type; - -}; - -void tst_QState::historyInitialState() -{ - QStateMachine machine; - - QState *s1 = new QState(&machine); - - QState *s2 = new QState(&machine); - QHistoryState *h1 = new QHistoryState(s2); - - s2->setInitialState(h1); - - QState *s3 = new QState(s2); - h1->setDefaultState(s3); - - QState *s4 = new QState(s2); - - s1->addTransition(new EventTestTransition(QEvent::User, s2)); - s2->addTransition(new EventTestTransition(QEvent::User, s1)); - s3->addTransition(new EventTestTransition(QEvent::Type(QEvent::User+1), s4)); - - machine.setInitialState(s1); - machine.start(); - QCoreApplication::processEvents(); - - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s1)); - - machine.postEvent(new QEvent(QEvent::User)); - QCoreApplication::processEvents(); - - QCOMPARE(machine.configuration().size(), 2); - QVERIFY(machine.configuration().contains(s2)); - QVERIFY(machine.configuration().contains(s3)); - - machine.postEvent(new QEvent(QEvent::User)); - QCoreApplication::processEvents(); - - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s1)); - - machine.postEvent(new QEvent(QEvent::User)); - QCoreApplication::processEvents(); - - QCOMPARE(machine.configuration().size(), 2); - QVERIFY(machine.configuration().contains(s2)); - QVERIFY(machine.configuration().contains(s3)); - - machine.postEvent(new QEvent(QEvent::Type(QEvent::User+1))); - QCoreApplication::processEvents(); - - QCOMPARE(machine.configuration().size(), 2); - QVERIFY(machine.configuration().contains(s2)); - QVERIFY(machine.configuration().contains(s4)); - - machine.postEvent(new QEvent(QEvent::User)); - QCoreApplication::processEvents(); - - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s1)); - - machine.postEvent(new QEvent(QEvent::User)); - QCoreApplication::processEvents(); - - QCOMPARE(machine.configuration().size(), 2); - QVERIFY(machine.configuration().contains(s2)); - QVERIFY(machine.configuration().contains(s4)); -} - -void tst_QState::transitions() -{ - QState s1; - QState s2; - - QVERIFY(s1.transitions().isEmpty()); - - QAbstractTransition *t1 = s1.addTransition(this, SIGNAL(destroyed()), &s2); - QAbstractTransition *t1_1 = s1.addTransition(this, &tst_QState::destroyed, &s2); - QVERIFY(t1 != 0); - QVERIFY(t1_1 != 0); - QCOMPARE(s1.transitions().count(), 2); - QCOMPARE(s1.transitions().first(), t1); - QCOMPARE(s1.transitions().last(), t1_1); - QVERIFY(s2.transitions().isEmpty()); - - s1.removeTransition(t1); - s1.removeTransition(t1_1); - QVERIFY(s1.transitions().isEmpty()); - - s1.addTransition(t1); - QCOMPARE(s1.transitions().count(), 1); - QCOMPARE(s1.transitions().first(), t1); - - QAbstractTransition *t2 = new QEventTransition(&s1); - QCOMPARE(s1.transitions().count(), 2); - QVERIFY(s1.transitions().contains(t1)); - QVERIFY(s1.transitions().contains(t2)); - - // Transitions from child states should not be reported. - QState *s21 = new QState(&s2); - QAbstractTransition *t3 = s21->addTransition(this, SIGNAL(destroyed()), &s2); - QVERIFY(s2.transitions().isEmpty()); - QCOMPARE(s21->transitions().count(), 1); - QCOMPARE(s21->transitions().first(), t3); -} - -class MyState : public QState -{ - Q_OBJECT -public: - MyState(QState *parent = 0) - : QState(parent) - { - - } - - void emitPrivateSignals() - { - // These deliberately do not compile -// emit entered(); -// emit exited(); -// -// emit entered(QPrivateSignal()); -// emit exited(QPrivateSignal()); -// -// emit entered(QAbstractState::QPrivateSignal()); -// emit exited(QAbstractState::QPrivateSignal()); - } - -}; - -class MyTransition : public QSignalTransition -{ - Q_OBJECT -public: - MyTransition(QObject * sender, const char * signal, QState *sourceState = 0) - : QSignalTransition(sender, signal, sourceState) - { - - } - - void emitPrivateSignals() - { - // These deliberately do not compile -// emit triggered(); -// -// emit triggered(QPrivateSignal()); -// -// emit triggered(QAbstractTransition::QPrivateSignal()); - } -}; - -class SignalConnectionTester : public QObject -{ - Q_OBJECT -public: - SignalConnectionTester(QObject *parent = 0) - : QObject(parent), testPassed(false) - { - - } - -public Q_SLOTS: - void testSlot() - { - testPassed = true; - } - -public: - bool testPassed; -}; - -class TestTrigger : public QObject -{ - Q_OBJECT -public: - TestTrigger(QObject *parent = 0) - : QObject(parent) - { - - } - - void emitTrigger() - { - emit trigger(); - } - -signals: - void trigger(); -}; - -void tst_QState::privateSignals() -{ - QStateMachine machine; - - QState *s1 = new QState(&machine); - MyState *s2 = new MyState(&machine); - - TestTrigger testTrigger; - - MyTransition *t1 = new MyTransition(&testTrigger, SIGNAL(trigger()), s1); - s1->addTransition(t1); - t1->setTargetState(s2); - - machine.setInitialState(s1); - machine.start(); - QCoreApplication::processEvents(); - - SignalConnectionTester s1Tester; - SignalConnectionTester s2Tester; - SignalConnectionTester t1Tester; - - QObject::connect(s1, &QState::exited, &s1Tester, &SignalConnectionTester::testSlot); - QObject::connect(s2, &QState::entered, &s2Tester, &SignalConnectionTester::testSlot); - QObject::connect(t1, &QSignalTransition::triggered, &t1Tester, &SignalConnectionTester::testSlot); - - testTrigger.emitTrigger(); - - QCoreApplication::processEvents(); - - QVERIFY(s1Tester.testPassed); - QVERIFY(s2Tester.testPassed); - QVERIFY(t1Tester.testPassed); - -} - -void tst_QState::parallelStateAndInitialState() -{ - QStateMachine machine; - - { // setting an initial state on a parallel state: - QState a(QState::ParallelStates, &machine); - QState b(&a); - QVERIFY(!a.initialState()); - const QString warning - = QString::asprintf("QState::setInitialState: ignoring attempt to set initial state of parallel state group %p", &a); - QTest::ignoreMessage(QtWarningMsg, qPrintable(warning)); - a.setInitialState(&b); // should produce a warning and do nothing. - QVERIFY(!a.initialState()); - } - - { // setting the child-mode from ExclusiveStates to ParallelStates should remove the initial state: - QState a(QState::ExclusiveStates, &machine); - QState b(&a); - a.setInitialState(&b); - QCOMPARE(a.initialState(), &b); - const QString warning - = QString::asprintf("QState::setChildMode: setting the child-mode of state %p to " - "parallel removes the initial state", &a); - QTest::ignoreMessage(QtWarningMsg, qPrintable(warning)); - a.setChildMode(QState::ParallelStates); // should produce a warning and remove the initial state - QVERIFY(!a.initialState()); - QCOMPARE(a.childMode(), QState::ParallelStates); - } -} - -QTEST_MAIN(tst_QState) -#include "tst_qstate.moc" diff --git a/tests/auto/corelib/statemachine/qstatemachine/CMakeLists.txt b/tests/auto/corelib/statemachine/qstatemachine/CMakeLists.txt deleted file mode 100644 index 8cbe69dfdfa..00000000000 --- a/tests/auto/corelib/statemachine/qstatemachine/CMakeLists.txt +++ /dev/null @@ -1,20 +0,0 @@ -# Generated from qstatemachine.pro. - -##################################################################### -## tst_qstatemachine Test: -##################################################################### - -qt_add_test(tst_qstatemachine - SOURCES - tst_qstatemachine.cpp - PUBLIC_LIBRARIES - Qt::CorePrivate -) - -## Scopes: -##################################################################### - -qt_extend_target(tst_qstatemachine CONDITION TARGET Qt::Widgets - PUBLIC_LIBRARIES - Qt::Widgets -) diff --git a/tests/auto/corelib/statemachine/qstatemachine/qstatemachine.pro b/tests/auto/corelib/statemachine/qstatemachine/qstatemachine.pro deleted file mode 100644 index 4f16b2a9cae..00000000000 --- a/tests/auto/corelib/statemachine/qstatemachine/qstatemachine.pro +++ /dev/null @@ -1,5 +0,0 @@ -CONFIG += testcase -TARGET = tst_qstatemachine -QT = core-private testlib -qtHaveModule(widgets): QT += widgets -SOURCES = tst_qstatemachine.cpp diff --git a/tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp b/tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp deleted file mode 100644 index d898d37bda7..00000000000 --- a/tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp +++ /dev/null @@ -1,6868 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include -#include -#ifndef QT_NO_WIDGETS -#include -#include -#include -#include -#endif - -#include "qstatemachine.h" -#include "qstate.h" -#include "qhistorystate.h" -#ifndef QT_NO_WIDGETS -#include "qkeyeventtransition.h" -#include "qmouseeventtransition.h" -#endif -#include "private/qstate_p.h" -#include "private/qstatemachine_p.h" - -static int globalTick; - -// Run exec for a maximum of TIMEOUT msecs -#define QCOREAPPLICATION_EXEC(TIMEOUT) \ -{ \ - QTimer timer; \ - timer.setSingleShot(true); \ - timer.setInterval(TIMEOUT); \ - timer.start(); \ - connect(&timer, SIGNAL(timeout()), QCoreApplication::instance(), SLOT(quit())); \ - QCoreApplication::exec(); \ -} - -#define TEST_RUNNING_CHANGED(RUNNING) \ -{ \ - QTRY_COMPARE(runningSpy.count(), 1); \ - QList runningArgs = runningSpy.takeFirst(); \ - QVERIFY(runningArgs.at(0).type() == QVariant::Bool); \ - QVERIFY(runningArgs.at(0).toBool() == RUNNING); \ - QCOMPARE(machine.isRunning(), runningArgs.at(0).toBool()); \ -} - -#define TEST_RUNNING_CHANGED_STARTED_STOPPED \ -{ \ - QTRY_COMPARE(runningSpy.count(), 2); \ - QList runningArgs = runningSpy.takeFirst(); \ - QVERIFY(runningArgs.at(0).type() == QVariant::Bool); \ - QVERIFY(runningArgs.at(0).toBool() == true); \ - runningArgs = runningSpy.takeFirst(); \ - QVERIFY(runningArgs.at(0).type() == QVariant::Bool); \ - QVERIFY(runningArgs.at(0).toBool() == false); \ - QCOMPARE(machine.isRunning(), runningArgs.at(0).toBool()); \ -} - -#define DEFINE_ACTIVE_SPY(VAR) \ - QSignalSpy VAR##_activeSpy(VAR, &QState::activeChanged); \ - QVERIFY(VAR##_activeSpy.isValid()); - -#define TEST_ACTIVE_CHANGED(VAR, COUNT) \ -{ \ - QTRY_COMPARE(VAR##_activeSpy.count(), COUNT); \ - bool active = true; \ - foreach (const QList &activeArgs, static_cast > >(VAR##_activeSpy)) { \ - QVERIFY(activeArgs.at(0).type() == QVariant::Bool); \ - QVERIFY(activeArgs.at(0).toBool() == active); \ - active = !active; \ - } \ - QCOMPARE(VAR->active(), !active); \ -} - -class SignalEmitter : public QObject -{ -Q_OBJECT - public: - SignalEmitter(QObject *parent = 0) - : QObject(parent) {} -public Q_SLOTS: - void emitSignalWithNoArg() - { emit signalWithNoArg(); } - void emitSignalWithIntArg(int arg) - { emit signalWithIntArg(arg); } - void emitSignalWithStringArg(const QString &arg) - { emit signalWithStringArg(arg); } - void emitSignalWithDefaultArg() - { emit signalWithDefaultArg(); } -Q_SIGNALS: - void signalWithNoArg(); - void signalWithIntArg(int); - void signalWithStringArg(const QString &); - void signalWithDefaultArg(int i = 42); -}; - -class tst_QStateMachine : public QObject -{ - Q_OBJECT -private slots: - void rootState(); - void machineWithParent(); -#ifdef QT_BUILD_INTERNAL - void addAndRemoveState(); -#endif - void stateEntryAndExit(); - void assignProperty(); - void assignPropertyWithAnimation(); - void postEvent(); - void cancelDelayedEvent(); - void postDelayedEventAndStop(); - void postDelayedEventFromThread(); - void stopAndPostEvent(); - void stateFinished(); - void parallelStates(); - void parallelRootState(); - void allSourceToTargetConfigurations(); - void signalTransitions(); -#ifndef QT_NO_WIDGETS - void eventTransitions(); - void graphicsSceneEventTransitions(); -#endif - void historyStates(); - void startAndStop(); - void setRunning(); - void targetStateWithNoParent(); - void targetStateDeleted(); - void transitionToRootState(); - void transitionFromRootState(); - void transitionEntersParent(); - - void defaultErrorState(); - void customGlobalErrorState(); - void customLocalErrorStateInBrokenState(); - void customLocalErrorStateInOtherState(); - void customLocalErrorStateInParentOfBrokenState(); - void customLocalErrorStateOverridesParent(); - void errorStateHasChildren(); - void errorStateHasErrors(); - void errorStateIsRootState(); - void errorStateEntersParentFirst(); - void customErrorStateIsNull(); - void clearError(); - void historyStateHasNowhereToGo(); - void historyStateAsInitialState(); - void historyStateAfterRestart(); - void brokenStateIsNeverEntered(); - void customErrorStateNotInGraph(); - void transitionToStateNotInGraph(); - void restoreProperties(); - - void defaultGlobalRestorePolicy(); - void globalRestorePolicySetToRestore(); - void globalRestorePolicySetToDontRestore(); - - void noInitialStateForInitialState(); - - void transitionWithParent(); - void transitionsFromParallelStateWithNoChildren(); - void parallelStateTransition(); - void parallelStateAssignmentsDone(); - void nestedRestoreProperties(); - void nestedRestoreProperties2(); - - void simpleAnimation(); - void twoAnimations(); - void twoAnimatedTransitions(); - void playAnimationTwice(); - void nestedTargetStateForAnimation(); - void propertiesAssignedSignalTransitionsReuseAnimationGroup(); - void animatedGlobalRestoreProperty(); - void specificTargetValueOfAnimation(); - - void addDefaultAnimation(); - void addDefaultAnimationWithUnusedAnimation(); - void removeDefaultAnimation(); - void overrideDefaultAnimationWithSpecific(); - - void nestedStateMachines(); - void goToState(); - void goToStateFromSourceWithTransition(); - - void clonedSignals(); - void postEventFromOtherThread(); -#ifndef QT_NO_WIDGETS - void eventFilterForApplication(); -#endif - void eventClassesExported(); - void stopInTransitionToFinalState(); - void stopInEventTest_data(); - void stopInEventTest(); - - void testIncrementReceivers(); - void initialStateIsEnteredBeforeStartedEmitted(); - void deletePropertyAssignmentObjectBeforeEntry(); - void deletePropertyAssignmentObjectBeforeRestore(); - void deleteInitialState(); - void setPropertyAfterRestore(); - void transitionWithNoTarget_data(); - void transitionWithNoTarget(); - void initialStateIsFinal(); - - void restorePropertiesSimple(); - void restoreProperties2(); - void restoreProperties3(); - void restoreProperties4(); - void restorePropertiesSelfTransition(); - void changeStateWhileAnimatingProperty(); - void propertiesAreAssignedBeforeEntryCallbacks_data(); - void propertiesAreAssignedBeforeEntryCallbacks(); - - void multiTargetTransitionInsideParallelStateGroup(); - void signalTransitionNormalizeSignature(); -#ifdef Q_COMPILER_DELEGATING_CONSTRUCTORS - void createPointerToMemberSignalTransition(); -#endif - void createSignalTransitionWhenRunning(); - void createEventTransitionWhenRunning(); - void signalTransitionSenderInDifferentThread(); - void signalTransitionSenderInDifferentThread2(); - void signalTransitionRegistrationThreadSafety(); - void childModeConstructor(); - - void qtbug_44963(); - void qtbug_44783(); - void internalTransition(); - void conflictingTransition(); - void conflictingTransition2(); - void qtbug_46059(); - void qtbug_46703(); - void postEventFromBeginSelectTransitions(); - void dontProcessSlotsWhenMachineIsNotRunning(); - - void cancelDelayedEventWithChrono(); - void postDelayedEventWithChronoAndStop(); - void postDelayedEventWithChronoFromThread(); -}; - -class TestState : public QState -{ -public: - enum Event { - Entry, - Exit - }; - TestState(QState *parent, const QString &objectName = QString()) - : QState(parent) - { setObjectName(objectName); } - TestState(ChildMode mode, const QString &objectName = QString()) - : QState(mode) - { setObjectName(objectName); } - QList > events; -protected: - virtual void onEntry(QEvent *) { - events.append(qMakePair(globalTick++, Entry)); - } - virtual void onExit(QEvent *) { - events.append(qMakePair(globalTick++, Exit)); - } -}; - -class TestTransition : public QAbstractTransition -{ -public: - TestTransition(QAbstractState *target, const QString &objectName = QString()) - : QAbstractTransition() - { setTargetState(target); setObjectName(objectName); } - QList triggers; -protected: - virtual bool eventTest(QEvent *) { - return true; - } - virtual void onTransition(QEvent *) { - triggers.append(globalTick++); - } -}; - -class EventTransition : public QAbstractTransition -{ -public: - EventTransition(QEvent::Type type, QAbstractState *target, QState *parent = 0) - : QAbstractTransition(parent), m_type(type) - { setTargetState(target); } - EventTransition(QEvent::Type type, const QList &targets, QState *parent = 0) - : QAbstractTransition(parent), m_type(type) - { setTargetStates(targets); } -protected: - virtual bool eventTest(QEvent *e) { - return (e->type() == m_type); - } - virtual void onTransition(QEvent *) {} -private: - QEvent::Type m_type; -}; - -void tst_QStateMachine::transitionToRootState() -{ - QStateMachine machine; - machine.setObjectName("machine"); - - QState *initialState = new QState(); - DEFINE_ACTIVE_SPY(initialState); - initialState->setObjectName("initial"); - machine.addState(initialState); - machine.setInitialState(initialState); - - QAbstractTransition *trans = new EventTransition(QEvent::User, &machine); - initialState->addTransition(trans); - QCOMPARE(trans->sourceState(), initialState); - QCOMPARE(trans->targetState(), static_cast(&machine)); - - machine.start(); - QCoreApplication::processEvents(); - - QCOMPARE(machine.configuration().count(), 1); - QVERIFY(machine.configuration().contains(initialState)); - TEST_ACTIVE_CHANGED(initialState, 1); - - machine.postEvent(new QEvent(QEvent::User)); - QTest::ignoreMessage(QtWarningMsg, - "Unrecoverable error detected in running state machine: " - "Child mode of state machine 'machine' is not 'ExclusiveStates'."); - QCoreApplication::processEvents(); - QVERIFY(machine.configuration().isEmpty()); - QVERIFY(!machine.isRunning()); - TEST_ACTIVE_CHANGED(initialState, 2); -} - -void tst_QStateMachine::transitionFromRootState() -{ - QStateMachine machine; - QState *root = &machine; - QState *s1 = new QState(root); - EventTransition *trans = new EventTransition(QEvent::User, s1); - root->addTransition(trans); - QCOMPARE(trans->sourceState(), root); - QCOMPARE(trans->targetState(), static_cast(s1)); -} - -void tst_QStateMachine::transitionEntersParent() -{ - QStateMachine machine; - - QObject *entryController = new QObject(&machine); - entryController->setObjectName("entryController"); - entryController->setProperty("greatGrandParentEntered", false); - entryController->setProperty("grandParentEntered", false); - entryController->setProperty("parentEntered", false); - entryController->setProperty("stateEntered", false); - - QState *greatGrandParent = new QState(); - greatGrandParent->setObjectName("grandParent"); - greatGrandParent->assignProperty(entryController, "greatGrandParentEntered", true); - machine.addState(greatGrandParent); - machine.setInitialState(greatGrandParent); - - QState *grandParent = new QState(greatGrandParent); - grandParent->setObjectName("grandParent"); - grandParent->assignProperty(entryController, "grandParentEntered", true); - - QState *parent = new QState(grandParent); - parent->setObjectName("parent"); - parent->assignProperty(entryController, "parentEntered", true); - - QState *state = new QState(parent); - state->setObjectName("state"); - state->assignProperty(entryController, "stateEntered", true); - - QState *initialStateOfGreatGrandParent = new QState(greatGrandParent); - initialStateOfGreatGrandParent->setObjectName("initialStateOfGreatGrandParent"); - greatGrandParent->setInitialState(initialStateOfGreatGrandParent); - - initialStateOfGreatGrandParent->addTransition(new EventTransition(QEvent::User, state)); - - machine.start(); - QCoreApplication::processEvents(); - - QCOMPARE(entryController->property("greatGrandParentEntered").toBool(), true); - QCOMPARE(entryController->property("grandParentEntered").toBool(), false); - QCOMPARE(entryController->property("parentEntered").toBool(), false); - QCOMPARE(entryController->property("stateEntered").toBool(), false); - QCOMPARE(machine.configuration().count(), 2); - QVERIFY(machine.configuration().contains(greatGrandParent)); - QVERIFY(machine.configuration().contains(initialStateOfGreatGrandParent)); - - entryController->setProperty("greatGrandParentEntered", false); - entryController->setProperty("grandParentEntered", false); - entryController->setProperty("parentEntered", false); - entryController->setProperty("stateEntered", false); - - machine.postEvent(new QEvent(QEvent::User)); - QCoreApplication::processEvents(); - - QCOMPARE(entryController->property("greatGrandParentEntered").toBool(), false); - QCOMPARE(entryController->property("grandParentEntered").toBool(), true); - QCOMPARE(entryController->property("parentEntered").toBool(), true); - QCOMPARE(entryController->property("stateEntered").toBool(), true); - QCOMPARE(machine.configuration().count(), 4); - QVERIFY(machine.configuration().contains(greatGrandParent)); - QVERIFY(machine.configuration().contains(grandParent)); - QVERIFY(machine.configuration().contains(parent)); - QVERIFY(machine.configuration().contains(state)); -} - -void tst_QStateMachine::defaultErrorState() -{ - QStateMachine machine; - QCOMPARE(machine.errorState(), reinterpret_cast(0)); - - QState *brokenState = new QState(); - brokenState->setObjectName("MyInitialState"); - - machine.addState(brokenState); - machine.setInitialState(brokenState); - - QState *childState = new QState(brokenState); - childState->setObjectName("childState"); - - QTest::ignoreMessage(QtWarningMsg, "Unrecoverable error detected in running state machine: Missing initial state in compound state 'MyInitialState'"); - - // initialState has no initial state - machine.start(); - QCoreApplication::processEvents(); - - QCOMPARE(machine.error(), QStateMachine::NoInitialStateError); - QCOMPARE(machine.errorString(), QString::fromLatin1("Missing initial state in compound state 'MyInitialState'")); - QCOMPARE(machine.isRunning(), false); -} - -class CustomErrorState: public QState -{ -public: - CustomErrorState(QStateMachine *machine, QState *parent = 0) - : QState(parent), error(QStateMachine::NoError), m_machine(machine) - { - } - - void onEntry(QEvent *) - { - error = m_machine->error(); - errorString = m_machine->errorString(); - } - - QStateMachine::Error error; - QString errorString; - -private: - QStateMachine *m_machine; -}; - -void tst_QStateMachine::customGlobalErrorState() -{ - QStateMachine machine; - - CustomErrorState *customErrorState = new CustomErrorState(&machine); - customErrorState->setObjectName("customErrorState"); - machine.addState(customErrorState); - machine.setErrorState(customErrorState); - - QState *initialState = new QState(); - initialState->setObjectName("initialState"); - machine.addState(initialState); - machine.setInitialState(initialState); - - QState *brokenState = new QState(); - brokenState->setObjectName("brokenState"); - machine.addState(brokenState); - QState *childState = new QState(brokenState); - childState->setObjectName("childState"); - - initialState->addTransition(new EventTransition(QEvent::Type(QEvent::User + 1), brokenState)); - machine.start(); - QCoreApplication::processEvents(); - - QCOMPARE(machine.errorState(), static_cast(customErrorState)); - QCOMPARE(machine.configuration().count(), 1); - QVERIFY(machine.configuration().contains(initialState)); - - machine.postEvent(new QEvent(QEvent::Type(QEvent::User + 1))); - QCOMPARE(machine.configuration().count(), 1); - QVERIFY(machine.configuration().contains(initialState)); - - QCoreApplication::processEvents(); - - QCOMPARE(machine.isRunning(), true); - QCOMPARE(machine.configuration().count(), 1); - QVERIFY(machine.configuration().contains(customErrorState)); - QCOMPARE(customErrorState->error, QStateMachine::NoInitialStateError); - QCOMPARE(customErrorState->errorString, QString::fromLatin1("Missing initial state in compound state 'brokenState'")); - QCOMPARE(machine.error(), QStateMachine::NoInitialStateError); - QCOMPARE(machine.errorString(), QString::fromLatin1("Missing initial state in compound state 'brokenState'")); -} - -void tst_QStateMachine::customLocalErrorStateInBrokenState() -{ - QStateMachine machine; - CustomErrorState *customErrorState = new CustomErrorState(&machine); - machine.addState(customErrorState); - - QState *initialState = new QState(); - initialState->setObjectName("initialState"); - machine.addState(initialState); - machine.setInitialState(initialState); - - QState *brokenState = new QState(); - brokenState->setObjectName("brokenState"); - machine.addState(brokenState); - brokenState->setErrorState(customErrorState); - - QState *childState = new QState(brokenState); - childState->setObjectName("childState"); - - initialState->addTransition(new EventTransition(QEvent::Type(QEvent::User + 1), brokenState)); - - machine.start(); - QCoreApplication::processEvents(); - - machine.postEvent(new QEvent(QEvent::Type(QEvent::User + 1))); - QCoreApplication::processEvents(); - - QCOMPARE(machine.isRunning(), true); - QCOMPARE(machine.configuration().count(), 1); - QVERIFY(machine.configuration().contains(customErrorState)); - QCOMPARE(customErrorState->error, QStateMachine::NoInitialStateError); -} - -void tst_QStateMachine::customLocalErrorStateInOtherState() -{ - QStateMachine machine; - CustomErrorState *customErrorState = new CustomErrorState(&machine); - machine.addState(customErrorState); - - QState *initialState = new QState(); - initialState->setObjectName("initialState"); - QTest::ignoreMessage(QtWarningMsg, "QState::setErrorState: error state cannot belong to a different state machine"); - initialState->setErrorState(customErrorState); - machine.addState(initialState); - machine.setInitialState(initialState); - - QState *brokenState = new QState(); - brokenState->setObjectName("brokenState"); - - machine.addState(brokenState); - - QState *childState = new QState(brokenState); - childState->setObjectName("childState"); - - initialState->addTransition(new EventTransition(QEvent::Type(QEvent::User + 1), brokenState)); - - QTest::ignoreMessage(QtWarningMsg, "Unrecoverable error detected in running state machine: Missing initial state in compound state 'brokenState'"); - machine.start(); - QCoreApplication::processEvents(); - - machine.postEvent(new QEvent(QEvent::Type(QEvent::User + 1))); - QCoreApplication::processEvents(); - - QCOMPARE(machine.isRunning(), false); -} - -void tst_QStateMachine::customLocalErrorStateInParentOfBrokenState() -{ - QStateMachine machine; - CustomErrorState *customErrorState = new CustomErrorState(&machine); - machine.addState(customErrorState); - - QState *initialState = new QState(); - initialState->setObjectName("initialState"); - machine.addState(initialState); - machine.setInitialState(initialState); - - QState *parentOfBrokenState = new QState(); - machine.addState(parentOfBrokenState); - parentOfBrokenState->setObjectName("parentOfBrokenState"); - parentOfBrokenState->setErrorState(customErrorState); - - QState *brokenState = new QState(parentOfBrokenState); - brokenState->setObjectName("brokenState"); - parentOfBrokenState->setInitialState(brokenState); - - QState *childState = new QState(brokenState); - childState->setObjectName("childState"); - - initialState->addTransition(new EventTransition(QEvent::Type(QEvent::User + 1), brokenState)); - - machine.start(); - QCoreApplication::processEvents(); - - machine.postEvent(new QEvent(QEvent::Type(QEvent::User + 1))); - QCoreApplication::processEvents(); - - QCOMPARE(machine.isRunning(), true); - QCOMPARE(machine.configuration().count(), 1); - QVERIFY(machine.configuration().contains(customErrorState)); -} - -void tst_QStateMachine::customLocalErrorStateOverridesParent() -{ - QStateMachine machine; - CustomErrorState *customErrorStateForParent = new CustomErrorState(&machine); - machine.addState(customErrorStateForParent); - - CustomErrorState *customErrorStateForBrokenState = new CustomErrorState(&machine); - machine.addState(customErrorStateForBrokenState); - - QState *initialState = new QState(); - initialState->setObjectName("initialState"); - machine.addState(initialState); - machine.setInitialState(initialState); - - QState *parentOfBrokenState = new QState(); - machine.addState(parentOfBrokenState); - parentOfBrokenState->setObjectName("parentOfBrokenState"); - parentOfBrokenState->setErrorState(customErrorStateForParent); - - QState *brokenState = new QState(parentOfBrokenState); - brokenState->setObjectName("brokenState"); - brokenState->setErrorState(customErrorStateForBrokenState); - parentOfBrokenState->setInitialState(brokenState); - - QState *childState = new QState(brokenState); - childState->setObjectName("childState"); - - initialState->addTransition(new EventTransition(QEvent::Type(QEvent::User + 1), brokenState)); - - machine.start(); - QCoreApplication::processEvents(); - - machine.postEvent(new QEvent(QEvent::Type(QEvent::User + 1))); - QCoreApplication::processEvents(); - - QCOMPARE(machine.configuration().count(), 1); - QVERIFY(machine.configuration().contains(customErrorStateForBrokenState)); - QCOMPARE(customErrorStateForBrokenState->error, QStateMachine::NoInitialStateError); - QCOMPARE(customErrorStateForParent->error, QStateMachine::NoError); -} - -void tst_QStateMachine::errorStateHasChildren() -{ - QStateMachine machine; - CustomErrorState *customErrorState = new CustomErrorState(&machine); - customErrorState->setObjectName("customErrorState"); - machine.addState(customErrorState); - - machine.setErrorState(customErrorState); - - QState *childOfErrorState = new QState(customErrorState); - childOfErrorState->setObjectName("childOfErrorState"); - customErrorState->setInitialState(childOfErrorState); - - QState *initialState = new QState(); - initialState->setObjectName("initialState"); - machine.addState(initialState); - machine.setInitialState(initialState); - - QState *brokenState = new QState(); - brokenState->setObjectName("brokenState"); - machine.addState(brokenState); - - QState *childState = new QState(brokenState); - childState->setObjectName("childState"); - - initialState->addTransition(new EventTransition(QEvent::Type(QEvent::User + 1), brokenState)); - - machine.start(); - QCoreApplication::processEvents(); - - machine.postEvent(new QEvent(QEvent::Type(QEvent::User + 1))); - QCoreApplication::processEvents(); - - QCOMPARE(machine.isRunning(), true); - QCOMPARE(machine.configuration().count(), 2); - QVERIFY(machine.configuration().contains(customErrorState)); - QVERIFY(machine.configuration().contains(childOfErrorState)); -} - - -void tst_QStateMachine::errorStateHasErrors() -{ - QStateMachine machine; - CustomErrorState *customErrorState = new CustomErrorState(&machine); - customErrorState->setObjectName("customErrorState"); - machine.addState(customErrorState); - - machine.setErrorState(customErrorState); - - QState *childOfErrorState = new QState(customErrorState); - childOfErrorState->setObjectName("childOfErrorState"); - - QState *initialState = new QState(); - initialState->setObjectName("initialState"); - machine.addState(initialState); - machine.setInitialState(initialState); - - QState *brokenState = new QState(); - brokenState->setObjectName("brokenState"); - machine.addState(brokenState); - - QState *childState = new QState(brokenState); - childState->setObjectName("childState"); - - initialState->addTransition(new EventTransition(QEvent::Type(QEvent::User + 1), brokenState)); - - machine.start(); - QCoreApplication::processEvents(); - - machine.postEvent(new QEvent(QEvent::Type(QEvent::User + 1))); - QTest::ignoreMessage(QtWarningMsg, "Unrecoverable error detected in running state machine: Missing initial state in compound state 'customErrorState'"); - QCoreApplication::processEvents(); - - QCOMPARE(machine.isRunning(), false); - QCOMPARE(machine.error(), QStateMachine::NoInitialStateError); - QCOMPARE(machine.errorString(), QString::fromLatin1("Missing initial state in compound state 'customErrorState'")); -} - -void tst_QStateMachine::errorStateIsRootState() -{ - QStateMachine machine; - QTest::ignoreMessage(QtWarningMsg, "QStateMachine::setErrorState: root state cannot be error state"); - machine.setErrorState(&machine); - - QState *initialState = new QState(); - initialState->setObjectName("initialState"); - machine.addState(initialState); - machine.setInitialState(initialState); - - QState *brokenState = new QState(); - brokenState->setObjectName("brokenState"); - machine.addState(brokenState); - - QState *childState = new QState(brokenState); - childState->setObjectName("childState"); - - initialState->addTransition(new EventTransition(QEvent::Type(QEvent::User + 1), brokenState)); - - machine.start(); - QCoreApplication::processEvents(); - - machine.postEvent(new QEvent(QEvent::Type(QEvent::User + 1))); - QTest::ignoreMessage(QtWarningMsg, "Unrecoverable error detected in running state machine: Missing initial state in compound state 'brokenState'"); - QCoreApplication::processEvents(); - - QCOMPARE(machine.isRunning(), false); -} - -void tst_QStateMachine::errorStateEntersParentFirst() -{ - QStateMachine machine; - - QObject *entryController = new QObject(&machine); - entryController->setObjectName("entryController"); - entryController->setProperty("greatGrandParentEntered", false); - entryController->setProperty("grandParentEntered", false); - entryController->setProperty("parentEntered", false); - entryController->setProperty("errorStateEntered", false); - - QState *greatGrandParent = new QState(); - greatGrandParent->setObjectName("greatGrandParent"); - greatGrandParent->assignProperty(entryController, "greatGrandParentEntered", true); - machine.addState(greatGrandParent); - machine.setInitialState(greatGrandParent); - - QState *grandParent = new QState(greatGrandParent); - grandParent->setObjectName("grandParent"); - grandParent->assignProperty(entryController, "grandParentEntered", true); - - QState *parent = new QState(grandParent); - parent->setObjectName("parent"); - parent->assignProperty(entryController, "parentEntered", true); - - QState *errorState = new QState(parent); - errorState->setObjectName("errorState"); - errorState->assignProperty(entryController, "errorStateEntered", true); - machine.setErrorState(errorState); - - QState *initialStateOfGreatGrandParent = new QState(greatGrandParent); - initialStateOfGreatGrandParent->setObjectName("initialStateOfGreatGrandParent"); - greatGrandParent->setInitialState(initialStateOfGreatGrandParent); - - QState *brokenState = new QState(greatGrandParent); - brokenState->setObjectName("brokenState"); - - QState *childState = new QState(brokenState); - childState->setObjectName("childState"); - - initialStateOfGreatGrandParent->addTransition(new EventTransition(QEvent::User, brokenState)); - - machine.start(); - QCoreApplication::processEvents(); - - QCOMPARE(entryController->property("greatGrandParentEntered").toBool(), true); - QCOMPARE(entryController->property("grandParentEntered").toBool(), false); - QCOMPARE(entryController->property("parentEntered").toBool(), false); - QCOMPARE(entryController->property("errorStateEntered").toBool(), false); - QCOMPARE(machine.configuration().count(), 2); - QVERIFY(machine.configuration().contains(greatGrandParent)); - QVERIFY(machine.configuration().contains(initialStateOfGreatGrandParent)); - - entryController->setProperty("greatGrandParentEntered", false); - entryController->setProperty("grandParentEntered", false); - entryController->setProperty("parentEntered", false); - entryController->setProperty("errorStateEntered", false); - - machine.postEvent(new QEvent(QEvent::User)); - QCoreApplication::processEvents(); - - QCOMPARE(entryController->property("greatGrandParentEntered").toBool(), false); - QCOMPARE(entryController->property("grandParentEntered").toBool(), true); - QCOMPARE(entryController->property("parentEntered").toBool(), true); - QCOMPARE(entryController->property("errorStateEntered").toBool(), true); - QCOMPARE(machine.configuration().count(), 4); - QVERIFY(machine.configuration().contains(greatGrandParent)); - QVERIFY(machine.configuration().contains(grandParent)); - QVERIFY(machine.configuration().contains(parent)); - QVERIFY(machine.configuration().contains(errorState)); -} - -void tst_QStateMachine::customErrorStateIsNull() -{ - QStateMachine machine; - machine.setErrorState(0); - - QState *initialState = new QState(); - machine.addState(initialState); - machine.setInitialState(initialState); - - QState *brokenState = new QState(); - machine.addState(brokenState); - - new QState(brokenState); - initialState->addTransition(new EventTransition(QEvent::User, brokenState)); - - machine.start(); - QCoreApplication::processEvents(); - - machine.postEvent(new QEvent(QEvent::User)); - QTest::ignoreMessage(QtWarningMsg, "Unrecoverable error detected in running state machine: Missing initial state in compound state ''"); - QCoreApplication::processEvents(); - - QCOMPARE(machine.errorState(), reinterpret_cast(0)); - QCOMPARE(machine.isRunning(), false); -} - -void tst_QStateMachine::clearError() -{ - QStateMachine machine; - machine.setErrorState(new QState(&machine)); // avoid warnings - - QState *brokenState = new QState(&machine); - brokenState->setObjectName("brokenState"); - machine.setInitialState(brokenState); - new QState(brokenState); - - machine.start(); - QCoreApplication::processEvents(); - - QCOMPARE(machine.isRunning(), true); - QCOMPARE(machine.error(), QStateMachine::NoInitialStateError); - QCOMPARE(machine.errorString(), QString::fromLatin1("Missing initial state in compound state 'brokenState'")); - - machine.clearError(); - - QCOMPARE(machine.error(), QStateMachine::NoError); - QVERIFY(machine.errorString().isEmpty()); -} - -void tst_QStateMachine::historyStateAsInitialState() -{ - QStateMachine machine; - - QHistoryState *hs = new QHistoryState(&machine); - machine.setInitialState(hs); - - QState *s1 = new QState(&machine); - hs->setDefaultState(s1); - - QState *s2 = new QState(&machine); - - QHistoryState *s2h = new QHistoryState(s2); - s2->setInitialState(s2h); - - QState *s21 = new QState(s2); - s2h->setDefaultState(s21); - - s1->addTransition(new EventTransition(QEvent::User, s2)); - - machine.start(); - QCoreApplication::processEvents(); - - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s1)); - - machine.postEvent(new QEvent(QEvent::User)); - QCoreApplication::processEvents(); - - QCOMPARE(machine.configuration().size(), 2); - QVERIFY(machine.configuration().contains(s2)); - QVERIFY(machine.configuration().contains(s21)); -} - -void tst_QStateMachine::historyStateHasNowhereToGo() -{ - QStateMachine machine; - - QState *initialState = new QState(&machine); - initialState->setObjectName("initialState"); - machine.setInitialState(initialState); - QState *errorState = new QState(&machine); - errorState->setObjectName("errorState"); - machine.setErrorState(errorState); // avoid warnings - - QState *brokenState = new QState(&machine); - brokenState->setObjectName("brokenState"); - brokenState->setInitialState(new QState(brokenState)); - - QHistoryState *historyState = new QHistoryState(brokenState); - historyState->setObjectName("historyState"); - EventTransition *t = new EventTransition(QEvent::User, historyState); - t->setObjectName("initialState->historyState"); - initialState->addTransition(t); - - machine.start(); - QCoreApplication::processEvents(); - - machine.postEvent(new QEvent(QEvent::User)); - QCoreApplication::processEvents(); - - QCOMPARE(machine.isRunning(), true); - QCOMPARE(machine.configuration().count(), 1); - QVERIFY(machine.configuration().contains(machine.errorState())); - QCOMPARE(machine.error(), QStateMachine::NoDefaultStateInHistoryStateError); - QCOMPARE(machine.errorString(), QString::fromLatin1("Missing default state in history state 'historyState'")); -} - -void tst_QStateMachine::historyStateAfterRestart() -{ - // QTBUG-8842 - QStateMachine machine; - - QState *s1 = new QState(&machine); - machine.setInitialState(s1); - QState *s2 = new QState(&machine); - QState *s21 = new QState(s2); - QState *s22 = new QState(s2); - QHistoryState *s2h = new QHistoryState(s2); - s2h->setDefaultState(s21); - s1->addTransition(new EventTransition(QEvent::User, s2h)); - s21->addTransition(new EventTransition(QEvent::User, s22)); - s2->addTransition(new EventTransition(QEvent::User, s1)); - - for (int x = 0; x < 2; ++x) { - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(runningSpy.isValid()); - QSignalSpy startedSpy(&machine, &QStateMachine::started); - QVERIFY(startedSpy.isValid()); - machine.start(); - QTRY_COMPARE(startedSpy.count(), 1); - TEST_RUNNING_CHANGED(true); - QCOMPARE(machine.configuration().count(), 1); - QVERIFY(machine.configuration().contains(s1)); - - // s1 -> s2h -> s21 (default state) - machine.postEvent(new QEvent(QEvent::User)); - QCoreApplication::processEvents(); - QCOMPARE(machine.configuration().count(), 2); - QVERIFY(machine.configuration().contains(s2)); - // This used to fail on the 2nd run because the - // history had not been cleared. - QVERIFY(machine.configuration().contains(s21)); - - // s21 -> s22 - machine.postEvent(new QEvent(QEvent::User)); - QCoreApplication::processEvents(); - QCOMPARE(machine.configuration().count(), 2); - QVERIFY(machine.configuration().contains(s2)); - QVERIFY(machine.configuration().contains(s22)); - - // s2 -> s1 (s22 saved in s2h) - machine.postEvent(new QEvent(QEvent::User)); - QCoreApplication::processEvents(); - QCOMPARE(machine.configuration().count(), 1); - QVERIFY(machine.configuration().contains(s1)); - - // s1 -> s2h -> s22 (saved state) - machine.postEvent(new QEvent(QEvent::User)); - QCoreApplication::processEvents(); - QCOMPARE(machine.configuration().count(), 2); - QVERIFY(machine.configuration().contains(s2)); - QVERIFY(machine.configuration().contains(s22)); - - QSignalSpy stoppedSpy(&machine, &QStateMachine::stopped); - QVERIFY(stoppedSpy.isValid()); - machine.stop(); - QTRY_COMPARE(stoppedSpy.count(), 1); - TEST_RUNNING_CHANGED(false); - } -} - -void tst_QStateMachine::brokenStateIsNeverEntered() -{ - QStateMachine machine; - - QObject *entryController = new QObject(&machine); - entryController->setProperty("brokenStateEntered", false); - entryController->setProperty("childStateEntered", false); - entryController->setProperty("errorStateEntered", false); - - QState *initialState = new QState(&machine); - machine.setInitialState(initialState); - - QState *errorState = new QState(&machine); - errorState->assignProperty(entryController, "errorStateEntered", true); - machine.setErrorState(errorState); - - QState *brokenState = new QState(&machine); - brokenState->assignProperty(entryController, "brokenStateEntered", true); - brokenState->setObjectName("brokenState"); - - QState *childState = new QState(brokenState); - childState->assignProperty(entryController, "childStateEntered", true); - - initialState->addTransition(new EventTransition(QEvent::User, brokenState)); - - machine.start(); - QCoreApplication::processEvents(); - - machine.postEvent(new QEvent(QEvent::User)); - QCoreApplication::processEvents(); - - QCOMPARE(entryController->property("errorStateEntered").toBool(), true); - QCOMPARE(entryController->property("brokenStateEntered").toBool(), false); - QCOMPARE(entryController->property("childStateEntered").toBool(), false); -} - -void tst_QStateMachine::transitionToStateNotInGraph() -{ - QStateMachine machine; - - QState *initialState = new QState(&machine); - initialState->setObjectName("initialState"); - machine.setInitialState(initialState); - - QState independentState; - independentState.setObjectName("independentState"); - initialState->addTransition(&independentState); - - machine.start(); - QTest::ignoreMessage(QtWarningMsg, "Unrecoverable error detected in running state machine: " - "Child mode of state machine '' is not 'ExclusiveStates'."); - QCoreApplication::processEvents(); - - QCOMPARE(machine.isRunning(), false); -} - -void tst_QStateMachine::customErrorStateNotInGraph() -{ - QStateMachine machine; - - QState errorState; - errorState.setObjectName("errorState"); - QTest::ignoreMessage(QtWarningMsg, "QState::setErrorState: error state cannot belong to a different state machine"); - machine.setErrorState(&errorState); - QCOMPARE(machine.errorState(), reinterpret_cast(0)); - - QState *initialBrokenState = new QState(&machine); - initialBrokenState->setObjectName("initialBrokenState"); - machine.setInitialState(initialBrokenState); - new QState(initialBrokenState); - - machine.start(); - QTest::ignoreMessage(QtWarningMsg, "Unrecoverable error detected in running state machine: Missing initial state in compound state 'initialBrokenState'"); - QCoreApplication::processEvents(); - - QCOMPARE(machine.isRunning(), false); -} - -void tst_QStateMachine::restoreProperties() -{ - QStateMachine machine; - QCOMPARE(machine.globalRestorePolicy(), QState::DontRestoreProperties); - machine.setGlobalRestorePolicy(QState::RestoreProperties); - - QObject *object = new QObject(&machine); - object->setProperty("a", 1); - object->setProperty("b", 2); - - QState *S1 = new QState(); - S1->setObjectName("S1"); - S1->assignProperty(object, "a", 3); - machine.addState(S1); - - QState *S2 = new QState(); - S2->setObjectName("S2"); - S2->assignProperty(object, "b", 5); - machine.addState(S2); - - QState *S3 = new QState(); - S3->setObjectName("S3"); - machine.addState(S3); - - QFinalState *S4 = new QFinalState(); - machine.addState(S4); - - S1->addTransition(new EventTransition(QEvent::User, S2)); - S2->addTransition(new EventTransition(QEvent::User, S3)); - S3->addTransition(S4); - - machine.setInitialState(S1); - machine.start(); - QCoreApplication::processEvents(); - - QCOMPARE(object->property("a").toInt(), 3); - QCOMPARE(object->property("b").toInt(), 2); - - machine.postEvent(new QEvent(QEvent::User)); - QCoreApplication::processEvents(); - - QCOMPARE(object->property("a").toInt(), 1); - QCOMPARE(object->property("b").toInt(), 5); - - machine.postEvent(new QEvent(QEvent::User)); - QCoreApplication::processEvents(); - - QCOMPARE(object->property("a").toInt(), 1); - QCOMPARE(object->property("b").toInt(), 2); -} - -void tst_QStateMachine::rootState() -{ - QStateMachine machine; - QCOMPARE(qobject_cast(machine.parentState()), (QState*)0); - QCOMPARE(machine.machine(), (QStateMachine*)0); - - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - QCOMPARE(s1->parentState(), static_cast(&machine)); - - QState *s2 = new QState(); - DEFINE_ACTIVE_SPY(s2); - s2->setParent(&machine); - QCOMPARE(s2->parentState(), static_cast(&machine)); - TEST_ACTIVE_CHANGED(s1, 0); - TEST_ACTIVE_CHANGED(s2, 0); -} - -void tst_QStateMachine::machineWithParent() -{ - QObject object; - QStateMachine *machine = new QStateMachine(&object); - QCOMPARE(machine->parent(), &object); - QCOMPARE(machine->parentState(), static_cast(0)); -} - -#ifdef QT_BUILD_INTERNAL -void tst_QStateMachine::addAndRemoveState() -{ - QStateMachine machine; - QStatePrivate *root_d = QStatePrivate::get(&machine); - QCOMPARE(root_d->childStates().size(), 0); - - QTest::ignoreMessage(QtWarningMsg, "QStateMachine::addState: cannot add null state"); - machine.addState(0); - - QState *s1 = new QState(); - QCOMPARE(s1->parentState(), (QState*)0); - QCOMPARE(s1->machine(), (QStateMachine*)0); - machine.addState(s1); - QCOMPARE(s1->machine(), static_cast(&machine)); - QCOMPARE(s1->parentState(), static_cast(&machine)); - QCOMPARE(root_d->childStates().size(), 1); - QCOMPARE(root_d->childStates().at(0), (QAbstractState*)s1); - - QTest::ignoreMessage(QtWarningMsg, "QStateMachine::addState: state has already been added to this machine"); - machine.addState(s1); - - QState *s2 = new QState(); - QCOMPARE(s2->parentState(), (QState*)0); - machine.addState(s2); - QCOMPARE(s2->parentState(), static_cast(&machine)); - QCOMPARE(root_d->childStates().size(), 2); - QCOMPARE(root_d->childStates().at(0), (QAbstractState*)s1); - QCOMPARE(root_d->childStates().at(1), (QAbstractState*)s2); - - QTest::ignoreMessage(QtWarningMsg, "QStateMachine::addState: state has already been added to this machine"); - machine.addState(s2); - - machine.removeState(s1); - QCOMPARE(s1->parentState(), (QState*)0); - QCOMPARE(root_d->childStates().size(), 1); - QCOMPARE(root_d->childStates().at(0), (QAbstractState*)s2); - - machine.removeState(s2); - QCOMPARE(s2->parentState(), (QState*)0); - QCOMPARE(root_d->childStates().size(), 0); - - QTest::ignoreMessage(QtWarningMsg, "QStateMachine::removeState: cannot remove null state"); - machine.removeState(0); - - { - QStateMachine machine2; - { - const QString warning - = QString::asprintf("QStateMachine::removeState: state %p's machine (%p) is different from this machine (%p)", - &machine2, (void*)0, &machine); - QTest::ignoreMessage(QtWarningMsg, qPrintable(warning)); - machine.removeState(&machine2); - } - // ### check this behavior - machine.addState(&machine2); - QCOMPARE(machine2.parent(), (QObject*)&machine); - } - - delete s1; - delete s2; - // ### how to deal with this? - // machine.removeState(machine.errorState()); -} -#endif - -void tst_QStateMachine::stateEntryAndExit() -{ - // Two top-level states - { - QStateMachine machine; - - TestState *s1 = new TestState(&machine); - QTest::ignoreMessage(QtWarningMsg, "QState::addTransition: cannot add transition to null state"); - s1->addTransition((QAbstractState*)0); - QTest::ignoreMessage(QtWarningMsg, "QState::addTransition: cannot add null transition"); - s1->addTransition((QAbstractTransition*)0); - QTest::ignoreMessage(QtWarningMsg, "QState::removeTransition: cannot remove null transition"); - s1->removeTransition((QAbstractTransition*)0); - - TestState *s2 = new TestState(&machine); - QFinalState *s3 = new QFinalState(&machine); - - TestTransition *t = new TestTransition(s2); - QCOMPARE(t->machine(), (QStateMachine*)0); - QCOMPARE(t->sourceState(), (QState*)0); - QCOMPARE(t->targetState(), (QAbstractState*)s2); - QCOMPARE(t->targetStates().size(), 1); - QCOMPARE(t->targetStates().at(0), (QAbstractState*)s2); - t->setTargetState(0); - QCOMPARE(t->targetState(), (QAbstractState*)0); - QVERIFY(t->targetStates().isEmpty()); - t->setTargetState(s2); - QCOMPARE(t->targetState(), (QAbstractState*)s2); - QTest::ignoreMessage(QtWarningMsg, "QAbstractTransition::setTargetStates: target state(s) cannot be null"); - t->setTargetStates(QList() << 0); - QCOMPARE(t->targetState(), (QAbstractState*)s2); - t->setTargetStates(QList() << s2); - QCOMPARE(t->targetState(), (QAbstractState*)s2); - QCOMPARE(t->targetStates().size(), 1); - QCOMPARE(t->targetStates().at(0), (QAbstractState*)s2); - s1->addTransition(t); - QCOMPARE(t->sourceState(), (QState*)s1); - QCOMPARE(t->machine(), &machine); - - { - QAbstractTransition *trans = s2->addTransition(s3); - QVERIFY(trans != 0); - QCOMPARE(trans->sourceState(), (QState*)s2); - QCOMPARE(trans->targetState(), (QAbstractState*)s3); - { - const QString warning - = QString::asprintf("QState::removeTransition: transition %p's source state (%p) is different from this state (%p)", trans, s2, s1); - QTest::ignoreMessage(QtWarningMsg, qPrintable(warning)); - s1->removeTransition(trans); - } - s2->removeTransition(trans); - QCOMPARE(trans->sourceState(), (QState*)0); - QCOMPARE(trans->targetState(), (QAbstractState*)s3); - s2->addTransition(trans); - QCOMPARE(trans->sourceState(), (QState*)s2); - } - - QSignalSpy startedSpy(&machine, &QStateMachine::started); - QSignalSpy stoppedSpy(&machine, &QStateMachine::stopped); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - - QVERIFY(startedSpy.isValid()); - QVERIFY(stoppedSpy.isValid()); - QVERIFY(finishedSpy.isValid()); - QVERIFY(runningSpy.isValid()); - - machine.setInitialState(s1); - QCOMPARE(machine.initialState(), (QAbstractState*)s1); - { - QString warning - = QString::asprintf("QState::setInitialState: state %p is not a child of this state (%p)", &machine, &machine); - QTest::ignoreMessage(QtWarningMsg, qPrintable(warning)); - machine.setInitialState(&machine); - QCOMPARE(machine.initialState(), (QAbstractState*)s1); - } - QVERIFY(machine.configuration().isEmpty()); - globalTick = 0; - QVERIFY(!machine.isRunning()); - QSignalSpy s1EnteredSpy(s1, &TestState::entered); - QSignalSpy s1ExitedSpy(s1, &TestState::exited); - QSignalSpy tTriggeredSpy(t, &TestTransition::triggered); - QSignalSpy s2EnteredSpy(s2, &TestState::entered); - QSignalSpy s2ExitedSpy(s2, &TestState::exited); - - QVERIFY(s1EnteredSpy.isValid()); - QVERIFY(s1ExitedSpy.isValid()); - QVERIFY(tTriggeredSpy.isValid()); - QVERIFY(s2EnteredSpy.isValid()); - QVERIFY(s2ExitedSpy.isValid()); - - machine.start(); - - QTRY_COMPARE(startedSpy.count(), 1); - QTRY_COMPARE(finishedSpy.count(), 1); - QTRY_COMPARE(stoppedSpy.count(), 0); - TEST_RUNNING_CHANGED_STARTED_STOPPED; - QCOMPARE(machine.configuration().count(), 1); - QVERIFY(machine.configuration().contains(s3)); - - // s1 is entered - QCOMPARE(s1->events.count(), 2); - QCOMPARE(s1->events.at(0).first, 0); - QCOMPARE(s1->events.at(0).second, TestState::Entry); - // s1 is exited - QCOMPARE(s1->events.at(1).first, 1); - QCOMPARE(s1->events.at(1).second, TestState::Exit); - // t is triggered - QCOMPARE(t->triggers.count(), 1); - QCOMPARE(t->triggers.at(0), 2); - // s2 is entered - QCOMPARE(s2->events.count(), 2); - QCOMPARE(s2->events.at(0).first, 3); - QCOMPARE(s2->events.at(0).second, TestState::Entry); - // s2 is exited - QCOMPARE(s2->events.at(1).first, 4); - QCOMPARE(s2->events.at(1).second, TestState::Exit); - - QCOMPARE(s1EnteredSpy.count(), 1); - QCOMPARE(s1ExitedSpy.count(), 1); - QCOMPARE(tTriggeredSpy.count(), 1); - QCOMPARE(s2EnteredSpy.count(), 1); - QCOMPARE(s2ExitedSpy.count(), 1); - } - // Two top-level states, one has two child states - { - QStateMachine machine; - - TestState *s1 = new TestState(&machine, "s1"); - TestState *s11 = new TestState(s1, "s11"); - TestState *s12 = new TestState(s1, "s12"); - TestState *s2 = new TestState(&machine, "s2"); - QFinalState *s3 = new QFinalState(&machine); - s3->setObjectName("s3"); - s1->setInitialState(s11); - TestTransition *t1 = new TestTransition(s12, "t1"); - s11->addTransition(t1); - TestTransition *t2 = new TestTransition(s2, "t2"); - s12->addTransition(t2); - s2->addTransition(s3); - - QSignalSpy startedSpy(&machine, &QStateMachine::started); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(startedSpy.isValid()); - QVERIFY(finishedSpy.isValid()); - QVERIFY(runningSpy.isValid()); - machine.setInitialState(s1); - globalTick = 0; - machine.start(); - - QTRY_COMPARE(startedSpy.count(), 1); - QTRY_COMPARE(finishedSpy.count(), 1); - TEST_RUNNING_CHANGED_STARTED_STOPPED; - QCOMPARE(machine.configuration().count(), 1); - QVERIFY(machine.configuration().contains(s3)); - - // s1 is entered - QCOMPARE(s1->events.count(), 2); - QCOMPARE(s1->events.at(0).first, 0); - QCOMPARE(s1->events.at(0).second, TestState::Entry); - // s11 is entered - QCOMPARE(s11->events.count(), 2); - QCOMPARE(s11->events.at(0).first, 1); - QCOMPARE(s11->events.at(0).second, TestState::Entry); - // s11 is exited - QCOMPARE(s11->events.at(1).first, 2); - QCOMPARE(s11->events.at(1).second, TestState::Exit); - // t1 is triggered - QCOMPARE(t1->triggers.count(), 1); - QCOMPARE(t1->triggers.at(0), 3); - // s12 is entered - QCOMPARE(s12->events.count(), 2); - QCOMPARE(s12->events.at(0).first, 4); - QCOMPARE(s12->events.at(0).second, TestState::Entry); - // s12 is exited - QCOMPARE(s12->events.at(1).first, 5); - QCOMPARE(s12->events.at(1).second, TestState::Exit); - // s1 is exited - QCOMPARE(s1->events.at(1).first, 6); - QCOMPARE(s1->events.at(1).second, TestState::Exit); - // t2 is triggered - QCOMPARE(t2->triggers.count(), 1); - QCOMPARE(t2->triggers.at(0), 7); - // s2 is entered - QCOMPARE(s2->events.count(), 2); - QCOMPARE(s2->events.at(0).first, 8); - QCOMPARE(s2->events.at(0).second, TestState::Entry); - // s2 is exited - QCOMPARE(s2->events.at(1).first, 9); - QCOMPARE(s2->events.at(1).second, TestState::Exit); - } -} - -void tst_QStateMachine::assignProperty() -{ - QStateMachine machine; - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - - QTest::ignoreMessage(QtWarningMsg, "QState::assignProperty: cannot assign property 'foo' of null object"); - s1->assignProperty(0, "foo", QVariant()); - - s1->assignProperty(s1, "objectName", "s1"); - QFinalState *s2 = new QFinalState(&machine); - s1->addTransition(s2); - machine.setInitialState(s1); - machine.start(); - QTRY_COMPARE(s1->objectName(), QString::fromLatin1("s1")); - TEST_ACTIVE_CHANGED(s1, 2); - - s1->assignProperty(s1, "objectName", "foo"); - machine.start(); - QTRY_COMPARE(s1->objectName(), QString::fromLatin1("foo")); - TEST_ACTIVE_CHANGED(s1, 4); - - s1->assignProperty(s1, "noSuchProperty", 123); - machine.start(); - QTRY_COMPARE(s1->dynamicPropertyNames().size(), 1); - QCOMPARE(s1->dynamicPropertyNames().at(0), QByteArray("noSuchProperty")); - QCOMPARE(s1->objectName(), QString::fromLatin1("foo")); - TEST_ACTIVE_CHANGED(s1, 6); - - { - QSignalSpy propertiesAssignedSpy(s1, &QState::propertiesAssigned); - QVERIFY(propertiesAssignedSpy.isValid()); - machine.start(); - QTRY_COMPARE(propertiesAssignedSpy.count(), 1); - TEST_ACTIVE_CHANGED(s1, 8); - } - - // nested states - { - QState *s11 = new QState(s1); - DEFINE_ACTIVE_SPY(s11); - QString str = QString::fromLatin1("set by nested state"); - s11->assignProperty(s11, "objectName", str); - s1->setInitialState(s11); - machine.start(); - QTRY_COMPARE(s11->objectName(), str); - TEST_ACTIVE_CHANGED(s1, 10); - TEST_ACTIVE_CHANGED(s11, 2); - } -} - -void tst_QStateMachine::assignPropertyWithAnimation() -{ - // Single animation - { - QStateMachine machine; - QVERIFY(machine.isAnimated()); - machine.setAnimated(false); - QVERIFY(!machine.isAnimated()); - machine.setAnimated(true); - QVERIFY(machine.isAnimated()); - QObject obj; - obj.setProperty("foo", 321); - obj.setProperty("bar", 654); - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - s1->assignProperty(&obj, "foo", 123); - QState *s2 = new QState(&machine); - DEFINE_ACTIVE_SPY(s2); - s2->assignProperty(&obj, "foo", 456); - s2->assignProperty(&obj, "bar", 789); - QAbstractTransition *trans = s1->addTransition(s2); - QVERIFY(trans->animations().isEmpty()); - QTest::ignoreMessage(QtWarningMsg, "QAbstractTransition::addAnimation: cannot add null animation"); - trans->addAnimation(0); - QPropertyAnimation anim(&obj, "foo"); - anim.setDuration(250); - trans->addAnimation(&anim); - QCOMPARE(trans->animations().size(), 1); - QCOMPARE(trans->animations().at(0), (QAbstractAnimation*)&anim); - QCOMPARE(anim.parent(), (QObject*)0); - QTest::ignoreMessage(QtWarningMsg, "QAbstractTransition::removeAnimation: cannot remove null animation"); - trans->removeAnimation(0); - trans->removeAnimation(&anim); - QVERIFY(trans->animations().isEmpty()); - trans->addAnimation(&anim); - QCOMPARE(trans->animations().size(), 1); - QCOMPARE(trans->animations().at(0), (QAbstractAnimation*)&anim); - QFinalState *s3 = new QFinalState(&machine); - s2->addTransition(s2, SIGNAL(propertiesAssigned()), s3); - - machine.setInitialState(s1); - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(runningSpy.isValid()); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QVERIFY(finishedSpy.isValid()); - machine.start(); - QTRY_COMPARE(finishedSpy.count(), 1); - TEST_RUNNING_CHANGED_STARTED_STOPPED; - QCOMPARE(obj.property("foo").toInt(), 456); - QCOMPARE(obj.property("bar").toInt(), 789); - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 2); - } - // Two animations - { - QStateMachine machine; - QObject obj; - obj.setProperty("foo", 321); - obj.setProperty("bar", 654); - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - s1->assignProperty(&obj, "foo", 123); - QState *s2 = new QState(&machine); - DEFINE_ACTIVE_SPY(s2); - s2->assignProperty(&obj, "foo", 456); - s2->assignProperty(&obj, "bar", 789); - QAbstractTransition *trans = s1->addTransition(s2); - QPropertyAnimation anim(&obj, "foo"); - anim.setDuration(150); - trans->addAnimation(&anim); - QPropertyAnimation anim2(&obj, "bar"); - anim2.setDuration(150); - trans->addAnimation(&anim2); - QFinalState *s3 = new QFinalState(&machine); - s2->addTransition(s2, SIGNAL(propertiesAssigned()), s3); - - machine.setInitialState(s1); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(finishedSpy.isValid()); - QVERIFY(runningSpy.isValid()); - machine.start(); - QTRY_COMPARE(finishedSpy.count(), 1); - TEST_RUNNING_CHANGED_STARTED_STOPPED; - QCOMPARE(obj.property("foo").toInt(), 456); - QCOMPARE(obj.property("bar").toInt(), 789); - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 2); - } - // Animation group - { - QStateMachine machine; - QObject obj; - obj.setProperty("foo", 321); - obj.setProperty("bar", 654); - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - s1->assignProperty(&obj, "foo", 123); - s1->assignProperty(&obj, "bar", 321); - QState *s2 = new QState(&machine); - DEFINE_ACTIVE_SPY(s2); - s2->assignProperty(&obj, "foo", 456); - s2->assignProperty(&obj, "bar", 654); - s2->assignProperty(&obj, "baz", 789); - QAbstractTransition *trans = s1->addTransition(s2); - QSequentialAnimationGroup group; - group.addAnimation(new QPropertyAnimation(&obj, "foo")); - group.addAnimation(new QPropertyAnimation(&obj, "bar")); - trans->addAnimation(&group); - QFinalState *s3 = new QFinalState(&machine); - s2->addTransition(s2, SIGNAL(propertiesAssigned()), s3); - - machine.setInitialState(s1); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(finishedSpy.isValid()); - QVERIFY(runningSpy.isValid()); - machine.start(); - QTRY_COMPARE(finishedSpy.count(), 1); - TEST_RUNNING_CHANGED_STARTED_STOPPED; - QCOMPARE(obj.property("foo").toInt(), 456); - QCOMPARE(obj.property("bar").toInt(), 654); - QCOMPARE(obj.property("baz").toInt(), 789); - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 2); - } - // Nested states - { - QStateMachine machine; - QObject obj; - obj.setProperty("foo", 321); - obj.setProperty("bar", 654); - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - QCOMPARE(s1->childMode(), QState::ExclusiveStates); - s1->setChildMode(QState::ParallelStates); - QCOMPARE(s1->childMode(), QState::ParallelStates); - s1->setChildMode(QState::ExclusiveStates); - QCOMPARE(s1->childMode(), QState::ExclusiveStates); - QCOMPARE(s1->initialState(), (QAbstractState*)0); - s1->setObjectName("s1"); - s1->assignProperty(&obj, "foo", 123); - s1->assignProperty(&obj, "bar", 456); - QState *s2 = new QState(&machine); - DEFINE_ACTIVE_SPY(s2); - s2->setObjectName("s2"); - s2->assignProperty(&obj, "foo", 321); - QState *s21 = new QState(s2); - DEFINE_ACTIVE_SPY(s21); - s21->setObjectName("s21"); - s21->assignProperty(&obj, "bar", 654); - QState *s22 = new QState(s2); - DEFINE_ACTIVE_SPY(s22); - s22->setObjectName("s22"); - s22->assignProperty(&obj, "bar", 789); - s2->setInitialState(s21); - QCOMPARE(s2->initialState(), (QAbstractState*)s21); - - QAbstractTransition *trans = s1->addTransition(s2); - QPropertyAnimation anim(&obj, "foo"); - anim.setDuration(500); - trans->addAnimation(&anim); - QPropertyAnimation anim2(&obj, "bar"); - anim2.setDuration(250); - trans->addAnimation(&anim2); - - s21->addTransition(s21, SIGNAL(propertiesAssigned()), s22); - - QFinalState *s3 = new QFinalState(&machine); - s22->addTransition(s2, SIGNAL(propertiesAssigned()), s3); - - machine.setInitialState(s1); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(finishedSpy.isValid()); - QVERIFY(runningSpy.isValid()); - machine.start(); - QTRY_COMPARE(finishedSpy.count(), 1); - TEST_RUNNING_CHANGED_STARTED_STOPPED; - QCOMPARE(obj.property("foo").toInt(), 321); - QCOMPARE(obj.property("bar").toInt(), 789); - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 2); - TEST_ACTIVE_CHANGED(s21, 2); - TEST_ACTIVE_CHANGED(s22, 2); - } - // Aborted animation - { - QStateMachine machine; - SignalEmitter emitter; - QObject obj; - obj.setProperty("foo", 321); - obj.setProperty("bar", 654); - QState *group = new QState(&machine); - QState *s1 = new QState(group); - DEFINE_ACTIVE_SPY(s1); - group->setInitialState(s1); - s1->assignProperty(&obj, "foo", 123); - QState *s2 = new QState(group); - DEFINE_ACTIVE_SPY(s2); - s2->assignProperty(&obj, "foo", 456); - s2->assignProperty(&obj, "bar", 789); - QAbstractTransition *trans = s1->addTransition(&emitter, SIGNAL(signalWithNoArg()), s2); - QPropertyAnimation anim(&obj, "foo"); - anim.setDuration(8000); - trans->addAnimation(&anim); - QPropertyAnimation anim2(&obj, "bar"); - anim2.setDuration(8000); - trans->addAnimation(&anim2); - QState *s3 = new QState(group); - DEFINE_ACTIVE_SPY(s3); - s3->assignProperty(&obj, "foo", 911); - s2->addTransition(&emitter, SIGNAL(signalWithNoArg()), s3); - - machine.setInitialState(group); - machine.start(); - QTRY_COMPARE(machine.configuration().contains(s1), true); - QSignalSpy propertiesAssignedSpy(s2, &QState::propertiesAssigned); - QVERIFY(propertiesAssignedSpy.isValid()); - emitter.emitSignalWithNoArg(); - QTRY_COMPARE(machine.configuration().contains(s2), true); - QVERIFY(propertiesAssignedSpy.isEmpty()); - emitter.emitSignalWithNoArg(); // will cause animations from s1-->s2 to abort - QTRY_COMPARE(machine.configuration().contains(s3), true); - QVERIFY(propertiesAssignedSpy.isEmpty()); - QCOMPARE(obj.property("foo").toInt(), 911); - QCOMPARE(obj.property("bar").toInt(), 789); - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 2); - TEST_ACTIVE_CHANGED(s3, 1); - QVERIFY(machine.isRunning()); - } -} - -struct StringEvent : public QEvent -{ -public: - StringEvent(const QString &val) - : QEvent(QEvent::Type(QEvent::User+2)), - value(val) {} - - QString value; -}; - -class StringTransition : public QAbstractTransition -{ -public: - StringTransition(const QString &value, QAbstractState *target) - : QAbstractTransition(), m_value(value) - { setTargetState(target); } - -protected: - virtual bool eventTest(QEvent *e) - { - if (e->type() != QEvent::Type(QEvent::User+2)) - return false; - StringEvent *se = static_cast(e); - return (m_value == se->value) && (!m_cond.isValid() || m_cond.match(m_value).hasMatch()); - } - virtual void onTransition(QEvent *) {} - -private: - QString m_value; - QRegularExpression m_cond; -}; - -class StringEventPoster : public QState -{ -public: - StringEventPoster(const QString &value, QState *parent = 0) - : QState(parent), m_value(value), m_delay(-1) {} - - void setString(const QString &value) - { m_value = value; } - void setDelay(int delay) - { m_delay = delay; } - -protected: - virtual void onEntry(QEvent *) - { - if (m_delay == -1) - machine()->postEvent(new StringEvent(m_value)); - else - machine()->postDelayedEvent(new StringEvent(m_value), m_delay); - } - virtual void onExit(QEvent *) {} - -private: - QString m_value; - int m_delay; -}; - -void tst_QStateMachine::postEvent() -{ - for (int x = 0; x < 2; ++x) { - QStateMachine machine; - { - QEvent e(QEvent::None); - QTest::ignoreMessage(QtWarningMsg, "QStateMachine::postEvent: cannot post event when the state machine is not running"); - machine.postEvent(&e); - } - StringEventPoster *s1 = new StringEventPoster("a"); - DEFINE_ACTIVE_SPY(s1); - if (x == 1) - s1->setDelay(100); - QFinalState *s2 = new QFinalState; - s1->addTransition(new StringTransition("a", s2)); - machine.addState(s1); - machine.addState(s2); - machine.setInitialState(s1); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(finishedSpy.isValid()); - QVERIFY(runningSpy.isValid()); - machine.start(); - QTRY_COMPARE(finishedSpy.count(), 1); - TEST_RUNNING_CHANGED_STARTED_STOPPED; - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s2)); - TEST_ACTIVE_CHANGED(s1, 2); - - s1->setString("b"); - QFinalState *s3 = new QFinalState(); - machine.addState(s3); - s1->addTransition(new StringTransition("b", s3)); - finishedSpy.clear(); - machine.start(); - QTRY_COMPARE(finishedSpy.count(), 1); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s3)); - TEST_ACTIVE_CHANGED(s1, 4); - } -} - -void tst_QStateMachine::cancelDelayedEvent() -{ - QStateMachine machine; - QTest::ignoreMessage(QtWarningMsg, "QStateMachine::cancelDelayedEvent: the machine is not running"); - QVERIFY(!machine.cancelDelayedEvent(-1)); - - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - QFinalState *s2 = new QFinalState(&machine); - s1->addTransition(new StringTransition("a", s2)); - machine.setInitialState(s1); - - QSignalSpy startedSpy(&machine, &QStateMachine::started); - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(startedSpy.isValid()); - QVERIFY(runningSpy.isValid()); - machine.start(); - QTRY_COMPARE(startedSpy.count(), 1); - TEST_RUNNING_CHANGED(true); - TEST_ACTIVE_CHANGED(s1, 1); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s1)); - int id1 = machine.postDelayedEvent(new StringEvent("c"), 50000); - QVERIFY(id1 != -1); - int id2 = machine.postDelayedEvent(new StringEvent("b"), 25000); - QVERIFY(id2 != -1); - QVERIFY(id2 != id1); - int id3 = machine.postDelayedEvent(new StringEvent("a"), 100); - QVERIFY(id3 != -1); - QVERIFY(id3 != id2); - QVERIFY(machine.cancelDelayedEvent(id1)); - QVERIFY(!machine.cancelDelayedEvent(id1)); - QVERIFY(machine.cancelDelayedEvent(id2)); - QVERIFY(!machine.cancelDelayedEvent(id2)); - - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QVERIFY(finishedSpy.isValid()); - QTRY_COMPARE(finishedSpy.count(), 1); - TEST_RUNNING_CHANGED(false); - TEST_ACTIVE_CHANGED(s1, 2); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s2)); -} - -void tst_QStateMachine::postDelayedEventAndStop() -{ - QStateMachine machine; - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - QFinalState *s2 = new QFinalState(&machine); - s1->addTransition(new StringTransition("a", s2)); - machine.setInitialState(s1); - - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(runningSpy.isValid()); - QSignalSpy startedSpy(&machine, &QStateMachine::started); - QVERIFY(startedSpy.isValid()); - machine.start(); - QTRY_COMPARE(startedSpy.count(), 1); - TEST_RUNNING_CHANGED(true); - TEST_ACTIVE_CHANGED(s1, 1); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s1)); - - int id1 = machine.postDelayedEvent(new StringEvent("a"), 0); - QVERIFY(id1 != -1); - QSignalSpy stoppedSpy(&machine, &QStateMachine::stopped); - QVERIFY(stoppedSpy.isValid()); - machine.stop(); - QTRY_COMPARE(stoppedSpy.count(), 1); - TEST_RUNNING_CHANGED(false); - TEST_ACTIVE_CHANGED(s1, 1); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s1)); - - machine.start(); - QTRY_COMPARE(startedSpy.count(), 2); - TEST_RUNNING_CHANGED(true); - TEST_ACTIVE_CHANGED(s1, 3); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s1)); - - int id2 = machine.postDelayedEvent(new StringEvent("a"), 1000); - QVERIFY(id2 != -1); - machine.stop(); - QTRY_COMPARE(stoppedSpy.count(), 2); - TEST_RUNNING_CHANGED(false); - TEST_ACTIVE_CHANGED(s1, 3); - machine.start(); - QTRY_COMPARE(startedSpy.count(), 3); - TEST_RUNNING_CHANGED(true); - QTestEventLoop::instance().enterLoop(2); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s1)); - TEST_ACTIVE_CHANGED(s1, 5); - QVERIFY(machine.isRunning()); -} - -class DelayedEventPosterThread : public QThread -{ - Q_OBJECT -public: - DelayedEventPosterThread(QStateMachine *machine, QObject *parent = 0) - : QThread(parent), firstEventWasCancelled(false), - m_machine(machine) - { - moveToThread(this); - QObject::connect(m_machine, SIGNAL(started()), - this, SLOT(postEvent())); - } - - mutable bool firstEventWasCancelled; - -private Q_SLOTS: - void postEvent() - { - int id = m_machine->postDelayedEvent(new QEvent(QEvent::User), 1000); - firstEventWasCancelled = m_machine->cancelDelayedEvent(id); - - m_machine->postDelayedEvent(new QEvent(QEvent::User), 1); - - quit(); - } -private: - QStateMachine *m_machine; -}; - -void tst_QStateMachine::postDelayedEventFromThread() -{ - QStateMachine machine; - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - QFinalState *f = new QFinalState(&machine); - s1->addTransition(new EventTransition(QEvent::User, f)); - machine.setInitialState(s1); - - DelayedEventPosterThread poster(&machine); - poster.start(); - - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(runningSpy.isValid()); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QVERIFY(finishedSpy.isValid()); - machine.start(); - QTRY_COMPARE(finishedSpy.count(), 1); - TEST_RUNNING_CHANGED_STARTED_STOPPED; - TEST_ACTIVE_CHANGED(s1, 2); - QVERIFY(poster.firstEventWasCancelled); -} - -void tst_QStateMachine::stopAndPostEvent() -{ - QStateMachine machine; - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - machine.setInitialState(s1); - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(runningSpy.isValid()); - QSignalSpy startedSpy(&machine, &QStateMachine::started); - QVERIFY(startedSpy.isValid()); - machine.start(); - QTRY_COMPARE(startedSpy.count(), 1); - TEST_RUNNING_CHANGED(true); - TEST_ACTIVE_CHANGED(s1, 1); - QSignalSpy stoppedSpy(&machine, &QStateMachine::stopped); - QVERIFY(stoppedSpy.isValid()); - machine.stop(); - QCOMPARE(stoppedSpy.count(), 0); - machine.postEvent(new QEvent(QEvent::User)); - QTRY_COMPARE(stoppedSpy.count(), 1); - TEST_RUNNING_CHANGED(false); - TEST_ACTIVE_CHANGED(s1, 1); - QCoreApplication::processEvents(); -} - -void tst_QStateMachine::stateFinished() -{ - QStateMachine machine; - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - QState *s1_1 = new QState(s1); - DEFINE_ACTIVE_SPY(s1_1); - QFinalState *s1_2 = new QFinalState(s1); - s1_1->addTransition(s1_2); - s1->setInitialState(s1_1); - QFinalState *s2 = new QFinalState(&machine); - s1->addTransition(s1, SIGNAL(finished()), s2); - machine.setInitialState(s1); - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(runningSpy.isValid()); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QVERIFY(finishedSpy.isValid()); - machine.start(); - QTRY_COMPARE(finishedSpy.count(), 1); - TEST_RUNNING_CHANGED_STARTED_STOPPED; - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s1_1, 2); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s2)); -} - -void tst_QStateMachine::parallelStates() -{ - QStateMachine machine; - - TestState *s1 = new TestState(QState::ParallelStates); - QCOMPARE(s1->childMode(), QState::ParallelStates); - TestState *s1_1 = new TestState(s1); - QState *s1_1_1 = new QState(s1_1); - QFinalState *s1_1_f = new QFinalState(s1_1); - s1_1_1->addTransition(s1_1_f); - s1_1->setInitialState(s1_1_1); - TestState *s1_2 = new TestState(s1); - QState *s1_2_1 = new QState(s1_2); - QFinalState *s1_2_f = new QFinalState(s1_2); - s1_2_1->addTransition(s1_2_f); - s1_2->setInitialState(s1_2_1); - { - const QString warning - = QString::asprintf("QState::setInitialState: ignoring attempt to set initial state of parallel state group %p", s1); - QTest::ignoreMessage(QtWarningMsg, qPrintable(warning)); - s1->setInitialState(0); - } - machine.addState(s1); - - QFinalState *s2 = new QFinalState(); - machine.addState(s2); - - s1->addTransition(s1, SIGNAL(finished()), s2); - - machine.setInitialState(s1); - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(runningSpy.isValid()); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QVERIFY(finishedSpy.isValid()); - globalTick = 0; - machine.start(); - QTRY_COMPARE(finishedSpy.count(), 1); - TEST_RUNNING_CHANGED_STARTED_STOPPED; - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s2)); - - QCOMPARE(s1->events.count(), 2); - // s1 is entered - QCOMPARE(s1->events.at(0).first, 0); - QCOMPARE(s1->events.at(0).second, TestState::Entry); - // s1_1 is entered - QCOMPARE(s1_1->events.count(), 2); - QCOMPARE(s1_1->events.at(0).first, 1); - QCOMPARE(s1_1->events.at(0).second, TestState::Entry); - // s1_2 is entered - QCOMPARE(s1_2->events.at(0).first, 2); - QCOMPARE(s1_2->events.at(0).second, TestState::Entry); - // s1_2 is exited - QCOMPARE(s1_2->events.at(1).first, 3); - QCOMPARE(s1_2->events.at(1).second, TestState::Exit); - // s1_1 is exited - QCOMPARE(s1_1->events.at(1).first, 4); - QCOMPARE(s1_1->events.at(1).second, TestState::Exit); - // s1 is exited - QCOMPARE(s1->events.at(1).first, 5); - QCOMPARE(s1->events.at(1).second, TestState::Exit); -} - -void tst_QStateMachine::parallelRootState() -{ - QStateMachine machine; - QState *root = &machine; - QCOMPARE(root->childMode(), QState::ExclusiveStates); - root->setChildMode(QState::ParallelStates); - QCOMPARE(root->childMode(), QState::ParallelStates); - - QState *s1 = new QState(root); - DEFINE_ACTIVE_SPY(s1); - QFinalState *s1_f = new QFinalState(s1); - s1->setInitialState(s1_f); - QState *s2 = new QState(root); - DEFINE_ACTIVE_SPY(s2); - QFinalState *s2_f = new QFinalState(s2); - s2->setInitialState(s2_f); - - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(runningSpy.isValid()); - QSignalSpy startedSpy(&machine, &QStateMachine::started); - QVERIFY(startedSpy.isValid()); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QVERIFY(finishedSpy.isValid()); - machine.start(); - QTest::ignoreMessage(QtWarningMsg, "Unrecoverable error detected in running state machine: " - "Child mode of state machine '' is not 'ExclusiveStates'."); - QTRY_COMPARE(startedSpy.count(), 1); - QCOMPARE(machine.configuration().size(), 4); - QVERIFY(machine.configuration().contains(s1)); - QVERIFY(machine.configuration().contains(s1_f)); - QVERIFY(machine.configuration().contains(s2)); - QVERIFY(machine.configuration().contains(s2_f)); - QTRY_COMPARE(finishedSpy.count(), 1); - TEST_RUNNING_CHANGED_STARTED_STOPPED; - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s2, 1); - QVERIFY(!machine.isRunning()); -} - -void tst_QStateMachine::allSourceToTargetConfigurations() -{ - QStateMachine machine; - QState *s0 = new QState(&machine); - DEFINE_ACTIVE_SPY(s0); - s0->setObjectName("s0"); - QState *s1 = new QState(s0); - DEFINE_ACTIVE_SPY(s1); - s1->setObjectName("s1"); - QState *s11 = new QState(s1); - DEFINE_ACTIVE_SPY(s11); - s11->setObjectName("s11"); - QState *s2 = new QState(s0); - DEFINE_ACTIVE_SPY(s2); - s2->setObjectName("s2"); - QState *s21 = new QState(s2); - DEFINE_ACTIVE_SPY(s21); - s21->setObjectName("s21"); - QState *s211 = new QState(s21); - DEFINE_ACTIVE_SPY(s211); - s211->setObjectName("s211"); - QFinalState *f = new QFinalState(&machine); - f->setObjectName("f"); - - s0->setInitialState(s1); - s1->setInitialState(s11); - s2->setInitialState(s21); - s21->setInitialState(s211); - - s11->addTransition(new StringTransition("g", s211)); - s1->addTransition(new StringTransition("a", s1)); - s1->addTransition(new StringTransition("b", s11)); - s1->addTransition(new StringTransition("c", s2)); - s1->addTransition(new StringTransition("d", s0)); - s1->addTransition(new StringTransition("f", s211)); - s211->addTransition(new StringTransition("d", s21)); - s211->addTransition(new StringTransition("g", s0)); - s211->addTransition(new StringTransition("h", f)); - s21->addTransition(new StringTransition("b", s211)); - s2->addTransition(new StringTransition("c", s1)); - s2->addTransition(new StringTransition("f", s11)); - s0->addTransition(new StringTransition("e", s211)); - - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(runningSpy.isValid()); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QVERIFY(finishedSpy.isValid()); - machine.setInitialState(s0); - machine.start(); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(s0, 1); - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s11, 1); - TEST_ACTIVE_CHANGED(s2, 0); - TEST_ACTIVE_CHANGED(s21, 0); - TEST_ACTIVE_CHANGED(s211, 0); - - machine.postEvent(new StringEvent("a")); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(s0, 1); - TEST_ACTIVE_CHANGED(s1, 3); - TEST_ACTIVE_CHANGED(s11, 3); - TEST_ACTIVE_CHANGED(s2, 0); - TEST_ACTIVE_CHANGED(s21, 0); - TEST_ACTIVE_CHANGED(s211, 0); - - machine.postEvent(new StringEvent("b")); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(s0, 1); - TEST_ACTIVE_CHANGED(s1, 5); - TEST_ACTIVE_CHANGED(s11, 5); - TEST_ACTIVE_CHANGED(s2, 0); - TEST_ACTIVE_CHANGED(s21, 0); - TEST_ACTIVE_CHANGED(s211, 0); - - machine.postEvent(new StringEvent("c")); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(s0, 1); - TEST_ACTIVE_CHANGED(s1, 6); - TEST_ACTIVE_CHANGED(s11, 6); - TEST_ACTIVE_CHANGED(s2, 1); - TEST_ACTIVE_CHANGED(s21, 1); - TEST_ACTIVE_CHANGED(s211, 1); - - machine.postEvent(new StringEvent("d")); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(s0, 1); - TEST_ACTIVE_CHANGED(s1, 6); - TEST_ACTIVE_CHANGED(s11, 6); - TEST_ACTIVE_CHANGED(s2, 1); - TEST_ACTIVE_CHANGED(s21, 3); - TEST_ACTIVE_CHANGED(s211, 3); - - machine.postEvent(new StringEvent("e")); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(s0, 3); - TEST_ACTIVE_CHANGED(s1, 6); - TEST_ACTIVE_CHANGED(s11, 6); - TEST_ACTIVE_CHANGED(s2, 3); - TEST_ACTIVE_CHANGED(s21, 5); - TEST_ACTIVE_CHANGED(s211, 5); - - machine.postEvent(new StringEvent("f")); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(s0, 3); - TEST_ACTIVE_CHANGED(s1, 7); - TEST_ACTIVE_CHANGED(s11, 7); - TEST_ACTIVE_CHANGED(s2, 4); - TEST_ACTIVE_CHANGED(s21, 6); - TEST_ACTIVE_CHANGED(s211, 6); - - machine.postEvent(new StringEvent("g")); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(s0, 3); - TEST_ACTIVE_CHANGED(s1, 8); - TEST_ACTIVE_CHANGED(s11, 8); - TEST_ACTIVE_CHANGED(s2, 5); - TEST_ACTIVE_CHANGED(s21, 7); - TEST_ACTIVE_CHANGED(s211, 7); - - machine.postEvent(new StringEvent("h")); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(s0, 4); - TEST_ACTIVE_CHANGED(s1, 8); - TEST_ACTIVE_CHANGED(s11, 8); - TEST_ACTIVE_CHANGED(s2, 6); - TEST_ACTIVE_CHANGED(s21, 8); - TEST_ACTIVE_CHANGED(s211, 8); - - QTRY_COMPARE(finishedSpy.count(), 1); - TEST_RUNNING_CHANGED_STARTED_STOPPED; -} - -class TestSignalTransition : public QSignalTransition -{ -public: - TestSignalTransition(QState *sourceState = 0) - : QSignalTransition(sourceState), - m_eventTestSender(0), m_eventTestSignalIndex(-1), - m_transitionSender(0), m_transitionSignalIndex(-1) - {} - TestSignalTransition(QObject *sender, const char *signal, - QAbstractState *target) - : QSignalTransition(sender, signal), - m_eventTestSender(0), m_eventTestSignalIndex(-1), - m_transitionSender(0), m_transitionSignalIndex(-1) - { setTargetState(target); } - QObject *eventTestSenderReceived() const { - return m_eventTestSender; - } - int eventTestSignalIndexReceived() const { - return m_eventTestSignalIndex; - } - QVariantList eventTestArgumentsReceived() const { - return m_eventTestArgs; - } - QObject *transitionSenderReceived() const { - return m_transitionSender; - } - int transitionSignalIndexReceived() const { - return m_transitionSignalIndex; - } - QVariantList transitionArgumentsReceived() const { - return m_transitionArgs; - } -protected: - bool eventTest(QEvent *e) { - if (!QSignalTransition::eventTest(e)) - return false; - QStateMachine::SignalEvent *se = static_cast(e); - m_eventTestSender = se->sender(); - m_eventTestSignalIndex = se->signalIndex(); - m_eventTestArgs = se->arguments(); - return true; - } - void onTransition(QEvent *e) { - QSignalTransition::onTransition(e); - QStateMachine::SignalEvent *se = static_cast(e); - m_transitionSender = se->sender(); - m_transitionSignalIndex = se->signalIndex(); - m_transitionArgs = se->arguments(); - } -private: - QObject *m_eventTestSender; - int m_eventTestSignalIndex; - QVariantList m_eventTestArgs; - QObject *m_transitionSender; - int m_transitionSignalIndex; - QVariantList m_transitionArgs; -}; - -void tst_QStateMachine::signalTransitions() -{ - { - QStateMachine machine; - QState *s0 = new QState(&machine); - DEFINE_ACTIVE_SPY(s0); - QTest::ignoreMessage(QtWarningMsg, "QState::addTransition: sender cannot be null"); - QCOMPARE(s0->addTransition(0, SIGNAL(noSuchSignal()), 0), (QSignalTransition*)0); - - SignalEmitter emitter; - QTest::ignoreMessage(QtWarningMsg, "QState::addTransition: signal cannot be null"); - QCOMPARE(s0->addTransition(&emitter, 0, 0), (QSignalTransition*)0); - - QTest::ignoreMessage(QtWarningMsg, "QState::addTransition: cannot add transition to null state"); - QCOMPARE(s0->addTransition(&emitter, SIGNAL(signalWithNoArg()), 0), (QSignalTransition*)0); - - QFinalState *s1 = new QFinalState(&machine); - QTest::ignoreMessage(QtWarningMsg, "QState::addTransition: no such signal SignalEmitter::noSuchSignal()"); - QCOMPARE(s0->addTransition(&emitter, SIGNAL(noSuchSignal()), s1), (QSignalTransition*)0); - - QSignalTransition *trans = s0->addTransition(&emitter, SIGNAL(signalWithNoArg()), s1); - QVERIFY(trans != 0); - QCOMPARE(trans->sourceState(), s0); - QCOMPARE(trans->targetState(), (QAbstractState*)s1); - QCOMPARE(trans->senderObject(), (QObject*)&emitter); - QCOMPARE(trans->signal(), QByteArray(SIGNAL(signalWithNoArg()))); - - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(runningSpy.isValid()); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QVERIFY(finishedSpy.isValid()); - machine.setInitialState(s0); - machine.start(); - QCoreApplication::processEvents(); - - emitter.emitSignalWithNoArg(); - - QTRY_COMPARE(finishedSpy.count(), 1); - TEST_RUNNING_CHANGED_STARTED_STOPPED; - TEST_ACTIVE_CHANGED(s0, 2); - emitter.emitSignalWithNoArg(); - - trans->setSignal(SIGNAL(signalWithIntArg(int))); - QCOMPARE(trans->signal(), QByteArray(SIGNAL(signalWithIntArg(int)))); - machine.start(); - QCoreApplication::processEvents(); - emitter.emitSignalWithIntArg(123); - QTRY_COMPARE(finishedSpy.count(), 2); - TEST_RUNNING_CHANGED_STARTED_STOPPED; - TEST_ACTIVE_CHANGED(s0, 4); - - machine.start(); - QCoreApplication::processEvents(); - trans->setSignal(SIGNAL(signalWithNoArg())); - QCOMPARE(trans->signal(), QByteArray(SIGNAL(signalWithNoArg()))); - emitter.emitSignalWithNoArg(); - QTRY_COMPARE(finishedSpy.count(), 3); - TEST_RUNNING_CHANGED_STARTED_STOPPED; - TEST_ACTIVE_CHANGED(s0, 6); - - SignalEmitter emitter2; - machine.start(); - QCoreApplication::processEvents(); - trans->setSenderObject(&emitter2); - emitter2.emitSignalWithNoArg(); - QTRY_COMPARE(finishedSpy.count(), 4); - TEST_RUNNING_CHANGED_STARTED_STOPPED; - TEST_ACTIVE_CHANGED(s0, 8); - - machine.start(); - QCoreApplication::processEvents(); - QTest::ignoreMessage(QtWarningMsg, "QSignalTransition: no such signal: SignalEmitter::noSuchSignal()"); - trans->setSignal(SIGNAL(noSuchSignal())); - QCOMPARE(trans->signal(), QByteArray(SIGNAL(noSuchSignal()))); - TEST_RUNNING_CHANGED(true); - TEST_ACTIVE_CHANGED(s0, 9); - QVERIFY(machine.isRunning()); - } - { - QStateMachine machine; - QState *s0 = new QState(&machine); - DEFINE_ACTIVE_SPY(s0); - QFinalState *s1 = new QFinalState(&machine); - SignalEmitter emitter; - QSignalTransition *trans = s0->addTransition(&emitter, "signalWithNoArg()", s1); - QVERIFY(trans != 0); - QCOMPARE(trans->sourceState(), s0); - QCOMPARE(trans->targetState(), (QAbstractState*)s1); - QCOMPARE(trans->senderObject(), (QObject*)&emitter); - QCOMPARE(trans->signal(), QByteArray("signalWithNoArg()")); - - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(runningSpy.isValid()); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QVERIFY(finishedSpy.isValid()); - machine.setInitialState(s0); - machine.start(); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(s0, 1); - emitter.emitSignalWithNoArg(); - - QTRY_COMPARE(finishedSpy.count(), 1); - TEST_RUNNING_CHANGED_STARTED_STOPPED; - TEST_ACTIVE_CHANGED(s0, 2); - - trans->setSignal("signalWithIntArg(int)"); - QCOMPARE(trans->signal(), QByteArray("signalWithIntArg(int)")); - machine.start(); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(s0, 3); - emitter.emitSignalWithIntArg(123); - QTRY_COMPARE(finishedSpy.count(), 2); - TEST_RUNNING_CHANGED_STARTED_STOPPED; - TEST_ACTIVE_CHANGED(s0, 4); - } - { - QStateMachine machine; - QState *s0 = new QState(&machine); - DEFINE_ACTIVE_SPY(s0); - QFinalState *s1 = new QFinalState(&machine); - SignalEmitter emitter; - TestSignalTransition *trans = new TestSignalTransition(&emitter, SIGNAL(signalWithIntArg(int)), s1); - s0->addTransition(trans); - - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(runningSpy.isValid()); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QVERIFY(finishedSpy.isValid()); - machine.setInitialState(s0); - machine.start(); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(s0, 1); - emitter.emitSignalWithIntArg(123); - - QTRY_COMPARE(finishedSpy.count(), 1); - TEST_RUNNING_CHANGED_STARTED_STOPPED; - TEST_ACTIVE_CHANGED(s0, 2); - QCOMPARE(trans->eventTestSenderReceived(), (QObject*)&emitter); - QCOMPARE(trans->eventTestSignalIndexReceived(), emitter.metaObject()->indexOfSignal("signalWithIntArg(int)")); - QCOMPARE(trans->eventTestArgumentsReceived().size(), 1); - QCOMPARE(trans->eventTestArgumentsReceived().at(0).toInt(), 123); - QCOMPARE(trans->transitionSenderReceived(), (QObject*)&emitter); - QCOMPARE(trans->transitionSignalIndexReceived(), emitter.metaObject()->indexOfSignal("signalWithIntArg(int)")); - QCOMPARE(trans->transitionArgumentsReceived().size(), 1); - QCOMPARE(trans->transitionArgumentsReceived().at(0).toInt(), 123); - } - { - QStateMachine machine; - QState *s0 = new QState(&machine); - DEFINE_ACTIVE_SPY(s0); - QFinalState *s1 = new QFinalState(&machine); - SignalEmitter emitter; - TestSignalTransition *trans = new TestSignalTransition(&emitter, SIGNAL(signalWithStringArg(QString)), s1); - s0->addTransition(trans); - - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(runningSpy.isValid()); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QVERIFY(finishedSpy.isValid()); - machine.setInitialState(s0); - machine.start(); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(s0, 1); - - QString testString = QString::fromLatin1("hello"); - emitter.emitSignalWithStringArg(testString); - - QTRY_COMPARE(finishedSpy.count(), 1); - TEST_RUNNING_CHANGED_STARTED_STOPPED; - TEST_ACTIVE_CHANGED(s0, 2); - QCOMPARE(trans->eventTestSenderReceived(), (QObject*)&emitter); - QCOMPARE(trans->eventTestSignalIndexReceived(), emitter.metaObject()->indexOfSignal("signalWithStringArg(QString)")); - QCOMPARE(trans->eventTestArgumentsReceived().size(), 1); - QCOMPARE(trans->eventTestArgumentsReceived().at(0).toString(), testString); - QCOMPARE(trans->transitionSenderReceived(), (QObject*)&emitter); - QCOMPARE(trans->transitionSignalIndexReceived(), emitter.metaObject()->indexOfSignal("signalWithStringArg(QString)")); - QCOMPARE(trans->transitionArgumentsReceived().size(), 1); - QCOMPARE(trans->transitionArgumentsReceived().at(0).toString(), testString); - } - { - QStateMachine machine; - QState *s0 = new QState(&machine); - DEFINE_ACTIVE_SPY(s0); - QFinalState *s1 = new QFinalState(&machine); - - TestSignalTransition *trans = new TestSignalTransition(); - QCOMPARE(trans->senderObject(), (QObject*)0); - QCOMPARE(trans->signal(), QByteArray()); - - SignalEmitter emitter; - trans->setSenderObject(&emitter); - QCOMPARE(trans->senderObject(), (QObject*)&emitter); - trans->setSignal(SIGNAL(signalWithNoArg())); - QCOMPARE(trans->signal(), QByteArray(SIGNAL(signalWithNoArg()))); - trans->setTargetState(s1); - s0->addTransition(trans); - - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(runningSpy.isValid()); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QVERIFY(finishedSpy.isValid()); - machine.setInitialState(s0); - machine.start(); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(s0, 1); - - emitter.emitSignalWithNoArg(); - - QTRY_COMPARE(finishedSpy.count(), 1); - TEST_RUNNING_CHANGED_STARTED_STOPPED; - TEST_ACTIVE_CHANGED(s0, 2); - } - // Multiple transitions for same (object,signal) - { - QStateMachine machine; - SignalEmitter emitter; - QState *s0 = new QState(&machine); - DEFINE_ACTIVE_SPY(s0); - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - QSignalTransition *t0 = s0->addTransition(&emitter, SIGNAL(signalWithNoArg()), s1); - QSignalTransition *t1 = s1->addTransition(&emitter, SIGNAL(signalWithNoArg()), s0); - - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QVERIFY(finishedSpy.isValid()); - machine.setInitialState(s0); - machine.start(); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(s0, 1); - TEST_ACTIVE_CHANGED(s1, 0); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s0)); - - emitter.emitSignalWithNoArg(); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(s0, 2); - TEST_ACTIVE_CHANGED(s1, 1); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s1)); - - s0->removeTransition(t0); - emitter.emitSignalWithNoArg(); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(s0, 3); - TEST_ACTIVE_CHANGED(s1, 2); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s0)); - - emitter.emitSignalWithNoArg(); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(s0, 3); - TEST_ACTIVE_CHANGED(s1, 2); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s0)); - - s1->removeTransition(t1); - emitter.emitSignalWithNoArg(); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(s0, 3); - TEST_ACTIVE_CHANGED(s1, 2); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s0)); - - s0->addTransition(t0); - s1->addTransition(t1); - emitter.emitSignalWithNoArg(); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(s0, 4); - TEST_ACTIVE_CHANGED(s1, 3); - QVERIFY(machine.isRunning()); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s1)); - } - // multiple signal transitions from same source - { - QStateMachine machine; - SignalEmitter emitter; - QState *s0 = new QState(&machine); - DEFINE_ACTIVE_SPY(s0); - QFinalState *s1 = new QFinalState(&machine); - s0->addTransition(&emitter, SIGNAL(signalWithNoArg()), s1); - QFinalState *s2 = new QFinalState(&machine); - s0->addTransition(&emitter, SIGNAL(signalWithIntArg(int)), s2); - QFinalState *s3 = new QFinalState(&machine); - s0->addTransition(&emitter, SIGNAL(signalWithStringArg(QString)), s3); - - QSignalSpy startedSpy(&machine, &QStateMachine::started); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(startedSpy.isValid()); - QVERIFY(finishedSpy.isValid()); - QVERIFY(runningSpy.isValid()); - machine.setInitialState(s0); - - machine.start(); - TEST_ACTIVE_CHANGED(s0, 1); - QTRY_COMPARE(startedSpy.count(), 1); - TEST_RUNNING_CHANGED(true); - emitter.emitSignalWithNoArg(); - TEST_ACTIVE_CHANGED(s0, 2); - QTRY_COMPARE(finishedSpy.count(), 1); - TEST_RUNNING_CHANGED(false); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s1)); - - machine.start(); - TEST_ACTIVE_CHANGED(s0, 3); - QTRY_COMPARE(startedSpy.count(), 2); - TEST_RUNNING_CHANGED(true); - emitter.emitSignalWithIntArg(123); - TEST_ACTIVE_CHANGED(s0, 4); - QTRY_COMPARE(finishedSpy.count(), 2); - TEST_RUNNING_CHANGED(false); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s2)); - - machine.start(); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(s0, 5); - QTRY_COMPARE(startedSpy.count(), 3); - TEST_RUNNING_CHANGED(true); - emitter.emitSignalWithStringArg("hello"); - TEST_ACTIVE_CHANGED(s0, 6); - QTRY_COMPARE(finishedSpy.count(), 3); - TEST_RUNNING_CHANGED(false); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s3)); - } - // signature normalization - { - QStateMachine machine; - SignalEmitter emitter; - QState *s0 = new QState(&machine); - DEFINE_ACTIVE_SPY(s0); - QFinalState *s1 = new QFinalState(&machine); - QSignalTransition *t0 = s0->addTransition(&emitter, SIGNAL(signalWithNoArg()), s1); - QVERIFY(t0 != 0); - QCOMPARE(t0->signal(), QByteArray(SIGNAL(signalWithNoArg()))); - - QSignalTransition *t1 = s0->addTransition(&emitter, SIGNAL(signalWithStringArg(QString)), s1); - QVERIFY(t1 != 0); - QCOMPARE(t1->signal(), QByteArray(SIGNAL(signalWithStringArg(QString)))); - - QSignalSpy startedSpy(&machine, &QStateMachine::started); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(startedSpy.isValid()); - QVERIFY(finishedSpy.isValid()); - QVERIFY(runningSpy.isValid()); - machine.setInitialState(s0); - machine.start(); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(s0, 1); - QTRY_COMPARE(startedSpy.count(), 1); - QCOMPARE(finishedSpy.count(), 0); - TEST_RUNNING_CHANGED(true); - - emitter.emitSignalWithNoArg(); - - TEST_ACTIVE_CHANGED(s0, 2); - QTRY_COMPARE(finishedSpy.count(), 1); - TEST_RUNNING_CHANGED(false); - } -} - -class TestEventTransition : public QEventTransition -{ -public: - TestEventTransition(QState *sourceState = 0) - : QEventTransition(sourceState), - m_eventSource(0), m_eventType(QEvent::None) - {} - TestEventTransition(QObject *object, QEvent::Type type, - QAbstractState *target) - : QEventTransition(object, type), - m_eventSource(0), m_eventType(QEvent::None) - { setTargetState(target); } - QObject *eventSourceReceived() const { - return m_eventSource; - } - QEvent::Type eventTypeReceived() const { - return m_eventType; - } -protected: - bool eventTest(QEvent *e) { - if (!QEventTransition::eventTest(e)) - return false; - QStateMachine::WrappedEvent *we = static_cast(e); - m_eventSource = we->object(); - m_eventType = we->event()->type(); - return true; - } -private: - QObject *m_eventSource; - QEvent::Type m_eventType; -}; - -#ifndef QT_NO_WIDGETS -void tst_QStateMachine::eventTransitions() -{ - QPushButton button; - { - QStateMachine machine; - QState *s0 = new QState(&machine); - QFinalState *s1 = new QFinalState(&machine); - - QMouseEventTransition *trans; - trans = new QMouseEventTransition(&button, QEvent::MouseButtonPress, Qt::LeftButton); - QCOMPARE(trans->targetState(), (QAbstractState*)0); - trans->setTargetState(s1); - QCOMPARE(trans->eventType(), QEvent::MouseButtonPress); - QCOMPARE(trans->button(), Qt::LeftButton); - QCOMPARE(trans->targetState(), (QAbstractState*)s1); - s0->addTransition(trans); - - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(runningSpy.isValid()); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QVERIFY(finishedSpy.isValid()); - machine.setInitialState(s0); - machine.start(); - QCoreApplication::processEvents(); - - QTest::mousePress(&button, Qt::LeftButton); - QTRY_COMPARE(finishedSpy.count(), 1); - TEST_RUNNING_CHANGED_STARTED_STOPPED; - - QTest::mousePress(&button, Qt::LeftButton); - - trans->setEventType(QEvent::MouseButtonRelease); - QCOMPARE(trans->eventType(), QEvent::MouseButtonRelease); - machine.start(); - QCoreApplication::processEvents(); - QTest::mouseRelease(&button, Qt::LeftButton); - QTRY_COMPARE(finishedSpy.count(), 2); - TEST_RUNNING_CHANGED_STARTED_STOPPED; - - machine.start(); - QCoreApplication::processEvents(); - trans->setEventType(QEvent::MouseButtonPress); - QTest::mousePress(&button, Qt::LeftButton); - QTRY_COMPARE(finishedSpy.count(), 3); - TEST_RUNNING_CHANGED_STARTED_STOPPED; - - QPushButton button2; - machine.start(); - QCoreApplication::processEvents(); - trans->setEventSource(&button2); - QTest::mousePress(&button2, Qt::LeftButton); - QTRY_COMPARE(finishedSpy.count(), 4); - TEST_RUNNING_CHANGED_STARTED_STOPPED; - } - for (int x = 0; x < 2; ++x) { - QStateMachine machine; - QState *s0 = new QState(&machine); - QFinalState *s1 = new QFinalState(&machine); - - QEventTransition *trans = 0; - if (x == 0) { - trans = new QEventTransition(); - QCOMPARE(trans->eventSource(), (QObject*)0); - QCOMPARE(trans->eventType(), QEvent::None); - trans->setEventSource(&button); - trans->setEventType(QEvent::MouseButtonPress); - trans->setTargetState(s1); - } else if (x == 1) { - trans = new QEventTransition(&button, QEvent::MouseButtonPress); - trans->setTargetState(s1); - } - QCOMPARE(trans->eventSource(), (QObject*)&button); - QCOMPARE(trans->eventType(), QEvent::MouseButtonPress); - QCOMPARE(trans->targetState(), (QAbstractState*)s1); - s0->addTransition(trans); - - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(runningSpy.isValid()); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QVERIFY(finishedSpy.isValid()); - machine.setInitialState(s0); - machine.start(); - QCoreApplication::processEvents(); - - QTest::mousePress(&button, Qt::LeftButton); - QCoreApplication::processEvents(); - - QTRY_COMPARE(finishedSpy.count(), 1); - TEST_RUNNING_CHANGED_STARTED_STOPPED; - } - { - QStateMachine machine; - QState *s0 = new QState(&machine); - QFinalState *s1 = new QFinalState(&machine); - - QMouseEventTransition *trans = new QMouseEventTransition(); - QCOMPARE(trans->eventSource(), (QObject*)0); - QCOMPARE(trans->eventType(), QEvent::None); - QCOMPARE(trans->button(), Qt::NoButton); - trans->setEventSource(&button); - trans->setEventType(QEvent::MouseButtonPress); - trans->setButton(Qt::LeftButton); - trans->setTargetState(s1); - s0->addTransition(trans); - - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(runningSpy.isValid()); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QVERIFY(finishedSpy.isValid()); - machine.setInitialState(s0); - machine.start(); - QCoreApplication::processEvents(); - TEST_RUNNING_CHANGED(true); - QTest::mousePress(&button, Qt::LeftButton); - QCoreApplication::processEvents(); - - QTRY_COMPARE(finishedSpy.count(), 1); - TEST_RUNNING_CHANGED(false); - } - - { - QStateMachine machine; - QState *s0 = new QState(&machine); - QFinalState *s1 = new QFinalState(&machine); - - QKeyEventTransition *trans = new QKeyEventTransition(&button, QEvent::KeyPress, Qt::Key_A); - QCOMPARE(trans->eventType(), QEvent::KeyPress); - QCOMPARE(trans->key(), (int)Qt::Key_A); - trans->setTargetState(s1); - s0->addTransition(trans); - - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(runningSpy.isValid()); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QVERIFY(finishedSpy.isValid()); - machine.setInitialState(s0); - machine.start(); - QCoreApplication::processEvents(); - TEST_RUNNING_CHANGED(true); - - QTest::keyPress(&button, Qt::Key_A); - QCoreApplication::processEvents(); - - QTRY_COMPARE(finishedSpy.count(), 1); - TEST_RUNNING_CHANGED(false); - } - { - QStateMachine machine; - QState *s0 = new QState(&machine); - QFinalState *s1 = new QFinalState(&machine); - - QKeyEventTransition *trans = new QKeyEventTransition(); - QCOMPARE(trans->eventSource(), (QObject*)0); - QCOMPARE(trans->eventType(), QEvent::None); - QCOMPARE(trans->key(), 0); - trans->setEventSource(&button); - trans->setEventType(QEvent::KeyPress); - trans->setKey(Qt::Key_A); - trans->setTargetState(s1); - s0->addTransition(trans); - - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(runningSpy.isValid()); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QVERIFY(finishedSpy.isValid()); - machine.setInitialState(s0); - machine.start(); - QCoreApplication::processEvents(); - TEST_RUNNING_CHANGED(true); - - QTest::keyPress(&button, Qt::Key_A); - QCoreApplication::processEvents(); - - QTRY_COMPARE(finishedSpy.count(), 1); - TEST_RUNNING_CHANGED(false); - } - // Multiple transitions for same (object,event) - { - QStateMachine machine; - QState *s0 = new QState(&machine); - QState *s1 = new QState(&machine); - QEventTransition *t0 = new QEventTransition(&button, QEvent::MouseButtonPress); - t0->setTargetState(s1); - s0->addTransition(t0); - QEventTransition *t1 = new QEventTransition(&button, QEvent::MouseButtonPress); - t1->setTargetState(s0); - s1->addTransition(t1); - - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QVERIFY(finishedSpy.isValid()); - machine.setInitialState(s0); - machine.start(); - QCoreApplication::processEvents(); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s0)); - - QTest::mousePress(&button, Qt::LeftButton); - QCoreApplication::processEvents(); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s1)); - - s0->removeTransition(t0); - QTest::mousePress(&button, Qt::LeftButton); - QCoreApplication::processEvents(); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s0)); - - QTest::mousePress(&button, Qt::LeftButton); - QCoreApplication::processEvents(); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s0)); - - s1->removeTransition(t1); - QTest::mousePress(&button, Qt::LeftButton); - QCoreApplication::processEvents(); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s0)); - - s0->addTransition(t0); - s1->addTransition(t1); - QTest::mousePress(&button, Qt::LeftButton); - QCoreApplication::processEvents(); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s1)); - } - // multiple event transitions from same source - { - QStateMachine machine; - QState *s0 = new QState(&machine); - QFinalState *s1 = new QFinalState(&machine); - QFinalState *s2 = new QFinalState(&machine); - QEventTransition *t0 = new QEventTransition(&button, QEvent::MouseButtonPress); - t0->setTargetState(s1); - s0->addTransition(t0); - QEventTransition *t1 = new QEventTransition(&button, QEvent::MouseButtonRelease); - t1->setTargetState(s2); - s0->addTransition(t1); - - QSignalSpy startedSpy(&machine, &QStateMachine::started); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(startedSpy.isValid()); - QVERIFY(finishedSpy.isValid()); - QVERIFY(runningSpy.isValid()); - machine.setInitialState(s0); - - machine.start(); - QTRY_COMPARE(startedSpy.count(), 1); - TEST_RUNNING_CHANGED(true); - QTest::mousePress(&button, Qt::LeftButton); - QTRY_COMPARE(finishedSpy.count(), 1); - TEST_RUNNING_CHANGED(false); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s1)); - - machine.start(); - QTRY_COMPARE(startedSpy.count(), 2); - TEST_RUNNING_CHANGED(true); - QTest::mouseRelease(&button, Qt::LeftButton); - QTRY_COMPARE(finishedSpy.count(), 2); - TEST_RUNNING_CHANGED(false); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s2)); - } - // custom event - { - QStateMachine machine; - QState *s0 = new QState(&machine); - QFinalState *s1 = new QFinalState(&machine); - - QEventTransition *trans = new QEventTransition(&button, QEvent::Type(QEvent::User+1)); - trans->setTargetState(s1); - s0->addTransition(trans); - - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(runningSpy.isValid()); - QSignalSpy startedSpy(&machine, &QStateMachine::started); - QVERIFY(startedSpy.isValid()); - machine.setInitialState(s0); - machine.start(); - QTest::ignoreMessage(QtWarningMsg, "QObject event transitions are not supported for custom types"); - QTRY_COMPARE(startedSpy.count(), 1); - TEST_RUNNING_CHANGED(true); - } - // custom transition - { - QStateMachine machine; - QState *s0 = new QState(&machine); - QFinalState *s1 = new QFinalState(&machine); - - TestEventTransition *trans = new TestEventTransition(&button, QEvent::MouseButtonPress, s1); - s0->addTransition(trans); - QCOMPARE(trans->eventSourceReceived(), (QObject*)0); - QCOMPARE(trans->eventTypeReceived(), QEvent::None); - - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(runningSpy.isValid()); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QVERIFY(finishedSpy.isValid()); - machine.setInitialState(s0); - machine.start(); - QCoreApplication::processEvents(); - TEST_RUNNING_CHANGED(true); - - QTest::mousePress(&button, Qt::LeftButton); - QCoreApplication::processEvents(); - - QTRY_COMPARE(finishedSpy.count(), 1); - TEST_RUNNING_CHANGED(false); - - QCOMPARE(trans->eventSourceReceived(), (QObject*)&button); - QCOMPARE(trans->eventTypeReceived(), QEvent::MouseButtonPress); - } -} - -void tst_QStateMachine::graphicsSceneEventTransitions() -{ - QGraphicsScene scene; - QGraphicsTextItem *textItem = scene.addText("foo"); - - QStateMachine machine; - QState *s1 = new QState(&machine); - QFinalState *s2 = new QFinalState(&machine); - QEventTransition *t = new QEventTransition(textItem, QEvent::GraphicsSceneMouseMove); - t->setTargetState(s2); - s1->addTransition(t); - machine.setInitialState(s1); - - QSignalSpy startedSpy(&machine, &QStateMachine::started); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(startedSpy.isValid()); - QVERIFY(finishedSpy.isValid()); - QVERIFY(runningSpy.isValid()); - machine.start(); - QTRY_COMPARE(startedSpy.count(), 1); - QCOMPARE(finishedSpy.count(), 0); - TEST_RUNNING_CHANGED(true); - QGraphicsSceneMouseEvent mouseEvent(QEvent::GraphicsSceneMouseMove); - scene.sendEvent(textItem, &mouseEvent); - QTRY_COMPARE(finishedSpy.count(), 1); - TEST_RUNNING_CHANGED(false); -} -#endif - -void tst_QStateMachine::historyStates() -{ - for (int x = 0; x < 2; ++x) { - QStateMachine machine; - QState *root = &machine; - QState *s0 = new QState(root); - DEFINE_ACTIVE_SPY(s0); - QState *s00 = new QState(s0); - DEFINE_ACTIVE_SPY(s00); - QState *s01 = new QState(s0); - DEFINE_ACTIVE_SPY(s01); - QHistoryState *s0h; - if (x == 0) { - s0h = new QHistoryState(s0); - QCOMPARE(s0h->historyType(), QHistoryState::ShallowHistory); - s0h->setHistoryType(QHistoryState::DeepHistory); - } else { - s0h = new QHistoryState(QHistoryState::DeepHistory, s0); - } - QCOMPARE(s0h->historyType(), QHistoryState::DeepHistory); - s0h->setHistoryType(QHistoryState::ShallowHistory); - QCOMPARE(s0h->historyType(), QHistoryState::ShallowHistory); - QCOMPARE(s0h->defaultState(), (QAbstractState*)0); - s0h->setDefaultState(s00); - QCOMPARE(s0h->defaultState(), (QAbstractState*)s00); - const QString warning - = QString::asprintf("QHistoryState::setDefaultState: state %p does not belong to this history state's group (%p)", s0, s0); - QTest::ignoreMessage(QtWarningMsg, qPrintable(warning)); - s0h->setDefaultState(s0); - QState *s1 = new QState(root); - DEFINE_ACTIVE_SPY(s1); - QFinalState *s2 = new QFinalState(root); - - s00->addTransition(new StringTransition("a", s01)); - s0->addTransition(new StringTransition("b", s1)); - s1->addTransition(new StringTransition("c", s0h)); - s0->addTransition(new StringTransition("d", s2)); - - root->setInitialState(s0); - s0->setInitialState(s00); - - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(runningSpy.isValid()); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QVERIFY(finishedSpy.isValid()); - machine.start(); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(s0, 1); - TEST_ACTIVE_CHANGED(s00, 1); - TEST_ACTIVE_CHANGED(s01, 0); - TEST_ACTIVE_CHANGED(s1, 0); - QCOMPARE(machine.configuration().size(), 2); - QVERIFY(machine.configuration().contains(s0)); - QVERIFY(machine.configuration().contains(s00)); - - machine.postEvent(new StringEvent("a")); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(s0, 1); - TEST_ACTIVE_CHANGED(s00, 2); - TEST_ACTIVE_CHANGED(s01, 1); - TEST_ACTIVE_CHANGED(s1, 0); - QCOMPARE(machine.configuration().size(), 2); - QVERIFY(machine.configuration().contains(s0)); - QVERIFY(machine.configuration().contains(s01)); - - machine.postEvent(new StringEvent("b")); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(s0, 2); - TEST_ACTIVE_CHANGED(s00, 2); - TEST_ACTIVE_CHANGED(s01, 2); - TEST_ACTIVE_CHANGED(s1, 1); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s1)); - - machine.postEvent(new StringEvent("c")); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(s0, 3); - TEST_ACTIVE_CHANGED(s00, 2); - TEST_ACTIVE_CHANGED(s01, 3); - TEST_ACTIVE_CHANGED(s1, 2); - QCOMPARE(machine.configuration().size(), 2); - QVERIFY(machine.configuration().contains(s0)); - QVERIFY(machine.configuration().contains(s01)); - - machine.postEvent(new StringEvent("d")); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(s0, 4); - TEST_ACTIVE_CHANGED(s00, 2); - TEST_ACTIVE_CHANGED(s01, 4); - TEST_ACTIVE_CHANGED(s1, 2); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s2)); - - QTRY_COMPARE(finishedSpy.count(), 1); - TEST_RUNNING_CHANGED_STARTED_STOPPED; - } -} - -void tst_QStateMachine::startAndStop() -{ - QStateMachine machine; - QSignalSpy startedSpy(&machine, &QStateMachine::started); - QSignalSpy stoppedSpy(&machine, &QStateMachine::stopped); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - - QVERIFY(startedSpy.isValid()); - QVERIFY(stoppedSpy.isValid()); - QVERIFY(finishedSpy.isValid()); - QVERIFY(runningSpy.isValid()); - - QVERIFY(!machine.isRunning()); - QTest::ignoreMessage(QtWarningMsg, "QStateMachine::start: No initial state set for machine. Refusing to start."); - machine.start(); - QCOMPARE(startedSpy.count(), 0); - QCOMPARE(stoppedSpy.count(), 0); - QCOMPARE(finishedSpy.count(), 0); - QCOMPARE(runningSpy.count(), 0); - QVERIFY(!machine.isRunning()); - machine.stop(); - QCOMPARE(startedSpy.count(), 0); - QCOMPARE(stoppedSpy.count(), 0); - QCOMPARE(finishedSpy.count(), 0); - QCOMPARE(runningSpy.count(), 0); - - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - machine.setInitialState(s1); - machine.start(); - TEST_ACTIVE_CHANGED(s1, 1); - QTRY_COMPARE(machine.isRunning(), true); - QTRY_COMPARE(startedSpy.count(), 1); - QCOMPARE(stoppedSpy.count(), 0); - QCOMPARE(finishedSpy.count(), 0); - TEST_RUNNING_CHANGED(true); - QCOMPARE(machine.configuration().count(), 1); - QVERIFY(machine.configuration().contains(s1)); - - QTest::ignoreMessage(QtWarningMsg, "QStateMachine::start(): already running"); - machine.start(); - QCOMPARE(runningSpy.count(), 0); - - machine.stop(); - TEST_ACTIVE_CHANGED(s1, 1); - QTRY_COMPARE(machine.isRunning(), false); - QTRY_COMPARE(stoppedSpy.count(), 1); - QCOMPARE(startedSpy.count(), 1); - QCOMPARE(finishedSpy.count(), 0); - TEST_RUNNING_CHANGED(false); - - QCOMPARE(machine.configuration().count(), 1); - QVERIFY(machine.configuration().contains(s1)); - - machine.start(); - TEST_ACTIVE_CHANGED(s1, 3); - machine.stop(); - TEST_ACTIVE_CHANGED(s1, 3); - QTRY_COMPARE(startedSpy.count(), 2); - QTRY_COMPARE(stoppedSpy.count(), 2); - TEST_RUNNING_CHANGED_STARTED_STOPPED; -} - -void tst_QStateMachine::setRunning() -{ - QStateMachine machine; - QSignalSpy startedSpy(&machine, &QStateMachine::started); - QSignalSpy stoppedSpy(&machine, &QStateMachine::stopped); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - - QVERIFY(startedSpy.isValid()); - QVERIFY(stoppedSpy.isValid()); - QVERIFY(finishedSpy.isValid()); - QVERIFY(runningSpy.isValid()); - - QVERIFY(!machine.isRunning()); - QTest::ignoreMessage(QtWarningMsg, "QStateMachine::start: No initial state set for machine. Refusing to start."); - machine.setRunning(true); - QCOMPARE(startedSpy.count(), 0); - QCOMPARE(stoppedSpy.count(), 0); - QCOMPARE(finishedSpy.count(), 0); - QCOMPARE(runningSpy.count(), 0); - QVERIFY(!machine.isRunning()); - machine.setRunning(false); - QCOMPARE(startedSpy.count(), 0); - QCOMPARE(stoppedSpy.count(), 0); - QCOMPARE(finishedSpy.count(), 0); - QCOMPARE(runningSpy.count(), 0); - - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - machine.setInitialState(s1); - machine.setRunning(true); - TEST_ACTIVE_CHANGED(s1, 1); - QTRY_COMPARE(machine.isRunning(), true); - QTRY_COMPARE(startedSpy.count(), 1); - QCOMPARE(stoppedSpy.count(), 0); - QCOMPARE(finishedSpy.count(), 0); - TEST_RUNNING_CHANGED(true); - QCOMPARE(machine.configuration().count(), 1); - QVERIFY(machine.configuration().contains(s1)); - - QTest::ignoreMessage(QtWarningMsg, "QStateMachine::start(): already running"); - machine.setRunning(true); - TEST_ACTIVE_CHANGED(s1, 1); - QCOMPARE(runningSpy.count(), 0); - - machine.setRunning(false); - TEST_ACTIVE_CHANGED(s1, 1); - QTRY_COMPARE(machine.isRunning(), false); - QTRY_COMPARE(stoppedSpy.count(), 1); - QCOMPARE(startedSpy.count(), 1); - QCOMPARE(finishedSpy.count(), 0); - TEST_RUNNING_CHANGED(false); - QCOMPARE(machine.configuration().count(), 1); - QVERIFY(machine.configuration().contains(s1)); - - machine.setRunning(false); - QCOMPARE(runningSpy.count(), 0); - TEST_ACTIVE_CHANGED(s1, 1); - - machine.start(); - TEST_ACTIVE_CHANGED(s1, 3); - machine.setRunning(false); - TEST_ACTIVE_CHANGED(s1, 3); - QTRY_COMPARE(startedSpy.count(), 2); - QTRY_COMPARE(stoppedSpy.count(), 2); - TEST_RUNNING_CHANGED_STARTED_STOPPED; - QState *s1_1 = new QState(s1); - QFinalState *s1_2 = new QFinalState(s1); - s1_1->addTransition(s1_2); - s1->setInitialState(s1_1); - QFinalState *s2 = new QFinalState(&machine); - s1->addTransition(s1, SIGNAL(finished()), s2); - machine.setRunning(false); - QCOMPARE(runningSpy.count(), 0); - machine.setRunning(true); - TEST_ACTIVE_CHANGED(s1, 6); - TEST_RUNNING_CHANGED_STARTED_STOPPED; - QTRY_COMPARE(startedSpy.count(), 3); - QCOMPARE(stoppedSpy.count(), 2); - QCOMPARE(finishedSpy.count(), 1); -} - -void tst_QStateMachine::targetStateWithNoParent() -{ - QStateMachine machine; - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - s1->setObjectName("s1"); - QState s2; - s1->addTransition(&s2); - machine.setInitialState(s1); - QSignalSpy startedSpy(&machine, &QStateMachine::started); - QSignalSpy stoppedSpy(&machine, &QStateMachine::stopped); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - - QVERIFY(startedSpy.isValid()); - QVERIFY(stoppedSpy.isValid()); - QVERIFY(finishedSpy.isValid()); - QVERIFY(runningSpy.isValid()); - - machine.start(); - QTest::ignoreMessage(QtWarningMsg, "Unrecoverable error detected in running state machine: " - "Child mode of state machine '' is not 'ExclusiveStates'."); - TEST_ACTIVE_CHANGED(s1, 2); - QTRY_COMPARE(startedSpy.count(), 1); - QCOMPARE(machine.isRunning(), false); - QCOMPARE(stoppedSpy.count(), 1); - QCOMPARE(finishedSpy.count(), 0); - TEST_RUNNING_CHANGED_STARTED_STOPPED; - QCOMPARE(machine.error(), QStateMachine::StateMachineChildModeSetToParallelError); -} - -void tst_QStateMachine::targetStateDeleted() -{ - QStateMachine machine; - QState *s1 = new QState(&machine); - s1->setObjectName("s1"); - QState *s2 = new QState(&machine); - QAbstractTransition *trans = s1->addTransition(s2); - delete s2; - QCOMPARE(trans->targetState(), (QAbstractState*)0); - QVERIFY(trans->targetStates().isEmpty()); -} - -void tst_QStateMachine::defaultGlobalRestorePolicy() -{ - QStateMachine machine; - - QObject *propertyHolder = new QObject(&machine); - propertyHolder->setProperty("a", 1); - propertyHolder->setProperty("b", 2); - - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - s1->assignProperty(propertyHolder, "a", 3); - - QState *s2 = new QState(&machine); - DEFINE_ACTIVE_SPY(s2); - s2->assignProperty(propertyHolder, "b", 4); - - QState *s3 = new QState(&machine); - DEFINE_ACTIVE_SPY(s3); - - s1->addTransition(new EventTransition(QEvent::User, s2)); - s2->addTransition(new EventTransition(QEvent::User, s3)); - - machine.setInitialState(s1); - machine.start(); - QCoreApplication::processEvents(); - - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s2, 0); - TEST_ACTIVE_CHANGED(s3, 0); - QCOMPARE(propertyHolder->property("a").toInt(), 3); - QCOMPARE(propertyHolder->property("b").toInt(), 2); - - machine.postEvent(new QEvent(QEvent::User)); - QCoreApplication::processEvents(); - - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 1); - TEST_ACTIVE_CHANGED(s3, 0); - QCOMPARE(propertyHolder->property("a").toInt(), 3); - QCOMPARE(propertyHolder->property("b").toInt(), 4); - - machine.postEvent(new QEvent(QEvent::User)); - QCoreApplication::processEvents(); - - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 2); - TEST_ACTIVE_CHANGED(s3, 1); - QVERIFY(machine.isRunning()); - QCOMPARE(propertyHolder->property("a").toInt(), 3); - QCOMPARE(propertyHolder->property("b").toInt(), 4); -} - -void tst_QStateMachine::noInitialStateForInitialState() -{ - QStateMachine machine; - - QState *initialState = new QState(&machine); - DEFINE_ACTIVE_SPY(initialState); - initialState->setObjectName("initialState"); - machine.setInitialState(initialState); - - QState *childState = new QState(initialState); - DEFINE_ACTIVE_SPY(childState); - (void)childState; - - QTest::ignoreMessage(QtWarningMsg, "Unrecoverable error detected in running state machine: " - "Missing initial state in compound state 'initialState'"); - machine.start(); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(initialState, 1); - TEST_ACTIVE_CHANGED(childState, 0); - QCOMPARE(machine.isRunning(), false); - QCOMPARE(int(machine.error()), int(QStateMachine::NoInitialStateError)); -} - -void tst_QStateMachine::globalRestorePolicySetToDontRestore() -{ - QStateMachine machine; - machine.setGlobalRestorePolicy(QState::DontRestoreProperties); - - QObject *propertyHolder = new QObject(&machine); - propertyHolder->setProperty("a", 1); - propertyHolder->setProperty("b", 2); - - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - s1->assignProperty(propertyHolder, "a", 3); - - QState *s2 = new QState(&machine); - DEFINE_ACTIVE_SPY(s2); - s2->assignProperty(propertyHolder, "b", 4); - - QState *s3 = new QState(&machine); - DEFINE_ACTIVE_SPY(s3); - - s1->addTransition(new EventTransition(QEvent::User, s2)); - s2->addTransition(new EventTransition(QEvent::User, s3)); - - machine.setInitialState(s1); - machine.start(); - QCoreApplication::processEvents(); - - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s2, 0); - TEST_ACTIVE_CHANGED(s3, 0); - QCOMPARE(propertyHolder->property("a").toInt(), 3); - QCOMPARE(propertyHolder->property("b").toInt(), 2); - - machine.postEvent(new QEvent(QEvent::User)); - QCoreApplication::processEvents(); - - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 1); - TEST_ACTIVE_CHANGED(s3, 0); - QCOMPARE(propertyHolder->property("a").toInt(), 3); - QCOMPARE(propertyHolder->property("b").toInt(), 4); - - machine.postEvent(new QEvent(QEvent::User)); - QCoreApplication::processEvents(); - - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 2); - TEST_ACTIVE_CHANGED(s3, 1); - QVERIFY(machine.isRunning()); - QCOMPARE(propertyHolder->property("a").toInt(), 3); - QCOMPARE(propertyHolder->property("b").toInt(), 4); -} - -void tst_QStateMachine::globalRestorePolicySetToRestore() -{ - QStateMachine machine; - machine.setGlobalRestorePolicy(QState::RestoreProperties); - - QObject *propertyHolder = new QObject(&machine); - propertyHolder->setProperty("a", 1); - propertyHolder->setProperty("b", 2); - - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - s1->assignProperty(propertyHolder, "a", 3); - - QState *s2 = new QState(&machine); - DEFINE_ACTIVE_SPY(s2); - s2->assignProperty(propertyHolder, "b", 4); - - QState *s3 = new QState(&machine); - DEFINE_ACTIVE_SPY(s3); - - s1->addTransition(new EventTransition(QEvent::User, s2)); - s2->addTransition(new EventTransition(QEvent::User, s3)); - - machine.setInitialState(s1); - machine.start(); - QCoreApplication::processEvents(); - - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s2, 0); - TEST_ACTIVE_CHANGED(s3, 0); - QCOMPARE(propertyHolder->property("a").toInt(), 3); - QCOMPARE(propertyHolder->property("b").toInt(), 2); - - machine.postEvent(new QEvent(QEvent::User)); - QCoreApplication::processEvents(); - - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 1); - TEST_ACTIVE_CHANGED(s3, 0); - QCOMPARE(propertyHolder->property("a").toInt(), 1); - QCOMPARE(propertyHolder->property("b").toInt(), 4); - - machine.postEvent(new QEvent(QEvent::User)); - QCoreApplication::processEvents(); - - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 2); - TEST_ACTIVE_CHANGED(s3, 1); - QVERIFY(machine.isRunning()); - QCOMPARE(propertyHolder->property("a").toInt(), 1); - QCOMPARE(propertyHolder->property("b").toInt(), 2); -} - -void tst_QStateMachine::transitionWithParent() -{ - QStateMachine machine; - QState *s1 = new QState(&machine); - QState *s2 = new QState(&machine); - EventTransition *trans = new EventTransition(QEvent::User, s2, s1); - QCOMPARE(trans->sourceState(), s1); - QCOMPARE(trans->targetState(), (QAbstractState*)s2); - QCOMPARE(trans->targetStates().size(), 1); - QCOMPARE(trans->targetStates().at(0), (QAbstractState*)s2); -} - -void tst_QStateMachine::simpleAnimation() -{ - QStateMachine machine; - - QObject *object = new QObject(&machine); - object->setProperty("fooBar", 1.0); - - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - QState *s2 = new QState(&machine); - DEFINE_ACTIVE_SPY(s2); - s2->assignProperty(object, "fooBar", 2.0); - - EventTransition *et = new EventTransition(QEvent::User, s2); - QPropertyAnimation *animation = new QPropertyAnimation(object, "fooBar", s2); - et->addAnimation(animation); - s1->addTransition(et); - - QState *s3 = new QState(&machine); - DEFINE_ACTIVE_SPY(s3); - s2->addTransition(animation, SIGNAL(finished()), s3); - QObject::connect(s3, SIGNAL(entered()), QCoreApplication::instance(), SLOT(quit())); - - machine.setInitialState(s1); - machine.start(); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s2, 0); - TEST_ACTIVE_CHANGED(s3, 0); - - machine.postEvent(new QEvent(QEvent::User)); - QCOREAPPLICATION_EXEC(5000); - - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 2); - TEST_ACTIVE_CHANGED(s3, 1); - QVERIFY(machine.isRunning()); - QVERIFY(machine.configuration().contains(s3)); - QCOMPARE(object->property("fooBar").toDouble(), 2.0); -} - -class SlotCalledCounter: public QObject -{ - Q_OBJECT -public: - SlotCalledCounter() : counter(0) {} - - int counter; - -public slots: - void slot() { counter++; } -}; - -void tst_QStateMachine::twoAnimations() -{ - QStateMachine machine; - - QObject *object = new QObject(&machine); - object->setProperty("foo", 1.0); - object->setProperty("bar", 3.0); - - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - QState *s2 = new QState(&machine); - DEFINE_ACTIVE_SPY(s2); - s2->assignProperty(object, "foo", 2.0); - s2->assignProperty(object, "bar", 10.0); - - QPropertyAnimation *animationFoo = new QPropertyAnimation(object, "foo", s2); - QPropertyAnimation *animationBar = new QPropertyAnimation(object, "bar", s2); - animationBar->setDuration(900); - - SlotCalledCounter counter; - connect(animationFoo, SIGNAL(finished()), &counter, SLOT(slot())); - connect(animationBar, SIGNAL(finished()), &counter, SLOT(slot())); - - EventTransition *et = new EventTransition(QEvent::User, s2); - et->addAnimation(animationFoo); - et->addAnimation(animationBar); - s1->addTransition(et); - - QState *s3 = new QState(&machine); - DEFINE_ACTIVE_SPY(s3); - QObject::connect(s3, SIGNAL(entered()), QCoreApplication::instance(), SLOT(quit())); - s2->addTransition(s2, SIGNAL(propertiesAssigned()), s3); - - machine.setInitialState(s1); - machine.start(); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s2, 0); - TEST_ACTIVE_CHANGED(s3, 0); - - machine.postEvent(new QEvent(QEvent::User)); - QCOREAPPLICATION_EXEC(5000); - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 2); - TEST_ACTIVE_CHANGED(s3, 1); - QVERIFY(machine.isRunning()); - - QVERIFY(machine.configuration().contains(s3)); - QCOMPARE(object->property("foo").toDouble(), 2.0); - QCOMPARE(object->property("bar").toDouble(), 10.0); - - QCOMPARE(counter.counter, 2); -} - -void tst_QStateMachine::twoAnimatedTransitions() -{ - QStateMachine machine; - - QObject *object = new QObject(&machine); - object->setProperty("foo", 1.0); - - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - - QState *s2 = new QState(&machine); - DEFINE_ACTIVE_SPY(s2); - s2->assignProperty(object, "foo", 5.0); - QPropertyAnimation *fooAnimation = new QPropertyAnimation(object, "foo", s2); - EventTransition *trans = new EventTransition(QEvent::User, s2); - s1->addTransition(trans); - trans->addAnimation(fooAnimation); - - QState *s3 = new QState(&machine); - DEFINE_ACTIVE_SPY(s3); - QObject::connect(s3, SIGNAL(entered()), QCoreApplication::instance(), SLOT(quit())); - s2->addTransition(fooAnimation, SIGNAL(finished()), s3); - - QState *s4 = new QState(&machine); - DEFINE_ACTIVE_SPY(s4); - s4->assignProperty(object, "foo", 2.0); - QPropertyAnimation *fooAnimation2 = new QPropertyAnimation(object, "foo", s4); - trans = new EventTransition(QEvent::User, s4); - s3->addTransition(trans); - trans->addAnimation(fooAnimation2); - - QState *s5 = new QState(&machine); - DEFINE_ACTIVE_SPY(s5); - QObject::connect(s5, SIGNAL(entered()), QCoreApplication::instance(), SLOT(quit())); - s4->addTransition(fooAnimation2, SIGNAL(finished()), s5); - - machine.setInitialState(s1); - machine.start(); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s2, 0); - TEST_ACTIVE_CHANGED(s3, 0); - TEST_ACTIVE_CHANGED(s4, 0); - TEST_ACTIVE_CHANGED(s5, 0); - - machine.postEvent(new QEvent(QEvent::User)); - QCOREAPPLICATION_EXEC(5000); - - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 2); - TEST_ACTIVE_CHANGED(s3, 1); - TEST_ACTIVE_CHANGED(s4, 0); - TEST_ACTIVE_CHANGED(s5, 0); - QVERIFY(machine.configuration().contains(s3)); - QCOMPARE(object->property("foo").toDouble(), 5.0); - - machine.postEvent(new QEvent(QEvent::User)); - QCOREAPPLICATION_EXEC(5000); - - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 2); - TEST_ACTIVE_CHANGED(s3, 2); - TEST_ACTIVE_CHANGED(s4, 2); - TEST_ACTIVE_CHANGED(s5, 1); - QVERIFY(machine.isRunning()); - QVERIFY(machine.configuration().contains(s5)); - QCOMPARE(object->property("foo").toDouble(), 2.0); -} - -void tst_QStateMachine::playAnimationTwice() -{ - QStateMachine machine; - - QObject *object = new QObject(&machine); - object->setProperty("foo", 1.0); - - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - - QState *s2 = new QState(&machine); - DEFINE_ACTIVE_SPY(s2); - s2->assignProperty(object, "foo", 5.0); - QPropertyAnimation *fooAnimation = new QPropertyAnimation(object, "foo", s2); - EventTransition *trans = new EventTransition(QEvent::User, s2); - s1->addTransition(trans); - trans->addAnimation(fooAnimation); - - QState *s3 = new QState(&machine); - DEFINE_ACTIVE_SPY(s3); - QObject::connect(s3, SIGNAL(entered()), QCoreApplication::instance(), SLOT(quit())); - s2->addTransition(fooAnimation, SIGNAL(finished()), s3); - - QState *s4 = new QState(&machine); - DEFINE_ACTIVE_SPY(s4); - s4->assignProperty(object, "foo", 2.0); - trans = new EventTransition(QEvent::User, s4); - s3->addTransition(trans); - trans->addAnimation(fooAnimation); - - QState *s5 = new QState(&machine); - DEFINE_ACTIVE_SPY(s5); - QObject::connect(s5, SIGNAL(entered()), QCoreApplication::instance(), SLOT(quit())); - s4->addTransition(fooAnimation, SIGNAL(finished()), s5); - - machine.setInitialState(s1); - machine.start(); - QCoreApplication::processEvents(); - - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s2, 0); - TEST_ACTIVE_CHANGED(s3, 0); - TEST_ACTIVE_CHANGED(s4, 0); - TEST_ACTIVE_CHANGED(s5, 0); - machine.postEvent(new QEvent(QEvent::User)); - QCOREAPPLICATION_EXEC(5000); - - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 2); - TEST_ACTIVE_CHANGED(s3, 1); - TEST_ACTIVE_CHANGED(s4, 0); - TEST_ACTIVE_CHANGED(s5, 0); - QVERIFY(machine.configuration().contains(s3)); - QCOMPARE(object->property("foo").toDouble(), 5.0); - - machine.postEvent(new QEvent(QEvent::User)); - QCOREAPPLICATION_EXEC(5000); - - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 2); - TEST_ACTIVE_CHANGED(s3, 2); - TEST_ACTIVE_CHANGED(s4, 2); - TEST_ACTIVE_CHANGED(s5, 1); - QVERIFY(machine.isRunning()); - QVERIFY(machine.configuration().contains(s5)); - QCOMPARE(object->property("foo").toDouble(), 2.0); -} - -void tst_QStateMachine::nestedTargetStateForAnimation() -{ - QStateMachine machine; - - QObject *object = new QObject(&machine); - object->setProperty("foo", 1.0); - object->setProperty("bar", 3.0); - - SlotCalledCounter counter; - - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - QState *s2 = new QState(&machine); - DEFINE_ACTIVE_SPY(s2); - - s2->assignProperty(object, "foo", 2.0); - - QState *s2Child = new QState(s2); - DEFINE_ACTIVE_SPY(s2Child); - s2Child->assignProperty(object, "bar", 10.0); - s2->setInitialState(s2Child); - - QState *s2Child2 = new QState(s2); - DEFINE_ACTIVE_SPY(s2Child2); - s2Child2->assignProperty(object, "bar", 11.0); - QAbstractTransition *at = new EventTransition(QEvent::User, s2Child2); - s2Child->addTransition(at); - - QPropertyAnimation *animation = new QPropertyAnimation(object, "bar", s2); - animation->setDuration(2000); - connect(animation, SIGNAL(finished()), &counter, SLOT(slot())); - at->addAnimation(animation); - - at = new EventTransition(QEvent::User, s2); - s1->addTransition(at); - - animation = new QPropertyAnimation(object, "foo", s2); - connect(animation, SIGNAL(finished()), &counter, SLOT(slot())); - at->addAnimation(animation); - - animation = new QPropertyAnimation(object, "bar", s2); - connect(animation, SIGNAL(finished()), &counter, SLOT(slot())); - at->addAnimation(animation); - - QState *s3 = new QState(&machine); - DEFINE_ACTIVE_SPY(s3); - s2->addTransition(s2Child, SIGNAL(propertiesAssigned()), s3); - - QObject::connect(s3, SIGNAL(entered()), QCoreApplication::instance(), SLOT(quit())); - - machine.setInitialState(s1); - machine.start(); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s2, 0); - TEST_ACTIVE_CHANGED(s2Child, 0); - TEST_ACTIVE_CHANGED(s2Child2, 0); - TEST_ACTIVE_CHANGED(s3, 0); - machine.postEvent(new QEvent(QEvent::User)); - - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 1); - TEST_ACTIVE_CHANGED(s2Child, 1); - TEST_ACTIVE_CHANGED(s2Child2, 0); - TEST_ACTIVE_CHANGED(s3, 0); - - QCOREAPPLICATION_EXEC(5000); - - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 2); - TEST_ACTIVE_CHANGED(s2Child, 2); - TEST_ACTIVE_CHANGED(s2Child2, 0); - TEST_ACTIVE_CHANGED(s3, 1); - QVERIFY(machine.isRunning()); - QVERIFY(machine.configuration().contains(s3)); - QCOMPARE(object->property("foo").toDouble(), 2.0); - QCOMPARE(object->property("bar").toDouble(), 10.0); - QCOMPARE(counter.counter, 2); -} - -void tst_QStateMachine::propertiesAssignedSignalTransitionsReuseAnimationGroup() -{ - QStateMachine machine; - QObject *object = new QObject(&machine); - object->setProperty("foo", 0); - - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - s1->assignProperty(object, "foo", 123); - QState *s2 = new QState(&machine); - DEFINE_ACTIVE_SPY(s2); - s2->assignProperty(object, "foo", 456); - QState *s3 = new QState(&machine); - DEFINE_ACTIVE_SPY(s3); - s3->assignProperty(object, "foo", 789); - QFinalState *s4 = new QFinalState(&machine); - - QParallelAnimationGroup animationGroup; - animationGroup.addAnimation(new QPropertyAnimation(object, "foo")); - QSignalSpy animationFinishedSpy(&animationGroup, &QParallelAnimationGroup::finished); - QVERIFY(animationFinishedSpy.isValid()); - s1->addTransition(s1, SIGNAL(propertiesAssigned()), s2)->addAnimation(&animationGroup); - s2->addTransition(s2, SIGNAL(propertiesAssigned()), s3)->addAnimation(&animationGroup); - s3->addTransition(s3, SIGNAL(propertiesAssigned()), s4); - - machine.setInitialState(s1); - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(runningSpy.isValid()); - QSignalSpy machineFinishedSpy(&machine, &QStateMachine::finished); - QVERIFY(machineFinishedSpy.isValid()); - machine.start(); - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 2); - TEST_ACTIVE_CHANGED(s3, 2); - QTRY_COMPARE(machineFinishedSpy.count(), 1); - TEST_RUNNING_CHANGED_STARTED_STOPPED; - QVERIFY(!machine.isRunning()); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s4)); - QCOMPARE(object->property("foo").toInt(), 789); - QCOMPARE(animationFinishedSpy.count(), 2); - -} - -void tst_QStateMachine::animatedGlobalRestoreProperty() -{ - QStateMachine machine; - machine.setGlobalRestorePolicy(QState::RestoreProperties); - - QObject *object = new QObject(&machine); - object->setProperty("foo", 1.0); - - SlotCalledCounter counter; - - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - QState *s2 = new QState(&machine); - DEFINE_ACTIVE_SPY(s2); - s2->assignProperty(object, "foo", 2.0); - - QState *s3 = new QState(&machine); - DEFINE_ACTIVE_SPY(s3); - - QState *s4 = new QState(&machine); - DEFINE_ACTIVE_SPY(s4); - QObject::connect(s4, SIGNAL(entered()), QCoreApplication::instance(), SLOT(quit())); - - QAbstractTransition *at = new EventTransition(QEvent::User, s2); - s1->addTransition(at); - QPropertyAnimation *pa = new QPropertyAnimation(object, "foo", s2); - connect(pa, SIGNAL(finished()), &counter, SLOT(slot())); - at->addAnimation(pa); - - at = s2->addTransition(pa, SIGNAL(finished()), s3); - pa = new QPropertyAnimation(object, "foo", s3); - connect(pa, SIGNAL(finished()), &counter, SLOT(slot())); - at->addAnimation(pa); - - at = s3->addTransition(pa, SIGNAL(finished()), s4); - pa = new QPropertyAnimation(object, "foo", s4); - connect(pa, SIGNAL(finished()), &counter, SLOT(slot())); - at->addAnimation(pa); - - machine.setInitialState(s1); - machine.start(); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s2, 0); - TEST_ACTIVE_CHANGED(s3, 0); - TEST_ACTIVE_CHANGED(s4, 0); - - machine.postEvent(new QEvent(QEvent::User)); - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 1); - TEST_ACTIVE_CHANGED(s3, 0); - TEST_ACTIVE_CHANGED(s4, 0); - - QCOREAPPLICATION_EXEC(5000); - - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 2); - TEST_ACTIVE_CHANGED(s3, 2); - TEST_ACTIVE_CHANGED(s4, 1); - QVERIFY(machine.isRunning()); - QVERIFY(machine.configuration().contains(s4)); - QCOMPARE(object->property("foo").toDouble(), 1.0); - QCOMPARE(counter.counter, 2); -} - -void tst_QStateMachine::specificTargetValueOfAnimation() -{ - QStateMachine machine; - - QObject *object = new QObject(&machine); - object->setProperty("foo", 1.0); - - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - - QState *s2 = new QState(&machine); - DEFINE_ACTIVE_SPY(s2); - s2->assignProperty(object, "foo", 2.0); - - QPropertyAnimation *anim = new QPropertyAnimation(object, "foo"); - anim->setEndValue(10.0); - EventTransition *trans = new EventTransition(QEvent::User, s2); - s1->addTransition(trans); - trans->addAnimation(anim); - - QState *s3 = new QState(&machine); - DEFINE_ACTIVE_SPY(s3); - QObject::connect(s3, SIGNAL(entered()), QCoreApplication::instance(), SLOT(quit())); - s2->addTransition(anim, SIGNAL(finished()), s3); - - machine.setInitialState(s1); - machine.start(); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s2, 0); - TEST_ACTIVE_CHANGED(s3, 0); - - machine.postEvent(new QEvent(QEvent::User)); - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 1); - TEST_ACTIVE_CHANGED(s3, 0); - - QCOREAPPLICATION_EXEC(5000); - - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 2); - TEST_ACTIVE_CHANGED(s3, 1); - QVERIFY(machine.isRunning()); - QVERIFY(machine.configuration().contains(s3)); - QCOMPARE(object->property("foo").toDouble(), 2.0); - QCOMPARE(anim->endValue().toDouble(), 10.0); - - delete anim; -} - -void tst_QStateMachine::addDefaultAnimation() -{ - QStateMachine machine; - - QObject *object = new QObject(); - object->setProperty("foo", 1.0); - - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - - QState *s2 = new QState(&machine); - DEFINE_ACTIVE_SPY(s2); - s2->assignProperty(object, "foo", 2.0); - - QState *s3 = new QState(&machine); - DEFINE_ACTIVE_SPY(s3); - QObject::connect(s3, SIGNAL(entered()), QCoreApplication::instance(), SLOT(quit())); - - s1->addTransition(new EventTransition(QEvent::User, s2)); - - QPropertyAnimation *pa = new QPropertyAnimation(object, "foo", &machine); - machine.addDefaultAnimation(pa); - s2->addTransition(pa, SIGNAL(finished()), s3); - - machine.setInitialState(s1); - machine.start(); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s2, 0); - TEST_ACTIVE_CHANGED(s3, 0); - - machine.postEvent(new QEvent(QEvent::User)); - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 1); - TEST_ACTIVE_CHANGED(s3, 0); - - QCOREAPPLICATION_EXEC(5000); - - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 2); - TEST_ACTIVE_CHANGED(s3, 1); - QVERIFY(machine.isRunning()); - QVERIFY(machine.configuration().contains(s3)); - QCOMPARE(object->property("foo").toDouble(), 2.0); - - delete object; -} - -void tst_QStateMachine::addDefaultAnimationWithUnusedAnimation() -{ - QStateMachine machine; - - QObject *object = new QObject(&machine); - object->setProperty("foo", 1.0); - object->setProperty("bar", 2.0); - - SlotCalledCounter counter; - - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - - QState *s2 = new QState(&machine); - DEFINE_ACTIVE_SPY(s2); - s2->assignProperty(object, "foo", 2.0); - - QState *s3 = new QState(&machine); - DEFINE_ACTIVE_SPY(s3); - QObject::connect(s3, SIGNAL(entered()), QCoreApplication::instance(), SLOT(quit())); - - s1->addTransition(new EventTransition(QEvent::User, s2)); - - QPropertyAnimation *pa = new QPropertyAnimation(object, "foo", &machine); - connect(pa, SIGNAL(finished()), &counter, SLOT(slot())); - machine.addDefaultAnimation(pa); - s2->addTransition(pa, SIGNAL(finished()), s3); - - pa = new QPropertyAnimation(object, "bar", &machine); - connect(pa, SIGNAL(finished()), &counter, SLOT(slot())); - machine.addDefaultAnimation(pa); - - machine.setInitialState(s1); - machine.start(); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s2, 0); - TEST_ACTIVE_CHANGED(s3, 0); - - machine.postEvent(new QEvent(QEvent::User)); - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 1); - TEST_ACTIVE_CHANGED(s3, 0); - - QCOREAPPLICATION_EXEC(5000); - - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 2); - TEST_ACTIVE_CHANGED(s3, 1); - QVERIFY(machine.isRunning()); - QVERIFY(machine.configuration().contains(s3)); - QCOMPARE(object->property("foo").toDouble(), 2.0); - QCOMPARE(counter.counter, 1); -} - -void tst_QStateMachine::removeDefaultAnimation() -{ - QStateMachine machine; - - QObject propertyHolder; - propertyHolder.setProperty("foo", 0); - - QCOMPARE(machine.defaultAnimations().size(), 0); - - QPropertyAnimation *anim = new QPropertyAnimation(&propertyHolder, "foo"); - - machine.addDefaultAnimation(anim); - - QCOMPARE(machine.defaultAnimations().size(), 1); - QVERIFY(machine.defaultAnimations().contains(anim)); - - machine.removeDefaultAnimation(anim); - - QCOMPARE(machine.defaultAnimations().size(), 0); - - machine.addDefaultAnimation(anim); - - QPropertyAnimation *anim2 = new QPropertyAnimation(&propertyHolder, "foo"); - machine.addDefaultAnimation(anim2); - - QCOMPARE(machine.defaultAnimations().size(), 2); - QVERIFY(machine.defaultAnimations().contains(anim)); - QVERIFY(machine.defaultAnimations().contains(anim2)); - - machine.removeDefaultAnimation(anim); - - QCOMPARE(machine.defaultAnimations().size(), 1); - QVERIFY(machine.defaultAnimations().contains(anim2)); - - machine.removeDefaultAnimation(anim2); - QCOMPARE(machine.defaultAnimations().size(), 0); - - delete anim; - delete anim2; -} - -void tst_QStateMachine::overrideDefaultAnimationWithSpecific() -{ - QStateMachine machine; - - QObject *object = new QObject(&machine); - object->setProperty("foo", 1.0); - - SlotCalledCounter counter; - - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - machine.setInitialState(s1); - - QState *s2 = new QState(&machine); - DEFINE_ACTIVE_SPY(s2); - s2->assignProperty(object, "foo", 2.0); - - QState *s3 = new QState(&machine); - DEFINE_ACTIVE_SPY(s3); - QObject::connect(s3, SIGNAL(entered()), QCoreApplication::instance(), SLOT(quit())); - - QAbstractTransition *at = new EventTransition(QEvent::User, s2); - s1->addTransition(at); - - QPropertyAnimation *defaultAnimation = new QPropertyAnimation(object, "foo"); - connect(defaultAnimation, SIGNAL(stateChanged(QAbstractAnimation::State,QAbstractAnimation::State)), &counter, SLOT(slot())); - - QPropertyAnimation *moreSpecificAnimation = new QPropertyAnimation(object, "foo"); - s2->addTransition(moreSpecificAnimation, SIGNAL(finished()), s3); - connect(moreSpecificAnimation, SIGNAL(stateChanged(QAbstractAnimation::State,QAbstractAnimation::State)), &counter, SLOT(slot())); - - machine.addDefaultAnimation(defaultAnimation); - at->addAnimation(moreSpecificAnimation); - - machine.start(); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s2, 0); - TEST_ACTIVE_CHANGED(s3, 0); - - machine.postEvent(new QEvent(QEvent::User)); - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 1); - TEST_ACTIVE_CHANGED(s3, 0); - - QCOREAPPLICATION_EXEC(5000); - - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 2); - TEST_ACTIVE_CHANGED(s3, 1); - QVERIFY(machine.isRunning()); - QVERIFY(machine.configuration().contains(s3)); - QCOMPARE(counter.counter, 2); // specific animation started and stopped - - delete defaultAnimation; - delete moreSpecificAnimation; -} - -void tst_QStateMachine::parallelStateAssignmentsDone() -{ - QStateMachine machine; - - QObject *propertyHolder = new QObject(&machine); - propertyHolder->setProperty("foo", 123); - propertyHolder->setProperty("bar", 456); - propertyHolder->setProperty("zoot", 789); - - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - machine.setInitialState(s1); - - QState *parallelState = new QState(QState::ParallelStates, &machine); - parallelState->assignProperty(propertyHolder, "foo", 321); - - QState *s2 = new QState(parallelState); - DEFINE_ACTIVE_SPY(s2); - s2->assignProperty(propertyHolder, "bar", 654); - - QState *s3 = new QState(parallelState); - DEFINE_ACTIVE_SPY(s3); - s3->assignProperty(propertyHolder, "zoot", 987); - - s1->addTransition(new EventTransition(QEvent::User, parallelState)); - machine.start(); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s2, 0); - TEST_ACTIVE_CHANGED(s3, 0); - - QCOMPARE(propertyHolder->property("foo").toInt(), 123); - QCOMPARE(propertyHolder->property("bar").toInt(), 456); - QCOMPARE(propertyHolder->property("zoot").toInt(), 789); - - machine.postEvent(new QEvent(QEvent::User)); - QCoreApplication::processEvents(); - - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 1); - TEST_ACTIVE_CHANGED(s3, 1); - QVERIFY(machine.isRunning()); - QCOMPARE(propertyHolder->property("foo").toInt(), 321); - QCOMPARE(propertyHolder->property("bar").toInt(), 654); - QCOMPARE(propertyHolder->property("zoot").toInt(), 987); -} - -void tst_QStateMachine::transitionsFromParallelStateWithNoChildren() -{ - QStateMachine machine; - - QState *parallelState = new QState(QState::ParallelStates, &machine); - DEFINE_ACTIVE_SPY(parallelState); - machine.setInitialState(parallelState); - - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - parallelState->addTransition(new EventTransition(QEvent::User, s1)); - - machine.start(); - QCoreApplication::processEvents(); - TEST_ACTIVE_CHANGED(parallelState, 1); - TEST_ACTIVE_CHANGED(s1, 0); - - QCOMPARE(1, machine.configuration().size()); - QVERIFY(machine.configuration().contains(parallelState)); - - machine.postEvent(new QEvent(QEvent::User)); - QCoreApplication::processEvents(); - - TEST_ACTIVE_CHANGED(parallelState, 2); - TEST_ACTIVE_CHANGED(s1, 1); - QVERIFY(machine.isRunning()); - QCOMPARE(1, machine.configuration().size()); - QVERIFY(machine.configuration().contains(s1)); -} - -void tst_QStateMachine::parallelStateTransition() -{ - // This test checks if the parallel state is exited and re-entered if one compound state - // is exited and subsequently re-entered. When the parallel state is exited, the other compound - // state in the parallel state has to be exited too. When the parallel state is re-entered, the - // other state also needs to be re-entered. - - QStateMachine machine; - - QState *parallelState = new QState(QState::ParallelStates, &machine); - parallelState->setObjectName("parallelState"); - DEFINE_ACTIVE_SPY(parallelState); - machine.setInitialState(parallelState); - - QState *s1 = new QState(parallelState); - s1->setObjectName("s1"); - DEFINE_ACTIVE_SPY(s1); - QState *s2 = new QState(parallelState); - s2->setObjectName("s2"); - DEFINE_ACTIVE_SPY(s2); - - QState *s1InitialChild = new QState(s1); - s1InitialChild->setObjectName("s1InitialChild"); - DEFINE_ACTIVE_SPY(s1InitialChild); - s1->setInitialState(s1InitialChild); - - QState *s2InitialChild = new QState(s2); - s2InitialChild->setObjectName("s2InitialChild"); - DEFINE_ACTIVE_SPY(s2InitialChild); - s2->setInitialState(s2InitialChild); - - QState *s1OtherChild = new QState(s1); - s1OtherChild->setObjectName("s1OtherChild"); - DEFINE_ACTIVE_SPY(s1OtherChild); - - // The following transition will exit s1 (which means that parallelState is also exited), and - // subsequently re-entered (which means that parallelState is also re-entered). - EventTransition *et = new EventTransition(QEvent::User, s1OtherChild); - et->setObjectName("s1->s1OtherChild"); - s1->addTransition(et); - - machine.start(); - QCoreApplication::processEvents(); - - // Initial entrance of the parallel state and its sub-states: - TEST_ACTIVE_CHANGED(parallelState, 1); - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s1InitialChild, 1); - TEST_ACTIVE_CHANGED(s2, 1); - TEST_ACTIVE_CHANGED(s2InitialChild, 1); - TEST_ACTIVE_CHANGED(s1OtherChild, 0); - - QVERIFY(machine.configuration().contains(parallelState)); - QVERIFY(machine.configuration().contains(s1)); - QVERIFY(machine.configuration().contains(s2)); - QVERIFY(machine.configuration().contains(s1InitialChild)); - QVERIFY(machine.configuration().contains(s2InitialChild)); - QCOMPARE(machine.configuration().size(), 5); - - machine.postEvent(new QEvent(QEvent::User)); - QCoreApplication::processEvents(); - - TEST_ACTIVE_CHANGED(parallelState, 3); // initial + exit + entry - TEST_ACTIVE_CHANGED(s1, 3); // initial + exit + entry - TEST_ACTIVE_CHANGED(s1InitialChild, 2); // initial + exit - TEST_ACTIVE_CHANGED(s2, 3); // initial + exit due to parent exit + entry due to parent re-entry - TEST_ACTIVE_CHANGED(s2InitialChild, 3); // initial + exit due to parent exit + re-entry due to parent re-entry - TEST_ACTIVE_CHANGED(s1OtherChild, 1); // entry due to transition - QVERIFY(machine.isRunning()); - - // Check that s1InitialChild is not in the configuration, because although s1 is re-entered, - // another child state (s1OtherChild) is active, so the initial child should not be activated. - QVERIFY(machine.configuration().contains(parallelState)); - QVERIFY(machine.configuration().contains(s1)); - QVERIFY(machine.configuration().contains(s2)); - QVERIFY(machine.configuration().contains(s1OtherChild)); - QVERIFY(machine.configuration().contains(s2InitialChild)); - QCOMPARE(machine.configuration().size(), 5); -} - -void tst_QStateMachine::nestedRestoreProperties() -{ - QStateMachine machine; - machine.setGlobalRestorePolicy(QState::RestoreProperties); - - QObject *propertyHolder = new QObject(&machine); - propertyHolder->setProperty("foo", 1); - propertyHolder->setProperty("bar", 2); - - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - machine.setInitialState(s1); - - QState *s2 = new QState(&machine); - DEFINE_ACTIVE_SPY(s2); - s2->assignProperty(propertyHolder, "foo", 3); - - QState *s21 = new QState(s2); - DEFINE_ACTIVE_SPY(s21); - s21->assignProperty(propertyHolder, "bar", 4); - s2->setInitialState(s21); - - QState *s22 = new QState(s2); - DEFINE_ACTIVE_SPY(s22); - s22->assignProperty(propertyHolder, "bar", 5); - - s1->addTransition(new EventTransition(QEvent::User, s2)); - s21->addTransition(new EventTransition(QEvent::User, s22)); - - machine.start(); - QCoreApplication::processEvents(); - - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s2, 0); - TEST_ACTIVE_CHANGED(s21, 0); - TEST_ACTIVE_CHANGED(s22, 0); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s1)); - QCOMPARE(propertyHolder->property("foo").toInt(), 1); - QCOMPARE(propertyHolder->property("bar").toInt(), 2); - - machine.postEvent(new QEvent(QEvent::User)); - QCoreApplication::processEvents(); - - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 1); - TEST_ACTIVE_CHANGED(s21, 1); - TEST_ACTIVE_CHANGED(s22, 0); - QCOMPARE(machine.configuration().size(), 2); - QVERIFY(machine.configuration().contains(s2)); - QVERIFY(machine.configuration().contains(s21)); - QCOMPARE(propertyHolder->property("foo").toInt(), 3); - QCOMPARE(propertyHolder->property("bar").toInt(), 4); - - machine.postEvent(new QEvent(QEvent::User)); - QCoreApplication::processEvents(); - - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 1); - TEST_ACTIVE_CHANGED(s21, 2); - TEST_ACTIVE_CHANGED(s22, 1); - QVERIFY(machine.isRunning()); - QCOMPARE(machine.configuration().size(), 2); - QVERIFY(machine.configuration().contains(s2)); - QVERIFY(machine.configuration().contains(s22)); - QCOMPARE(propertyHolder->property("foo").toInt(), 3); - QCOMPARE(propertyHolder->property("bar").toInt(), 5); -} - -void tst_QStateMachine::nestedRestoreProperties2() -{ - QStateMachine machine; - machine.setGlobalRestorePolicy(QState::RestoreProperties); - - QObject *propertyHolder = new QObject(&machine); - propertyHolder->setProperty("foo", 1); - propertyHolder->setProperty("bar", 2); - - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - machine.setInitialState(s1); - - QState *s2 = new QState(&machine); - DEFINE_ACTIVE_SPY(s2); - s2->assignProperty(propertyHolder, "foo", 3); - - QState *s21 = new QState(s2); - DEFINE_ACTIVE_SPY(s21); - s21->assignProperty(propertyHolder, "bar", 4); - s2->setInitialState(s21); - - QState *s22 = new QState(s2); - DEFINE_ACTIVE_SPY(s22); - s22->assignProperty(propertyHolder, "foo", 6); - s22->assignProperty(propertyHolder, "bar", 5); - - s1->addTransition(new EventTransition(QEvent::User, s2)); - s21->addTransition(new EventTransition(QEvent::User, s22)); - s22->addTransition(new EventTransition(QEvent::User, s21)); - - machine.start(); - QCoreApplication::processEvents(); - - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s2, 0); - TEST_ACTIVE_CHANGED(s21, 0); - TEST_ACTIVE_CHANGED(s22, 0); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s1)); - QCOMPARE(propertyHolder->property("foo").toInt(), 1); - QCOMPARE(propertyHolder->property("bar").toInt(), 2); - - machine.postEvent(new QEvent(QEvent::User)); - QCoreApplication::processEvents(); - - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 1); - TEST_ACTIVE_CHANGED(s21, 1); - TEST_ACTIVE_CHANGED(s22, 0); - QCOMPARE(machine.configuration().size(), 2); - QVERIFY(machine.configuration().contains(s2)); - QVERIFY(machine.configuration().contains(s21)); - QCOMPARE(propertyHolder->property("foo").toInt(), 3); - QCOMPARE(propertyHolder->property("bar").toInt(), 4); - - machine.postEvent(new QEvent(QEvent::User)); - QCoreApplication::processEvents(); - - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 1); - TEST_ACTIVE_CHANGED(s21, 2); - TEST_ACTIVE_CHANGED(s22, 1); - QCOMPARE(machine.configuration().size(), 2); - QVERIFY(machine.configuration().contains(s2)); - QVERIFY(machine.configuration().contains(s22)); - QCOMPARE(propertyHolder->property("foo").toInt(), 6); - QCOMPARE(propertyHolder->property("bar").toInt(), 5); - - machine.postEvent(new QEvent(QEvent::User)); - QCoreApplication::processEvents(); - - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 1); - TEST_ACTIVE_CHANGED(s21, 3); - TEST_ACTIVE_CHANGED(s22, 2); - QCOMPARE(machine.configuration().size(), 2); - QVERIFY(machine.configuration().contains(s2)); - QVERIFY(machine.configuration().contains(s21)); - QCOMPARE(propertyHolder->property("foo").toInt(), 3); - QCOMPARE(propertyHolder->property("bar").toInt(), 4); - -} - -void tst_QStateMachine::nestedStateMachines() -{ - QStateMachine machine; - QState *group = new QState(&machine); - DEFINE_ACTIVE_SPY(group); - group->setChildMode(QState::ParallelStates); - QStateMachine *subMachines[3]; - for (int i = 0; i < 3; ++i) { - QState *subGroup = new QState(group); - QStateMachine *subMachine = new QStateMachine(subGroup); - { - QState *initial = new QState(subMachine); - QFinalState *done = new QFinalState(subMachine); - initial->addTransition(new EventTransition(QEvent::User, done)); - subMachine->setInitialState(initial); - } - QFinalState *subMachineDone = new QFinalState(subGroup); - subMachine->addTransition(subMachine, SIGNAL(finished()), subMachineDone); - subGroup->setInitialState(subMachine); - subMachines[i] = subMachine; - } - QFinalState *final = new QFinalState(&machine); - group->addTransition(group, SIGNAL(finished()), final); - machine.setInitialState(group); - - QSignalSpy startedSpy(&machine, &QStateMachine::started); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(startedSpy.isValid()); - QVERIFY(finishedSpy.isValid()); - QVERIFY(runningSpy.isValid()); - machine.start(); - QTRY_COMPARE(startedSpy.count(), 1); - TEST_RUNNING_CHANGED(true); - QTRY_COMPARE(machine.configuration().count(), 1+2*3); - QVERIFY(machine.configuration().contains(group)); - for (int i = 0; i < 3; ++i) - QVERIFY(machine.configuration().contains(subMachines[i])); - - QCoreApplication::processEvents(); // starts the submachines - TEST_ACTIVE_CHANGED(group, 1); - - for (int i = 0; i < 3; ++i) - subMachines[i]->postEvent(new QEvent(QEvent::User)); - - QTRY_COMPARE(finishedSpy.count(), 1); - TEST_RUNNING_CHANGED(false); - TEST_ACTIVE_CHANGED(group, 2); -} - -void tst_QStateMachine::goToState() -{ - QStateMachine machine; - QState *s1 = new QState(&machine); - QState *s2 = new QState(&machine); - machine.setInitialState(s1); - QSignalSpy startedSpy(&machine, &QStateMachine::started); - QVERIFY(startedSpy.isValid()); - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(runningSpy.isValid()); - machine.start(); - QTRY_COMPARE(startedSpy.count(), 1); - TEST_RUNNING_CHANGED(true); - - QStateMachinePrivate::get(&machine)->goToState(s2); - QCoreApplication::processEvents(); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s2)); - - QStateMachinePrivate::get(&machine)->goToState(s2); - QCoreApplication::processEvents(); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s2)); - - QStateMachinePrivate::get(&machine)->goToState(s1); - QStateMachinePrivate::get(&machine)->goToState(s2); - QStateMachinePrivate::get(&machine)->goToState(s1); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s2)); - - QCoreApplication::processEvents(); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s1)); - - // go to state in group - QState *s2_1 = new QState(s2); - s2->setInitialState(s2_1); - QStateMachinePrivate::get(&machine)->goToState(s2_1); - QCoreApplication::processEvents(); - QCOMPARE(machine.configuration().size(), 2); - QVERIFY(machine.configuration().contains(s2)); - QVERIFY(machine.configuration().contains(s2_1)); -} - -void tst_QStateMachine::goToStateFromSourceWithTransition() -{ - // QTBUG-21813 - QStateMachine machine; - QState *s1 = new QState(&machine); - s1->addTransition(new QSignalTransition); - QState *s2 = new QState(&machine); - machine.setInitialState(s1); - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(runningSpy.isValid()); - QSignalSpy startedSpy(&machine, &QStateMachine::started); - QVERIFY(startedSpy.isValid()); - machine.start(); - QTRY_COMPARE(startedSpy.count(), 1); - TEST_RUNNING_CHANGED(true); - - QStateMachinePrivate::get(&machine)->goToState(s2); - QCoreApplication::processEvents(); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s2)); -} - -class CloneSignalTransition : public QSignalTransition -{ -public: - CloneSignalTransition(QObject *sender, const char *signal, QAbstractState *target) - : QSignalTransition(sender, signal) - { - setTargetState(target); - } - - void onTransition(QEvent *e) - { - QSignalTransition::onTransition(e); - QStateMachine::SignalEvent *se = static_cast(e); - eventSignalIndex = se->signalIndex(); - } - - int eventSignalIndex; -}; - -void tst_QStateMachine::clonedSignals() -{ - SignalEmitter emitter; - QStateMachine machine; - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - QState *s2 = new QState(&machine); - DEFINE_ACTIVE_SPY(s2); - CloneSignalTransition *t1 = new CloneSignalTransition(&emitter, SIGNAL(signalWithDefaultArg()), s2); - s1->addTransition(t1); - - machine.setInitialState(s1); - QSignalSpy startedSpy(&machine, &QStateMachine::started); - machine.start(); - QVERIFY(startedSpy.wait()); - - QSignalSpy transitionSpy(t1, &CloneSignalTransition::triggered); - emitter.emitSignalWithDefaultArg(); - QTRY_COMPARE(transitionSpy.count(), 1); - - QCOMPARE(t1->eventSignalIndex, emitter.metaObject()->indexOfSignal("signalWithDefaultArg()")); - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 1); - QVERIFY(machine.isRunning()); -} - -class EventPosterThread : public QThread -{ - Q_OBJECT -public: - EventPosterThread(QStateMachine *machine, QObject *parent = 0) - : QThread(parent), m_machine(machine), m_count(0) - { - moveToThread(this); - QObject::connect(m_machine, SIGNAL(started()), - this, SLOT(postEvent())); - } -protected: - virtual void run() - { - exec(); - } -private Q_SLOTS: - void postEvent() - { - m_machine->postEvent(new QEvent(QEvent::User)); - if (++m_count < 1000) - QTimer::singleShot(0, this, SLOT(postEvent())); - else - quit(); - } -private: - QStateMachine *m_machine; - int m_count; -}; - -void tst_QStateMachine::postEventFromOtherThread() -{ - QStateMachine machine; - EventPosterThread poster(&machine); - StringEventPoster *s1 = new StringEventPoster("foo", &machine); - s1->addTransition(new EventTransition(QEvent::User, s1)); - QFinalState *f = new QFinalState(&machine); - s1->addTransition(&poster, SIGNAL(finished()), f); - machine.setInitialState(s1); - - poster.start(); - - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(runningSpy.isValid()); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QVERIFY(finishedSpy.isValid()); - machine.start(); - QTRY_COMPARE(finishedSpy.count(), 1); - TEST_RUNNING_CHANGED_STARTED_STOPPED; -} - -#ifndef QT_NO_WIDGETS -void tst_QStateMachine::eventFilterForApplication() -{ - QStateMachine machine; - - QState *s1 = new QState(&machine); - { - machine.setInitialState(s1); - } - - QState *s2 = new QState(&machine); - - QEventTransition *transition = new QEventTransition(QCoreApplication::instance(), - QEvent::ApplicationActivate); - transition->setTargetState(s2); - s1->addTransition(transition); - - machine.start(); - QCoreApplication::processEvents(); - - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s1)); - - QCoreApplication::postEvent(QCoreApplication::instance(), - new QEvent(QEvent::ApplicationActivate)); - QCoreApplication::processEvents(); - - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s2)); -} -#endif - -void tst_QStateMachine::eventClassesExported() -{ - // make sure this links - QStateMachine::WrappedEvent *wrappedEvent = new QStateMachine::WrappedEvent(0, 0); - Q_UNUSED(wrappedEvent); - QStateMachine::SignalEvent *signalEvent = new QStateMachine::SignalEvent(0, 0, QList()); - Q_UNUSED(signalEvent); -} - -void tst_QStateMachine::stopInTransitionToFinalState() -{ - QStateMachine machine; - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - QFinalState *s2 = new QFinalState(&machine); - QAbstractTransition *t1 = s1->addTransition(s2); - machine.setInitialState(s1); - - QObject::connect(t1, SIGNAL(triggered()), &machine, SLOT(stop())); - QSignalSpy stoppedSpy(&machine, &QStateMachine::stopped); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QSignalSpy s2EnteredSpy(s2, &QFinalState::entered); - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(stoppedSpy.isValid()); - QVERIFY(finishedSpy.isValid()); - QVERIFY(s2EnteredSpy.isValid()); - QVERIFY(runningSpy.isValid()); - machine.start(); - // Stopping should take precedence over finished. - QTRY_COMPARE(stoppedSpy.count(), 1); - QCOMPARE(finishedSpy.count(), 0); - QCOMPARE(s2EnteredSpy.count(), 1); - TEST_RUNNING_CHANGED_STARTED_STOPPED; - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s2)); - TEST_ACTIVE_CHANGED(s1, 2); -} - -class StopInEventTestTransition : public QAbstractTransition -{ -public: - bool eventTest(QEvent *e) - { - if (e->type() == QEvent::User) - machine()->stop(); - return false; - } - void onTransition(QEvent *) - { } -}; - -void tst_QStateMachine::stopInEventTest_data() -{ - QTest::addColumn("eventPriority"); - QTest::newRow("NormalPriority") << int(QStateMachine::NormalPriority); - QTest::newRow("HighPriority") << int(QStateMachine::HighPriority); -} - -void tst_QStateMachine::stopInEventTest() -{ - QFETCH(int, eventPriority); - - QStateMachine machine; - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - s1->addTransition(new StopInEventTestTransition()); - machine.setInitialState(s1); - - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(runningSpy.isValid()); - QSignalSpy startedSpy(&machine, &QStateMachine::started); - QVERIFY(startedSpy.isValid()); - machine.start(); - TEST_ACTIVE_CHANGED(s1, 1); - QTRY_COMPARE(startedSpy.count(), 1); - TEST_RUNNING_CHANGED(true); - - QSignalSpy stoppedSpy(&machine, &QStateMachine::stopped); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QVERIFY(stoppedSpy.isValid()); - QVERIFY(finishedSpy.isValid()); - machine.postEvent(new QEvent(QEvent::User), QStateMachine::EventPriority(eventPriority)); - - QTRY_COMPARE(stoppedSpy.count(), 1); - QCOMPARE(finishedSpy.count(), 0); - TEST_RUNNING_CHANGED(false); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s1)); - TEST_ACTIVE_CHANGED(s1, 1); -} - -class IncrementReceiversTest : public QObject -{ - Q_OBJECT -signals: - void mySignal(); -public: - virtual void connectNotify(const QMetaMethod &signal) - { - signalList.append(signal); - } - - QList signalList; -}; - -void tst_QStateMachine::testIncrementReceivers() -{ - QStateMachine machine; - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - machine.setInitialState(s1); - QFinalState *s2 = new QFinalState(&machine); - - IncrementReceiversTest testObject; - s1->addTransition(&testObject, SIGNAL(mySignal()), s2); - - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(runningSpy.isValid()); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - machine.start(); - TEST_RUNNING_CHANGED(true); - - QMetaObject::invokeMethod(&testObject, "mySignal", Qt::QueuedConnection); - - QTRY_COMPARE(finishedSpy.count(), 1); - TEST_RUNNING_CHANGED(false); - QCOMPARE(testObject.signalList.size(), 1); - QCOMPARE(testObject.signalList.at(0), QMetaMethod::fromSignal(&IncrementReceiversTest::mySignal)); - TEST_ACTIVE_CHANGED(s1, 2); -} - -void tst_QStateMachine::initialStateIsEnteredBeforeStartedEmitted() -{ - QStateMachine machine; - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - machine.setInitialState(s1); - QFinalState *s2 = new QFinalState(&machine); - - // When started() is emitted, s1 should be the active state, and this - // transition should trigger. - s1->addTransition(&machine, SIGNAL(started()), s2); - - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(runningSpy.isValid()); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - machine.start(); - QTRY_COMPARE(finishedSpy.count(), 1); - TEST_RUNNING_CHANGED_STARTED_STOPPED; - TEST_ACTIVE_CHANGED(s1, 2); -} - -void tst_QStateMachine::deletePropertyAssignmentObjectBeforeEntry() -{ - QStateMachine machine; - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - machine.setInitialState(s1); - - QObject *o1 = new QObject; - s1->assignProperty(o1, "objectName", "foo"); - delete o1; - QObject *o2 = new QObject; - s1->assignProperty(o2, "objectName", "bar"); - - machine.start(); - // Shouldn't crash - QTRY_VERIFY(machine.configuration().contains(s1)); - - QCOMPARE(o2->objectName(), QString::fromLatin1("bar")); - delete o2; - TEST_ACTIVE_CHANGED(s1, 1); - QVERIFY(machine.isRunning()); -} - -void tst_QStateMachine::deletePropertyAssignmentObjectBeforeRestore() -{ - QStateMachine machine; - machine.setGlobalRestorePolicy(QState::RestoreProperties); - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - machine.setInitialState(s1); - QState *s2 = new QState(&machine); - DEFINE_ACTIVE_SPY(s2); - s1->addTransition(new EventTransition(QEvent::User, s2)); - - QObject *o1 = new QObject; - s1->assignProperty(o1, "objectName", "foo"); - QObject *o2 = new QObject; - s1->assignProperty(o2, "objectName", "bar"); - - QVERIFY(o1->objectName().isEmpty()); - QVERIFY(o2->objectName().isEmpty()); - machine.start(); - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s2, 0); - QTRY_VERIFY(machine.configuration().contains(s1)); - QCOMPARE(o1->objectName(), QString::fromLatin1("foo")); - QCOMPARE(o2->objectName(), QString::fromLatin1("bar")); - - delete o1; - machine.postEvent(new QEvent(QEvent::User)); - // Shouldn't crash - QTRY_VERIFY(machine.configuration().contains(s2)); - - QVERIFY(o2->objectName().isEmpty()); - delete o2; - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 1); - QVERIFY(machine.isRunning()); -} - -void tst_QStateMachine::deleteInitialState() -{ - QStateMachine machine; - QState *s1 = new QState(&machine); - machine.setInitialState(s1); - delete s1; - QTest::ignoreMessage(QtWarningMsg, "QStateMachine::start: No initial state set for machine. Refusing to start."); - machine.start(); - // Shouldn't crash - QCoreApplication::processEvents(); -} - -void tst_QStateMachine::setPropertyAfterRestore() -{ - QStateMachine machine; - machine.setGlobalRestorePolicy(QState::RestoreProperties); - - QObject *object = new QObject(&machine); - object->setProperty("a", 1); - - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - machine.setInitialState(s1); - s1->assignProperty(object, "a", 2); - - QState *s2 = new QState(&machine); - DEFINE_ACTIVE_SPY(s2); - s1->addTransition(new EventTransition(QEvent::User, s2)); - - QState *s3 = new QState(&machine); - DEFINE_ACTIVE_SPY(s3); - s3->assignProperty(object, "a", 4); - s2->addTransition(new EventTransition(QEvent::User, s3)); - - QState *s4 = new QState(&machine); - DEFINE_ACTIVE_SPY(s4); - s3->addTransition(new EventTransition(QEvent::User, s4)); - - machine.start(); - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s2, 0); - TEST_ACTIVE_CHANGED(s3, 0); - TEST_ACTIVE_CHANGED(s4, 0); - QTRY_VERIFY(machine.configuration().contains(s1)); - QCOMPARE(object->property("a").toInt(), 2); - - machine.postEvent(new QEvent(QEvent::User)); - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 1); - TEST_ACTIVE_CHANGED(s3, 0); - TEST_ACTIVE_CHANGED(s4, 0); - QTRY_VERIFY(machine.configuration().contains(s2)); - QCOMPARE(object->property("a").toInt(), 1); // restored - - // Set property outside of state machine; this is the value - // that should be remembered in the next transition - object->setProperty("a", 3); - - machine.postEvent(new QEvent(QEvent::User)); - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 2); - TEST_ACTIVE_CHANGED(s3, 1); - TEST_ACTIVE_CHANGED(s4, 0); - QTRY_VERIFY(machine.configuration().contains(s3)); - QCOMPARE(object->property("a").toInt(), 4); - - machine.postEvent(new QEvent(QEvent::User)); - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 2); - TEST_ACTIVE_CHANGED(s3, 2); - TEST_ACTIVE_CHANGED(s4, 1); - QVERIFY(machine.isRunning()); - QTRY_VERIFY(machine.configuration().contains(s4)); - QCOMPARE(object->property("a").toInt(), 3); // restored - - delete object; -} - -void tst_QStateMachine::transitionWithNoTarget_data() -{ - QTest::addColumn("restorePolicy"); - QTest::newRow("DontRestoreProperties") << int(QState::DontRestoreProperties); - QTest::newRow("RestoreProperties") << int(QState::RestoreProperties); -} - -void tst_QStateMachine::transitionWithNoTarget() -{ - QFETCH(int, restorePolicy); - - QStateMachine machine; - machine.setGlobalRestorePolicy(static_cast(restorePolicy)); - - QObject *object = new QObject; - object->setProperty("a", 1); - - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - machine.setInitialState(s1); - s1->assignProperty(object, "a", 2); - EventTransition *t1 = new EventTransition(QEvent::User, /*target=*/0); - s1->addTransition(t1); - - QSignalSpy s1EnteredSpy(s1, &QState::entered); - QSignalSpy s1ExitedSpy(s1, &QState::exited); - QSignalSpy t1TriggeredSpy(t1, &EventTransition::triggered); - - machine.start(); - QTRY_VERIFY(machine.configuration().contains(s1)); - QCOMPARE(s1EnteredSpy.count(), 1); - QCOMPARE(s1ExitedSpy.count(), 0); - QCOMPARE(t1TriggeredSpy.count(), 0); - QCOMPARE(object->property("a").toInt(), 2); - - object->setProperty("a", 3); - - machine.postEvent(new QEvent(QEvent::User)); - QTRY_COMPARE(t1TriggeredSpy.count(), 1); - QCOMPARE(s1EnteredSpy.count(), 1); - QCOMPARE(s1ExitedSpy.count(), 0); - // the assignProperty should not be re-executed, nor should the old value - // be restored - QCOMPARE(object->property("a").toInt(), 3); - - machine.postEvent(new QEvent(QEvent::User)); - QTRY_COMPARE(t1TriggeredSpy.count(), 2); - QCOMPARE(s1EnteredSpy.count(), 1); - QCOMPARE(s1ExitedSpy.count(), 0); - QCOMPARE(object->property("a").toInt(), 3); - - delete object; - TEST_ACTIVE_CHANGED(s1, 1); - QVERIFY(machine.isRunning()); -} - -void tst_QStateMachine::initialStateIsFinal() -{ - QStateMachine machine; - QFinalState *f = new QFinalState(&machine); - machine.setInitialState(f); - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(runningSpy.isValid()); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - machine.start(); - QTRY_VERIFY(machine.configuration().contains(f)); - QTRY_COMPARE(finishedSpy.count(), 1); - TEST_RUNNING_CHANGED_STARTED_STOPPED; -} - -class PropertyObject : public QObject -{ - Q_OBJECT - Q_PROPERTY(int prop READ prop WRITE setProp) -public: - PropertyObject(QObject *parent = 0) - : QObject(parent), m_propValue(0), m_propWriteCount(0) - {} - int prop() const { return m_propValue; } - void setProp(int value) { m_propValue = value; ++m_propWriteCount; } - int propWriteCount() const { return m_propWriteCount; } -private: - int m_propValue; - int m_propWriteCount; -}; - -void tst_QStateMachine::restorePropertiesSimple() -{ - QStateMachine machine; - machine.setGlobalRestorePolicy(QState::RestoreProperties); - - PropertyObject *po = new PropertyObject; - po->setProp(2); - QCOMPARE(po->propWriteCount(), 1); - - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - s1->assignProperty(po, "prop", 4); - machine.setInitialState(s1); - - QState *s2 = new QState(&machine); - DEFINE_ACTIVE_SPY(s2); - s1->addTransition(new EventTransition(QEvent::User, s2)); - - QState *s3 = new QState(&machine); - DEFINE_ACTIVE_SPY(s3); - s3->assignProperty(po, "prop", 6); - s2->addTransition(new EventTransition(QEvent::User, s3)); - - QState *s4 = new QState(&machine); - DEFINE_ACTIVE_SPY(s4); - s4->assignProperty(po, "prop", 8); - s3->addTransition(new EventTransition(QEvent::User, s4)); - - QState *s5 = new QState(&machine); - DEFINE_ACTIVE_SPY(s5); - s4->addTransition(new EventTransition(QEvent::User, s5)); - - QState *s6 = new QState(&machine); - DEFINE_ACTIVE_SPY(s6); - s5->addTransition(new EventTransition(QEvent::User, s6)); - - machine.start(); - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s2, 0); - TEST_ACTIVE_CHANGED(s3, 0); - TEST_ACTIVE_CHANGED(s4, 0); - TEST_ACTIVE_CHANGED(s5, 0); - TEST_ACTIVE_CHANGED(s6, 0); - QTRY_VERIFY(machine.configuration().contains(s1)); - QCOMPARE(po->propWriteCount(), 2); - QCOMPARE(po->prop(), 4); - - machine.postEvent(new QEvent(QEvent::User)); - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 1); - TEST_ACTIVE_CHANGED(s3, 0); - TEST_ACTIVE_CHANGED(s4, 0); - TEST_ACTIVE_CHANGED(s5, 0); - TEST_ACTIVE_CHANGED(s6, 0); - QTRY_VERIFY(machine.configuration().contains(s2)); - QCOMPARE(po->propWriteCount(), 3); - QCOMPARE(po->prop(), 2); // restored - - machine.postEvent(new QEvent(QEvent::User)); - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 2); - TEST_ACTIVE_CHANGED(s3, 1); - TEST_ACTIVE_CHANGED(s4, 0); - TEST_ACTIVE_CHANGED(s5, 0); - TEST_ACTIVE_CHANGED(s6, 0); - QTRY_VERIFY(machine.configuration().contains(s3)); - QCOMPARE(po->propWriteCount(), 4); - QCOMPARE(po->prop(), 6); - - machine.postEvent(new QEvent(QEvent::User)); - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 2); - TEST_ACTIVE_CHANGED(s3, 2); - TEST_ACTIVE_CHANGED(s4, 1); - TEST_ACTIVE_CHANGED(s5, 0); - TEST_ACTIVE_CHANGED(s6, 0); - QTRY_VERIFY(machine.configuration().contains(s4)); - QCOMPARE(po->propWriteCount(), 5); - QCOMPARE(po->prop(), 8); - - machine.postEvent(new QEvent(QEvent::User)); - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 2); - TEST_ACTIVE_CHANGED(s3, 2); - TEST_ACTIVE_CHANGED(s4, 2); - TEST_ACTIVE_CHANGED(s5, 1); - TEST_ACTIVE_CHANGED(s6, 0); - QTRY_VERIFY(machine.configuration().contains(s5)); - QCOMPARE(po->propWriteCount(), 6); - QCOMPARE(po->prop(), 2); // restored - - machine.postEvent(new QEvent(QEvent::User)); - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 2); - TEST_ACTIVE_CHANGED(s3, 2); - TEST_ACTIVE_CHANGED(s4, 2); - TEST_ACTIVE_CHANGED(s5, 2); - TEST_ACTIVE_CHANGED(s6, 1); - QVERIFY(machine.isRunning()); - QTRY_VERIFY(machine.configuration().contains(s6)); - QCOMPARE(po->propWriteCount(), 6); - - delete po; -} - -void tst_QStateMachine::restoreProperties2() -{ - QStateMachine machine; - machine.setGlobalRestorePolicy(QState::RestoreProperties); - - PropertyObject *po = new PropertyObject; - po->setProp(2); - QCOMPARE(po->propWriteCount(), 1); - - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - s1->assignProperty(po, "prop", 4); - machine.setInitialState(s1); - - QState *s11 = new QState(s1); - DEFINE_ACTIVE_SPY(s11); - s1->setInitialState(s11); - - QState *s12 = new QState(s1); - DEFINE_ACTIVE_SPY(s12); - s11->addTransition(new EventTransition(QEvent::User, s12)); - - QState *s13 = new QState(s1); - DEFINE_ACTIVE_SPY(s13); - s13->assignProperty(po, "prop", 6); - s12->addTransition(new EventTransition(QEvent::User, s13)); - - QState *s14 = new QState(s1); - DEFINE_ACTIVE_SPY(s14); - s14->assignProperty(po, "prop", 8); - s13->addTransition(new EventTransition(QEvent::User, s14)); - - QState *s15 = new QState(s1); - DEFINE_ACTIVE_SPY(s15); - s14->addTransition(new EventTransition(QEvent::User, s15)); - - QState *s16 = new QState(s1); - DEFINE_ACTIVE_SPY(s16); - s15->addTransition(new EventTransition(QEvent::User, s16)); - - QState *s2 = new QState(&machine); - DEFINE_ACTIVE_SPY(s2); - s2->assignProperty(po, "prop", 10); - s16->addTransition(new EventTransition(QEvent::User, s2)); - - QState *s3 = new QState(&machine); - DEFINE_ACTIVE_SPY(s3); - s2->addTransition(new EventTransition(QEvent::User, s3)); - - machine.start(); - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s11, 1); - TEST_ACTIVE_CHANGED(s12, 0); - TEST_ACTIVE_CHANGED(s13, 0); - TEST_ACTIVE_CHANGED(s14, 0); - TEST_ACTIVE_CHANGED(s15, 0); - TEST_ACTIVE_CHANGED(s16, 0); - TEST_ACTIVE_CHANGED(s2, 0); - TEST_ACTIVE_CHANGED(s3, 0); - QTRY_VERIFY(machine.configuration().contains(s11)); - QCOMPARE(po->propWriteCount(), 2); - QCOMPARE(po->prop(), 4); - - machine.postEvent(new QEvent(QEvent::User)); - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s11, 2); - TEST_ACTIVE_CHANGED(s12, 1); - TEST_ACTIVE_CHANGED(s13, 0); - TEST_ACTIVE_CHANGED(s14, 0); - TEST_ACTIVE_CHANGED(s15, 0); - TEST_ACTIVE_CHANGED(s16, 0); - TEST_ACTIVE_CHANGED(s2, 0); - TEST_ACTIVE_CHANGED(s3, 0); - QTRY_VERIFY(machine.configuration().contains(s12)); - QCOMPARE(po->propWriteCount(), 2); - - machine.postEvent(new QEvent(QEvent::User)); - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s11, 2); - TEST_ACTIVE_CHANGED(s12, 2); - TEST_ACTIVE_CHANGED(s13, 1); - TEST_ACTIVE_CHANGED(s14, 0); - TEST_ACTIVE_CHANGED(s15, 0); - TEST_ACTIVE_CHANGED(s16, 0); - TEST_ACTIVE_CHANGED(s2, 0); - TEST_ACTIVE_CHANGED(s3, 0); - QTRY_VERIFY(machine.configuration().contains(s13)); - QCOMPARE(po->propWriteCount(), 3); - QCOMPARE(po->prop(), 6); - - machine.postEvent(new QEvent(QEvent::User)); - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s11, 2); - TEST_ACTIVE_CHANGED(s12, 2); - TEST_ACTIVE_CHANGED(s13, 2); - TEST_ACTIVE_CHANGED(s14, 1); - TEST_ACTIVE_CHANGED(s15, 0); - TEST_ACTIVE_CHANGED(s16, 0); - TEST_ACTIVE_CHANGED(s2, 0); - TEST_ACTIVE_CHANGED(s3, 0); - QTRY_VERIFY(machine.configuration().contains(s14)); - QCOMPARE(po->propWriteCount(), 4); - QCOMPARE(po->prop(), 8); - - machine.postEvent(new QEvent(QEvent::User)); - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s11, 2); - TEST_ACTIVE_CHANGED(s12, 2); - TEST_ACTIVE_CHANGED(s13, 2); - TEST_ACTIVE_CHANGED(s14, 2); - TEST_ACTIVE_CHANGED(s15, 1); - TEST_ACTIVE_CHANGED(s16, 0); - TEST_ACTIVE_CHANGED(s2, 0); - TEST_ACTIVE_CHANGED(s3, 0); - QTRY_VERIFY(machine.configuration().contains(s15)); - QCOMPARE(po->propWriteCount(), 5); - QCOMPARE(po->prop(), 4); // restored s1 - - machine.postEvent(new QEvent(QEvent::User)); - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s11, 2); - TEST_ACTIVE_CHANGED(s12, 2); - TEST_ACTIVE_CHANGED(s13, 2); - TEST_ACTIVE_CHANGED(s14, 2); - TEST_ACTIVE_CHANGED(s15, 2); - TEST_ACTIVE_CHANGED(s16, 1); - TEST_ACTIVE_CHANGED(s2, 0); - TEST_ACTIVE_CHANGED(s3, 0); - QTRY_VERIFY(machine.configuration().contains(s16)); - QCOMPARE(po->propWriteCount(), 5); - - machine.postEvent(new QEvent(QEvent::User)); - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s11, 2); - TEST_ACTIVE_CHANGED(s12, 2); - TEST_ACTIVE_CHANGED(s13, 2); - TEST_ACTIVE_CHANGED(s14, 2); - TEST_ACTIVE_CHANGED(s15, 2); - TEST_ACTIVE_CHANGED(s16, 2); - TEST_ACTIVE_CHANGED(s2, 1); - TEST_ACTIVE_CHANGED(s3, 0); - QTRY_VERIFY(machine.configuration().contains(s2)); - QCOMPARE(po->propWriteCount(), 6); - QCOMPARE(po->prop(), 10); - - machine.postEvent(new QEvent(QEvent::User)); - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s11, 2); - TEST_ACTIVE_CHANGED(s12, 2); - TEST_ACTIVE_CHANGED(s13, 2); - TEST_ACTIVE_CHANGED(s14, 2); - TEST_ACTIVE_CHANGED(s15, 2); - TEST_ACTIVE_CHANGED(s16, 2); - TEST_ACTIVE_CHANGED(s2, 2); - TEST_ACTIVE_CHANGED(s3, 1); - QVERIFY(machine.isRunning()); - QTRY_VERIFY(machine.configuration().contains(s3)); - QCOMPARE(po->propWriteCount(), 7); - QCOMPARE(po->prop(), 2); // restored original - - delete po; - -} - -void tst_QStateMachine::restoreProperties3() -{ - QStateMachine machine; - machine.setGlobalRestorePolicy(QState::RestoreProperties); - - PropertyObject *po = new PropertyObject; - po->setProp(2); - QCOMPARE(po->propWriteCount(), 1); - - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - s1->assignProperty(po, "prop", 4); - machine.setInitialState(s1); - - QState *s11 = new QState(s1); - DEFINE_ACTIVE_SPY(s11); - s11->assignProperty(po, "prop", 6); - s1->setInitialState(s11); - - QState *s12 = new QState(s1); - DEFINE_ACTIVE_SPY(s12); - s11->addTransition(new EventTransition(QEvent::User, s12)); - - QState *s13 = new QState(s1); - DEFINE_ACTIVE_SPY(s13); - s13->assignProperty(po, "prop", 8); - s12->addTransition(new EventTransition(QEvent::User, s13)); - - QState *s2 = new QState(&machine); - DEFINE_ACTIVE_SPY(s2); - s13->addTransition(new EventTransition(QEvent::User, s2)); - - machine.start(); - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s11, 1); - TEST_ACTIVE_CHANGED(s12, 0); - TEST_ACTIVE_CHANGED(s13, 0); - TEST_ACTIVE_CHANGED(s2, 0); - - QTRY_VERIFY(machine.configuration().contains(s11)); - QCOMPARE(po->propWriteCount(), 3); - QCOMPARE(po->prop(), 6); // s11 - - machine.postEvent(new QEvent(QEvent::User)); - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s11, 2); - TEST_ACTIVE_CHANGED(s12, 1); - TEST_ACTIVE_CHANGED(s13, 0); - TEST_ACTIVE_CHANGED(s2, 0); - QTRY_VERIFY(machine.configuration().contains(s12)); - QCOMPARE(po->propWriteCount(), 4); - QCOMPARE(po->prop(), 4); // restored s1 - - machine.postEvent(new QEvent(QEvent::User)); - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s11, 2); - TEST_ACTIVE_CHANGED(s12, 2); - TEST_ACTIVE_CHANGED(s13, 1); - TEST_ACTIVE_CHANGED(s2, 0); - QTRY_VERIFY(machine.configuration().contains(s13)); - QCOMPARE(po->propWriteCount(), 5); - QCOMPARE(po->prop(), 8); - - machine.postEvent(new QEvent(QEvent::User)); - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s11, 2); - TEST_ACTIVE_CHANGED(s12, 2); - TEST_ACTIVE_CHANGED(s13, 2); - TEST_ACTIVE_CHANGED(s2, 1); - QVERIFY(machine.isRunning()); - QTRY_VERIFY(machine.configuration().contains(s2)); - QCOMPARE(po->propWriteCount(), 6); - QCOMPARE(po->prop(), 2); // restored original - - delete po; -} - -// QTBUG-20362 -void tst_QStateMachine::restoreProperties4() -{ - QStateMachine machine; - machine.setGlobalRestorePolicy(QState::RestoreProperties); - - PropertyObject *po1 = new PropertyObject; - po1->setProp(2); - QCOMPARE(po1->propWriteCount(), 1); - PropertyObject *po2 = new PropertyObject; - po2->setProp(4); - QCOMPARE(po2->propWriteCount(), 1); - - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - s1->setChildMode(QState::ParallelStates); - machine.setInitialState(s1); - - QState *s11 = new QState(s1); - DEFINE_ACTIVE_SPY(s11); - QState *s111 = new QState(s11); - DEFINE_ACTIVE_SPY(s111); - s111->assignProperty(po1, "prop", 6); - s11->setInitialState(s111); - - QState *s112 = new QState(s11); - DEFINE_ACTIVE_SPY(s112); - s112->assignProperty(po1, "prop", 8); - s111->addTransition(new EventTransition(QEvent::User, s112)); - - QState *s12 = new QState(s1); - DEFINE_ACTIVE_SPY(s12); - QState *s121 = new QState(s12); - DEFINE_ACTIVE_SPY(s121); - s121->assignProperty(po2, "prop", 10); - s12->setInitialState(s121); - - QState *s122 = new QState(s12); - DEFINE_ACTIVE_SPY(s122); - s122->assignProperty(po2, "prop", 12); - s121->addTransition(new EventTransition(static_cast(QEvent::User+1), s122)); - - QState *s2 = new QState(&machine); - s112->addTransition(new EventTransition(QEvent::User, s2)); - DEFINE_ACTIVE_SPY(s2); - - machine.start(); - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s11, 1); - TEST_ACTIVE_CHANGED(s111, 1); - TEST_ACTIVE_CHANGED(s112, 0); - TEST_ACTIVE_CHANGED(s12, 1); - TEST_ACTIVE_CHANGED(s121, 1); - TEST_ACTIVE_CHANGED(s122, 0); - TEST_ACTIVE_CHANGED(s2, 0); - - QTRY_VERIFY(machine.configuration().contains(s1)); - QVERIFY(machine.configuration().contains(s11)); - QVERIFY(machine.configuration().contains(s111)); - QVERIFY(machine.configuration().contains(s12)); - QVERIFY(machine.configuration().contains(s121)); - QCOMPARE(po1->propWriteCount(), 2); - QCOMPARE(po1->prop(), 6); - QCOMPARE(po2->propWriteCount(), 2); - QCOMPARE(po2->prop(), 10); - - machine.postEvent(new QEvent(QEvent::User)); - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s11, 1); - TEST_ACTIVE_CHANGED(s111, 2); - TEST_ACTIVE_CHANGED(s112, 1); - TEST_ACTIVE_CHANGED(s12, 1); - TEST_ACTIVE_CHANGED(s121, 1); - TEST_ACTIVE_CHANGED(s122, 0); - TEST_ACTIVE_CHANGED(s2, 0); - QTRY_VERIFY(machine.configuration().contains(s112)); - QCOMPARE(po1->propWriteCount(), 3); - QCOMPARE(po1->prop(), 8); - QCOMPARE(po2->propWriteCount(), 2); - - machine.postEvent(new QEvent(static_cast(QEvent::User+1))); - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s11, 1); - TEST_ACTIVE_CHANGED(s111, 2); - TEST_ACTIVE_CHANGED(s112, 1); - TEST_ACTIVE_CHANGED(s12, 1); - TEST_ACTIVE_CHANGED(s121, 2); - TEST_ACTIVE_CHANGED(s122, 1); - TEST_ACTIVE_CHANGED(s2, 0); - QTRY_VERIFY(machine.configuration().contains(s122)); - QCOMPARE(po1->propWriteCount(), 3); - QCOMPARE(po2->propWriteCount(), 3); - QCOMPARE(po2->prop(), 12); - - machine.postEvent(new QEvent(QEvent::User)); - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s11, 2); - TEST_ACTIVE_CHANGED(s111, 2); - TEST_ACTIVE_CHANGED(s112, 2); - TEST_ACTIVE_CHANGED(s12, 2); - TEST_ACTIVE_CHANGED(s121, 2); - TEST_ACTIVE_CHANGED(s122, 2); - TEST_ACTIVE_CHANGED(s2, 1); - QTRY_VERIFY(machine.configuration().contains(s2)); - QCOMPARE(po1->propWriteCount(), 4); - QCOMPARE(po1->prop(), 2); // restored original - QCOMPARE(po2->propWriteCount(), 4); - QCOMPARE(po2->prop(), 4); // restored original - - delete po1; - delete po2; -} - -void tst_QStateMachine::restorePropertiesSelfTransition() -{ - QStateMachine machine; - machine.setGlobalRestorePolicy(QState::RestoreProperties); - - PropertyObject *po = new PropertyObject; - po->setProp(2); - QCOMPARE(po->propWriteCount(), 1); - - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - s1->assignProperty(po, "prop", 4); - s1->addTransition(new EventTransition(QEvent::User, s1)); - machine.setInitialState(s1); - - QState *s2 = new QState(&machine); - DEFINE_ACTIVE_SPY(s2); - s1->addTransition(new EventTransition(static_cast(QEvent::User+1), s2)); - - machine.start(); - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s2, 0); - QTRY_VERIFY(machine.configuration().contains(s1)); - QCOMPARE(po->propWriteCount(), 2); - QCOMPARE(po->prop(), 4); - - machine.postEvent(new QEvent(QEvent::User)); - TEST_ACTIVE_CHANGED(s1, 3); - TEST_ACTIVE_CHANGED(s2, 0); - QTRY_COMPARE(po->propWriteCount(), 3); - QCOMPARE(po->prop(), 4); - - machine.postEvent(new QEvent(QEvent::User)); - TEST_ACTIVE_CHANGED(s1, 5); - TEST_ACTIVE_CHANGED(s2, 0); - QTRY_COMPARE(po->propWriteCount(), 4); - QCOMPARE(po->prop(), 4); - - machine.postEvent(new QEvent(static_cast(QEvent::User+1))); - TEST_ACTIVE_CHANGED(s1, 6); - TEST_ACTIVE_CHANGED(s2, 1); - QTRY_VERIFY(machine.configuration().contains(s2)); - QCOMPARE(po->propWriteCount(), 5); - QCOMPARE(po->prop(), 2); // restored - - delete po; -} - -void tst_QStateMachine::changeStateWhileAnimatingProperty() -{ - QStateMachine machine; - machine.setGlobalRestorePolicy(QState::RestoreProperties); - - QObject *o1 = new QObject; - o1->setProperty("x", 10.); - QObject *o2 = new QObject; - o2->setProperty("y", 20.); - - QState *group = new QState(&machine); - DEFINE_ACTIVE_SPY(group); - machine.setInitialState(group); - - QState *s0 = new QState(group); - DEFINE_ACTIVE_SPY(s0); - group->setInitialState(s0); - - QState *s1 = new QState(group); - DEFINE_ACTIVE_SPY(s1); - s1->assignProperty(o1, "x", 15.); - QPropertyAnimation *a1 = new QPropertyAnimation(o1, "x", s1); - a1->setDuration(800); - machine.addDefaultAnimation(a1); - group->addTransition(new EventTransition(QEvent::User, s1)); - - QState *s2 = new QState(group); - DEFINE_ACTIVE_SPY(s2); - s2->assignProperty(o2, "y", 25.); - QPropertyAnimation *a2 = new QPropertyAnimation(o2, "y", s2); - a2->setDuration(800); - machine.addDefaultAnimation(a2); - group->addTransition(new EventTransition(static_cast(QEvent::User+1), s2)); - - machine.start(); - TEST_ACTIVE_CHANGED(group, 1); - TEST_ACTIVE_CHANGED(s0, 1); - TEST_ACTIVE_CHANGED(s1, 0); - TEST_ACTIVE_CHANGED(s2, 0); - QTRY_VERIFY(machine.configuration().contains(s0)); - - machine.postEvent(new QEvent(QEvent::User)); - TEST_ACTIVE_CHANGED(group, 3); - TEST_ACTIVE_CHANGED(s0, 2); - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s2, 0); - QTRY_VERIFY(machine.configuration().contains(s1)); - QCOREAPPLICATION_EXEC(400); - machine.postEvent(new QEvent(static_cast(QEvent::User+1))); - TEST_ACTIVE_CHANGED(group, 5); - TEST_ACTIVE_CHANGED(s0, 2); - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 1); - QTRY_VERIFY(machine.configuration().contains(s2)); - QCOREAPPLICATION_EXEC(300); - machine.postEvent(new QEvent(QEvent::User)); - TEST_ACTIVE_CHANGED(group, 7); - TEST_ACTIVE_CHANGED(s0, 2); - TEST_ACTIVE_CHANGED(s1, 3); - TEST_ACTIVE_CHANGED(s2, 2); - QTRY_VERIFY(machine.configuration().contains(s1)); - QCOREAPPLICATION_EXEC(200); - machine.postEvent(new QEvent(static_cast(QEvent::User+1))); - TEST_ACTIVE_CHANGED(group, 9); - TEST_ACTIVE_CHANGED(s0, 2); - TEST_ACTIVE_CHANGED(s1, 4); - TEST_ACTIVE_CHANGED(s2, 3); - QTRY_VERIFY(machine.configuration().contains(s2)); - QCOREAPPLICATION_EXEC(100); - machine.postEvent(new QEvent(QEvent::User)); - TEST_ACTIVE_CHANGED(group, 11); - TEST_ACTIVE_CHANGED(s0, 2); - TEST_ACTIVE_CHANGED(s1, 5); - TEST_ACTIVE_CHANGED(s2, 4); - QTRY_VERIFY(machine.configuration().contains(s1)); - QTRY_COMPARE(o1->property("x").toDouble(), 15.); - QTRY_COMPARE(o2->property("y").toDouble(), 20.); - - delete o1; - delete o2; -} - -class AssignPropertyTestState : public QState -{ - Q_OBJECT -public: - AssignPropertyTestState(QState *parent = 0) - : QState(parent), onEntryPassed(false), enteredPassed(false) - { QObject::connect(this, SIGNAL(entered()), this, SLOT(onEntered())); } - - virtual void onEntry(QEvent *) - { onEntryPassed = property("wasAssigned").toBool(); } - - bool onEntryPassed; - bool enteredPassed; - -private Q_SLOTS: - void onEntered() - { enteredPassed = property("wasAssigned").toBool(); } -}; - -void tst_QStateMachine::propertiesAreAssignedBeforeEntryCallbacks_data() -{ - QTest::addColumn("restorePolicy"); - QTest::newRow("DontRestoreProperties") << int(QState::DontRestoreProperties); - QTest::newRow("RestoreProperties") << int(QState::RestoreProperties); -} - -void tst_QStateMachine::propertiesAreAssignedBeforeEntryCallbacks() -{ - QFETCH(int, restorePolicy); - - QStateMachine machine; - machine.setGlobalRestorePolicy(static_cast(restorePolicy)); - - AssignPropertyTestState *s1 = new AssignPropertyTestState(&machine); - DEFINE_ACTIVE_SPY(s1); - s1->assignProperty(s1, "wasAssigned", true); - machine.setInitialState(s1); - - AssignPropertyTestState *s2 = new AssignPropertyTestState(&machine); - DEFINE_ACTIVE_SPY(s2); - s2->assignProperty(s2, "wasAssigned", true); - s1->addTransition(new EventTransition(QEvent::User, s2)); - - QVERIFY(!s1->property("wasAssigned").toBool()); - machine.start(); - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s2, 0); - QTRY_VERIFY(machine.configuration().contains(s1)); - - QVERIFY(s1->onEntryPassed); - QVERIFY(s1->enteredPassed); - - QVERIFY(!s2->property("wasAssigned").toBool()); - machine.postEvent(new QEvent(QEvent::User)); - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 1); - QTRY_VERIFY(machine.configuration().contains(s2)); - - QVERIFY(s2->onEntryPassed); - QVERIFY(s2->enteredPassed); -} - -// QTBUG-25958 -void tst_QStateMachine::multiTargetTransitionInsideParallelStateGroup() -{ - // TODO QTBUG-25958 was reopened, see https://codereview.qt-project.org/89775 - return; - - QStateMachine machine; - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - machine.setInitialState(s1); - - QState *s2 = new QState(QState::ParallelStates, &machine); - DEFINE_ACTIVE_SPY(s2); - - QState *s21 = new QState(s2); - DEFINE_ACTIVE_SPY(s21); - QState *s211 = new QState(s21); - DEFINE_ACTIVE_SPY(s211); - QState *s212 = new QState(s21); - DEFINE_ACTIVE_SPY(s212); - s21->setInitialState(s212); - - QState *s22 = new QState(s2); - DEFINE_ACTIVE_SPY(s22); - QState *s221 = new QState(s22); - DEFINE_ACTIVE_SPY(s221); - QState *s222 = new QState(s22); - DEFINE_ACTIVE_SPY(s222); - s22->setInitialState(s222); - - QAbstractTransition *t1 = new EventTransition(QEvent::User, QList() << s211 << s221); - s1->addTransition(t1); - - machine.start(); - QTRY_VERIFY(machine.configuration().contains(s1)); - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s2, 0); - TEST_ACTIVE_CHANGED(s21, 0); - TEST_ACTIVE_CHANGED(s211, 0); - TEST_ACTIVE_CHANGED(s212, 0); - TEST_ACTIVE_CHANGED(s22, 0); - TEST_ACTIVE_CHANGED(s221, 0); - TEST_ACTIVE_CHANGED(s222, 0); - machine.postEvent(new QEvent(QEvent::User)); - QTRY_VERIFY(machine.configuration().contains(s2)); - QCOMPARE(machine.configuration().size(), 5); - QVERIFY(machine.configuration().contains(s21)); - QVERIFY(machine.configuration().contains(s211)); - QVERIFY(machine.configuration().contains(s22)); - QVERIFY(machine.configuration().contains(s221)); - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 1); - TEST_ACTIVE_CHANGED(s21, 1); - TEST_ACTIVE_CHANGED(s211, 1); - TEST_ACTIVE_CHANGED(s212, 0); - TEST_ACTIVE_CHANGED(s22, 1); - TEST_ACTIVE_CHANGED(s221, 1); - TEST_ACTIVE_CHANGED(s222, 0); -} - -void tst_QStateMachine::signalTransitionNormalizeSignature() -{ - QStateMachine machine; - QState *s0 = new QState(&machine); - DEFINE_ACTIVE_SPY(s0); - machine.setInitialState(s0); - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - SignalEmitter emitter; - TestSignalTransition *t0 = new TestSignalTransition(&emitter, SIGNAL(signalWithNoArg()), s1); - s0->addTransition(t0); - - machine.start(); - TEST_ACTIVE_CHANGED(s0, 1); - TEST_ACTIVE_CHANGED(s1, 0); - QTRY_VERIFY(machine.configuration().contains(s0)); - emitter.emitSignalWithNoArg(); - QTRY_VERIFY(machine.configuration().contains(s1)); - - QCOMPARE(t0->eventTestSenderReceived(), (QObject*)&emitter); - QCOMPARE(t0->eventTestSignalIndexReceived(), emitter.metaObject()->indexOfSignal("signalWithNoArg()")); - QCOMPARE(t0->eventTestArgumentsReceived().size(), 0); - QCOMPARE(t0->transitionSenderReceived(), (QObject*)&emitter); - QCOMPARE(t0->transitionSignalIndexReceived(), emitter.metaObject()->indexOfSignal("signalWithNoArg()")); - QCOMPARE(t0->transitionArgumentsReceived().size(), 0); - TEST_ACTIVE_CHANGED(s0, 2); - TEST_ACTIVE_CHANGED(s1, 1); -} - -#ifdef Q_COMPILER_DELEGATING_CONSTRUCTORS -void tst_QStateMachine::createPointerToMemberSignalTransition() -{ - QStateMachine machine; - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - machine.setInitialState(s1); - machine.start(); - TEST_ACTIVE_CHANGED(s1, 1); - QTRY_VERIFY(machine.configuration().contains(s1)); - - QState *s2 = new QState(&machine); - DEFINE_ACTIVE_SPY(s2); - SignalEmitter emitter; - QSignalTransition *t1 = new QSignalTransition(&emitter, &SignalEmitter::signalWithNoArg, s1); - QCOMPARE(t1->sourceState(), s1); - t1->setTargetState(s2); - s1->addTransition(t1); - emitter.emitSignalWithNoArg(); - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 1); - QTRY_VERIFY(machine.configuration().contains(s2)); -} -#endif - -void tst_QStateMachine::createSignalTransitionWhenRunning() -{ - QStateMachine machine; - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - machine.setInitialState(s1); - machine.start(); - TEST_ACTIVE_CHANGED(s1, 1); - QTRY_VERIFY(machine.configuration().contains(s1)); - // Create by addTransition() - QState *s2 = new QState(&machine); - DEFINE_ACTIVE_SPY(s2); - SignalEmitter emitter; - QAbstractTransition *t1 = s1->addTransition(&emitter, SIGNAL(signalWithNoArg()), s2); - QCOMPARE(t1->sourceState(), s1); - emitter.emitSignalWithNoArg(); - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 1); - QTRY_VERIFY(machine.configuration().contains(s2)); - - // Create by constructor that takes sender, signal, source (parent) state - QState *s3 = new QState(&machine); - DEFINE_ACTIVE_SPY(s3); - QSignalTransition *t2 = new QSignalTransition(&emitter, SIGNAL(signalWithNoArg()), s2); - QCOMPARE(t2->sourceState(), s2); - t2->setTargetState(s3); - emitter.emitSignalWithNoArg(); - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 2); - TEST_ACTIVE_CHANGED(s3, 1); - QTRY_VERIFY(machine.configuration().contains(s3)); - - // Create by constructor that takes source (parent) state - QState *s4 = new QState(&machine); - DEFINE_ACTIVE_SPY(s4); - QSignalTransition *t3 = new QSignalTransition(s3); - QCOMPARE(t3->sourceState(), s3); - t3->setSenderObject(&emitter); - t3->setSignal(SIGNAL(signalWithNoArg())); - t3->setTargetState(s4); - emitter.emitSignalWithNoArg(); - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 2); - TEST_ACTIVE_CHANGED(s3, 2); - TEST_ACTIVE_CHANGED(s4, 1); - QTRY_VERIFY(machine.configuration().contains(s4)); - - // Create by constructor without parent, then set the parent - QState *s5 = new QState(&machine); - DEFINE_ACTIVE_SPY(s5); - QSignalTransition *t4 = new QSignalTransition(); - t4->setSenderObject(&emitter); - t4->setParent(s4); - QCOMPARE(t4->sourceState(), s4); - t4->setSignal(SIGNAL(signalWithNoArg())); - t4->setTargetState(s5); - emitter.emitSignalWithNoArg(); - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 2); - TEST_ACTIVE_CHANGED(s3, 2); - TEST_ACTIVE_CHANGED(s4, 2); - TEST_ACTIVE_CHANGED(s5, 1); - QTRY_VERIFY(machine.configuration().contains(s5)); -} - -void tst_QStateMachine::createEventTransitionWhenRunning() -{ - QStateMachine machine; - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - machine.setInitialState(s1); - machine.start(); - TEST_ACTIVE_CHANGED(s1, 1); - QTRY_VERIFY(machine.configuration().contains(s1)); - - // Create by constructor that takes event source, type, source (parent) state - QState *s2 = new QState(&machine); - DEFINE_ACTIVE_SPY(s2); - QObject object; - QEventTransition *t1 = new QEventTransition(&object, QEvent::Timer, s1); - QCOMPARE(t1->sourceState(), s1); - t1->setTargetState(s2); - - object.startTimer(10); // Will cause QEvent::Timer to fire every 10ms - QTRY_VERIFY(machine.configuration().contains(s2)); - - // Create by constructor that takes source (parent) state - QState *s3 = new QState(&machine); - DEFINE_ACTIVE_SPY(s3); - QEventTransition *t2 = new QEventTransition(s2); - QCOMPARE(t2->sourceState(), s2); - t2->setEventSource(&object); - t2->setEventType(QEvent::Timer); - t2->setTargetState(s3); - QTRY_VERIFY(machine.configuration().contains(s3)); - - // Create by constructor without parent, then set the parent - QState *s4 = new QState(&machine); - DEFINE_ACTIVE_SPY(s4); - QEventTransition *t3 = new QEventTransition(); - t3->setEventSource(&object); - t3->setParent(s3); - QCOMPARE(t3->sourceState(), s3); - t3->setEventType(QEvent::Timer); - t3->setTargetState(s4); - QTRY_VERIFY(machine.configuration().contains(s4)); - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 2); - TEST_ACTIVE_CHANGED(s3, 2); - TEST_ACTIVE_CHANGED(s4, 1); -} - -class SignalEmitterThread : public QThread -{ - Q_OBJECT -public: - SignalEmitterThread(QObject *parent = 0) - : QThread(parent) - { - moveToThread(this); - } - -Q_SIGNALS: - void signal1(); - void signal2(); - -public Q_SLOTS: - void emitSignals() - { - emit signal1(); - emit signal2(); - } -}; - -// QTBUG-19789 -void tst_QStateMachine::signalTransitionSenderInDifferentThread() -{ - QStateMachine machine; - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - machine.setInitialState(s1); - - SignalEmitterThread thread; - QState *s2 = new QState(&machine); - DEFINE_ACTIVE_SPY(s2); - s1->addTransition(&thread, SIGNAL(signal1()), s2); - - QFinalState *s3 = new QFinalState(&machine); - s2->addTransition(&thread, SIGNAL(signal2()), s3); - - thread.start(); - QTRY_VERIFY(thread.isRunning()); - - machine.start(); - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s2, 0); - QTRY_VERIFY(machine.configuration().contains(s1)); - - QMetaObject::invokeMethod(&thread, "emitSignals"); - // thread emits both signal1() and signal2(), so we should end in s3 - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 2); - QTRY_VERIFY(!machine.isRunning()); - QTRY_VERIFY(machine.configuration().contains(s3)); - - // Run the machine again; transitions should still be registered - machine.start(); - TEST_ACTIVE_CHANGED(s1, 3); - TEST_ACTIVE_CHANGED(s2, 2); - QTRY_VERIFY(machine.configuration().contains(s1)); - QMetaObject::invokeMethod(&thread, "emitSignals"); - QTRY_VERIFY(machine.configuration().contains(s3)); - - thread.quit(); - QTRY_VERIFY(thread.wait()); - TEST_ACTIVE_CHANGED(s1, 4); - TEST_ACTIVE_CHANGED(s2, 4); - QVERIFY(!machine.isRunning()); -} - -void tst_QStateMachine::signalTransitionSenderInDifferentThread2() -{ - QStateMachine machine; - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - machine.setInitialState(s1); - - QState *s2 = new QState(&machine); - DEFINE_ACTIVE_SPY(s2); - SignalEmitter emitter; - // At the time of the transition creation, the machine and the emitter - // are both in the same thread. - s1->addTransition(&emitter, SIGNAL(signalWithNoArg()), s2); - - QFinalState *s3 = new QFinalState(&machine); - s2->addTransition(&emitter, SIGNAL(signalWithDefaultArg()), s3); - - QThread thread; - // Move the machine and its states to a secondary thread, but let the - // SignalEmitter stay in the main thread. - machine.moveToThread(&thread); - - thread.start(); - QTRY_VERIFY(thread.isRunning()); - - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(runningSpy.isValid()); - QSignalSpy startedSpy(&machine, &QStateMachine::started); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - machine.start(); - QTRY_COMPARE(startedSpy.count(), 1); - TEST_RUNNING_CHANGED(true); - - emitter.emitSignalWithNoArg(); - // The second emission should not get "lost". - emitter.emitSignalWithDefaultArg(); - QTRY_COMPARE(finishedSpy.count(), 1); - TEST_RUNNING_CHANGED(false); - - thread.quit(); - QTRY_VERIFY(thread.wait()); - TEST_ACTIVE_CHANGED(s1, 2); - TEST_ACTIVE_CHANGED(s2, 2); -} - -class SignalTransitionMutatorThread : public QThread -{ -public: - SignalTransitionMutatorThread(QSignalTransition *transition) - : m_transition(transition) - {} - void run() - { - // Cause repeated registration and unregistration - for (int i = 0; i < 50000; ++i) { - m_transition->setSenderObject(this); - m_transition->setSenderObject(0); - } - } -private: - QSignalTransition *m_transition; -}; - -// Should not crash: -void tst_QStateMachine::signalTransitionRegistrationThreadSafety() -{ - QStateMachine machine; - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - machine.setInitialState(s1); - machine.start(); - QTRY_VERIFY(machine.configuration().contains(s1)); - - QSignalTransition *t1 = new QSignalTransition(); - t1->setSignal(SIGNAL(objectNameChanged(QString))); - s1->addTransition(t1); - - QSignalTransition *t2 = new QSignalTransition(); - t2->setSignal(SIGNAL(objectNameChanged(QString))); - s1->addTransition(t2); - - SignalTransitionMutatorThread thread(t1); - thread.start(); - QTRY_VERIFY(thread.isRunning()); - - // Cause repeated registration and unregistration - for (int i = 0; i < 50000; ++i) { - t2->setSenderObject(this); - t2->setSenderObject(0); - } - - thread.quit(); - QTRY_VERIFY(thread.wait()); - TEST_ACTIVE_CHANGED(s1, 1); - QVERIFY(machine.isRunning()); -} - -void tst_QStateMachine::childModeConstructor() -{ - { - QStateMachine machine(QState::ExclusiveStates); - QCOMPARE(machine.childMode(), QState::ExclusiveStates); - QVERIFY(!machine.parent()); - QVERIFY(!machine.parentState()); - } - { - QStateMachine machine(QState::ParallelStates); - QCOMPARE(machine.childMode(), QState::ParallelStates); - QVERIFY(!machine.parent()); - QVERIFY(!machine.parentState()); - } - { - QStateMachine machine(QState::ExclusiveStates, this); - QCOMPARE(machine.childMode(), QState::ExclusiveStates); - QCOMPARE(machine.parent(), static_cast(this)); - QVERIFY(!machine.parentState()); - } - { - QStateMachine machine(QState::ParallelStates, this); - QCOMPARE(machine.childMode(), QState::ParallelStates); - QCOMPARE(machine.parent(), static_cast(this)); - QVERIFY(!machine.parentState()); - } - QState state; - { - QStateMachine machine(QState::ExclusiveStates, &state); - QCOMPARE(machine.childMode(), QState::ExclusiveStates); - QCOMPARE(machine.parent(), static_cast(&state)); - QCOMPARE(machine.parentState(), &state); - } - { - QStateMachine machine(QState::ParallelStates, &state); - QCOMPARE(machine.childMode(), QState::ParallelStates); - QCOMPARE(machine.parent(), static_cast(&state)); - QCOMPARE(machine.parentState(), &state); - } -} - -void tst_QStateMachine::qtbug_44963() -{ - SignalEmitter emitter; - - QStateMachine machine; - QState a(QState::ParallelStates, &machine); - QHistoryState ha(QHistoryState::DeepHistory, &a); - QState b(QState::ParallelStates, &a); - QState c(QState::ParallelStates, &b); - QState d(QState::ParallelStates, &c); - QState e(QState::ParallelStates, &d); - QState i(&e); - QState i1(&i); - QState i2(&i); - QState j(&e); - QState h(&d); - QState g(&c); - QState k(&a); - QState l(&machine); - - machine.setInitialState(&a); - ha.setDefaultState(&b); - i.setInitialState(&i1); - i1.addTransition(&emitter, SIGNAL(signalWithIntArg(int)), &i2)->setObjectName("i1->i2"); - i2.addTransition(&emitter, SIGNAL(signalWithDefaultArg(int)), &l)->setObjectName("i2->l"); - l.addTransition(&emitter, SIGNAL(signalWithNoArg()), &ha)->setObjectName("l->ha"); - - a.setObjectName("a"); - ha.setObjectName("ha"); - b.setObjectName("b"); - c.setObjectName("c"); - d.setObjectName("d"); - e.setObjectName("e"); - i.setObjectName("i"); - i1.setObjectName("i1"); - i2.setObjectName("i2"); - j.setObjectName("j"); - h.setObjectName("h"); - g.setObjectName("g"); - k.setObjectName("k"); - l.setObjectName("l"); - - machine.start(); - - QTRY_COMPARE(machine.configuration().contains(&i1), true); - QTRY_COMPARE(machine.configuration().contains(&i2), false); - QTRY_COMPARE(machine.configuration().contains(&j), true); - QTRY_COMPARE(machine.configuration().contains(&h), true); - QTRY_COMPARE(machine.configuration().contains(&g), true); - QTRY_COMPARE(machine.configuration().contains(&k), true); - QTRY_COMPARE(machine.configuration().contains(&l), false); - - emitter.emitSignalWithIntArg(0); - - QTRY_COMPARE(machine.configuration().contains(&i1), false); - QTRY_COMPARE(machine.configuration().contains(&i2), true); - QTRY_COMPARE(machine.configuration().contains(&j), true); - QTRY_COMPARE(machine.configuration().contains(&h), true); - QTRY_COMPARE(machine.configuration().contains(&g), true); - QTRY_COMPARE(machine.configuration().contains(&k), true); - QTRY_COMPARE(machine.configuration().contains(&l), false); - - emitter.emitSignalWithDefaultArg(); - - QTRY_COMPARE(machine.configuration().contains(&i1), false); - QTRY_COMPARE(machine.configuration().contains(&i2), false); - QTRY_COMPARE(machine.configuration().contains(&j), false); - QTRY_COMPARE(machine.configuration().contains(&h), false); - QTRY_COMPARE(machine.configuration().contains(&g), false); - QTRY_COMPARE(machine.configuration().contains(&k), false); - QTRY_COMPARE(machine.configuration().contains(&l), true); - - emitter.emitSignalWithNoArg(); - - QTRY_COMPARE(machine.configuration().contains(&i1), false); - QTRY_COMPARE(machine.configuration().contains(&i2), true); - QTRY_COMPARE(machine.configuration().contains(&j), true); - QTRY_COMPARE(machine.configuration().contains(&h), true); - QTRY_COMPARE(machine.configuration().contains(&g), true); - QTRY_COMPARE(machine.configuration().contains(&k), true); - QTRY_COMPARE(machine.configuration().contains(&l), false); - - QVERIFY(machine.isRunning()); -} - -void tst_QStateMachine::qtbug_44783() -{ - SignalEmitter emitter; - - QStateMachine machine; - QState s(&machine); - QState p(QState::ParallelStates, &s); - QState p1(&p); - QState p1_1(&p1); - QState p1_2(&p1); - QState p2(&p); - QState s1(&machine); - - machine.setInitialState(&s); - s.setInitialState(&p); - p1.setInitialState(&p1_1); - p1_1.addTransition(&emitter, SIGNAL(signalWithNoArg()), &p1_2)->setObjectName("p1_1->p1_2"); - p2.addTransition(&emitter, SIGNAL(signalWithNoArg()), &s1)->setObjectName("p2->s1"); - - s.setObjectName("s"); - p.setObjectName("p"); - p1.setObjectName("p1"); - p1_1.setObjectName("p1_1"); - p1_2.setObjectName("p1_2"); - p2.setObjectName("p2"); - s1.setObjectName("s1"); - - machine.start(); - - QTRY_COMPARE(machine.configuration().contains(&s), true); - QTRY_COMPARE(machine.configuration().contains(&p), true); - QTRY_COMPARE(machine.configuration().contains(&p1), true); - QTRY_COMPARE(machine.configuration().contains(&p1_1), true); - QTRY_COMPARE(machine.configuration().contains(&p1_2), false); - QTRY_COMPARE(machine.configuration().contains(&p2), true); - QTRY_COMPARE(machine.configuration().contains(&s1), false); - - emitter.emitSignalWithNoArg(); - - // Only one of the following two can be true, because the two possible transitions conflict. - if (machine.configuration().contains(&s1)) { - // the transition p2 -> s1 was taken, not p1_1 -> p1_2, so: - // the parallel state exited, so none of the states inside it are active - QTRY_COMPARE(machine.configuration().contains(&s), false); - QTRY_COMPARE(machine.configuration().contains(&p), false); - QTRY_COMPARE(machine.configuration().contains(&p1), false); - QTRY_COMPARE(machine.configuration().contains(&p1_1), false); - QTRY_COMPARE(machine.configuration().contains(&p1_2), false); - QTRY_COMPARE(machine.configuration().contains(&p2), false); - } else { - // the transition p1_1 -> p1_2 was taken, not p2 -> s1, so: - // the parallel state was not exited and the state is the same as the start state with one - // difference: p1_1 inactive and p1_2 active: - QTRY_COMPARE(machine.configuration().contains(&s), true); - QTRY_COMPARE(machine.configuration().contains(&p), true); - QTRY_COMPARE(machine.configuration().contains(&p1), true); - QTRY_COMPARE(machine.configuration().contains(&p1_1), false); - QTRY_COMPARE(machine.configuration().contains(&p1_2), true); - QTRY_COMPARE(machine.configuration().contains(&p2), true); - } - - QVERIFY(machine.isRunning()); -} - -void tst_QStateMachine::internalTransition() -{ - SignalEmitter emitter; - - QStateMachine machine; - QState *s = new QState(&machine); - QState *s1 = new QState(s); - QState *s11 = new QState(s1); - - DEFINE_ACTIVE_SPY(s); - DEFINE_ACTIVE_SPY(s1); - DEFINE_ACTIVE_SPY(s11); - - machine.setInitialState(s); - s->setInitialState(s1); - s1->setInitialState(s11); - QSignalTransition *t = s1->addTransition(&emitter, SIGNAL(signalWithNoArg()), s11); - t->setObjectName("s1->s11"); - t->setTransitionType(QAbstractTransition::InternalTransition); - - s->setObjectName("s"); - s1->setObjectName("s1"); - s11->setObjectName("s11"); - - machine.start(); - - QTRY_COMPARE(machine.configuration().contains(s), true); - QTRY_COMPARE(machine.configuration().contains(s1), true); - QTRY_COMPARE(machine.configuration().contains(s11), true); - TEST_ACTIVE_CHANGED(s, 1); - TEST_ACTIVE_CHANGED(s1, 1); - TEST_ACTIVE_CHANGED(s11, 1); - - emitter.emitSignalWithNoArg(); - - QTRY_COMPARE(machine.configuration().contains(s), true); - QTRY_COMPARE(machine.configuration().contains(s1), true); - QTRY_COMPARE(machine.configuration().contains(s11), true); - TEST_ACTIVE_CHANGED(s11, 3); - TEST_ACTIVE_CHANGED(s1, 1); // external transitions will return 3, internal transitions should return 1. - TEST_ACTIVE_CHANGED(s, 1); -} - -void tst_QStateMachine::conflictingTransition() -{ - SignalEmitter emitter; - - QStateMachine machine; - QState b(QState::ParallelStates, &machine); - QState c(&b); - QState d(QState::ParallelStates, &b); - QState e(&d); - QState e1(&e); - QState e2(&e); - QState f(&d); - QState f1(&f); - QState f2(&f); - QState a1(&machine); - - machine.setInitialState(&b); - e.setInitialState(&e1); - f.setInitialState(&f1); - c.addTransition(&emitter, SIGNAL(signalWithNoArg()), &a1)->setObjectName("c->a1"); - e1.addTransition(&emitter, SIGNAL(signalWithNoArg()), &e2)->setObjectName("e1->e2"); - f1.addTransition(&emitter, SIGNAL(signalWithNoArg()), &f2)->setObjectName("f1->f2"); - - b.setObjectName("b"); - c.setObjectName("c"); - d.setObjectName("d"); - e.setObjectName("e"); - e1.setObjectName("e1"); - e2.setObjectName("e2"); - f.setObjectName("f"); - f1.setObjectName("f1"); - f2.setObjectName("f2"); - a1.setObjectName("a1"); - - machine.start(); - - QTRY_COMPARE(machine.configuration().contains(&b), true); - QTRY_COMPARE(machine.configuration().contains(&c), true); - QTRY_COMPARE(machine.configuration().contains(&d), true); - QTRY_COMPARE(machine.configuration().contains(&e), true); - QTRY_COMPARE(machine.configuration().contains(&e1), true); - QTRY_COMPARE(machine.configuration().contains(&e2), false); - QTRY_COMPARE(machine.configuration().contains(&f), true); - QTRY_COMPARE(machine.configuration().contains(&f1), true); - QTRY_COMPARE(machine.configuration().contains(&f2), false); - QTRY_COMPARE(machine.configuration().contains(&a1), false); - - emitter.emitSignalWithNoArg(); - - QTRY_COMPARE(machine.configuration().contains(&b), true); - QTRY_COMPARE(machine.configuration().contains(&c), true); - QTRY_COMPARE(machine.configuration().contains(&d), true); - QTRY_COMPARE(machine.configuration().contains(&e), true); - QTRY_COMPARE(machine.configuration().contains(&e1), false); - QTRY_COMPARE(machine.configuration().contains(&e2), true); - QTRY_COMPARE(machine.configuration().contains(&f), true); - QTRY_COMPARE(machine.configuration().contains(&f1), false); - QTRY_COMPARE(machine.configuration().contains(&f2), true); - QTRY_COMPARE(machine.configuration().contains(&a1), false); - - QVERIFY(machine.isRunning()); -} - -void tst_QStateMachine::conflictingTransition2() -{ - SignalEmitter emitter; - - QStateMachine machine; - QState s0(&machine); - QState p0(QState::ParallelStates, &s0); - QState p0s1(&p0); - QState p0s2(&p0); - QState p0s3(&p0); - QState s1(&machine); - - machine.setInitialState(&s0); - s0.setInitialState(&p0); - - QSignalTransition *t1 = new QSignalTransition(&emitter, SIGNAL(signalWithNoArg())); - p0s1.addTransition(t1); - QSignalTransition *t2 = p0s2.addTransition(&emitter, SIGNAL(signalWithNoArg()), &p0s1); - QSignalTransition *t3 = p0s3.addTransition(&emitter, SIGNAL(signalWithNoArg()), &s1); - QSignalSpy t1Spy(t1, &QAbstractTransition::triggered); - QSignalSpy t2Spy(t2, &QAbstractTransition::triggered); - QSignalSpy t3Spy(t3, &QAbstractTransition::triggered); - QVERIFY(t1Spy.isValid()); - QVERIFY(t2Spy.isValid()); - QVERIFY(t3Spy.isValid()); - - s0.setObjectName("s0"); - p0.setObjectName("p0"); - p0s1.setObjectName("p0s1"); - p0s2.setObjectName("p0s2"); - p0s3.setObjectName("p0s3"); - s1.setObjectName("s1"); - t1->setObjectName("p0s1->p0s1"); - t2->setObjectName("p0s2->p0s1"); - t3->setObjectName("p0s3->s1"); - - machine.start(); - - QTRY_COMPARE(machine.configuration().contains(&s0), true); - QTRY_COMPARE(machine.configuration().contains(&p0), true); - QTRY_COMPARE(machine.configuration().contains(&p0s1), true); - QTRY_COMPARE(machine.configuration().contains(&p0s2), true); - QTRY_COMPARE(machine.configuration().contains(&p0s3), true); - QTRY_COMPARE(machine.configuration().contains(&s1), false); - - QCOMPARE(t1Spy.count(), 0); - QCOMPARE(t2Spy.count(), 0); - QCOMPARE(t3Spy.count(), 0); - - emitter.emitSignalWithNoArg(); - - QTRY_COMPARE(machine.configuration().contains(&s0), true); - QTRY_COMPARE(machine.configuration().contains(&p0), true); - QTRY_COMPARE(machine.configuration().contains(&p0s1), true); - QTRY_COMPARE(machine.configuration().contains(&p0s2), true); - QTRY_COMPARE(machine.configuration().contains(&p0s3), true); - QTRY_COMPARE(machine.configuration().contains(&s1), false); - - QCOMPARE(t1Spy.count(), 1); - QCOMPARE(t2Spy.count(), 1); - QCOMPARE(t3Spy.count(), 0); // t3 got preempted by t2 - - QVERIFY(machine.isRunning()); -} - -void tst_QStateMachine::qtbug_46059() -{ - QStateMachine machine; - QState a(&machine); - QState b(&a); - QState c(&a); - QState success(&a); - QState failure(&machine); - - machine.setInitialState(&a); - a.setInitialState(&b); - b.addTransition(new EventTransition(QEvent::Type(QEvent::User + 1), &c)); - c.addTransition(new EventTransition(QEvent::Type(QEvent::User + 2), &success)); - b.addTransition(new EventTransition(QEvent::Type(QEvent::User + 2), &failure)); - - machine.start(); - QCoreApplication::processEvents(); - - QTRY_COMPARE(machine.configuration().contains(&a), true); - QTRY_COMPARE(machine.configuration().contains(&b), true); - QTRY_COMPARE(machine.configuration().contains(&c), false); - QTRY_COMPARE(machine.configuration().contains(&failure), false); - QTRY_COMPARE(machine.configuration().contains(&success), false); - - machine.postEvent(new QEvent(QEvent::Type(QEvent::User + 0)), QStateMachine::HighPriority); - machine.postEvent(new QEvent(QEvent::Type(QEvent::User + 1)), QStateMachine::HighPriority); - machine.postEvent(new QEvent(QEvent::Type(QEvent::User + 2)), QStateMachine::NormalPriority); - QCoreApplication::processEvents(); - - QTRY_COMPARE(machine.configuration().contains(&a), true); - QTRY_COMPARE(machine.configuration().contains(&b), false); - QTRY_COMPARE(machine.configuration().contains(&c), false); - QTRY_COMPARE(machine.configuration().contains(&failure), false); - QTRY_COMPARE(machine.configuration().contains(&success), true); - - QVERIFY(machine.isRunning()); -} - -void tst_QStateMachine::qtbug_46703() -{ - QStateMachine machine; - QState root(&machine); - QHistoryState h(&root); - QState p(QState::ParallelStates, &root); - QState a(&p); - QState a1(&a); - QState a2(&a); - QState a3(&a); - QState b(&p); - QState b1(&b); - QState b2(&b); - - machine.setObjectName("machine"); - root.setObjectName("root"); - h.setObjectName("h"); - p.setObjectName("p"); - a.setObjectName("a"); - a1.setObjectName("a1"); - a2.setObjectName("a2"); - a3.setObjectName("a3"); - b.setObjectName("b"); - b1.setObjectName("b1"); - b2.setObjectName("b2"); - - machine.setInitialState(&root); - root.setInitialState(&h); - a.setInitialState(&a3); - b.setInitialState(&b1); - struct : public QAbstractTransition { - virtual bool eventTest(QEvent *) { return false; } - virtual void onTransition(QEvent *) {} - } defaultTransition; - defaultTransition.setTargetStates(QList() << &a2 << &b2); - h.setDefaultTransition(&defaultTransition); - - machine.start(); - QCoreApplication::processEvents(); - - QTRY_COMPARE(machine.configuration().contains(&root), true); - QTRY_COMPARE(machine.configuration().contains(&h), false); - QTRY_COMPARE(machine.configuration().contains(&p), true); - QTRY_COMPARE(machine.configuration().contains(&a), true); - QTRY_COMPARE(machine.configuration().contains(&a1), false); - QTRY_COMPARE(machine.configuration().contains(&a2), true); - QTRY_COMPARE(machine.configuration().contains(&a3), false); - QTRY_COMPARE(machine.configuration().contains(&b), true); - QTRY_COMPARE(machine.configuration().contains(&b1), false); - QTRY_COMPARE(machine.configuration().contains(&b2), true); - - QVERIFY(machine.isRunning()); -} - -void tst_QStateMachine::postEventFromBeginSelectTransitions() -{ - class StateMachine : public QStateMachine { - protected: - void beginSelectTransitions(QEvent* e) override { - if (e->type() == QEvent::Type(QEvent::User + 2)) - postEvent(new QEvent(QEvent::Type(QEvent::User + 1)), QStateMachine::HighPriority); - } - } machine; - QState a(&machine); - QState success(&machine); - - machine.setInitialState(&a); - a.addTransition(new EventTransition(QEvent::Type(QEvent::User + 1), &success)); - - machine.start(); - - QTRY_COMPARE(machine.configuration().contains(&a), true); - QTRY_COMPARE(machine.configuration().contains(&success), false); - - machine.postEvent(new QEvent(QEvent::Type(QEvent::User + 2)), QStateMachine::NormalPriority); - - QTRY_COMPARE(machine.configuration().contains(&a), false); - QTRY_COMPARE(machine.configuration().contains(&success), true); - - QVERIFY(machine.isRunning()); -} - -void tst_QStateMachine::dontProcessSlotsWhenMachineIsNotRunning() -{ - QStateMachine machine; - QState initialState; - QFinalState finalState; - - struct Emitter : SignalEmitter - { - QThread thread; - Emitter(QObject *parent = nullptr) : SignalEmitter(parent) - { - moveToThread(&thread); - thread.start(); - } - } emitter; - - initialState.addTransition(&emitter, &Emitter::signalWithNoArg, &finalState); - machine.addState(&initialState); - machine.addState(&finalState); - machine.setInitialState(&initialState); - connect(&machine, &QStateMachine::started, &emitter, [&]() { - metaObject()->invokeMethod(&emitter, "emitSignalWithNoArg"); - metaObject()->invokeMethod(&emitter, "emitSignalWithNoArg"); - }); - connect(&machine, &QStateMachine::finished, &emitter.thread, &QThread::quit); - machine.start(); - QSignalSpy emittedSpy(&emitter, &SignalEmitter::signalWithNoArg); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QTRY_COMPARE_WITH_TIMEOUT(emittedSpy.count(), 2, 100); - QTRY_COMPARE(finishedSpy.count(), 1); - QTRY_VERIFY(emitter.thread.isFinished()); -} - -void tst_QStateMachine::cancelDelayedEventWithChrono() -{ -#if __has_include() - QStateMachine machine; - QTest::ignoreMessage(QtWarningMsg, - "QStateMachine::cancelDelayedEvent: the machine is not running"); - QVERIFY(!machine.cancelDelayedEvent(-1)); - - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - QFinalState *s2 = new QFinalState(&machine); - s1->addTransition(new StringTransition("a", s2)); - machine.setInitialState(s1); - - QSignalSpy startedSpy(&machine, &QStateMachine::started); - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(startedSpy.isValid()); - QVERIFY(runningSpy.isValid()); - machine.start(); - QTRY_COMPARE(startedSpy.count(), 1); - TEST_RUNNING_CHANGED(true); - TEST_ACTIVE_CHANGED(s1, 1); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s1)); - int id1 = machine.postDelayedEvent(new StringEvent("c"), std::chrono::seconds{50}); - QVERIFY(id1 != -1); - int id2 = machine.postDelayedEvent(new StringEvent("b"), std::chrono::seconds{25}); - QVERIFY(id2 != -1); - QVERIFY(id2 != id1); - int id3 = machine.postDelayedEvent(new StringEvent("a"), std::chrono::milliseconds{100}); - QVERIFY(id3 != -1); - QVERIFY(id3 != id2); - QVERIFY(machine.cancelDelayedEvent(id1)); - QVERIFY(!machine.cancelDelayedEvent(id1)); - QVERIFY(machine.cancelDelayedEvent(id2)); - QVERIFY(!machine.cancelDelayedEvent(id2)); - - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QVERIFY(finishedSpy.isValid()); - QTRY_COMPARE(finishedSpy.count(), 1); - TEST_RUNNING_CHANGED(false); - TEST_ACTIVE_CHANGED(s1, 2); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s2)); -#endif -} - -void tst_QStateMachine::postDelayedEventWithChronoAndStop() -{ -#if __has_include() - QStateMachine machine; - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - QFinalState *s2 = new QFinalState(&machine); - s1->addTransition(new StringTransition("a", s2)); - machine.setInitialState(s1); - - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(runningSpy.isValid()); - QSignalSpy startedSpy(&machine, &QStateMachine::started); - QVERIFY(startedSpy.isValid()); - machine.start(); - QTRY_COMPARE(startedSpy.count(), 1); - TEST_RUNNING_CHANGED(true); - TEST_ACTIVE_CHANGED(s1, 1); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s1)); - - int id1 = machine.postDelayedEvent(new StringEvent("a"), std::chrono::milliseconds{0}); - QVERIFY(id1 != -1); - QSignalSpy stoppedSpy(&machine, &QStateMachine::stopped); - QVERIFY(stoppedSpy.isValid()); - machine.stop(); - QTRY_COMPARE(stoppedSpy.count(), 1); - TEST_RUNNING_CHANGED(false); - TEST_ACTIVE_CHANGED(s1, 1); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s1)); - - machine.start(); - QTRY_COMPARE(startedSpy.count(), 2); - TEST_RUNNING_CHANGED(true); - TEST_ACTIVE_CHANGED(s1, 3); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s1)); - - int id2 = machine.postDelayedEvent(new StringEvent("a"), std::chrono::seconds{1}); - QVERIFY(id2 != -1); - machine.stop(); - QTRY_COMPARE(stoppedSpy.count(), 2); - TEST_RUNNING_CHANGED(false); - TEST_ACTIVE_CHANGED(s1, 3); - machine.start(); - QTRY_COMPARE(startedSpy.count(), 3); - TEST_RUNNING_CHANGED(true); - QTestEventLoop::instance().enterLoop(2); - QCOMPARE(machine.configuration().size(), 1); - QVERIFY(machine.configuration().contains(s1)); - TEST_ACTIVE_CHANGED(s1, 5); - QVERIFY(machine.isRunning()); -#endif -} - -class DelayedEventWithChronoPosterThread : public QThread -{ - Q_OBJECT -public: - DelayedEventWithChronoPosterThread(QStateMachine *machine, QObject *parent = 0) - : QThread(parent), firstEventWasCancelled(false), m_machine(machine) - { - moveToThread(this); - QObject::connect(m_machine, SIGNAL(started()), this, SLOT(postEvent())); - } - - mutable bool firstEventWasCancelled; - -private Q_SLOTS: - void postEvent() - { -#if __has_include() - int id = m_machine->postDelayedEvent(new QEvent(QEvent::User), std::chrono::seconds{1}); - firstEventWasCancelled = m_machine->cancelDelayedEvent(id); - - m_machine->postDelayedEvent(new QEvent(QEvent::User), std::chrono::milliseconds{1}); - - quit(); -#endif - } - -private: - QStateMachine *m_machine; -}; - -void tst_QStateMachine::postDelayedEventWithChronoFromThread() -{ -#if __has_include() - QStateMachine machine; - QState *s1 = new QState(&machine); - DEFINE_ACTIVE_SPY(s1); - QFinalState *f = new QFinalState(&machine); - s1->addTransition(new EventTransition(QEvent::User, f)); - machine.setInitialState(s1); - - DelayedEventWithChronoPosterThread poster(&machine); - poster.start(); - - QSignalSpy runningSpy(&machine, &QStateMachine::runningChanged); - QVERIFY(runningSpy.isValid()); - QSignalSpy finishedSpy(&machine, &QStateMachine::finished); - QVERIFY(finishedSpy.isValid()); - machine.start(); - QTRY_COMPARE(finishedSpy.count(), 1); - TEST_RUNNING_CHANGED_STARTED_STOPPED; - TEST_ACTIVE_CHANGED(s1, 2); - QVERIFY(poster.firstEventWasCancelled); -#endif -} - -QTEST_MAIN(tst_QStateMachine) -#include "tst_qstatemachine.moc" diff --git a/tests/auto/corelib/statemachine/statemachine.pro b/tests/auto/corelib/statemachine/statemachine.pro deleted file mode 100644 index aa645ac9f4d..00000000000 --- a/tests/auto/corelib/statemachine/statemachine.pro +++ /dev/null @@ -1,4 +0,0 @@ -TEMPLATE=subdirs -SUBDIRS=\ - qstate \ - qstatemachine diff --git a/tests/auto/guiapplauncher/examples.txt b/tests/auto/guiapplauncher/examples.txt index cf5cdbaa0ae..d59e14bfedc 100644 --- a/tests/auto/guiapplauncher/examples.txt +++ b/tests/auto/guiapplauncher/examples.txt @@ -1,10 +1,5 @@ -"animation/animatedtiles Example", "examples/widgets/animation/animatedtiles", "animatedtiles", 0, -1 "animation/appchooser Example", "examples/widgets/animation/appchooser", "appchooser", 10, -1 "animation/easing Example", "examples/widgets/animation/easing", "easing", 10, -1 -"animation/moveblocks Example", "examples/widgets/animation/moveblocks", "moveblocks", 10, -1 -"animation/states Example", "examples/widgets/animation/states", "states", 10, -1 -"animation/stickman Example", "examples/widgets/animation/stickman", "stickman", 10, -1 -"animation/sub-attaq Example", "examples/widgets/animation/sub-attaq", "sub-attaq", 0, -1 "designer/calculatorbuilder Example", "examples/widgets/designer/calculatorbuilder", "calculatorbuilder", 10, -1 "dialogs/standarddialogs Example", "examples/widgets/dialogs/standarddialogs", "standarddialogs", 10, -1 "draganddrop/dropsite Example", "examples/widgets/draganddrop/dropsite", "dropsite", 10, -1 @@ -23,7 +18,6 @@ "graphicsview/elasticnodes Example", "examples/widgets/graphicsview/elasticnodes", "elasticnodes", 10, -1 "graphicsview/embeddeddialogs Example", "examples/widgets/graphicsview/embeddeddialogs", "embeddeddialogs", 0, -1 "graphicsview/flowlayout Example", "examples/widgets/graphicsview/flowlayout", "flowlayout", 10, -1 -"graphicsview/padnavigator Example", "examples/widgets/graphicsview/padnavigator", "padnavigator", 0, -1 "graphicsview/portedasteroids Example", "examples/widgets/graphicsview/portedasteroids", "portedasteroids", 10, -1 "graphicsview/portedcanvas Example", "examples/widgets/graphicsview/portedcanvas", "portedcanvas", 10, -1 "graphicsview/weatheranchorlayout Example", "examples/widgets/graphicsview/weatheranchorlayout", "weatheranchorlayout", 10, -1 @@ -85,10 +79,6 @@ "richtext/textedit Example", "examples/widgets/richtext/textedit", "textedit", 0, -1 "richtext/textobject Example", "examples/widgets/richtext/textobject", "textobject", 10, -1 "sql/books Example", "examples/sql/books", "books", 0, -1 -"statemachine/eventtransitions Example", "examples/widgets/statemachine/eventtransitions", "eventtransitions", 10, -1 -"statemachine/rogue Example", "examples/widgets/statemachine/rogue", "rogue", 10, -1 -"statemachine/trafficlight Example", "examples/widgets/statemachine/trafficlight", "trafficlight", 0, -1 -"statemachine/twowaybutton Example", "examples/widgets/statemachine/twowaybutton", "twowaybutton", 10, -1 "tools/undo Example", "examples/widgets/tools/undo", "undo", 0, -1 "tutorials/addressbook/part7 Example", "examples/widgets/tutorials/addressbook/part7", "part7", 0, -1 "widgets/analogclock Example", "examples/widgets/widgets/analogclock", "analogclock", 6, -1