// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only

/*!
    \example qmlcustominput
    \title Qt Quick 2 Custom Input Example
    \ingroup qtdatavisualization_examples
    \brief Customizing input in a QML application.

    The Qt Quick 2 Custom Input example shows how to customize the 3D graph controls from Qt Quick 2 using the MouseArea to capture and process mouse events in QML.
    Custom input handling code in this example shows how the camera is now controlled by using NumberAnimation to animate the camera and item selection
    is done on mouseover rather than clicking any mouse buttons. Also the code shows how to implement similar zoom with mouse wheel functionality as the default
    input handler implements.

    \image qmlcustominput-example.png

    \include examples-run.qdocinc

    \section1 Removing Default Input Handling

    The default input handling mechanism is disabled by setting the inputHandler property to null.

    \snippet qmlcustominput/qml/qmlcustominput/main.qml 0
    \dots 0
    \snippet qmlcustominput/qml/qmlcustominput/main.qml 1
    \dots 0

    \section1 Implementing Custom Selection Handling

    The on mouseover selection handling is implemented using standard MouseArea to capture the mouse events.
    The mouse area is configured to capture hover events and has two custom properties for \c mouseX and \c mouseY
    to store the last known mouse coordinates.

    \snippet qmlcustominput/qml/qmlcustominput/main.qml 2

    Whenever a pointer movement related signal is received the code updates the \c mouseX and \c mouseY properties.

    \snippet qmlcustominput/qml/qmlcustominput/main.qml 3

    As the selection is one shot, and is cleared each time a 3D frame is rendered, a timer is setup to retrigger selection so that the selection moves to the item
    currently under the mouse cursor as the camera animates around the graph even when the mouse cursor is not moving.

    \snippet qmlcustominput/qml/qmlcustominput/main.qml 4

    \section1 Implementing Custom Zoom Handling

    The camera has a zoom factor that represents amount of zoom in percentages. In this example the zoom range is limited
    between 10% and 500%. This range is then divided to four subranges where angleDelta is scaled to different amount of zoom change
    based on the current subrange.

    \dots
    \snippet qmlcustominput/qml/qmlcustominput/main.qml 5
    \dots

    \section1 Implementing Custom Camera Handling

    The camera is animated to constantly rotate around the graph with two animations. The rotation around the graph is done with
    a simple NumberAnimation that just increments during 20 seconds from 0 degrees to 360 degrees and sets the \l Q3DCamera::xRotation property.

    \snippet qmlcustominput/qml/qmlcustominput/main.qml 6

    The camera movement up and down is implemented with a SequentialAnimation that varies the \l Q3DCamera::yRotation property of the camera
    from 5 degrees to 45 degrees and back with in and out easing.

    \snippet qmlcustominput/qml/qmlcustominput/main.qml 7
*/
