summaryrefslogtreecommitdiffstats
path: root/tests/manual/qmldynamicdata
diff options
context:
space:
mode:
Diffstat (limited to 'tests/manual/qmldynamicdata')
-rw-r--r--tests/manual/qmldynamicdata/main.cpp51
-rw-r--r--tests/manual/qmldynamicdata/qml/qmldynamicdata/NewButton.qml46
-rw-r--r--tests/manual/qmldynamicdata/qml/qmldynamicdata/main.qml263
-rw-r--r--tests/manual/qmldynamicdata/qmldynamicdata.pro9
-rw-r--r--tests/manual/qmldynamicdata/qmldynamicdata.qrc6
5 files changed, 375 insertions, 0 deletions
diff --git a/tests/manual/qmldynamicdata/main.cpp b/tests/manual/qmldynamicdata/main.cpp
new file mode 100644
index 00000000..b2f98108
--- /dev/null
+++ b/tests/manual/qmldynamicdata/main.cpp
@@ -0,0 +1,51 @@
+/******************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Data Visualization module.
+**
+** $QT_BEGIN_LICENSE:COMM$
+**
+** 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 http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** $QT_END_LICENSE$
+**
+******************************************************************************/
+
+#include <QtGui/QGuiApplication>
+#include <QtCore/QDir>
+#include <QtQuick/QQuickView>
+#include <QtQml/QQmlEngine>
+
+int main(int argc, char *argv[])
+{
+ QGuiApplication app(argc, argv);
+
+ QQuickView viewer;
+
+ // The following are needed to make examples run without having to install the module
+ // in desktop environments.
+#ifdef Q_OS_WIN
+ QString extraImportPath(QStringLiteral("%1/../../../%2"));
+#else
+ QString extraImportPath(QStringLiteral("%1/../../%2"));
+#endif
+ viewer.engine()->addImportPath(extraImportPath.arg(QGuiApplication::applicationDirPath(),
+ QString::fromLatin1("qml")));
+ QObject::connect(viewer.engine(), &QQmlEngine::quit, &viewer, &QWindow::close);
+
+ viewer.setTitle(QStringLiteral("QML Dynamic Data Test"));
+
+ viewer.setSource(QUrl("qrc:/qml/qmldynamicdata/main.qml"));
+ viewer.setResizeMode(QQuickView::SizeRootObjectToView);
+ viewer.show();
+
+ return app.exec();
+}
diff --git a/tests/manual/qmldynamicdata/qml/qmldynamicdata/NewButton.qml b/tests/manual/qmldynamicdata/qml/qmldynamicdata/NewButton.qml
new file mode 100644
index 00000000..ff191e77
--- /dev/null
+++ b/tests/manual/qmldynamicdata/qml/qmldynamicdata/NewButton.qml
@@ -0,0 +1,46 @@
+/******************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Data Visualization module.
+**
+** $QT_BEGIN_LICENSE:COMM$
+**
+** 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 http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** $QT_END_LICENSE$
+**
+******************************************************************************/
+
+import QtQuick 2.1
+import QtQuick.Controls 1.0
+
+Item {
+ id: newbutton
+
+ property alias text: buttonText.text
+
+ signal clicked
+
+ height: 80
+
+ Button {
+ width: parent.width
+ height: parent.height
+ Text {
+ id: buttonText
+ wrapMode: Text.WordWrap
+ verticalAlignment: Text.AlignVCenter
+ horizontalAlignment: Text.AlignHCenter
+ anchors.fill: parent
+ }
+ onClicked: newbutton.clicked()
+ }
+}
diff --git a/tests/manual/qmldynamicdata/qml/qmldynamicdata/main.qml b/tests/manual/qmldynamicdata/qml/qmldynamicdata/main.qml
new file mode 100644
index 00000000..00cc2271
--- /dev/null
+++ b/tests/manual/qmldynamicdata/qml/qmldynamicdata/main.qml
@@ -0,0 +1,263 @@
+/******************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Data Visualization module.
+**
+** $QT_BEGIN_LICENSE:COMM$
+**
+** 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 http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** $QT_END_LICENSE$
+**
+******************************************************************************/
+
+import QtQuick 2.1
+import QtDataVisualization 1.0
+import "."
+
+Rectangle {
+ id: mainView
+ width: 1280
+ height: 720
+ visible: true
+
+ ListModel {
+ id: graphModel
+ ListElement{ xPos: 0.0; yPos: 0.0; zPos: 0.0; rotation: "0.92388, 0.220942, 0.220942, 0.220942"}
+ ListElement{ xPos: 1.0; yPos: 1.0; zPos: 1.0; rotation: "@45,1.0,1.0,1.0" }
+ }
+
+ Timer {
+ id: dataTimer
+ interval: 1
+ running: true
+ repeat: true
+ property bool isIncreasing: true
+ property real rotationAngle: 0
+
+ function generateQuaternion() {
+ return "@" + Math.random() * 360 + "," + Math.random() + "," + Math.random() + "," + Math.random()
+ }
+
+ function appendRow() {
+ graphModel.append({"xPos": Math.random(),
+ "yPos": Math.random(),
+ "zPos": Math.random(),
+ "rotation": generateQuaternion()
+ });
+ }
+
+ onTriggered: {
+ rotationAngle = rotationAngle + 1
+ scatterSeries.setMeshAxisAndAngle(Qt.vector3d(1,1,1), rotationAngle)
+ if (isIncreasing) {
+ appendRow()
+ appendRow()
+ appendRow()
+ appendRow()
+ appendRow()
+ appendRow()
+ appendRow()
+ appendRow()
+ appendRow()
+ appendRow()
+ if (graphModel.count > 5000) {
+ scatterGraph.theme.type = Theme3D.ThemeIsabelle;
+ isIncreasing = false;
+ }
+ } else {
+ graphModel.remove(Math.random() * (graphModel.count - 1));
+ graphModel.remove(Math.random() * (graphModel.count - 1));
+ graphModel.remove(Math.random() * (graphModel.count - 1));
+ graphModel.remove(Math.random() * (graphModel.count - 1));
+ graphModel.remove(Math.random() * (graphModel.count - 1));
+ graphModel.remove(Math.random() * (graphModel.count - 1));
+ graphModel.remove(Math.random() * (graphModel.count - 1));
+ graphModel.remove(Math.random() * (graphModel.count - 1));
+ graphModel.remove(Math.random() * (graphModel.count - 1));
+ graphModel.remove(Math.random() * (graphModel.count - 1));
+ if (graphModel.count == 2) {
+ scatterGraph.theme.type = Theme3D.ThemeDigia;
+ isIncreasing = true;
+ }
+ }
+ }
+ }
+
+ ThemeColor {
+ id: dynamicColor
+ ColorAnimation on color {
+ from: "red"
+ to: "yellow"
+ duration: 5000
+ loops: Animation.Infinite
+ }
+ }
+
+ Item {
+ id: dataView
+ anchors.bottom: parent.bottom
+ width: parent.width
+ height: parent.height - shadowToggle.height
+
+ Scatter3D {
+ id: scatterGraph
+ width: dataView.width
+ height: dataView.height
+ theme: Theme3D {
+ type: Theme3D.ThemeQt
+ baseColors: [dynamicColor]
+ }
+ shadowQuality: AbstractGraph3D.ShadowQualitySoftMedium
+ scene.activeCamera.yRotation: 30.0
+ inputHandler: null
+ axisX.min: 0
+ axisY.min: 0
+ axisZ.min: 0
+ axisX.max: 1
+ axisY.max: 1
+ axisZ.max: 1
+
+ Scatter3DSeries {
+ id: scatterSeries
+ itemLabelFormat: "X:@xLabel Y:@yLabel Z:@zLabel"
+ mesh: Abstract3DSeries.MeshCube
+
+ ItemModelScatterDataProxy {
+ itemModel: graphModel
+ xPosRole: "xPos"
+ yPosRole: "yPos"
+ zPosRole: "zPos"
+ rotationRole: "rotation"
+ }
+ }
+ }
+
+ 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
+ }
+ }
+
+ NewButton {
+ id: shadowToggle
+ width: parent.width / 3 // We're adding 3 buttons and want to divide them equally
+ text: "Hide Shadows"
+ anchors.left: parent.left
+
+ onClicked: {
+ if (scatterGraph.shadowQuality === AbstractGraph3D.ShadowQualityNone) {
+ scatterGraph.shadowQuality = AbstractGraph3D.ShadowQualitySoftMedium;
+ text = "Hide Shadows";
+ } else {
+ scatterGraph.shadowQuality = AbstractGraph3D.ShadowQualityNone;
+ text = "Show Shadows";
+ }
+ }
+ }
+
+ NewButton {
+ id: cameraToggle
+ width: parent.width / 3
+ text: "Pause Camera"
+ anchors.left: shadowToggle.right
+
+ onClicked: {
+ cameraAnimationX.paused = !cameraAnimationX.paused;
+ cameraAnimationY.paused = cameraAnimationX.paused;
+ if (cameraAnimationX.paused) {
+ text = "Animate Camera";
+ } else {
+ text = "Pause Camera";
+ }
+ }
+ }
+
+ NewButton {
+ id: exitButton
+ width: parent.width / 3
+ text: "Quit"
+ anchors.left: cameraToggle.right
+ onClicked: Qt.quit(0);
+ }
+}
diff --git a/tests/manual/qmldynamicdata/qmldynamicdata.pro b/tests/manual/qmldynamicdata/qmldynamicdata.pro
new file mode 100644
index 00000000..a6ffeb3d
--- /dev/null
+++ b/tests/manual/qmldynamicdata/qmldynamicdata.pro
@@ -0,0 +1,9 @@
+!include( ../tests.pri ) {
+ error( "Couldn't find the tests.pri file!" )
+}
+
+SOURCES += main.cpp
+
+RESOURCES += qmldynamicdata.qrc
+
+OTHER_FILES += qml/qmldynamicdata/*
diff --git a/tests/manual/qmldynamicdata/qmldynamicdata.qrc b/tests/manual/qmldynamicdata/qmldynamicdata.qrc
new file mode 100644
index 00000000..76641cf9
--- /dev/null
+++ b/tests/manual/qmldynamicdata/qmldynamicdata.qrc
@@ -0,0 +1,6 @@
+<RCC>
+ <qresource prefix="/">
+ <file>qml/qmldynamicdata/main.qml</file>
+ <file>qml/qmldynamicdata/NewButton.qml</file>
+ </qresource>
+</RCC>