2022-05-13 13:12:05 +00:00
// Copyright (C) 2021 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
2021-09-06 19:40:18 +00:00
import QtQuick
import QtQuick . Layouts
import shared as Examples
import "components"
Rectangle {
id: window
width: 800
height: 800
visible: true
Examples . LauncherList {
id: ll
objectName: "LauncherList"
anchors.fill: parent
Component.onCompleted: {
addExample ( "tap" , "TapHandler: device-agnostic tap/click detection for buttons" , Qt . resolvedUrl ( "tapHandler.qml" ) )
addExample ( "multibuttons" , "TapHandler: gesturePolicy (99 red balloons)" , Qt . resolvedUrl ( "multibuttons.qml" ) )
Add TapHandler.gesturePolicy: DragWithinBounds enum value; examples
On a touchscreen, right-clicking is not directly possible; so sometimes
a long-press gesture is used as a substitute. The next thing a UI
designer would want would then be a way of showing feedback that a
long-press is in progress, rather than simply waiting for the long-press
to occur and then surprising the user with some instant action.
For example, a menu might begin to open as the user holds down the
touchpoint; but before the long-press gesture is complete, the user can
simply release, to cancel the gesture and close the menu. The timeHeld
property could drive the animation, to avoid needing a separate
animation type; in fact the reason timeHeld exists is to make it easy
to emulate this sort of touch-press animation, like one that occurs on
touchscreens since Windows 7.
But after the menu is open, the user would probably expect to be able to
drag the finger to a menu item and release, to select the menu item. For
such a purpose, the existing gesture policies weren't very useful: each
of them resets the timeHeld property if the user drags beyond the drag
threshold; so if the user expects to drag and release over a menu item,
then the timeHeld property cannot drive the menu-opening animation,
because the menu would disappear as soon as the user drags a little.
So it makes more sense to have a gesturePolicy that acts like
WithinBounds, but also applies the same policy to the timeHeld property
and the longPressed signal. We don't care about the drag threshold:
if the user is holding down a finger, it's considered to be a
long-press-in-progress, regardless of how far it has moved since press
(as long as it stays within the parent's bounds).
An example of such a menu is added. The menu must have TapHandler as
its root object, because it reacts to press-and-drag within some larger
item, larger than the menu itself. For example such a menu could be
used in a canvas-like application (drawing, diagramming, dragging things
like photos or file icons, or something like that): dragging items on
the canvas is possible, but long-pressing anywhere will open a context
menu. But in this example so far, only the menu is implemented.
It's a pie menu, because those are particularly touch-friendly; but
perhaps for the mouse, a conventional context menu would be used.
[ChangeLog][QtQuick][Event Handlers] TapHandler now has one more
gesturePolicy value: DragWithinBounds; it is similar to WithinBounds,
except that timeHeld is not reset during dragging, and the longPressed
signal can be emitted regardless of the drag threshold. This is useful
for implementing press-drag-release components such as menus, while
using timeHeld to directly drive an "opening" animation.
Change-Id: I298f8b1ad8f8d7d3c241ef4fdd68e7ec8d8b5bdd
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
2021-10-07 20:27:32 +00:00
addExample ( "pieMenu" , "TapHandler: pie menu" , Qt . resolvedUrl ( "pieMenu.qml" ) )
2021-09-06 19:40:18 +00:00
addExample ( "single point handler" , "PointHandler: properties such as seat, device, modifiers, velocity, pressure" , Qt . resolvedUrl ( "singlePointHandlerProperties.qml" ) )
2023-06-29 10:51:23 +00:00
addExample ( "multiflame" , "PointHandler: particle flames around touchpoints" , Qt . resolvedUrl ( "multiflame.qml" ) )
2021-09-06 19:40:18 +00:00
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" ) )
2023-06-29 10:51:23 +00:00
addExample ( "corkboards" , "editable, movable sticky notes in a ListView" , Qt . resolvedUrl ( "corkboards.qml" ) )
2021-09-06 19:40:18 +00:00
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" ) )
}
}
Item {
id: glassPane
objectName: "glassPane"
z: 10000
anchors.fill: parent
2021-12-09 07:06:18 +00:00
Instantiator {
model: 10
delegate: TouchpointFeedbackSprite { parent: glassPane }
}
2021-09-06 19:40:18 +00:00
}
2023-04-19 12:53:57 +00:00
MouseFeedbackSprite { }
2021-09-06 19:40:18 +00:00
}