2015-07-28 13:24:29 +00:00
|
|
|
/****************************************************************************
|
|
|
|
**
|
2018-07-26 06:14:13 +00:00
|
|
|
** Copyright (C) 2018 The Qt Company Ltd.
|
2015-07-28 13:24:29 +00:00
|
|
|
** Contact: https://www.qt.io/licensing/
|
|
|
|
**
|
|
|
|
** This file is part of the manual tests of the Qt Toolkit.
|
|
|
|
**
|
2017-11-15 15:29:18 +00:00
|
|
|
** $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.
|
2015-07-28 13:24:29 +00:00
|
|
|
**
|
|
|
|
** $QT_END_LICENSE$
|
|
|
|
**
|
|
|
|
****************************************************************************/
|
|
|
|
|
2018-06-25 16:12:29 +00:00
|
|
|
import QtQuick 2.12
|
2015-07-28 13:24:29 +00:00
|
|
|
import "qrc:/quick/shared/" as Examples
|
|
|
|
|
|
|
|
Item {
|
|
|
|
width: 480
|
|
|
|
height: 320
|
|
|
|
|
|
|
|
Rectangle {
|
|
|
|
id: rect
|
|
|
|
anchors.fill: parent; anchors.margins: 40
|
|
|
|
border.width: 3; border.color: "transparent"
|
2017-08-28 14:23:20 +00:00
|
|
|
color: handler.pressed ? "lightsteelblue" : "darkgrey"
|
2015-07-28 13:24:29 +00:00
|
|
|
|
|
|
|
TapHandler {
|
|
|
|
id: handler
|
|
|
|
acceptedButtons: (leftAllowedCB.checked ? Qt.LeftButton : Qt.NoButton) |
|
|
|
|
(middleAllowedCB.checked ? Qt.MiddleButton : Qt.NoButton) |
|
|
|
|
(rightAllowedCB.checked ? Qt.RightButton : Qt.NoButton)
|
2016-10-18 16:45:49 +00:00
|
|
|
gesturePolicy: (policyDragThresholdCB.checked ? TapHandler.DragThreshold :
|
|
|
|
policyWithinBoundsCB.checked ? TapHandler.WithinBounds :
|
|
|
|
TapHandler.ReleaseWithinBounds)
|
2017-02-24 15:42:47 +00:00
|
|
|
|
2015-07-28 13:24:29 +00:00
|
|
|
onCanceled: {
|
2017-02-24 15:42:47 +00:00
|
|
|
console.log("canceled @ " + point.position)
|
2015-07-28 13:24:29 +00:00
|
|
|
borderBlink.blinkColor = "red"
|
|
|
|
borderBlink.start()
|
|
|
|
}
|
2018-07-26 06:14:13 +00:00
|
|
|
onTapped: { // 'eventPoint' is a signal parameter of type QQuickEventPoint*
|
|
|
|
console.log("tapped button " + eventPoint.event.button + " @ " + eventPoint.scenePosition +
|
|
|
|
" on device '" + eventPoint.event.device.name + "' " + (tapCount > 1 ? (tapCount + " times") : "for the first time"))
|
2015-07-28 13:24:29 +00:00
|
|
|
if (tapCount > 1) {
|
|
|
|
tapCountLabel.text = tapCount
|
|
|
|
flashAnimation.start()
|
|
|
|
} else {
|
2018-07-26 06:14:13 +00:00
|
|
|
borderBlink.tapFeedback(eventPoint.event.button)
|
2015-07-28 13:24:29 +00:00
|
|
|
}
|
|
|
|
}
|
2016-11-18 14:02:18 +00:00
|
|
|
onLongPressed: longPressFeedback.createObject(rect,
|
2017-02-24 15:42:47 +00:00
|
|
|
{"x": point.position.x, "y": point.position.y,
|
2018-07-26 06:14:13 +00:00
|
|
|
"text": handler.timeHeld.toFixed(3) + " sec",
|
|
|
|
"color": buttonToBlinkColor(point.pressedButtons)})
|
2015-07-28 13:24:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
Text {
|
|
|
|
id: tapCountLabel
|
|
|
|
anchors.centerIn: parent
|
|
|
|
font.pixelSize: 72
|
|
|
|
font.weight: Font.Black
|
|
|
|
SequentialAnimation {
|
|
|
|
id: flashAnimation
|
|
|
|
PropertyAction { target: tapCountLabel; property: "visible"; value: true }
|
|
|
|
PropertyAction { target: tapCountLabel; property: "opacity"; value: 1.0 }
|
|
|
|
PropertyAction { target: tapCountLabel; property: "scale"; value: 1.0 }
|
|
|
|
ParallelAnimation {
|
|
|
|
NumberAnimation {
|
|
|
|
target: tapCountLabel
|
|
|
|
property: "opacity"
|
|
|
|
to: 0
|
|
|
|
duration: 500
|
|
|
|
}
|
|
|
|
NumberAnimation {
|
|
|
|
target: tapCountLabel
|
|
|
|
property: "scale"
|
|
|
|
to: 1.5
|
|
|
|
duration: 500
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-08-05 10:45:48 +00:00
|
|
|
Rectangle {
|
|
|
|
id: expandingCircle
|
|
|
|
radius: handler.timeHeld * 100
|
2017-08-28 14:23:20 +00:00
|
|
|
visible: radius > 0 && handler.pressed
|
2015-08-05 10:45:48 +00:00
|
|
|
border.width: 3
|
2018-07-26 06:14:13 +00:00
|
|
|
border.color: buttonToBlinkColor(handler.point.pressedButtons)
|
2015-08-05 10:45:48 +00:00
|
|
|
color: "transparent"
|
|
|
|
width: radius * 2
|
|
|
|
height: radius * 2
|
2017-02-24 15:42:47 +00:00
|
|
|
x: handler.point.pressPosition.x - radius
|
|
|
|
y: handler.point.pressPosition.y - radius
|
2015-08-05 10:45:48 +00:00
|
|
|
opacity: 0.25
|
|
|
|
}
|
|
|
|
|
2016-11-18 14:02:18 +00:00
|
|
|
Component {
|
|
|
|
id: longPressFeedback
|
|
|
|
Text { }
|
|
|
|
}
|
|
|
|
|
2015-07-28 13:24:29 +00:00
|
|
|
SequentialAnimation {
|
|
|
|
id: borderBlink
|
2018-07-26 06:14:13 +00:00
|
|
|
property color blinkColor: "red"
|
|
|
|
function tapFeedback(button) {
|
|
|
|
blinkColor = buttonToBlinkColor(button);
|
|
|
|
start();
|
|
|
|
}
|
2015-07-28 13:24:29 +00:00
|
|
|
loops: 3
|
|
|
|
ScriptAction { script: rect.border.color = borderBlink.blinkColor }
|
|
|
|
PauseAnimation { duration: 100 }
|
|
|
|
ScriptAction { script: rect.border.color = "transparent" }
|
|
|
|
PauseAnimation { duration: 100 }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-07-26 06:14:13 +00:00
|
|
|
function buttonToBlinkColor(button) {
|
|
|
|
switch (button) {
|
|
|
|
case Qt.MiddleButton: return "orange";
|
|
|
|
case Qt.RightButton: return "magenta";
|
|
|
|
default: return "green";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-07-28 13:24:29 +00:00
|
|
|
Row {
|
|
|
|
spacing: 6
|
|
|
|
Text { text: "accepted mouse clicks:"; anchors.verticalCenter: leftAllowedCB.verticalCenter }
|
|
|
|
Examples.CheckBox {
|
|
|
|
id: leftAllowedCB
|
|
|
|
checked: true
|
|
|
|
text: "left click"
|
|
|
|
}
|
|
|
|
Examples.CheckBox {
|
|
|
|
id: middleAllowedCB
|
|
|
|
text: "middle click"
|
|
|
|
}
|
|
|
|
Examples.CheckBox {
|
|
|
|
id: rightAllowedCB
|
|
|
|
text: "right click"
|
|
|
|
}
|
2016-10-18 16:45:49 +00:00
|
|
|
Text { text: " gesture policy:"; anchors.verticalCenter: leftAllowedCB.verticalCenter }
|
|
|
|
Examples.CheckBox {
|
|
|
|
id: policyDragThresholdCB
|
|
|
|
text: "drag threshold"
|
|
|
|
onCheckedChanged: if (checked) {
|
|
|
|
policyWithinBoundsCB.checked = false;
|
|
|
|
policyReleaseWithinBoundsCB.checked = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Examples.CheckBox {
|
|
|
|
id: policyWithinBoundsCB
|
|
|
|
text: "within bounds"
|
|
|
|
onCheckedChanged: if (checked) {
|
|
|
|
policyDragThresholdCB.checked = false;
|
|
|
|
policyReleaseWithinBoundsCB.checked = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Examples.CheckBox {
|
|
|
|
id: policyReleaseWithinBoundsCB
|
|
|
|
checked: true
|
|
|
|
text: "release within bounds"
|
|
|
|
onCheckedChanged: if (checked) {
|
|
|
|
policyDragThresholdCB.checked = false;
|
|
|
|
policyWithinBoundsCB.checked = false;
|
|
|
|
}
|
|
|
|
}
|
2015-07-28 13:24:29 +00:00
|
|
|
}
|
|
|
|
}
|