1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
|
// Copyright (C) 2021 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
import QtQuick
import "components"
Rectangle {
width: 1024; height: 600
color: "#eee"
function getTransformationDetails(item, pinchhandler) {
return "\n\npinch.scale:" + pinchhandler.scale.toFixed(2)
+ "\npinch.rotation:" + pinchhandler.rotation.toFixed(2)
+ "\npinch.translation:" + "(" + pinchhandler.translation.x.toFixed(2) + "," + pinchhandler.translation.y.toFixed(2) + ")"
+ "\nrect.scale: " + item.scale.toFixed(2)
+ "\nrect.rotation: " + item.rotation.toFixed(2)
+ "\nrect.position: " + "(" + item.x.toFixed(2) + "," + item.y.toFixed(2) + ")"
}
function activePincher() {
if (grandparentPinch.active)
return grandparentPinch
else if (parentPinch.active)
return parentPinch
else if (pinch2.active)
return pinch2
return pinch3 // always return a pinch handler, even when its inactive. The indicator will be invisble anyway.
}
Rectangle {
width: parent.width - 100; height: parent.height - 100; x: 50; y: 50
color: "beige"
border.width: grandparentPinch.active ? 2 : 0
border.color: border.width > 0 ? "red" : "transparent"
antialiasing: true
PinchHandler {
id: grandparentPinch
objectName: "grandparent pinch"
minimumScale: 0.5
maximumScale: 3
minimumPointCount: 3
maximumPointCount: 6 // mutants are allowed; using both hands is not normal for a pinch gesture, but we can't tell
}
Text {
text: "Pinch with 3 or more fingers to scale, rotate and translate"
+ getTransformationDetails(parent, grandparentPinch)
}
Rectangle {
width: parent.width - 100; height: parent.height - 100; x: 50; y: 50
color: "#ffe0e0e0"
antialiasing: true
PinchHandler {
id: parentPinch
objectName: "parent pinch"
minimumScale: 0.5
maximumScale: 3
}
Text {
text: "Pinch with 2 fingers to scale, rotate and translate"
+ getTransformationDetails(parent, parentPinch)
}
Rectangle {
id: rect2
width: 400
height: 300
color: "lightsteelblue"
antialiasing: true
x: 100
y: 200
rotation: 30
transformOrigin: Item.TopRight
border.width: (lsbDragHandler.active || pinch2.active) ? 2 : 0
border.color: border.width > 0 ? "red" : "transparent"
Text {
anchors.centerIn: parent
text: "Pinch with 2 fingers to scale, rotate and translate\nDrag with 1 finger"
+ getTransformationDetails(rect2, pinch2) + "\nz " + rect2.z
}
DragHandler {
id: lsbDragHandler
objectName: "lightsteelblue drag"
}
PinchHandler {
id: pinch2
objectName: "lightsteelblue pinch"
minimumRotation: -45
maximumRotation: 45
minimumScale: 0.5
maximumScale: 3
xAxis.minimum: 0
xAxis.maximum: 600
// acceptedModifiers: Qt.ControlModifier
}
TapHandler { gesturePolicy: TapHandler.DragThreshold; onTapped: rect2.z = rect3.z + 1 }
}
Rectangle {
id: rect3
x: 500
width: 400
height: 300
color: "wheat"
antialiasing: true
border.width: (wheatDragHandler.active || pinch3.active) ? 2 : 0
border.color: border.width > 0 ? "red" : "transparent"
Text {
anchors.centerIn: parent
text: "Pinch with 3 fingers to scale, rotate and translate\nDrag with 1 finger"
+ getTransformationDetails(rect3, pinch3) + "\nz " + rect3.z
}
DragHandler {
id: wheatDragHandler
objectName: "wheat drag"
}
PinchHandler {
id: pinch3
objectName: "wheat 3-finger pinch"
minimumPointCount: 3
minimumScale: 0.1
maximumScale: 10
onActiveChanged: {
if (!active)
anim.restart(centroid.velocity)
}
onGrabChanged: function (transition, point) {
if (transition === 0x10) { // GrabExclusive
console.log(point.id, "grabbed @", point.position)
Qt.createQmlObject("import QtQuick; Rectangle { opacity: 0.5; border.color: 'red'; radius: 8; width: radius * 2; height: radius * 2; " +
"x: " + (point.position.x - 8) + "; y: " + (point.position.y - 8) + "}",
rect3, "touchpoint" + point.id);
}
}
}
TapHandler { gesturePolicy: TapHandler.DragThreshold; onTapped: rect3.z = rect2.z + 1 }
MomentumAnimation { id: anim; target: rect3 }
}
}
}
Rectangle {
id: centroidIndicator
property QtObject pincher: activePincher()
x: pincher.centroid.scenePosition.x - radius
y: pincher.centroid.scenePosition.y - radius
z: 1
visible: pincher.active
radius: width / 2
width: 10
height: width
color: "red"
}
}
|