diff --git a/src/chartsqml2/chartsqml2_plugin.cpp b/src/chartsqml2/chartsqml2_plugin.cpp index 10da43b..ac36f23 100644 --- a/src/chartsqml2/chartsqml2_plugin.cpp +++ b/src/chartsqml2/chartsqml2_plugin.cpp @@ -305,6 +305,7 @@ public: qmlRegisterType(uri, 2, 1, "CategoryAxis"); qmlRegisterUncreatableType(uri, 2, 1, "AbstractAxis", QLatin1String("Trying to create uncreatable: AbstractAxis. Use specific types of axis instead.")); + qmlRegisterType(uri, 2, 1, "ChartView"); } }; diff --git a/src/chartsqml2/declarativechart.cpp b/src/chartsqml2/declarativechart.cpp index d2d2d07..0ec801c 100644 --- a/src/chartsqml2/declarativechart.cpp +++ b/src/chartsqml2/declarativechart.cpp @@ -227,6 +227,32 @@ QT_CHARTS_BEGIN_NAMESPACE /*! \qmlmethod ChartView::zoom(real factor) Zooms in by \a factor on the center of the chart. + + A factor over 1.0 zooms the view in and factor between 0.0 and 1.0 zooms out. +*/ + +/*! + \qmlmethod ChartView::zoomIn() + Zooms in the view by a factor of two. +*/ + +/*! + \qmlmethod ChartView::zoomIn(rect rectangle) + Zooms in the view to a maximum level at which \a rectangle is still fully visible. + \note This is not supported for polar charts. +*/ + +/*! + \qmlmethod ChartView::zoomOut() + Zooms out the view by a factor of two. +*/ + +/*! + \qmlmethod ChartView::zoomReset() + Resets the series domains to what they were before any zoom method was called. + Note that this will also reset any scrolls and explicit axis range settings done between + the first zoom operation and calling this method. If no zoom operation has been + done, this method does nothing. */ /*! @@ -798,6 +824,26 @@ void DeclarativeChart::zoom(qreal factor) m_chart->zoom(factor); } +void DeclarativeChart::zoomIn() +{ + m_chart->zoomIn(); +} + +void DeclarativeChart::zoomIn(const QRectF &rectangle) +{ + m_chart->zoomIn(rectangle); +} + +void DeclarativeChart::zoomOut() +{ + m_chart->zoomOut(); +} + +void DeclarativeChart::zoomReset() +{ + m_chart->zoomReset(); +} + void DeclarativeChart::scrollLeft(qreal pixels) { m_chart->scroll(-pixels, 0); diff --git a/src/chartsqml2/declarativechart.h b/src/chartsqml2/declarativechart.h index 3856cdc..599eed0 100644 --- a/src/chartsqml2/declarativechart.h +++ b/src/chartsqml2/declarativechart.h @@ -163,6 +163,10 @@ public: Q_INVOKABLE QAbstractAxis *axisX(QAbstractSeries *series = 0); Q_INVOKABLE QAbstractAxis *axisY(QAbstractSeries *series = 0); Q_INVOKABLE void zoom(qreal factor); + Q_REVISION(5) Q_INVOKABLE void zoomIn(); + Q_REVISION(5) Q_INVOKABLE void zoomIn(const QRectF &rectangle); + Q_REVISION(5) Q_INVOKABLE void zoomOut(); + Q_REVISION(5) Q_INVOKABLE void zoomReset(); Q_INVOKABLE void scrollLeft(qreal pixels); Q_INVOKABLE void scrollRight(qreal pixels); Q_INVOKABLE void scrollUp(qreal pixels); diff --git a/src/chartsqml2/plugins.qmltypes b/src/chartsqml2/plugins.qmltypes index e822d44..d4a4805 100644 --- a/src/chartsqml2/plugins.qmltypes +++ b/src/chartsqml2/plugins.qmltypes @@ -929,9 +929,10 @@ Module { "QtCharts/ChartView 1.1", "QtCharts/ChartView 1.2", "QtCharts/ChartView 1.3", - "QtCharts/ChartView 2.0" + "QtCharts/ChartView 2.0", + "QtCharts/ChartView 2.1" ] - exportMetaObjectRevisions: [0, 1, 2, 3, 4] + exportMetaObjectRevisions: [0, 1, 2, 3, 4, 5] Enum { name: "Theme" values: { @@ -1098,6 +1099,14 @@ Module { name: "zoom" Parameter { name: "factor"; type: "double" } } + Method { name: "zoomIn"; revision: 5 } + Method { + name: "zoomIn" + revision: 5 + Parameter { name: "rectangle"; type: "QRectF" } + } + Method { name: "zoomOut"; revision: 5 } + Method { name: "zoomReset"; revision: 5 } Method { name: "scrollLeft" Parameter { name: "pixels"; type: "double" } diff --git a/tests/auto/qml-qtquicktest/tst_chartviewfunctions.qml b/tests/auto/qml-qtquicktest/tst_chartviewfunctions.qml index 2c23bdd..763d99e 100644 --- a/tests/auto/qml-qtquicktest/tst_chartviewfunctions.qml +++ b/tests/auto/qml-qtquicktest/tst_chartviewfunctions.qml @@ -18,7 +18,7 @@ import QtQuick 2.0 import QtTest 1.0 -import QtCharts 2.0 +import QtCharts 2.1 Rectangle { width: 400 @@ -28,6 +28,7 @@ Rectangle { id: tc1 name: "tst_qml-qtquicktest ChartView Functions" when: windowShown + property rect zoomRect function test_chartViewSeriesAndAxes() { // Create XY series @@ -81,6 +82,11 @@ Rectangle { chartView.axisY().min = 1.0; chartView.axisY().max = 2.0; + var xMaxOriginal = chartView.axisX().max; + var xMinOriginal = chartView.axisX().min; + var yMaxOriginal = chartView.axisY().max; + var yMinOriginal = chartView.axisY().min; + var xMax = chartView.axisX().max; var xMin = chartView.axisX().min; var yMax = chartView.axisY().max; @@ -108,6 +114,62 @@ Rectangle { yMax = chartView.axisY().max; yMin = chartView.axisY().min; + // zoom x -1 + // negative value has no effect + chartView.zoom(-1); + verify(chartView.axisX().max === xMax); + verify(chartView.axisX().min === xMin); + verify(chartView.axisY().max === yMax); + verify(chartView.axisY().min === yMin); + + // zoom in + chartView.zoomIn(); + verify(chartView.axisX().max < xMax); + verify(chartView.axisX().min > xMin); + verify(chartView.axisY().max < yMax); + verify(chartView.axisY().min > yMin); + xMax = chartView.axisX().max; + xMin = chartView.axisX().min; + yMax = chartView.axisY().max; + yMin = chartView.axisY().min; + + // zoom in rect + zoomRect.x = 100; + zoomRect.y = 100; + zoomRect.width = 120; + zoomRect.height = 120; + chartView.zoomIn(zoomRect); + verify(chartView.axisX().max < xMax); + verify(chartView.axisX().min > xMin); + verify(chartView.axisY().max < yMax); + verify(chartView.axisY().min > yMin); + xMax = chartView.axisX().max; + xMin = chartView.axisX().min; + yMax = chartView.axisY().max; + yMin = chartView.axisY().min; + + // zoom out + chartView.zoomOut(); + verify(chartView.axisX().max > xMax); + verify(chartView.axisX().min < xMin); + verify(chartView.axisY().max > yMax); + verify(chartView.axisY().min < yMin); + xMax = chartView.axisX().max; + xMin = chartView.axisX().min; + yMax = chartView.axisY().max; + yMin = chartView.axisY().min; + + // zoom reset + chartView.zoomReset(); + verify(chartView.axisX().max === xMaxOriginal); + verify(chartView.axisX().min === xMinOriginal); + verify(chartView.axisY().max === yMaxOriginal); + verify(chartView.axisY().min === yMinOriginal); + xMax = chartView.axisX().max; + xMin = chartView.axisX().min; + yMax = chartView.axisY().max; + yMin = chartView.axisY().min; + // Scroll up chartView.scrollUp(10); compare(chartView.axisX().max, xMax); diff --git a/tests/auto/qml-qtquicktest/tst_chartviewfunctions_2_0.qml b/tests/auto/qml-qtquicktest/tst_chartviewfunctions_2_0.qml new file mode 100644 index 0000000..2c23bdd --- /dev/null +++ b/tests/auto/qml-qtquicktest/tst_chartviewfunctions_2_0.qml @@ -0,0 +1,158 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd +** All rights reserved. +** For any questions to The Qt Company, please use contact form at http://qt.io +** +** This file is part of the Qt Charts module. +** +** Licensees holding valid commercial license for Qt may use this file in +** accordance with the Qt License Agreement provided with the Software +** or, alternatively, in accordance with the terms contained in a written +** agreement between you and The Qt Company. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.io +** +****************************************************************************/ + +import QtQuick 2.0 +import QtTest 1.0 +import QtCharts 2.0 + +Rectangle { + width: 400 + height: 300 + + TestCase { + id: tc1 + name: "tst_qml-qtquicktest ChartView Functions" + when: windowShown + + function test_chartViewSeriesAndAxes() { + // Create XY series + var line = chartView.createSeries(ChartView.SeriesTypeLine, "line"); + verify(line != null && line != undefined); + var spline = chartView.createSeries(ChartView.SeriesTypeSpline, "spline"); + verify(spline != null && spline != undefined); + var scatter = chartView.createSeries(ChartView.SeriesTypeScatter, "scatter"); + verify(scatter != null && scatter != undefined); + + // Create a series with specific axes + var line2 = chartView.createSeries(ChartView.SeriesTypeLine, "line2", chartView.axisX(line), chartView.axisY(line)); + + // Check that all the XY series use the same axes + verify(chartView.axisX(line) != null); + verify(chartView.axisY(line) != null); + compare(chartView.axisX(line), chartView.axisX(line2)); + compare(chartView.axisY(line), chartView.axisY(line2)); + compare(chartView.axisX(line), chartView.axisX(spline)); + compare(chartView.axisY(line), chartView.axisY(spline)); + compare(chartView.axisX(line), chartView.axisX(scatter)); + compare(chartView.axisY(line), chartView.axisY(scatter)); + + var bar = chartView.createSeries(ChartView.SeriesTypeBar, "bar"); + verify(bar != null && bar != undefined); + var stackedbar = chartView.createSeries(ChartView.SeriesTypeStackedBar, "stackedbar"); + verify(stackedbar != null && stackedbar != undefined); + var percentbar = chartView.createSeries(ChartView.SeriesTypePercentBar, "percentbar"); + verify(percentbar != null && percentbar != undefined); + var horizontalbar = chartView.createSeries(ChartView.SeriesTypeHorizontalBar, "horizontalbar"); + verify(horizontalbar != null && horizontalbar != undefined); + var horizontalstackedbar = chartView.createSeries(ChartView.SeriesTypeHorizontalStackedBar, "horizontalstackedbar"); + verify(horizontalstackedbar != null && horizontalstackedbar != undefined); + var horizontalpercentbar = chartView.createSeries(ChartView.SeriesTypeHorizontalPercentBar, "horizontalpercentbar"); + verify(horizontalpercentbar != null && horizontalpercentbar != undefined); + var area = chartView.createSeries(ChartView.SeriesTypeArea, "area"); + verify(area != null && area != undefined); + + // Remove all series + chartView.removeAllSeries(); + compare(chartView.count, 0); + } + + function test_chartViewRange() { + // Set initial values + chartView.createSeries(ChartView.SeriesTypeLine, "line"); + verify(chartView.axisX() != null); + verify(chartView.axisY() != null); + chartView.axisX().min = 1.0; + chartView.axisX().max = 2.0; + chartView.axisY().min = 1.0; + chartView.axisY().max = 2.0; + + var xMax = chartView.axisX().max; + var xMin = chartView.axisX().min; + var yMax = chartView.axisY().max; + var yMin = chartView.axisY().min; + + // zoom x 2.5 + chartView.zoom(1.5); + verify(chartView.axisX().max < xMax); + verify(chartView.axisX().min > xMin); + verify(chartView.axisY().max < yMax); + verify(chartView.axisY().min > yMin); + xMax = chartView.axisX().max; + xMin = chartView.axisX().min; + yMax = chartView.axisY().max; + yMin = chartView.axisY().min; + + // zoom x 0.5 + chartView.zoom(0.5); + verify(chartView.axisX().max > xMax); + verify(chartView.axisX().min < xMin); + verify(chartView.axisY().max > yMax); + verify(chartView.axisY().min < yMin); + xMax = chartView.axisX().max; + xMin = chartView.axisX().min; + yMax = chartView.axisY().max; + yMin = chartView.axisY().min; + + // Scroll up + chartView.scrollUp(10); + compare(chartView.axisX().max, xMax); + compare(chartView.axisX().min, xMin); + verify(chartView.axisY().max > yMax); + verify(chartView.axisY().min > yMin); + xMax = chartView.axisX().max; + xMin = chartView.axisX().min; + yMax = chartView.axisY().max; + yMin = chartView.axisY().min; + + // Scroll down + chartView.scrollDown(10); + compare(chartView.axisX().max, xMax); + compare(chartView.axisX().min, xMin); + verify(chartView.axisY().max < yMax); + verify(chartView.axisY().min < yMin); + xMax = chartView.axisX().max; + xMin = chartView.axisX().min; + yMax = chartView.axisY().max; + yMin = chartView.axisY().min; + + // Scroll left + chartView.scrollLeft(10); + verify(chartView.axisX().max < xMax); + verify(chartView.axisX().min < xMin); + compare(chartView.axisY().max, yMax); + compare(chartView.axisY().min, yMin); + xMax = chartView.axisX().max; + xMin = chartView.axisX().min; + yMax = chartView.axisY().max; + yMin = chartView.axisY().min; + + // Scroll right + chartView.scrollRight(10); + verify(chartView.axisX().max > xMax); + verify(chartView.axisX().min > xMin); + compare(chartView.axisY().max, yMax); + compare(chartView.axisY().min, yMin); + } + } + + ChartView { + id: chartView + anchors.fill: parent + title: "Chart" + } +}