summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/datavisualization/data/qbar3dseries.cpp2
-rw-r--r--src/datavisualization/data/qscatter3dseries.cpp2
-rw-r--r--src/datavisualization/data/qsurface3dseries.cpp2
-rw-r--r--src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc26
-rw-r--r--src/datavisualization/engine/abstract3drenderer.cpp6
-rw-r--r--src/datavisualization/engine/scatter3drenderer.cpp9
-rw-r--r--src/datavisualization/engine/surface3drenderer.cpp5
-rw-r--r--src/datavisualizationqml2/abstractdeclarative.cpp38
-rw-r--r--src/datavisualizationqml2/abstractdeclarative_p.h21
-rw-r--r--tests/qmldynamicdata/qmldynamicdata.pro2
-rw-r--r--tests/qmlmultigraph/main.cpp54
-rw-r--r--tests/qmlmultigraph/qml/qmlmultigraph/main.qml162
-rw-r--r--tests/qmlmultigraph/qml/qmlmultigraph/newbutton.qml52
-rw-r--r--tests/qmlmultigraph/qmlmultigraph.pro25
-rw-r--r--tests/qmlmultigraph/qmlmultigraph.qrc6
-rw-r--r--tests/qmlmultigraph/qtquick2applicationviewer/qtquick2applicationviewer.cpp81
-rw-r--r--tests/qmlmultigraph/qtquick2applicationviewer/qtquick2applicationviewer.h33
-rw-r--r--tests/qmlmultigraph/qtquick2applicationviewer/qtquick2applicationviewer.pri180
-rw-r--r--tests/tests.pro3
19 files changed, 687 insertions, 22 deletions
diff --git a/src/datavisualization/data/qbar3dseries.cpp b/src/datavisualization/data/qbar3dseries.cpp
index 357feca6..6f0973cc 100644
--- a/src/datavisualization/data/qbar3dseries.cpp
+++ b/src/datavisualization/data/qbar3dseries.cpp
@@ -212,7 +212,7 @@ QBar3DSeriesPrivate::QBar3DSeriesPrivate(QBar3DSeries *q)
: QAbstract3DSeriesPrivate(q, QAbstract3DSeries::SeriesTypeBar),
m_selectedBar(Bars3DController::invalidSelectionPosition())
{
- m_itemLabelFormat = QStringLiteral("@valueTitle: @valueLabel");
+ m_itemLabelFormat = QStringLiteral("@valueLabel");
m_mesh = QAbstract3DSeries::MeshBevelBar;
}
diff --git a/src/datavisualization/data/qscatter3dseries.cpp b/src/datavisualization/data/qscatter3dseries.cpp
index 8604c3f0..0e7ce921 100644
--- a/src/datavisualization/data/qscatter3dseries.cpp
+++ b/src/datavisualization/data/qscatter3dseries.cpp
@@ -237,7 +237,7 @@ QScatter3DSeriesPrivate::QScatter3DSeriesPrivate(QScatter3DSeries *q)
m_selectedItem(Scatter3DController::invalidSelectionIndex()),
m_itemSize(0.0f)
{
- m_itemLabelFormat = QStringLiteral("@valueTitle: @valueLabel");
+ m_itemLabelFormat = QStringLiteral("@xLabel, @yLabel, @zLabel");
m_mesh = QAbstract3DSeries::MeshSphere;
}
diff --git a/src/datavisualization/data/qsurface3dseries.cpp b/src/datavisualization/data/qsurface3dseries.cpp
index 1d456243..da285b2d 100644
--- a/src/datavisualization/data/qsurface3dseries.cpp
+++ b/src/datavisualization/data/qsurface3dseries.cpp
@@ -306,7 +306,7 @@ QSurface3DSeriesPrivate::QSurface3DSeriesPrivate(QSurface3DSeries *q)
m_flatShadingEnabled(true),
m_drawMode(QSurface3DSeries::DrawSurfaceAndWireframe)
{
- m_itemLabelFormat = QStringLiteral("(@xLabel, @yLabel, @zLabel)");
+ m_itemLabelFormat = QStringLiteral("@xLabel, @yLabel, @zLabel");
m_mesh = QAbstract3DSeries::MeshSphere;
}
diff --git a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc
index 21dabf66..5ac6a03f 100644
--- a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc
+++ b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc
@@ -42,6 +42,11 @@
*/
/*!
+ \qmlproperty Scene3D AbstractGraph3D::scene
+ Read only Q3DScene that can be used to access e.g. camera object.
+ */
+
+/*!
\qmlproperty AbstractInputHandler3D AbstractGraph3D::inputHandler
Input handler. You can disable default input handlers by setting this property to \c null.
*/
@@ -50,3 +55,24 @@
\qmlproperty Theme3D AbstractGraph3D::theme
The active theme of the graph.
*/
+
+/*!
+ \qmlproperty bool AbstractGraph3D::clearWindowBeforeRendering
+
+ Indicates if the graph should also clear the whole window before rendering the graph,
+ including the areas outside the graph.
+ Since the graphs are drawn first under other QML items, the regular QML window clearing
+ before rendering is suppressed when there are any graphs in the window; the graphs
+ handle the clearing themselves instead.
+ If you have any other items besides graphs that do similar
+ custom drawing under other QML items, you need to set this property to false on all graphs
+ drawn to same window with the other custom items, or it is likely that the
+ other custom items do not render properly.
+ Defaults to true.
+
+ \note This property should be set to the same value for all graphs in the same window.
+ Otherwise some graphs may not show.
+
+ \note If window clearing before rendering is suppressed, any areas of the window not fully
+ covered with opaque items may not draw properly.
+ */
diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp
index 32435946..19b9a8c8 100644
--- a/src/datavisualization/engine/abstract3drenderer.cpp
+++ b/src/datavisualization/engine/abstract3drenderer.cpp
@@ -122,9 +122,15 @@ void Abstract3DRenderer::render(const GLuint defaultFboHandle)
m_viewport.y(),
m_viewport.width(),
m_viewport.height());
+ glScissor(m_viewport.x(),
+ m_viewport.y(),
+ m_viewport.width(),
+ m_viewport.height());
+ glEnable(GL_SCISSOR_TEST);
QVector3D clearColor = Utils::vectorFromColor(m_cachedTheme->windowColor());
glClearColor(clearColor.x(), clearColor.y(), clearColor.z(), 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glDisable(GL_SCISSOR_TEST);
}
QString Abstract3DRenderer::generateValueLabel(const QString &format, float value)
diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp
index b70fd5b4..85863519 100644
--- a/src/datavisualization/engine/scatter3drenderer.cpp
+++ b/src/datavisualization/engine/scatter3drenderer.cpp
@@ -454,6 +454,10 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
&& SelectOnScene == m_selectionState && seriesCount > 0) {
// Draw dots to selection buffer
glBindFramebuffer(GL_FRAMEBUFFER, m_selectionFrameBuffer);
+ glViewport(0, 0,
+ m_primarySubViewport.width(),
+ m_primarySubViewport.height());
+
glEnable(GL_DEPTH_TEST); // Needed, otherwise the depth render buffer is not used
glClearColor(1.0f, 1.0f, 1.0f, 1.0f); // Set clear color to white (= skipColor)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Needed for clearing the frame buffer
@@ -552,7 +556,12 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
selectionColorToSeriesAndIndex(clickedColor, clickedIndex, clickedSeries);
emit itemClicked(clickedIndex, clickedSeries);
+ // Revert to original fbo and viewport
glBindFramebuffer(GL_FRAMEBUFFER, defaultFboHandle);
+ glViewport(m_primarySubViewport.x(),
+ m_primarySubViewport.y(),
+ m_primarySubViewport.width(),
+ m_primarySubViewport.height());
#if 0 // Use this if you want to see what is being drawn to the framebuffer
m_labelShader->bind();
diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp
index 912edd97..13a95670 100644
--- a/src/datavisualization/engine/surface3drenderer.cpp
+++ b/src/datavisualization/engine/surface3drenderer.cpp
@@ -881,6 +881,7 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle)
// Render scene into a depth texture for using with shadow mapping
// Enable drawing to depth framebuffer
glBindFramebuffer(GL_FRAMEBUFFER, m_depthFrameBuffer);
+
// Attach texture to depth attachment
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, m_depthTexture, 0);
glClear(GL_DEPTH_BUFFER_BIT);
@@ -2147,6 +2148,10 @@ void Surface3DRenderer::updateDepthBuffer()
m_textureHelper->deleteTexture(&m_depthTexture);
m_depthTexture = 0;
}
+ if (m_depthModelTexture) {
+ m_textureHelper->deleteTexture(&m_depthModelTexture);
+ m_depthModelTexture = 0;
+ }
if (m_primarySubViewport.size().isEmpty())
return;
diff --git a/src/datavisualizationqml2/abstractdeclarative.cpp b/src/datavisualizationqml2/abstractdeclarative.cpp
index 5cac1882..65f27da0 100644
--- a/src/datavisualizationqml2/abstractdeclarative.cpp
+++ b/src/datavisualizationqml2/abstractdeclarative.cpp
@@ -24,9 +24,12 @@
QT_DATAVISUALIZATION_BEGIN_NAMESPACE
+static QList<const QQuickWindow *> clearList;
+
AbstractDeclarative::AbstractDeclarative(QQuickItem *parent) :
QQuickItem(parent),
- m_controller(0)
+ m_controller(0),
+ m_clearWindowBeforeRendering(true)
{
connect(this, &QQuickItem::windowChanged, this, &AbstractDeclarative::handleWindowChanged);
setAntialiasing(true);
@@ -51,6 +54,19 @@ Q3DTheme *AbstractDeclarative::theme() const
return m_controller->activeTheme();
}
+void AbstractDeclarative::setClearWindowBeforeRendering(bool enable)
+{
+ if (m_clearWindowBeforeRendering != enable) {
+ m_clearWindowBeforeRendering = enable;
+ emit clearWindowBeforeRenderingChanged(enable);
+ }
+}
+
+bool AbstractDeclarative::clearWindowBeforeRendering() const
+{
+ return m_clearWindowBeforeRendering;
+}
+
void AbstractDeclarative::setSelectionMode(QDataVis::SelectionFlags mode)
{
m_controller->setSelectionMode(mode);
@@ -87,6 +103,8 @@ void AbstractDeclarative::setSharedController(Abstract3DController *controller)
void AbstractDeclarative::synchDataToRenderer()
{
+ if (m_clearWindowBeforeRendering && clearList.size())
+ clearList.clear();
m_controller->initializeOpenGL();
m_controller->synchDataToRenderer();
}
@@ -140,10 +158,9 @@ void AbstractDeclarative::updateWindowParameters()
win->update();
}
- QPointF point = QQuickItem::mapToScene(QPointF(m_cachedGeometry.x(), m_cachedGeometry.y()));
- if (m_controller) {
+ QPointF point = QQuickItem::mapToScene(QPointF(0.0f, 0.0f));
+ if (m_controller)
scene->d_ptr->setViewport(QRect(point.x(), point.y(), m_cachedGeometry.width(), m_cachedGeometry.height()));
- }
}
}
@@ -151,11 +168,14 @@ void AbstractDeclarative::render()
{
updateWindowParameters();
- // Clear the background as that is not done by default
- glViewport(0, 0, window()->width(), window()->height());
- QColor clearColor = window()->color();
- glClearColor(clearColor.redF(), clearColor.greenF(), clearColor.blueF(), 1.0f);
- glClear(GL_COLOR_BUFFER_BIT);
+ // Clear the background once per window as that is not done by default
+ const QQuickWindow *win = window();
+ if (m_clearWindowBeforeRendering && !clearList.contains(win)) {
+ clearList.append(win);
+ QColor clearColor = win->color();
+ glClearColor(clearColor.redF(), clearColor.greenF(), clearColor.blueF(), 1.0f);
+ glClear(GL_COLOR_BUFFER_BIT);
+ }
// TODO: Store the state of these and restore before returning
glDepthMask(GL_TRUE);
diff --git a/src/datavisualizationqml2/abstractdeclarative_p.h b/src/datavisualizationqml2/abstractdeclarative_p.h
index 42cf13a4..5da22df3 100644
--- a/src/datavisualizationqml2/abstractdeclarative_p.h
+++ b/src/datavisualizationqml2/abstractdeclarative_p.h
@@ -48,11 +48,18 @@ class AbstractDeclarative : public QQuickItem
Q_PROPERTY(Q3DScene* scene READ scene NOTIFY sceneChanged)
Q_PROPERTY(QAbstract3DInputHandler* inputHandler READ inputHandler WRITE setInputHandler NOTIFY inputHandlerChanged)
Q_PROPERTY(Q3DTheme* theme READ theme WRITE setTheme NOTIFY themeChanged)
+ Q_PROPERTY(bool clearWindowBeforeRendering READ clearWindowBeforeRendering WRITE setClearWindowBeforeRendering NOTIFY clearWindowBeforeRenderingChanged)
public:
explicit AbstractDeclarative(QQuickItem *parent = 0);
virtual ~AbstractDeclarative();
+ virtual void setSelectionMode(QDataVis::SelectionFlags mode);
+ virtual QDataVis::SelectionFlags selectionMode() const;
+
+ virtual void setShadowQuality(QDataVis::ShadowQuality quality);
+ virtual QDataVis::ShadowQuality shadowQuality() const;
+
virtual Q3DScene *scene() const;
virtual QAbstract3DInputHandler *inputHandler() const;
@@ -61,14 +68,11 @@ public:
virtual void setTheme(Q3DTheme *theme);
virtual Q3DTheme *theme() const;
- virtual void setSelectionMode(QDataVis::SelectionFlags mode);
- virtual QDataVis::SelectionFlags selectionMode() const;
+ virtual void setClearWindowBeforeRendering(bool enable);
+ virtual bool clearWindowBeforeRendering() const;
virtual void geometryChanged(const QRectF & newGeometry, const QRectF & oldGeometry);
- virtual void setShadowQuality(QDataVis::ShadowQuality quality);
- virtual QDataVis::ShadowQuality shadowQuality() const;
-
void setSharedController(Abstract3DController *controller);
// Used to synch up data model from controller to renderer while main thread is locked
void synchDataToRenderer();
@@ -87,16 +91,17 @@ protected:
signals:
// Signals shadow quality changes.
+ void selectionModeChanged(QDataVis::SelectionFlags mode);
void shadowQualityChanged(QDataVis::ShadowQuality quality);
+ void sceneChanged(Q3DScene *scene);
void inputHandlerChanged(QAbstract3DInputHandler *inputHandler);
void themeChanged(Q3DTheme *theme);
- void selectionModeChanged(QDataVis::SelectionFlags mode);
- void itemLabelFormatChanged(QString format);
- void sceneChanged(Q3DScene *scene);
+ void clearWindowBeforeRenderingChanged(bool enable);
private:
Abstract3DController *m_controller;
QRectF m_cachedGeometry;
+ bool m_clearWindowBeforeRendering;
};
QT_DATAVISUALIZATION_END_NAMESPACE
diff --git a/tests/qmldynamicdata/qmldynamicdata.pro b/tests/qmldynamicdata/qmldynamicdata.pro
index da987ff0..b95f1577 100644
--- a/tests/qmldynamicdata/qmldynamicdata.pro
+++ b/tests/qmldynamicdata/qmldynamicdata.pro
@@ -1,5 +1,5 @@
!include( ../tests.pri ) {
- error( "Couldn't find the examples.pri file!" )
+ error( "Couldn't find the tests.pri file!" )
}
QT += widgets
diff --git a/tests/qmlmultigraph/main.cpp b/tests/qmlmultigraph/main.cpp
new file mode 100644
index 00000000..d4fb669f
--- /dev/null
+++ b/tests/qmlmultigraph/main.cpp
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVisualization module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+#include <QtGui/QGuiApplication>
+#include "qtquick2applicationviewer.h"
+#ifdef Q_OS_ANDROID
+#include <QDir>
+#include <QQmlEngine>
+#endif
+#include <QDebug>
+
+int main(int argc, char *argv[])
+{
+ QGuiApplication app(argc, argv);
+
+ QtQuick2ApplicationViewer viewer;
+
+#if !defined(QT_OPENGL_ES_2)
+ // Enable antialiasing
+ QSurfaceFormat surfaceFormat;
+ surfaceFormat.setDepthBufferSize(24);
+ surfaceFormat.setSamples(8);
+ surfaceFormat.setRenderableType(QSurfaceFormat::OpenGL);
+ surfaceFormat.setSwapBehavior(QSurfaceFormat::DoubleBuffer);
+ viewer.setFormat(surfaceFormat);
+#endif
+
+#ifdef Q_OS_ANDROID
+ viewer.addImportPath(QString::fromLatin1("assets:/qml"));
+ viewer.engine()->addPluginPath(QString::fromLatin1("%1/../%2").arg(QDir::homePath(),
+ QString::fromLatin1("lib")));
+#endif
+ viewer.setTitle(QStringLiteral("QML multigraph test"));
+ viewer.setSource(QUrl("qrc:/qml/main.qml"));
+ viewer.setResizeMode(QQuickView::SizeRootObjectToView);
+ viewer.showMaximized();
+
+ return app.exec();
+}
diff --git a/tests/qmlmultigraph/qml/qmlmultigraph/main.qml b/tests/qmlmultigraph/qml/qmlmultigraph/main.qml
new file mode 100644
index 00000000..fdc49132
--- /dev/null
+++ b/tests/qmlmultigraph/qml/qmlmultigraph/main.qml
@@ -0,0 +1,162 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVisualization module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+import QtQuick 2.1
+import QtQuick.Layouts 1.0
+import QtDataVisualization 1.0
+import "."
+
+Item {
+ id: mainView
+
+ Bars3D {
+ id: barGraph
+ width: parent.width / 3
+ anchors.top: emptySpace.bottom
+ anchors.bottom: parent.bottom
+ theme: Theme3D { type: Theme3D.ThemeIsabelle }
+ //clearWindowBeforeRendering: false
+
+ Bar3DSeries {
+ itemLabelFormat: "@colLabel, @rowLabel: @valueLabel"
+
+ ItemModelBarDataProxy {
+ itemModel: barDataModel
+ // Mapping model roles to bar series rows, columns, and values.
+ rowRole: "year"
+ columnRole: "city"
+ valueRole: "expenses"
+ }
+ }
+ }
+
+ ListModel {
+ id: barDataModel
+ ListElement{ year: "2012"; city: "Oulu"; expenses: "4200"; }
+ ListElement{ year: "2012"; city: "Rauma"; expenses: "2100"; }
+ ListElement{ year: "2012"; city: "Helsinki"; expenses: "7040"; }
+ ListElement{ year: "2012"; city: "Tampere"; expenses: "4330"; }
+ ListElement{ year: "2013"; city: "Oulu"; expenses: "3960"; }
+ ListElement{ year: "2013"; city: "Rauma"; expenses: "1990"; }
+ ListElement{ year: "2013"; city: "Helsinki"; expenses: "7230"; }
+ ListElement{ year: "2013"; city: "Tampere"; expenses: "4650"; }
+ }
+
+ Scatter3D {
+ id: scatterGraph
+ width: parent.width / 3
+ anchors.left: barGraph.right
+ anchors.top: emptySpace.bottom
+ anchors.bottom: parent.bottom
+ theme: Theme3D { type: Theme3D.ThemeIsabelle }
+ //clearWindowBeforeRendering: false
+
+ Scatter3DSeries {
+ ItemModelScatterDataProxy {
+ itemModel: scatterDataModel
+ // Mapping model roles to scatter series item coordinates.
+ xPosRole: "xPos"
+ yPosRole: "yPos"
+ zPosRole: "zPos"
+ }
+ }
+ }
+
+ ListModel {
+ id: scatterDataModel
+ ListElement{ xPos: "2.754"; yPos: "1.455"; zPos: "3.362"; }
+ ListElement{ xPos: "3.164"; yPos: "2.022"; zPos: "4.348"; }
+ ListElement{ xPos: "4.564"; yPos: "1.865"; zPos: "1.346"; }
+ ListElement{ xPos: "1.068"; yPos: "1.224"; zPos: "2.983"; }
+ ListElement{ xPos: "2.323"; yPos: "2.502"; zPos: "3.133"; }
+ }
+
+ Surface3D {
+ id: surfaceGraph
+ width: parent.width / 3
+ anchors.left: scatterGraph.right
+ anchors.top: emptySpace.bottom
+ anchors.bottom: parent.bottom
+ theme: Theme3D { type: Theme3D.ThemeIsabelle }
+ //clearWindowBeforeRendering: false
+
+ Surface3DSeries {
+ itemLabelFormat: "Pop density at (@xLabel N, @zLabel E): @yLabel"
+ ItemModelSurfaceDataProxy {
+ itemModel: surfaceDataModel
+ // Mapping model roles to surface series rows, columns, and values.
+ rowRole: "longitude"
+ columnRole: "latitude"
+ valueRole: "pop_density"
+ }
+ }
+ }
+ ListModel {
+ id: surfaceDataModel
+ ListElement{ longitude: "20"; latitude: "10"; pop_density: "4.75"; }
+ ListElement{ longitude: "21"; latitude: "10"; pop_density: "3.00"; }
+ ListElement{ longitude: "22"; latitude: "10"; pop_density: "1.24"; }
+ ListElement{ longitude: "23"; latitude: "10"; pop_density: "2.53"; }
+ ListElement{ longitude: "20"; latitude: "11"; pop_density: "2.55"; }
+ ListElement{ longitude: "21"; latitude: "11"; pop_density: "2.03"; }
+ ListElement{ longitude: "22"; latitude: "11"; pop_density: "3.46"; }
+ ListElement{ longitude: "23"; latitude: "11"; pop_density: "5.12"; }
+ ListElement{ longitude: "20"; latitude: "12"; pop_density: "1.37"; }
+ ListElement{ longitude: "21"; latitude: "12"; pop_density: "2.98"; }
+ ListElement{ longitude: "22"; latitude: "12"; pop_density: "3.33"; }
+ ListElement{ longitude: "23"; latitude: "12"; pop_density: "3.23"; }
+ ListElement{ longitude: "20"; latitude: "13"; pop_density: "4.34"; }
+ ListElement{ longitude: "21"; latitude: "13"; pop_density: "3.54"; }
+ ListElement{ longitude: "22"; latitude: "13"; pop_density: "1.65"; }
+ ListElement{ longitude: "23"; latitude: "13"; pop_density: "2.67"; }
+ }
+
+ RowLayout {
+ id: buttonLayout
+ Layout.minimumHeight: exitButton.height
+ width: parent.width
+ anchors.left: parent.left
+ anchors.top: parent.top
+ spacing: 0
+
+ NewButton {
+ id: exitButton
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ text: "Quit"
+ onClicked: Qt.quit(0);
+ }
+ }
+
+ Rectangle {
+ id: emptySpace
+ width: parent.width / 2
+ height: parent.height / 8
+ anchors.top: buttonLayout.bottom
+ anchors.left: parent.left
+ color: "#55555500"
+ }
+
+ Item {
+ id: emptySpace2
+ width: emptySpace.width
+ height: emptySpace.height
+ anchors.top: buttonLayout.bottom
+ anchors.left: emptySpace.right
+ }
+}
diff --git a/tests/qmlmultigraph/qml/qmlmultigraph/newbutton.qml b/tests/qmlmultigraph/qml/qmlmultigraph/newbutton.qml
new file mode 100644
index 00000000..e44c9d1a
--- /dev/null
+++ b/tests/qmlmultigraph/qml/qmlmultigraph/newbutton.qml
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVisualization module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+import QtQuick 2.1
+import QtQuick.Controls 1.0
+import QtQuick.Controls.Styles 1.0
+
+Item {
+ id: newbutton
+
+ property alias text: buttonText.text
+
+ signal clicked
+
+ implicitWidth: buttonText.implicitWidth + 5
+ implicitHeight: buttonText.implicitHeight + 10
+
+ Button {
+ id: buttonText
+ width: parent.width
+ height: parent.height
+
+ style: ButtonStyle {
+ label: Component {
+ Text {
+ text: buttonText.text
+ clip: true
+ wrapMode: Text.WordWrap
+ verticalAlignment: Text.AlignVCenter
+ horizontalAlignment: Text.AlignHCenter
+ anchors.fill: parent
+ }
+ }
+ }
+ onClicked: newbutton.clicked()
+ }
+}
diff --git a/tests/qmlmultigraph/qmlmultigraph.pro b/tests/qmlmultigraph/qmlmultigraph.pro
new file mode 100644
index 00000000..1aca51c0
--- /dev/null
+++ b/tests/qmlmultigraph/qmlmultigraph.pro
@@ -0,0 +1,25 @@
+!include( ../tests.pri ) {
+ error( "Couldn't find the tests.pri file!" )
+}
+
+QT += widgets
+
+# Add more folders to ship with the application, here
+folder_01.source = qml/qmlmultigraph
+folder_01.target = qml
+DEPLOYMENTFOLDERS = folder_01
+
+# Additional import path used to resolve QML modules in Creator's code model
+QML_IMPORT_PATH =
+
+# The .cpp file which was generated for your project. Feel free to hack it.
+SOURCES += main.cpp
+
+# Please do not modify the following two lines. Required for deployment.
+include(qtquick2applicationviewer/qtquick2applicationviewer.pri)
+qtcAddDeployment()
+
+RESOURCES += qmlmultigraph.qrc
+
+OTHER_FILES += doc/src/* \
+ doc/images/*
diff --git a/tests/qmlmultigraph/qmlmultigraph.qrc b/tests/qmlmultigraph/qmlmultigraph.qrc
new file mode 100644
index 00000000..78a5f993
--- /dev/null
+++ b/tests/qmlmultigraph/qmlmultigraph.qrc
@@ -0,0 +1,6 @@
+<RCC>
+ <qresource prefix="/qml">
+ <file alias="main.qml">qml/qmlmultigraph/main.qml</file>
+ <file alias="NewButton.qml">qml/qmlmultigraph/newbutton.qml</file>
+ </qresource>
+</RCC>
diff --git a/tests/qmlmultigraph/qtquick2applicationviewer/qtquick2applicationviewer.cpp b/tests/qmlmultigraph/qtquick2applicationviewer/qtquick2applicationviewer.cpp
new file mode 100644
index 00000000..10709d7a
--- /dev/null
+++ b/tests/qmlmultigraph/qtquick2applicationviewer/qtquick2applicationviewer.cpp
@@ -0,0 +1,81 @@
+// checksum 0x4f6f version 0x90005
+/*
+ This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
+ QtQuick2ApplicationViewer is a convenience class containing mobile device specific
+ code such as screen orientation handling. Also QML paths and debugging are
+ handled here.
+ It is recommended not to modify this file, since newer versions of Qt Creator
+ may offer an updated version of it.
+*/
+
+#include "qtquick2applicationviewer.h"
+
+#include <QtCore/QCoreApplication>
+#include <QtCore/QDir>
+#include <QtQml/QQmlEngine>
+
+class QtQuick2ApplicationViewerPrivate
+{
+ QString mainQmlFile;
+ friend class QtQuick2ApplicationViewer;
+ static QString adjustPath(const QString &path);
+};
+
+QString QtQuick2ApplicationViewerPrivate::adjustPath(const QString &path)
+{
+#if defined(Q_OS_MAC)
+ if (!QDir::isAbsolutePath(path))
+ return QString::fromLatin1("%1/../Resources/%2")
+ .arg(QCoreApplication::applicationDirPath(), path);
+#elif defined(Q_OS_BLACKBERRY)
+ if (!QDir::isAbsolutePath(path))
+ return QString::fromLatin1("app/native/%1").arg(path);
+#elif !defined(Q_OS_ANDROID)
+ QString pathInInstallDir =
+ QString::fromLatin1("%1/../%2").arg(QCoreApplication::applicationDirPath(), path);
+ if (QFileInfo(pathInInstallDir).exists())
+ return pathInInstallDir;
+ pathInInstallDir =
+ QString::fromLatin1("%1/%2").arg(QCoreApplication::applicationDirPath(), path);
+ if (QFileInfo(pathInInstallDir).exists())
+ return pathInInstallDir;
+#endif
+ return path;
+}
+
+QtQuick2ApplicationViewer::QtQuick2ApplicationViewer(QWindow *parent)
+ : QQuickView(parent)
+ , d(new QtQuick2ApplicationViewerPrivate())
+{
+ connect(engine(), SIGNAL(quit()), SLOT(close()));
+ setResizeMode(QQuickView::SizeRootObjectToView);
+}
+
+QtQuick2ApplicationViewer::~QtQuick2ApplicationViewer()
+{
+ delete d;
+}
+
+void QtQuick2ApplicationViewer::setMainQmlFile(const QString &file)
+{
+ d->mainQmlFile = QtQuick2ApplicationViewerPrivate::adjustPath(file);
+#ifdef Q_OS_ANDROID
+ setSource(QUrl(QLatin1String("assets:/")+d->mainQmlFile));
+#else
+ setSource(QUrl::fromLocalFile(d->mainQmlFile));
+#endif
+}
+
+void QtQuick2ApplicationViewer::addImportPath(const QString &path)
+{
+ engine()->addImportPath(QtQuick2ApplicationViewerPrivate::adjustPath(path));
+}
+
+void QtQuick2ApplicationViewer::showExpanded()
+{
+#if defined(Q_WS_SIMULATOR) || defined(Q_OS_QNX)
+ showFullScreen();
+#else
+ show();
+#endif
+}
diff --git a/tests/qmlmultigraph/qtquick2applicationviewer/qtquick2applicationviewer.h b/tests/qmlmultigraph/qtquick2applicationviewer/qtquick2applicationviewer.h
new file mode 100644
index 00000000..cf66f140
--- /dev/null
+++ b/tests/qmlmultigraph/qtquick2applicationviewer/qtquick2applicationviewer.h
@@ -0,0 +1,33 @@
+// checksum 0xfde6 version 0x90005
+/*
+ This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
+ QtQuick2ApplicationViewer is a convenience class containing mobile device specific
+ code such as screen orientation handling. Also QML paths and debugging are
+ handled here.
+ It is recommended not to modify this file, since newer versions of Qt Creator
+ may offer an updated version of it.
+*/
+
+#ifndef QTQUICK2APPLICATIONVIEWER_H
+#define QTQUICK2APPLICATIONVIEWER_H
+
+#include <QtQuick/QQuickView>
+
+class QtQuick2ApplicationViewer : public QQuickView
+{
+ Q_OBJECT
+
+public:
+ explicit QtQuick2ApplicationViewer(QWindow *parent = 0);
+ virtual ~QtQuick2ApplicationViewer();
+
+ void setMainQmlFile(const QString &file);
+ void addImportPath(const QString &path);
+
+ void showExpanded();
+
+private:
+ class QtQuick2ApplicationViewerPrivate *d;
+};
+
+#endif // QTQUICK2APPLICATIONVIEWER_H
diff --git a/tests/qmlmultigraph/qtquick2applicationviewer/qtquick2applicationviewer.pri b/tests/qmlmultigraph/qtquick2applicationviewer/qtquick2applicationviewer.pri
new file mode 100644
index 00000000..e5f7990f
--- /dev/null
+++ b/tests/qmlmultigraph/qtquick2applicationviewer/qtquick2applicationviewer.pri
@@ -0,0 +1,180 @@
+# checksum 0x7b0d version 0x90005
+# This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
+# The code below adds the QtQuick2ApplicationViewer to the project and handles
+# the activation of QML debugging.
+# It is recommended not to modify this file, since newer versions of Qt Creator
+# may offer an updated version of it.
+
+QT += qml quick
+
+SOURCES += $$PWD/qtquick2applicationviewer.cpp
+HEADERS += $$PWD/qtquick2applicationviewer.h
+INCLUDEPATH += $$PWD
+# This file was generated by an application wizard of Qt Creator.
+# The code below handles deployment to Android and Maemo, aswell as copying
+# of the application data to shadow build directories on desktop.
+# It is recommended not to modify this file, since newer versions of Qt Creator
+# may offer an updated version of it.
+
+defineTest(qtcAddDeployment) {
+for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ item = item$${deploymentfolder}
+ greaterThan(QT_MAJOR_VERSION, 4) {
+ itemsources = $${item}.files
+ } else {
+ itemsources = $${item}.sources
+ }
+ $$itemsources = $$eval($${deploymentfolder}.source)
+ itempath = $${item}.path
+ $$itempath= $$eval($${deploymentfolder}.target)
+ export($$itemsources)
+ export($$itempath)
+ DEPLOYMENT += $$item
+}
+
+MAINPROFILEPWD = $$PWD
+
+android-no-sdk {
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ item = item$${deploymentfolder}
+ itemfiles = $${item}.files
+ $$itemfiles = $$eval($${deploymentfolder}.source)
+ itempath = $${item}.path
+ $$itempath = /data/user/qt/$$eval($${deploymentfolder}.target)
+ export($$itemfiles)
+ export($$itempath)
+ INSTALLS += $$item
+ }
+
+ target.path = /data/user/qt
+
+ export(target.path)
+ INSTALLS += target
+} else:android {
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ item = item$${deploymentfolder}
+ itemfiles = $${item}.files
+ $$itemfiles = $$eval($${deploymentfolder}.source)
+ itempath = $${item}.path
+ $$itempath = /assets/$$eval($${deploymentfolder}.target)
+ export($$itemfiles)
+ export($$itempath)
+ INSTALLS += $$item
+ }
+
+ x86 {
+ target.path = /libs/x86
+ } else: armeabi-v7a {
+ target.path = /libs/armeabi-v7a
+ } else {
+ target.path = /libs/armeabi
+ }
+
+ export(target.path)
+ INSTALLS += target
+} else:win32 {
+ copyCommand =
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)
+ source = $$replace(source, /, \\)
+ sourcePathSegments = $$split(source, \\)
+ target = $$OUT_PWD/$$eval($${deploymentfolder}.target)/$$last(sourcePathSegments)
+ target = $$replace(target, /, \\)
+ target ~= s,\\\\\\.?\\\\,\\,
+ !isEqual(source,$$target) {
+ !isEmpty(copyCommand):copyCommand += &&
+ isEqual(QMAKE_DIR_SEP, \\) {
+ copyCommand += $(COPY_DIR) \"$$source\" \"$$target\"
+ } else {
+ source = $$replace(source, \\\\, /)
+ target = $$OUT_PWD/$$eval($${deploymentfolder}.target)
+ target = $$replace(target, \\\\, /)
+ copyCommand += test -d \"$$target\" || mkdir -p \"$$target\" && cp -r \"$$source\" \"$$target\"
+ }
+ }
+ }
+ !isEmpty(copyCommand) {
+ copyCommand = @echo Copying application data... && $$copyCommand
+ copydeploymentfolders.commands = $$copyCommand
+ first.depends = $(first) copydeploymentfolders
+ export(first.depends)
+ export(copydeploymentfolders.commands)
+ QMAKE_EXTRA_TARGETS += first copydeploymentfolders
+ }
+} else:unix {
+ maemo5 {
+ desktopfile.files = $${TARGET}.desktop
+ desktopfile.path = /usr/share/applications/hildon
+ icon.files = $${TARGET}64.png
+ icon.path = /usr/share/icons/hicolor/64x64/apps
+ } else:!isEmpty(MEEGO_VERSION_MAJOR) {
+ desktopfile.files = $${TARGET}_harmattan.desktop
+ desktopfile.path = /usr/share/applications
+ icon.files = $${TARGET}80.png
+ icon.path = /usr/share/icons/hicolor/80x80/apps
+ } else { # Assumed to be a Desktop Unix
+ copyCommand =
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)
+ source = $$replace(source, \\\\, /)
+ macx {
+ target = $$OUT_PWD/$${TARGET}.app/Contents/Resources/$$eval($${deploymentfolder}.target)
+ } else {
+ target = $$OUT_PWD/$$eval($${deploymentfolder}.target)
+ }
+ target = $$replace(target, \\\\, /)
+ sourcePathSegments = $$split(source, /)
+ targetFullPath = $$target/$$last(sourcePathSegments)
+ targetFullPath ~= s,/\\.?/,/,
+ !isEqual(source,$$targetFullPath) {
+ !isEmpty(copyCommand):copyCommand += &&
+ copyCommand += $(MKDIR) \"$$target\"
+ copyCommand += && $(COPY_DIR) \"$$source\" \"$$target\"
+ }
+ }
+ !isEmpty(copyCommand) {
+ copyCommand = @echo Copying application data... && $$copyCommand
+ copydeploymentfolders.commands = $$copyCommand
+ first.depends = $(first) copydeploymentfolders
+ export(first.depends)
+ export(copydeploymentfolders.commands)
+ QMAKE_EXTRA_TARGETS += first copydeploymentfolders
+ }
+ }
+ !isEmpty(target.path) {
+ installPrefix = $${target.path}
+ } else {
+ installPrefix = /opt/$${TARGET}
+ }
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ item = item$${deploymentfolder}
+ itemfiles = $${item}.files
+ $$itemfiles = $$eval($${deploymentfolder}.source)
+ itempath = $${item}.path
+ $$itempath = $${installPrefix}/$$eval($${deploymentfolder}.target)
+ export($$itemfiles)
+ export($$itempath)
+ INSTALLS += $$item
+ }
+
+ !isEmpty(desktopfile.path) {
+ export(icon.files)
+ export(icon.path)
+ export(desktopfile.files)
+ export(desktopfile.path)
+ INSTALLS += icon desktopfile
+ }
+
+ isEmpty(target.path) {
+ target.path = $${installPrefix}/bin
+ export(target.path)
+ }
+ INSTALLS += target
+}
+
+export (ICON)
+export (INSTALLS)
+export (DEPLOYMENT)
+export (LIBS)
+export (QMAKE_EXTRA_TARGETS)
+}
diff --git a/tests/tests.pro b/tests/tests.pro
index 01b0f109..f2445c70 100644
--- a/tests/tests.pro
+++ b/tests/tests.pro
@@ -12,7 +12,8 @@ SUBDIRS += barstest \
surfacetest \
qmlcamera \
qmldynamicdata \
- multigraphs
+ multigraphs \
+ qmlmultigraph
#SUBDIRS += kinectsurface