/**************************************************************************** ** ** 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); } } }