/**************************************************************************** ** ** Copyright (C) 2019 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the manual tests 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$ ** ****************************************************************************/ import QtQuick 2.14 import Qt.labs.animation 1.0 import "content" Rectangle { id: root width: 1024; height: 600 color: "#eee" CheckBox { id: cbTouchpadEnabled x: 10; y: 6 label: "Touchpad wheel emulation enabled" } CheckBox { id: cbHorzWheelEnabled x: cbTouchpadEnabled.width + 20; y: 6 label: "Horizontal wheel rotation" } 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) + ")" + "\nscale wheel.rotation:" + scaleWheelHandler.rotation.toFixed(2) + "°\nhorizontal wheel.rotation:" + horizontalRotationWheelHandler.rotation.toFixed(2) + "°\ncontrol-rotation wheel.rotation:" + controlRotationWheelHandler.rotation.toFixed(2) + "°\nrect.scale: " + item.scale.toFixed(2) + "\nrect.rotation: " + item.rotation.toFixed(2) + "°\nrect.position: " + "(" + item.x.toFixed(2) + "," + item.y.toFixed(2) + ")" } Rectangle { id: transformable 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 } WheelHandler { id: scaleWheelHandler objectName: "mouse wheel for scaling" acceptedDevices: cbTouchpadEnabled.checked ? PointerDevice.Mouse | PointerDevice.TouchPad : PointerDevice.Mouse acceptedModifiers: Qt.NoModifier property: "scale" onActiveChanged: if (!active) sbr.returnToBounds(); onWheel: console.log(objectName + ": rotation " + event.angleDelta.y + " scaled " + rotation + " @ " + point.position + " => " + parent.scale) } BoundaryRule on scale { id: sbr minimum: 0.1 maximum: 2 minimumOvershoot: 0.05 maximumOvershoot: 0.05 } BoundaryRule on rotation { id: rbr minimum: -90 maximum: 360 minimumOvershoot: 10 maximumOvershoot: 10 } WheelHandler { id: horizontalRotationWheelHandler enabled: cbHorzWheelEnabled.checked objectName: "horizontal mouse wheel for rotation" acceptedDevices: cbTouchpadEnabled.checked ? PointerDevice.Mouse | PointerDevice.TouchPad : PointerDevice.Mouse acceptedModifiers: Qt.NoModifier property: "rotation" orientation: Qt.Horizontal onActiveChanged: if (!active) rbr.returnToBounds() onWheel: console.log(objectName + ": rotation " + event.angleDelta.y + " scaled " + rotation + " @ " + point.position + " => " + parent.rotation) } WheelHandler { id: controlRotationWheelHandler objectName: "control-mouse wheel for rotation" acceptedDevices: cbTouchpadEnabled.checked ? PointerDevice.Mouse | PointerDevice.TouchPad : PointerDevice.Mouse acceptedModifiers: Qt.ControlModifier property: "rotation" orientation: Qt.Vertical // already the default // TODO returnToBounds() causes trouble because position isn't being adjusted when this happens onActiveChanged: if (!active) rbr.returnToBounds() onWheel: console.log(objectName + ": rotation " + event.angleDelta.y + " scaled " + rotation + " @ " + point.position + " => " + parent.rotation) } HoverHandler { id: hover acceptedDevices: PointerDevice.AllDevices property var scenePoint: transformable.mapToItem(root, point.position.x, point.position.y) } Text { text: "Pinch with 2 fingers to scale, rotate and translate\nMouse wheel to scale, Ctrl+mouse wheel or horizontal wheel to rotate" + getTransformationDetails(parent, parentPinch) } } Rectangle { width: 1; height: parent.height color: "blue" x: hover.scenePoint.x Text { x: implicitWidth / -2; style: Text.Outline; styleColor: "white" y: 30 color: "blue" text: "outer " + parent.x.toFixed(2) + " inner " + hover.point.position.x.toFixed(2) } } Rectangle { width: parent.width; height: 1 color: "blue" y: hover.scenePoint.y Text { x: 45 y: implicitHeight / -2; style: Text.Outline; styleColor: "white" color: "blue" text: "outer " + parent.y.toFixed(2) + " inner " + hover.point.position.y.toFixed(2) } } }