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 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
|
// 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: rect4
x: 400
y: 250
width: 300
height: 220
color: "#609cbc3d"
radius: 10
antialiasing: true
border {
width: 5
color: "maroon"
}
PinchHandler {
id: pinch4
target: null
xAxis.onActiveValueChanged: (delta) => rect4.width = Math.min(500, Math.max(120, 15 * Math.round((rect4.width + delta) / 15)))
yAxis.onActiveValueChanged: (delta) => rect4.opacity = Math.max(0.1, Math.min(0.9, rect4.opacity - delta / 200))
rotationAxis.onActiveValueChanged: (delta) => rect4.radius = Math.max(0, Math.min(60, rect4.radius + delta))
scaleAxis.onActiveValueChanged: (delta) => rect4.border.width *= delta
}
Text {
anchors.fill: parent
anchors.margins: rect4.radius / Math.PI + rect4.border.width
text: "Pinch with 2 fingers to tweak various properties"
wrapMode: Text.WordWrap
}
Text {
anchors.top: rect4.bottom
anchors.left: rect4.left
text: "opacity " + rect4.opacity.toFixed(3) + " width " + rect4.width +
" border " + rect4.border.width.toFixed(1) + " radius " + rect4.radius.toFixed(1)
}
}
}
}
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"
}
}
|