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

/*!
    \example custominput
    \title Custom Input Example
    \ingroup qtdatavisualization_examples
    \brief Implementing custom input handler in a widget application.

    The Custom Input example shows how to customize the 3D graph controls in a widget application
    using a custom graph input handler to capture and process mouse events.
    The code in this example shows also how the camera is controlled by using QPropertyAnimation
    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 custominput-example.png

    \include examples-run.qdocinc

    \section1 Replacing Default Input Handling

    The default input handling mechanism is replaced by setting the active input handler of
    Q3DScatter to \c CustomInputHandler that implements the custom behavior.

    \snippet custominput/scatterdatamodifier.cpp 0

    \section1 Implementing Custom Selection Handling

    The on mouseover selection handling is implemented in the \c CustomInputHandler that captures
    the mouse events. It then stores the last known coordinates to the
    QAbstract3DInputHandler::inputPosition property.

    \snippet custominput/custominputhandler.cpp 0

    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 custominput/scatterdatamodifier.cpp 1

    \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
    \c angleDelta is scaled to different amount of zoom change based on the current subrange.

    \snippet custominput/custominputhandler.cpp 1

    \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 QPropertyAnimation that just increments during 20
    seconds from 0 degrees to 360 degrees and sets the Q3DCamera::xRotation property.

    \snippet custominput/scatterdatamodifier.cpp 2

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

    \snippet custominput/scatterdatamodifier.cpp 3
*/
