2021-09-06 19:40:18 +00:00
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* *
* * Copyright ( C ) 2021 The Qt Company Ltd .
* * Contact: https: //www.qt.io/licensing/
* *
* * This file is part of the examples of the Qt Toolkit .
* *
* * $QT_BEGIN_LICENSE : BSD $
* * 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.
* *
* * BSD License Usage
* * Alternatively , you may use this file under the terms of the BSD license
* * as follows:
* *
* * " Redistribution and use in source and binary forms , with or without
* * modification , are permitted provided that the following conditions are
* * met:
* * * Redistributions of source code must retain the above copyright
* * notice , this list of conditions and the following disclaimer .
* * * Redistributions in binary form must reproduce the above copyright
* * notice , this list of conditions and the following disclaimer in
* * the documentation and / or other materials provided with the
* * distribution .
* * * Neither the name of The Qt Company Ltd nor the names of its
* * contributors may be used to endorse or promote products derived
* * from this software without specific prior written permission .
* *
* *
* * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT
* * LIMITED TO , THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* * A PARTICULAR PURPOSE ARE DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT
* * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT , INDIRECT , INCIDENTAL ,
* * SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT NOT
* * LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE ,
* * DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY
* * THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
* * ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE
* * OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE . "
* *
* * $QT_END_LICENSE $
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
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" ) )
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" ) )
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
// TODO use Instantiator to create these... but we need to be able to set their parents to glassPane somehow (QTBUG-64546)
TouchpointFeedbackSprite { }
TouchpointFeedbackSprite { }
TouchpointFeedbackSprite { }
TouchpointFeedbackSprite { }
TouchpointFeedbackSprite { }
TouchpointFeedbackSprite { }
MouseFeedbackSprite { }
}
}