From 1fc968c51350b509ea016fbf539978f8f3889a25 Mon Sep 17 00:00:00 2001 From: Shawn Rutledge Date: Thu, 29 Jun 2023 12:51:23 +0200 Subject: [PATCH] Move touchinteraction examples to pointerhandlers and manual test These are getting long in the tooth, but multiflame and corkboards seem worthwhile to update to use Pointer Handlers (as we could have done sometime during the last 5 years or so). The qrc prefix seems to have changed: let's get the qmake build working again. The multiflame example is mostly rewritten: - all in one file, which can run standalone - only one ParticleSystem instance (which hopefully is more efficient) - using an inline component - less boilerplate per component instance (only one property for ColoredEmitter, which is both its color and its group name) - less-extreme, more fire-like colors The version of corkboards in Qt Quick 3D was already updated (and then removed for unrelated reasons); now we have the fixes from 0227fcdf3ea82efee3005d99fd1019410a7f5789 BearWhack has nice graphics, but doesn't seem like a very nice use of multi-touch, so it's demoted to the touch manual test for now. The simple Flickable use cases seem underwhelming nowadays too, and we have snippets as simple as those. Replace mentions of touchinteraction for testing with pointerhandlers. Pick-to: 6.6 Change-Id: I4667e13e961ca6f84d3336505b3c673790babfa5 Reviewed-by: Shawn Rutledge Reviewed-by: Qt CI Bot --- examples/quick/CMakeLists.txt | 2 - examples/quick/pointerhandlers/CMakeLists.txt | 7 ++ .../pointerhandlers/components/CorkPanel.qml | 118 ++++++++++++++++++ .../components/images}/cork.jpg | Bin .../components/images}/note-yellow.png | Bin .../components/images}/tack.png | Bin .../corkboards.qml | 6 +- .../images}/blur-circle.png | Bin examples/quick/pointerhandlers/multiflame.qml | 69 ++++++++++ .../quick/pointerhandlers/pointerhandlers.qml | 2 + examples/quick/pointerhandlers/qml.qrc | 9 +- examples/quick/quick.pro | 2 +- .../quick/touchinteraction/CMakeLists.txt | 69 ---------- .../images/qml-touchinteraction-example.png | Bin 35860 -> 0 bytes .../doc/src/touchinteraction.qdoc | 55 -------- .../touchinteraction/flickable/Panel.qml | 113 ----------------- examples/quick/touchinteraction/main.cpp | 4 - .../multipointtouch/ParticleFlame.qml | 33 ----- .../multipointtouch/multiflame.qml | 57 --------- .../touchinteraction/touchinteraction.pro | 10 -- .../touchinteraction/touchinteraction.qml | 21 ---- .../touchinteraction.qmlproject | 17 --- .../touchinteraction/touchinteraction.qrc | 27 ---- tests/auto/guiapplauncher/examples.txt | 1 - tests/auto/quick/examples/tst_examples.cpp | 3 +- tests/manual/touch/CMakeLists.txt | 19 ++- .../manual/touch}/basic-flickable.qml | 0 .../touch/bearwhack}/AugmentedTouchPoint.qml | 0 .../manual/touch/bearwhack}/Bear0.png | Bin .../manual/touch/bearwhack}/Bear1.png | Bin .../manual/touch/bearwhack}/Bear2.png | Bin .../manual/touch/bearwhack}/Bear3.png | Bin .../manual/touch/bearwhack}/BearB.png | Bin .../bearwhack}/BearWhackParticleSystem.qml | 0 .../manual/touch/bearwhack}/bearwhack.qml | 0 tests/manual/touch/bearwhack/blur-circle.png | Bin 0 -> 4279 bytes .../manual/touch/bearwhack}/blur-circle3.png | Bin .../manual/touch/bearwhack}/heart-blur.png | Bin .../manual/touch/bearwhack}/title.png | Bin .../manual/touch}/flickresize.qml | 0 tests/manual/touch/main.qml | 2 + .../manual/touch}/qt-logo.jpg | Bin 42 files changed, 226 insertions(+), 420 deletions(-) create mode 100644 examples/quick/pointerhandlers/components/CorkPanel.qml rename examples/quick/{touchinteraction/flickable => pointerhandlers/components/images}/cork.jpg (100%) rename examples/quick/{touchinteraction/flickable => pointerhandlers/components/images}/note-yellow.png (100%) rename examples/quick/{touchinteraction/flickable => pointerhandlers/components/images}/tack.png (100%) rename examples/quick/{touchinteraction/flickable => pointerhandlers}/corkboards.qml (92%) rename examples/quick/{touchinteraction/multipointtouch => pointerhandlers/images}/blur-circle.png (100%) create mode 100644 examples/quick/pointerhandlers/multiflame.qml delete mode 100644 examples/quick/touchinteraction/CMakeLists.txt delete mode 100644 examples/quick/touchinteraction/doc/images/qml-touchinteraction-example.png delete mode 100644 examples/quick/touchinteraction/doc/src/touchinteraction.qdoc delete mode 100644 examples/quick/touchinteraction/flickable/Panel.qml delete mode 100644 examples/quick/touchinteraction/main.cpp delete mode 100644 examples/quick/touchinteraction/multipointtouch/ParticleFlame.qml delete mode 100644 examples/quick/touchinteraction/multipointtouch/multiflame.qml delete mode 100644 examples/quick/touchinteraction/touchinteraction.pro delete mode 100644 examples/quick/touchinteraction/touchinteraction.qml delete mode 100644 examples/quick/touchinteraction/touchinteraction.qmlproject delete mode 100644 examples/quick/touchinteraction/touchinteraction.qrc rename {examples/quick/touchinteraction/flickable => tests/manual/touch}/basic-flickable.qml (100%) rename {examples/quick/touchinteraction/multipointtouch => tests/manual/touch/bearwhack}/AugmentedTouchPoint.qml (100%) rename {examples/quick/touchinteraction/multipointtouch => tests/manual/touch/bearwhack}/Bear0.png (100%) rename {examples/quick/touchinteraction/multipointtouch => tests/manual/touch/bearwhack}/Bear1.png (100%) rename {examples/quick/touchinteraction/multipointtouch => tests/manual/touch/bearwhack}/Bear2.png (100%) rename {examples/quick/touchinteraction/multipointtouch => tests/manual/touch/bearwhack}/Bear3.png (100%) rename {examples/quick/touchinteraction/multipointtouch => tests/manual/touch/bearwhack}/BearB.png (100%) rename {examples/quick/touchinteraction/multipointtouch => tests/manual/touch/bearwhack}/BearWhackParticleSystem.qml (100%) rename {examples/quick/touchinteraction/multipointtouch => tests/manual/touch/bearwhack}/bearwhack.qml (100%) create mode 100644 tests/manual/touch/bearwhack/blur-circle.png rename {examples/quick/touchinteraction/multipointtouch => tests/manual/touch/bearwhack}/blur-circle3.png (100%) rename {examples/quick/touchinteraction/multipointtouch => tests/manual/touch/bearwhack}/heart-blur.png (100%) rename {examples/quick/touchinteraction/multipointtouch => tests/manual/touch/bearwhack}/title.png (100%) rename {examples/quick/touchinteraction/pincharea => tests/manual/touch}/flickresize.qml (100%) rename {examples/quick/touchinteraction/pincharea => tests/manual/touch}/qt-logo.jpg (100%) diff --git a/examples/quick/CMakeLists.txt b/examples/quick/CMakeLists.txt index bfeb47f898..ad31083163 100644 --- a/examples/quick/CMakeLists.txt +++ b/examples/quick/CMakeLists.txt @@ -21,7 +21,6 @@ add_subdirectory(scenegraph) qt_internal_add_example(shadereffects) qt_internal_add_example(text) qt_internal_add_example(threading) -qt_internal_add_example(touchinteraction) add_subdirectory(tutorials) add_subdirectory(customitems) qt_internal_add_example(imageprovider) @@ -52,7 +51,6 @@ set(reused_dir_targets righttoleft_shared text_shared threading_shared - touchinteraction_shared window_shared shapes_shared imageelements_shared diff --git a/examples/quick/pointerhandlers/CMakeLists.txt b/examples/quick/pointerhandlers/CMakeLists.txt index 1f79a4b4ae..376d0e379d 100644 --- a/examples/quick/pointerhandlers/CMakeLists.txt +++ b/examples/quick/pointerhandlers/CMakeLists.txt @@ -33,6 +33,7 @@ qt_add_qml_module(pointerhandlersexample QML_FILES "components/Button.qml" "components/CheckBox.qml" + "components/CorkPanel.qml" "components/FakeFlickable.qml" "components/FlashAnimation.qml" "components/LeftDrawer.qml" @@ -42,12 +43,14 @@ qt_add_qml_module(pointerhandlersexample "components/ScrollBar.qml" "components/Slider.qml" "components/TouchpointFeedbackSprite.qml" + "corkboards.qml" "fakeFlickable.qml" "flingAnimation.qml" "joystick.qml" "map.qml" "mixer.qml" "multibuttons.qml" + "multiflame.qml" "pieMenu.qml" "pinchHandler.qml" "pointerhandlers.qml" @@ -57,6 +60,7 @@ qt_add_qml_module(pointerhandlersexample "tapHandler.qml" RESOURCES "components/images/checkmark.png" + "components/images/cork.jpg" "components/images/fingersprite.png" "components/images/mixer-knob.png" "components/images/mouse.png" @@ -64,8 +68,11 @@ qt_add_qml_module(pointerhandlersexample "components/images/mouse_middle.png" "components/images/mouse_right.png" "components/images/mouse_wheel_ridges.png" + "components/images/note-yellow.png" + "components/images/tack.png" "images/arrowhead.png" "images/balloon.png" + "images/blur-circle.png" "images/cursor-airbrush.png" "images/cursor-eraser.png" "images/cursor-felt-marker.png" diff --git a/examples/quick/pointerhandlers/components/CorkPanel.qml b/examples/quick/pointerhandlers/components/CorkPanel.qml new file mode 100644 index 0000000000..4aec2b5c7c --- /dev/null +++ b/examples/quick/pointerhandlers/components/CorkPanel.qml @@ -0,0 +1,118 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick + +Image { + id: corkPanel + source: Qt.resolvedUrl("images/cork.jpg") + width: ListView.view.width + height: ListView.view.height + fillMode: Image.PreserveAspectCrop + + required property string name + required property var notes + + TapHandler { + objectName: corkPanel.name + onTapped: corkPanel.Window.activeFocusItem.focus = false + } + + Text { + text: corkPanel.name + x: 15 + y: 8 + height: 40 + width: 370 + font.pixelSize: 18 + font.bold: true + color: "white" + style: Text.Outline + styleColor: "black" + wrapMode: Text.Wrap + } + + Repeater { + model: corkPanel.notes + Item { + id: fulcrum + + x: 100 + Math.random() * (corkPanel.width - 0.5 * paper.width) + y: 50 + Math.random() * (corkPanel.height - 0.5 * paper.height) + + Item { + id: note + scale: 0.7 + + Image { + id: paper + x: 8 + -width * 0.6 / 2 + y: -20 + source: "images/note-yellow.png" + scale: 0.6 + transformOrigin: Item.TopLeft + antialiasing: true + + DragHandler { + target: fulcrum + xAxis.minimum: 100 + xAxis.maximum: corkPanel.width - 80 + yAxis.minimum: 0 + yAxis.maximum: corkPanel.height - 80 + } + } + + TextEdit { + id: text + x: -104 + y: 36 + width: 215 + height: 24 + font.pixelSize: 24 + readOnly: false + selectByMouse: activeFocus + rotation: -8 + text: noteText + wrapMode: Text.Wrap + } + + rotation: -flickable.horizontalVelocity / 100 + Behavior on rotation { + SpringAnimation { + spring: 2.0 + damping: 0.15 + } + } + } + + Image { + x: -width / 2 + y: -height * 0.5 / 2 + source: "images/tack.png" + scale: 0.7 + transformOrigin: Item.TopLeft + } + + states: State { + name: "pressed" + when: text.activeFocus + PropertyChanges { + target: note + rotation: 8 + scale: 1 + } + PropertyChanges { + target: fulcrum + z: 8 + } + } + + transitions: Transition { + NumberAnimation { + properties: "rotation,scale" + duration: 200 + } + } + } + } +} diff --git a/examples/quick/touchinteraction/flickable/cork.jpg b/examples/quick/pointerhandlers/components/images/cork.jpg similarity index 100% rename from examples/quick/touchinteraction/flickable/cork.jpg rename to examples/quick/pointerhandlers/components/images/cork.jpg diff --git a/examples/quick/touchinteraction/flickable/note-yellow.png b/examples/quick/pointerhandlers/components/images/note-yellow.png similarity index 100% rename from examples/quick/touchinteraction/flickable/note-yellow.png rename to examples/quick/pointerhandlers/components/images/note-yellow.png diff --git a/examples/quick/touchinteraction/flickable/tack.png b/examples/quick/pointerhandlers/components/images/tack.png similarity index 100% rename from examples/quick/touchinteraction/flickable/tack.png rename to examples/quick/pointerhandlers/components/images/tack.png diff --git a/examples/quick/touchinteraction/flickable/corkboards.qml b/examples/quick/pointerhandlers/corkboards.qml similarity index 92% rename from examples/quick/touchinteraction/flickable/corkboards.qml rename to examples/quick/pointerhandlers/corkboards.qml index a8b9032dfd..76928f1b8c 100644 --- a/examples/quick/touchinteraction/flickable/corkboards.qml +++ b/examples/quick/pointerhandlers/corkboards.qml @@ -2,6 +2,7 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause import QtQuick +import "components" Rectangle { width: 320; height: 480 @@ -44,8 +45,7 @@ Rectangle { orientation: ListView.Horizontal snapMode: ListView.SnapOneItem model: list - delegate: Panel { - horizontalVelocity: flickable.horizontalVelocity - } + delegate: CorkPanel { objectName: name } } } + diff --git a/examples/quick/touchinteraction/multipointtouch/blur-circle.png b/examples/quick/pointerhandlers/images/blur-circle.png similarity index 100% rename from examples/quick/touchinteraction/multipointtouch/blur-circle.png rename to examples/quick/pointerhandlers/images/blur-circle.png diff --git a/examples/quick/pointerhandlers/multiflame.qml b/examples/quick/pointerhandlers/multiflame.qml new file mode 100644 index 0000000000..7793e52ad6 --- /dev/null +++ b/examples/quick/pointerhandlers/multiflame.qml @@ -0,0 +1,69 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick +import QtQuick.Particles + +Rectangle { + id: root + width: 360 + height: 480 + color: "black" + + component ColoredEmitter: Emitter { + id: emitter + property string color + group: color + velocityFromMovement: 10 + emitRate: 80 + lifeSpan: 1500 + velocity: PointDirection { + y: -90 + yVariation: 50 + } + acceleration: PointDirection { + xVariation: 100 + yVariation: 90 + } + size: 51 + sizeVariation: 53 + endSize: 64 + enabled: handler.active + x: handler.point.position.x + y: handler.point.position.y + + PointHandler { + id: handler + parent: root + } + + ImageParticle { + id: img + groups: [emitter.color] + source: "images/blur-circle.png" + colorVariation: 0.1 + color: emitter.color + alpha: 0 + system: sys + } + } + + ParticleSystem { + id: sys + ColoredEmitter { + color: "indianred" + } + ColoredEmitter { + color: "greenyellow" + } + ColoredEmitter { + color: "yellow" + } + ColoredEmitter { + color: "darkorange" + } + ColoredEmitter { + color: "violet" + } + } +} diff --git a/examples/quick/pointerhandlers/pointerhandlers.qml b/examples/quick/pointerhandlers/pointerhandlers.qml index 447e3a8158..049182fa8a 100644 --- a/examples/quick/pointerhandlers/pointerhandlers.qml +++ b/examples/quick/pointerhandlers/pointerhandlers.qml @@ -20,12 +20,14 @@ Rectangle { addExample("multibuttons", "TapHandler: gesturePolicy (99 red balloons)", Qt.resolvedUrl("multibuttons.qml")) addExample("pieMenu", "TapHandler: pie menu", Qt.resolvedUrl("pieMenu.qml")) addExample("single point handler", "PointHandler: properties such as seat, device, modifiers, velocity, pressure", Qt.resolvedUrl("singlePointHandlerProperties.qml")) + addExample("multiflame", "PointHandler: particle flames around touchpoints", Qt.resolvedUrl("multiflame.qml")) addExample("hover sidebar", "HoverHandler: a hierarchy of items sharing the hover state", Qt.resolvedUrl("sidebar.qml")) addExample("joystick", "DragHandler: move one item inside another with any pointing device", Qt.resolvedUrl("joystick.qml")) addExample("mixer", "DragHandler: drag multiple sliders with multiple fingers", Qt.resolvedUrl("mixer.qml")) addExample("fling animation", "DragHandler: after dragging, use an animation to simulate momentum", Qt.resolvedUrl("flingAnimation.qml")) addExample("pinch", "PinchHandler: scale, rotate and drag", Qt.resolvedUrl("pinchHandler.qml")) addExample("map", "scale, pan, re-render at different resolutions", Qt.resolvedUrl("map.qml")) + addExample("corkboards", "editable, movable sticky notes in a ListView", Qt.resolvedUrl("corkboards.qml")) addExample("fake Flickable", "implementation of a simplified Flickable using only Items, DragHandler and MomentumAnimation", Qt.resolvedUrl("fakeFlickable.qml")) addExample("tablet canvas", "PointHandler and HoverHandler with a tablet: detect the stylus, and draw", Qt.resolvedUrl("tabletCanvasDrawing.qml")) } diff --git a/examples/quick/pointerhandlers/qml.qrc b/examples/quick/pointerhandlers/qml.qrc index e9a39bc50c..237eb8eae0 100644 --- a/examples/quick/pointerhandlers/qml.qrc +++ b/examples/quick/pointerhandlers/qml.qrc @@ -1,11 +1,13 @@ - + + corkboards.qml flingAnimation.qml fakeFlickable.qml joystick.qml map.qml mixer.qml multibuttons.qml + multiflame.qml pieMenu.qml pinchHandler.qml pointerhandlers.qml @@ -15,6 +17,7 @@ tapHandler.qml components/Button.qml components/CheckBox.qml + components/CorkPanel.qml components/FakeFlickable.qml components/FlashAnimation.qml components/LeftDrawer.qml @@ -27,6 +30,10 @@ images/arrowhead.png images/balloon.png components/images/checkmark.png + components/images/cork.jpg + components/images/note-yellow.png + components/images/tack.png + images/blur-circle.png images/cursor-airbrush.png images/cursor-eraser.png images/cursor-felt-marker.png diff --git a/examples/quick/quick.pro b/examples/quick/quick.pro index 9ae68ed8c8..d1a3c6db24 100644 --- a/examples/quick/quick.pro +++ b/examples/quick/quick.pro @@ -13,13 +13,13 @@ SUBDIRS = quick-accessibility \ views \ tableview \ mousearea \ + pointerhandlers \ positioners \ righttoleft \ scenegraph \ shadereffects \ text \ threading \ - touchinteraction \ tutorials \ customitems \ imageprovider \ diff --git a/examples/quick/touchinteraction/CMakeLists.txt b/examples/quick/touchinteraction/CMakeLists.txt deleted file mode 100644 index 6b27f3828b..0000000000 --- a/examples/quick/touchinteraction/CMakeLists.txt +++ /dev/null @@ -1,69 +0,0 @@ -# Copyright (C) 2022 The Qt Company Ltd. -# SPDX-License-Identifier: BSD-3-Clause - -cmake_minimum_required(VERSION 3.16) -project(touchinteraction LANGUAGES CXX) - -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/quick/touchinteraction") - -find_package(Qt6 REQUIRED COMPONENTS Core Gui Qml Quick) - -qt_standard_project_setup(REQUIRES 6.5) - -add_subdirectory("../shared" "shared") - -qt_add_executable(touchinteractionexample - WIN32 - MACOSX_BUNDLE - main.cpp -) - -target_link_libraries(touchinteractionexample PRIVATE - Qt6::Core - Qt6::Gui - Qt6::Qml - Qt6::Quick -) - -add_dependencies(touchinteractionexample touchinteraction_shared) - -qt_add_qml_module(touchinteractionexample - URI touchinteraction - QML_FILES - "flickable/Panel.qml" - "flickable/basic-flickable.qml" - "flickable/corkboards.qml" - "multipointtouch/AugmentedTouchPoint.qml" - "multipointtouch/BearWhackParticleSystem.qml" - "multipointtouch/ParticleFlame.qml" - "multipointtouch/bearwhack.qml" - "multipointtouch/multiflame.qml" - "pincharea/flickresize.qml" - "touchinteraction.qml" - RESOURCES - "flickable/cork.jpg" - "flickable/note-yellow.png" - "flickable/tack.png" - "multipointtouch/Bear0.png" - "multipointtouch/Bear1.png" - "multipointtouch/Bear2.png" - "multipointtouch/Bear3.png" - "multipointtouch/BearB.png" - "multipointtouch/blur-circle.png" - "multipointtouch/blur-circle3.png" - "multipointtouch/heart-blur.png" - "multipointtouch/title.png" - "pincharea/qt-logo.jpg" -) - -install(TARGETS touchinteractionexample - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" -) - -bundle_shared(touchinteractionexample) diff --git a/examples/quick/touchinteraction/doc/images/qml-touchinteraction-example.png b/examples/quick/touchinteraction/doc/images/qml-touchinteraction-example.png deleted file mode 100644 index d4f0cab2016a0230a0788a5af0d646788b39f1f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35860 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 diff --git a/examples/quick/touchinteraction/doc/src/touchinteraction.qdoc b/examples/quick/touchinteraction/doc/src/touchinteraction.qdoc deleted file mode 100644 index 519e79e741..0000000000 --- a/examples/quick/touchinteraction/doc/src/touchinteraction.qdoc +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (C) 2017 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only -/*! - \title Qt Quick Examples - Touch Interaction - \example touchinteraction - \brief A collection of QML Touch Interaction examples. - \image qml-touchinteraction-example.png - - \e{Touch Interaction} is a collection of small QML examples relating to - touch interaction methods. For more information, visit - \l{Important Concepts In Qt Quick - User Input}. - - \include examples-run.qdocinc - - \section1 Multipoint Flames Example - - \e{Multipoint Flames} demonstrates distinguishing different fingers in a - \l MultiPointTouchArea, by assigning a different colored flame to each touch - point. - - The MultipointTouchArea sets up multiple touch points: - \snippet touchinteraction/multipointtouch/multiflame.qml 0 - - The flames are then simply bound to the coordinates of the touch point, and - whether it is currently pressed, as follows: - \snippet touchinteraction/multipointtouch/multiflame.qml 1 - - \section1 Bear-Whack Example - - \e{Bear-Whack} demonstrates using \l MultiPointTouchArea to add multiple - finger support to a simple game. The interaction with the game - is done through a SpriteGoal that follows the TouchPoint. The TouchPoints - added to the MultiPointTouchArea are a component with the relevant logic - embedded into it: - \snippet touchinteraction/multipointtouch/AugmentedTouchPoint.qml 0 - - \section1 Flick Resize Example - - \e{Flick Resize} uses a \l PinchArea to implement a \e{pinch-to-resize} - behavior. This is easily achieved by listening to the PinchArea signals and - responding to user input. - \snippet touchinteraction/pincharea/flickresize.qml 0 - - \section1 Flickable Example - - \e Flickable is a simple example demonstrating the \l Flickable type. - \snippet touchinteraction/flickable/basic-flickable.qml 0 - - \section1 Corkboards Example - - \e Corkboards shows another use for \l Flickable, with QML types within the - flickable object that respond to mouse and keyboard interaction. This - behavior does not require special code as the Qt Quick types already - cooperate with the Flickable type for accepting touch events. -*/ diff --git a/examples/quick/touchinteraction/flickable/Panel.qml b/examples/quick/touchinteraction/flickable/Panel.qml deleted file mode 100644 index 25c864799e..0000000000 --- a/examples/quick/touchinteraction/flickable/Panel.qml +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright (C) 2017 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause - -import QtQuick - -Item { - required property string name - required property var notes - - property real horizontalVelocity: 0 - - id: page - width: ListView.view.width+40; height: ListView.view.height - - - Image { - source: "cork.jpg" - width: page.ListView.view.width - height: page.ListView.view.height - fillMode: Image.PreserveAspectCrop - clip: true - } - - MouseArea { - anchors.fill: parent - onClicked: page.focus = false; - } - - Text { - text: page.name; x: 15; y: 8; height: 40; width: 370 - font.pixelSize: 18; font.bold: true; color: "white" - style: Text.Outline; styleColor: "black" - } - - Repeater { - model: page.notes - Item { - id: stickyPage - required property string noteText - - property int randomX: Math.random() * (page.ListView.view.width-0.5*stickyImage.width) +100 - property int randomY: Math.random() * (page.ListView.view.height-0.5*stickyImage.height) +50 - - x: randomX; y: randomY - - rotation: -page.horizontalVelocity / 100 - Behavior on rotation { - SpringAnimation { spring: 2.0; damping: 0.15 } - } - - Item { - id: sticky - scale: 0.7 - - Image { - id: stickyImage - x: 8 + -width * 0.6 / 2; y: -20 - source: "note-yellow.png" - scale: 0.6; transformOrigin: Item.TopLeft - } - - TextEdit { - id: myText - x: -104; y: 36; width: 215; height: 200 - font.pixelSize: 24 - readOnly: false - rotation: -8 - text: stickyPage.noteText - } - - Item { - x: stickyImage.x; y: -20 - width: stickyImage.width * stickyImage.scale - height: stickyImage.height * stickyImage.scale - - MouseArea { - id: mouse - anchors.fill: parent - drag.target: stickyPage - drag.axis: Drag.XAndYAxis - drag.minimumY: 0 - drag.maximumY: page.height - 80 - drag.minimumX: 100 - drag.maximumX: page.width - 140 - onClicked: myText.forceActiveFocus() - } - } - } - - Image { - x: -width / 2; y: -height * 0.5 / 2 - source: "tack.png" - scale: 0.7; transformOrigin: Item.TopLeft - } - - states: State { - name: "pressed" - when: mouse.pressed - PropertyChanges { - sticky { - rotation: 8 - scale: 1 - } - page.z: 8 - } - } - - transitions: Transition { - NumberAnimation { properties: "rotation,scale"; duration: 200 } - } - } - } -} diff --git a/examples/quick/touchinteraction/main.cpp b/examples/quick/touchinteraction/main.cpp deleted file mode 100644 index e268ff0391..0000000000 --- a/examples/quick/touchinteraction/main.cpp +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright (C) 2017 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause -#include "../shared/shared.h" -DECLARATIVE_EXAMPLE_MAIN(touchinteraction/touchinteraction) diff --git a/examples/quick/touchinteraction/multipointtouch/ParticleFlame.qml b/examples/quick/touchinteraction/multipointtouch/ParticleFlame.qml deleted file mode 100644 index 66907b1f0d..0000000000 --- a/examples/quick/touchinteraction/multipointtouch/ParticleFlame.qml +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (C) 2017 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause - -import QtQuick -import QtQuick.Particles - -ParticleSystem { - anchors.fill: parent - - property alias emitterX: emitter.x - property alias emitterY: emitter.y - - property alias color: img.color - property alias emitting: emitter.enabled - ImageParticle { - id: img - source: "blur-circle.png" - colorVariation: 0.1 - color: "#ff521d" - alpha: 0 - } - Emitter { - id: emitter - velocityFromMovement: 10 - emitRate: 80 - lifeSpan: 1500 - velocity: PointDirection{ y: -90; yVariation: 50; } - acceleration: PointDirection{ xVariation: 100; yVariation: 90; } - size: 51 - sizeVariation: 53 - endSize: 64 - } -} diff --git a/examples/quick/touchinteraction/multipointtouch/multiflame.qml b/examples/quick/touchinteraction/multipointtouch/multiflame.qml deleted file mode 100644 index 3e03bf2815..0000000000 --- a/examples/quick/touchinteraction/multipointtouch/multiflame.qml +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (C) 2017 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause -import QtQuick - -Rectangle { - width: 360 - height: 480 - color: "black" - -//! [0] - MultiPointTouchArea { - anchors.fill: parent - minimumTouchPoints: 1 - maximumTouchPoints: 5 - touchPoints: [ - TouchPoint { id: touch1 }, - TouchPoint { id: touch2 }, - TouchPoint { id: touch11 }, - TouchPoint { id: touch21 }, - TouchPoint { id: touch31 } - ] - } -//! [0] - -//! [1] - ParticleFlame { - color: "red" - emitterX: touch1.x - emitterY: touch1.y - emitting: touch1.pressed - } -//! [1] - ParticleFlame { - color: "green" - emitterX: touch2.x - emitterY: touch2.y - emitting: touch2.pressed - } - ParticleFlame { - color: "yellow" - emitterX: touch11.x - emitterY: touch11.y - emitting: touch11.pressed - } - ParticleFlame { - color: "blue" - emitterX: touch21.x - emitterY: touch21.y - emitting: touch21.pressed - } - ParticleFlame { - color: "violet" - emitterX: touch31.x - emitterY: touch31.y - emitting: touch31.pressed - } -} diff --git a/examples/quick/touchinteraction/touchinteraction.pro b/examples/quick/touchinteraction/touchinteraction.pro deleted file mode 100644 index 0ae0a41cce..0000000000 --- a/examples/quick/touchinteraction/touchinteraction.pro +++ /dev/null @@ -1,10 +0,0 @@ -TEMPLATE = app - -QT += quick qml -SOURCES += main.cpp -RESOURCES += \ - touchinteraction.qrc \ - ../shared/shared.qrc - -target.path = $$[QT_INSTALL_EXAMPLES]/quick/touchinteraction -INSTALLS += target diff --git a/examples/quick/touchinteraction/touchinteraction.qml b/examples/quick/touchinteraction/touchinteraction.qml deleted file mode 100644 index 6961e48fd4..0000000000 --- a/examples/quick/touchinteraction/touchinteraction.qml +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (C) 2017 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause - -import QtQuick -import shared - -Item { - height: 480 - width: 320 - LauncherList { - id: ll - anchors.fill: parent - Component.onCompleted: { - addExample("Multipoint Flames", "Create multiple flames with multiple fingers", Qt.resolvedUrl("multipointtouch/multiflame.qml")); - addExample("Bear-Whack", "Use multiple touches to knock all the bears down", Qt.resolvedUrl("multipointtouch/bearwhack.qml")); - addExample("Flick Resize", "Manipulate images using pinch gestures", Qt.resolvedUrl("pincharea/flickresize.qml")); - addExample("Flickable", "A viewport you can move with touch gestures", Qt.resolvedUrl("flickable/basic-flickable.qml")); - addExample("Corkboards", "Uses touch input on items inside a Flickable", Qt.resolvedUrl("flickable/corkboards.qml")); - } - } -} diff --git a/examples/quick/touchinteraction/touchinteraction.qmlproject b/examples/quick/touchinteraction/touchinteraction.qmlproject deleted file mode 100644 index 50254f287f..0000000000 --- a/examples/quick/touchinteraction/touchinteraction.qmlproject +++ /dev/null @@ -1,17 +0,0 @@ -import QmlProject 1.1 - -Project { - mainFile: "touchinteraction.qml" - importPaths: [ "../" ] - - /* Include .qml, .js, and image files from current directory and subdirectories */ - QmlFiles { - directory: "." - } - JavaScriptFiles { - directory: "." - } - ImageFiles { - directory: "." - } -} diff --git a/examples/quick/touchinteraction/touchinteraction.qrc b/examples/quick/touchinteraction/touchinteraction.qrc deleted file mode 100644 index 6d0427b053..0000000000 --- a/examples/quick/touchinteraction/touchinteraction.qrc +++ /dev/null @@ -1,27 +0,0 @@ - - - touchinteraction.qml - flickable/basic-flickable.qml - flickable/corkboards.qml - flickable/cork.jpg - flickable/note-yellow.png - flickable/Panel.qml - flickable/tack.png - multipointtouch/bearwhack.qml - multipointtouch/multiflame.qml - multipointtouch/AugmentedTouchPoint.qml - multipointtouch/Bear0.png - multipointtouch/Bear1.png - multipointtouch/Bear2.png - multipointtouch/Bear3.png - multipointtouch/BearB.png - multipointtouch/BearWhackParticleSystem.qml - multipointtouch/blur-circle.png - multipointtouch/blur-circle3.png - multipointtouch/heart-blur.png - multipointtouch/ParticleFlame.qml - multipointtouch/title.png - pincharea/flickresize.qml - pincharea/qt-logo.jpg - - diff --git a/tests/auto/guiapplauncher/examples.txt b/tests/auto/guiapplauncher/examples.txt index 03ad71e7e2..820c0cedad 100644 --- a/tests/auto/guiapplauncher/examples.txt +++ b/tests/auto/guiapplauncher/examples.txt @@ -30,7 +30,6 @@ "quick/positioners Example", "examples/quick/positioners", "positioners", 0, -1 "quick/shadereffects Example", "examples/quick/shadereffects", "shadereffects", 0, -1 "quick/mousearea Example", "examples/quick/mousearea", "mousearea", 0, -1 -"quick/touchinteraction Example", "examples/quick/touchinteraction", "touchinteraction", 0, -1 "quick/canvas Example", "examples/quick/canvas", "canvas", 0, -1 "quick/text Example", "examples/quick/text", "text", 0, -1 "quick/quickwidgets/qquickviewcomparison Example", "examples/quick/quickwidgets/qquickviewcomparison", "qquickviewcomparison", 0, -1 diff --git a/tests/auto/quick/examples/tst_examples.cpp b/tests/auto/quick/examples/tst_examples.cpp index 76b67f9a04..3d4bc51d66 100644 --- a/tests/auto/quick/examples/tst_examples.cpp +++ b/tests/auto/quick/examples/tst_examples.cpp @@ -71,8 +71,7 @@ tst_examples::tst_examples() excludedFiles << "examples/qml/dynamicscene/dynamicscene.qml"; excludedFiles << "examples/quick/animation/basics/color-animation.qml"; excludedFiles << "examples/quick/particles/affectors/content/age.qml"; - excludedFiles << "examples/quick/touchinteraction/multipointtouch/bearwhack.qml"; - excludedFiles << "examples/quick/touchinteraction/multipointtouch/multiflame.qml"; + excludedFiles << "examples/quick/pointerhandlers/multiflame.qml"; excludedDirs << "examples/quick/particles"; // No Support for ShaderEffect excludedFiles << "src/quick/doc/snippets/qml/animators.qml"; diff --git a/tests/manual/touch/CMakeLists.txt b/tests/manual/touch/CMakeLists.txt index 835a593732..a843eb2248 100644 --- a/tests/manual/touch/CMakeLists.txt +++ b/tests/manual/touch/CMakeLists.txt @@ -19,9 +19,24 @@ qt_internal_add_manual_test(tst_manual_touch # Resources: set(qml_resource_files + "basic-flickable.qml" + "flickresize.qml" "flicktext.qml" "main.qml" "mpta-crosshairs.qml" + "qt-logo.jpg" + "bearwhack/heart-blur.png" + "bearwhack/Bear0.png" + "bearwhack/BearWhackParticleSystem.qml" + "bearwhack/blur-circle.png" + "bearwhack/Bear1.png" + "bearwhack/bearwhack.qml" + "bearwhack/Bear2.png" + "bearwhack/title.png" + "bearwhack/blur-circle3.png" + "bearwhack/Bear3.png" + "bearwhack/AugmentedTouchPoint.qml" + "bearwhack/BearB.png" ) qt_internal_add_resource(tst_manual_touch "qml" @@ -53,7 +68,3 @@ qt_internal_add_resource(tst_manual_touch "quick_shared" FILES ${quick_shared_resource_files} ) - - -#### Keys ignored in scope 1:.:.:touch.pro:: -# TEMPLATE = "app" diff --git a/examples/quick/touchinteraction/flickable/basic-flickable.qml b/tests/manual/touch/basic-flickable.qml similarity index 100% rename from examples/quick/touchinteraction/flickable/basic-flickable.qml rename to tests/manual/touch/basic-flickable.qml diff --git a/examples/quick/touchinteraction/multipointtouch/AugmentedTouchPoint.qml b/tests/manual/touch/bearwhack/AugmentedTouchPoint.qml similarity index 100% rename from examples/quick/touchinteraction/multipointtouch/AugmentedTouchPoint.qml rename to tests/manual/touch/bearwhack/AugmentedTouchPoint.qml diff --git a/examples/quick/touchinteraction/multipointtouch/Bear0.png b/tests/manual/touch/bearwhack/Bear0.png similarity index 100% rename from examples/quick/touchinteraction/multipointtouch/Bear0.png rename to tests/manual/touch/bearwhack/Bear0.png diff --git a/examples/quick/touchinteraction/multipointtouch/Bear1.png b/tests/manual/touch/bearwhack/Bear1.png similarity index 100% rename from examples/quick/touchinteraction/multipointtouch/Bear1.png rename to tests/manual/touch/bearwhack/Bear1.png diff --git a/examples/quick/touchinteraction/multipointtouch/Bear2.png b/tests/manual/touch/bearwhack/Bear2.png similarity index 100% rename from examples/quick/touchinteraction/multipointtouch/Bear2.png rename to tests/manual/touch/bearwhack/Bear2.png diff --git a/examples/quick/touchinteraction/multipointtouch/Bear3.png b/tests/manual/touch/bearwhack/Bear3.png similarity index 100% rename from examples/quick/touchinteraction/multipointtouch/Bear3.png rename to tests/manual/touch/bearwhack/Bear3.png diff --git a/examples/quick/touchinteraction/multipointtouch/BearB.png b/tests/manual/touch/bearwhack/BearB.png similarity index 100% rename from examples/quick/touchinteraction/multipointtouch/BearB.png rename to tests/manual/touch/bearwhack/BearB.png diff --git a/examples/quick/touchinteraction/multipointtouch/BearWhackParticleSystem.qml b/tests/manual/touch/bearwhack/BearWhackParticleSystem.qml similarity index 100% rename from examples/quick/touchinteraction/multipointtouch/BearWhackParticleSystem.qml rename to tests/manual/touch/bearwhack/BearWhackParticleSystem.qml diff --git a/examples/quick/touchinteraction/multipointtouch/bearwhack.qml b/tests/manual/touch/bearwhack/bearwhack.qml similarity index 100% rename from examples/quick/touchinteraction/multipointtouch/bearwhack.qml rename to tests/manual/touch/bearwhack/bearwhack.qml diff --git a/tests/manual/touch/bearwhack/blur-circle.png b/tests/manual/touch/bearwhack/blur-circle.png new file mode 100644 index 0000000000000000000000000000000000000000..1b03cd0b2cfa836907ebe81e40c5aa1f6c64c9d4 GIT binary patch literal 4279 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 BFIWHo literal 0 HcmV?d00001 diff --git a/examples/quick/touchinteraction/multipointtouch/blur-circle3.png b/tests/manual/touch/bearwhack/blur-circle3.png similarity index 100% rename from examples/quick/touchinteraction/multipointtouch/blur-circle3.png rename to tests/manual/touch/bearwhack/blur-circle3.png diff --git a/examples/quick/touchinteraction/multipointtouch/heart-blur.png b/tests/manual/touch/bearwhack/heart-blur.png similarity index 100% rename from examples/quick/touchinteraction/multipointtouch/heart-blur.png rename to tests/manual/touch/bearwhack/heart-blur.png diff --git a/examples/quick/touchinteraction/multipointtouch/title.png b/tests/manual/touch/bearwhack/title.png similarity index 100% rename from examples/quick/touchinteraction/multipointtouch/title.png rename to tests/manual/touch/bearwhack/title.png diff --git a/examples/quick/touchinteraction/pincharea/flickresize.qml b/tests/manual/touch/flickresize.qml similarity index 100% rename from examples/quick/touchinteraction/pincharea/flickresize.qml rename to tests/manual/touch/flickresize.qml diff --git a/tests/manual/touch/main.qml b/tests/manual/touch/main.qml index ca40140271..6a51e02aa0 100644 --- a/tests/manual/touch/main.qml +++ b/tests/manual/touch/main.qml @@ -14,6 +14,8 @@ Window { anchors.fill: parent Component.onCompleted: { addExample("crosshairs", "crosshairs and velocity vectors at finger positions", Qt.resolvedUrl("mpta-crosshairs.qml")) + addExample("flickable", "flick a bigger Rectangle", Qt.resolvedUrl("basic-flickable.qml")) + addExample("flick and resize", "flick and resize an image (old-school PinchArea)", Qt.resolvedUrl("flickresize.qml")) addExample("flick text", "flick a text document", Qt.resolvedUrl("flicktext.qml")) } } diff --git a/examples/quick/touchinteraction/pincharea/qt-logo.jpg b/tests/manual/touch/qt-logo.jpg similarity index 100% rename from examples/quick/touchinteraction/pincharea/qt-logo.jpg rename to tests/manual/touch/qt-logo.jpg