Qt Quick 2 Custom Input Example

 /****************************************************************************
 **
 ** Copyright (C) 2016 The Qt Company Ltd.
 ** Contact: https://www.qt.io/licensing/
 **
 ** This file is part of the Qt Data Visualization module of the Qt Toolkit.
 **
 ** $QT_BEGIN_LICENSE:GPL$
 ** 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 or (at your option) any later version
 ** approved by the KDE Free Qt Foundation. The licenses are as published by
 ** the Free Software Foundation and appearing in the file LICENSE.GPL3
 ** 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.1
 import QtQuick.Layouts 1.0
 import QtDataVisualization 1.0
 import "."

 Rectangle {
     id: mainView
     width: 1280
     height: 720

     Data {
         id: graphData
     }

     Item {
         id: dataView
         anchors.bottom: parent.bottom
         width: parent.width
         height: parent.height - buttonLayout.height

         Scatter3D {
             id: scatterGraph
             width: dataView.width
             height: dataView.height
             theme: Theme3D { type: Theme3D.ThemeDigia }
             shadowQuality: AbstractGraph3D.ShadowQualityMedium
             scene.activeCamera.yRotation: 30.0
             inputHandler: null

             Scatter3DSeries {
                 id: scatterSeriesOne
                 itemLabelFormat: "One - X:@xLabel Y:@yLabel Z:@zLabel"
                 mesh: Abstract3DSeries.MeshCube

                 ItemModelScatterDataProxy {
                     itemModel: graphData.modelOne
                     xPosRole: "xPos"
                     yPosRole: "yPos"
                     zPosRole: "zPos"
                 }
             }

             Scatter3DSeries {
                 id: scatterSeriesTwo
                 itemLabelFormat: "Two - X:@xLabel Y:@yLabel Z:@zLabel"
                 mesh: Abstract3DSeries.MeshCube

                 ItemModelScatterDataProxy {
                     itemModel: graphData.modelTwo
                     xPosRole: "xPos"
                     yPosRole: "yPos"
                     zPosRole: "zPos"
                 }
             }

             Scatter3DSeries {
                 id: scatterSeriesThree
                 itemLabelFormat: "Three - X:@xLabel Y:@yLabel Z:@zLabel"
                 mesh: Abstract3DSeries.MeshCube

                 ItemModelScatterDataProxy {
                     itemModel: graphData.modelThree
                     xPosRole: "xPos"
                     yPosRole: "yPos"
                     zPosRole: "zPos"
                 }
             }
         }

         MouseArea {
             id: inputArea
             anchors.fill: parent
             hoverEnabled: true
             acceptedButtons: Qt.LeftButton | Qt.RightButton
             property int mouseX: -1
             property int mouseY: -1

             onPositionChanged: {
                 mouseX = mouse.x;
                 mouseY = mouse.y;
             }

             onWheel: {
                 // Adjust zoom level based on what zoom range we're in.
                 var zoomLevel = scatterGraph.scene.activeCamera.zoomLevel;
                 if (zoomLevel > 100)
                     zoomLevel += wheel.angleDelta.y / 12.0;
                 else if (zoomLevel > 50)
                     zoomLevel += wheel.angleDelta.y / 60.0;
                 else
                     zoomLevel += wheel.angleDelta.y / 120.0;
                 if (zoomLevel > 500)
                     zoomLevel = 500;
                 else if (zoomLevel < 10)
                     zoomLevel = 10;

                 scatterGraph.scene.activeCamera.zoomLevel = zoomLevel;
             }
         }

         Timer {
             id: reselectTimer
             interval: 10
             running: true
             repeat: true
             onTriggered: {
                 scatterGraph.scene.selectionQueryPosition = Qt.point(inputArea.mouseX, inputArea.mouseY);
             }
         }
     }

     NumberAnimation {
         id: cameraAnimationX
         loops: Animation.Infinite
         running: true
         target: scatterGraph.scene.activeCamera
         property:"xRotation"
         from: 0.0
         to: 360.0
         duration: 20000
     }

     SequentialAnimation {
         id: cameraAnimationY
         loops: Animation.Infinite
         running: true

         NumberAnimation {
             target: scatterGraph.scene.activeCamera
             property:"yRotation"
             from: 5.0
             to: 45.0
             duration: 9000
             easing.type: Easing.InOutSine
         }

         NumberAnimation {
             target: scatterGraph.scene.activeCamera
             property:"yRotation"
             from: 45.0
             to: 5.0
             duration: 9000
             easing.type: Easing.InOutSine
         }
     }

     RowLayout {
         id: buttonLayout
         Layout.minimumHeight: shadowToggle.height
         width: parent.width
         anchors.left: parent.left
         spacing: 0

         NewButton {
             id: shadowToggle
             Layout.fillHeight: true
             Layout.minimumWidth: parent.width / 3 // 3 buttons divided equally in the layout
             text: scatterGraph.shadowsSupported ? "Hide Shadows" : "Shadows not supported"
             enabled: scatterGraph.shadowsSupported

             onClicked: {
                 if (scatterGraph.shadowQuality === AbstractGraph3D.ShadowQualityNone) {
                     scatterGraph.shadowQuality = AbstractGraph3D.ShadowQualityMedium;
                     text = "Hide Shadows";
                 } else {
                     scatterGraph.shadowQuality = AbstractGraph3D.ShadowQualityNone;
                     text = "Show Shadows";
                 }
             }
         }

         NewButton {
             id: cameraToggle
             Layout.fillHeight: true
             Layout.minimumWidth: parent.width / 3
             text: "Pause Camera"

             onClicked: {
                 cameraAnimationX.paused = !cameraAnimationX.paused;
                 cameraAnimationY.paused = cameraAnimationX.paused;
                 if (cameraAnimationX.paused) {
                     text = "Animate Camera";
                 } else {
                     text = "Pause Camera";
                 }
             }
         }

         NewButton {
             id: exitButton
             Layout.fillHeight: true
             Layout.minimumWidth: parent.width / 3
             text: "Quit"
             onClicked: Qt.quit(0);
         }
     }
 }