summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2017-11-03 09:43:33 +0000
committerThe Qt Project <gerrit-noreply@qt-project.org>2017-11-03 09:43:33 +0000
commit93ac0acba1baa63a4709e623a7790349df41c299 (patch)
treeb5918a077970e7337fc609fb6a8050273362bb75
parent567b5bc67e54f496027da2e6d99aa7b39d64a606 (diff)
parent85793744503112e13abe47b31d108f6b6ee998d9 (diff)
Merge "Merge remote-tracking branch 'origin/5.9' into 5.10" into refs/staging/5.10v5.10.0-beta4
-rw-r--r--dist/changes-2.1.35
-rw-r--r--dist/changes-5.9.225
-rw-r--r--src/charts/axis/valueaxis/qvalueaxis.cpp16
-rw-r--r--src/charts/xychart/qxyseries.cpp6
-rw-r--r--src/chartsqml2/declarativeopenglrendernode.cpp29
-rw-r--r--tests/auto/qchart/tst_qchart.cpp112
-rw-r--r--tests/auto/qvalueaxis/tst_qvalueaxis.cpp1
-rw-r--r--tests/manual/chartwidgettest/mainwidget.cpp3
8 files changed, 179 insertions, 18 deletions
diff --git a/dist/changes-2.1.3 b/dist/changes-2.1.3
new file mode 100644
index 00000000..0cdc45cb
--- /dev/null
+++ b/dist/changes-2.1.3
@@ -0,0 +1,5 @@
+Qt Charts 2.1.3
+
+Fixed issues
+------------
+- Fix crash on PieChartItem deletion
diff --git a/dist/changes-5.9.2 b/dist/changes-5.9.2
new file mode 100644
index 00000000..65c570a3
--- /dev/null
+++ b/dist/changes-5.9.2
@@ -0,0 +1,25 @@
+Qt 5.9.2 is a bug-fix release. It maintains both forward and backward
+compatibility (source and binary) with Qt 5.9.0.
+
+For more details, refer to the online documentation included in this
+distribution. The documentation is also available online:
+
+http://doc.qt.io/qt-5/index.html
+
+The Qt version 5.9 series is binary compatible with the 5.8.x series.
+Applications compiled for 5.8 will continue to run with 5.9.
+
+Some of the changes listed in this file include issue tracking numbers
+corresponding to tasks in the Qt Bug Tracker:
+
+https://bugreports.qt.io/
+
+Each of these identifiers can be entered in the bug tracker to obtain more
+information about a particular change.
+
+****************************************************************************
+* Qt 5.9.2 Changes *
+****************************************************************************
+- [QTBUG-62137] BarSeries: Account for labels when hovering over the bar
+- [QTBUG-56097] Account for very small numbers when setting the axis range
+- [QTBUG-63123] Fix crash when SeriesAnimations and point labels visible
diff --git a/src/charts/axis/valueaxis/qvalueaxis.cpp b/src/charts/axis/valueaxis/qvalueaxis.cpp
index e8f9698f..42dd8ed9 100644
--- a/src/charts/axis/valueaxis/qvalueaxis.cpp
+++ b/src/charts/axis/valueaxis/qvalueaxis.cpp
@@ -408,25 +408,13 @@ void QValueAxisPrivate::setRange(qreal min, qreal max)
return;
}
- bool changeMin = false;
- if (m_min == 0 || min == 0)
- changeMin = !qFuzzyCompare(1 + m_min, 1 + min);
- else
- changeMin = !qFuzzyCompare(m_min, min);
-
- bool changeMax = false;
- if (m_max == 0 || max == 0)
- changeMax = !qFuzzyCompare(1 + m_max, 1 + max);
- else
- changeMax = !qFuzzyCompare(m_max, max);
-
- if (changeMin) {
+ if (m_min != min) {
m_min = min;
changed = true;
emit q->minChanged(min);
}
- if (changeMax) {
+ if (m_max != max) {
m_max = max;
changed = true;
emit q->maxChanged(max);
diff --git a/src/charts/xychart/qxyseries.cpp b/src/charts/xychart/qxyseries.cpp
index 40382d15..c85d5340 100644
--- a/src/charts/xychart/qxyseries.cpp
+++ b/src/charts/xychart/qxyseries.cpp
@@ -1001,6 +1001,9 @@ void QXYSeriesPrivate::initializeAnimations(QtCharts::QChart::AnimationOptions o
void QXYSeriesPrivate::drawSeriesPointLabels(QPainter *painter, const QVector<QPointF> &points,
const int offset)
{
+ if (points.size() == 0)
+ return;
+
static const QString xPointTag(QLatin1String("@xPoint"));
static const QString yPointTag(QLatin1String("@yPoint"));
const int labelOffset = offset + 2;
@@ -1010,7 +1013,8 @@ void QXYSeriesPrivate::drawSeriesPointLabels(QPainter *painter, const QVector<QP
QFontMetrics fm(painter->font());
// m_points is used for the label here as it has the series point information
// points variable passed is used for positioning because it has the coordinates
- for (int i(0); i < m_points.size(); i++) {
+ const int pointCount = qMin(points.size(), m_points.size());
+ for (int i(0); i < pointCount; i++) {
QString pointLabel = m_pointLabelsFormat;
pointLabel.replace(xPointTag, presenter()->numberToString(m_points.at(i).x()));
pointLabel.replace(yPointTag, presenter()->numberToString(m_points.at(i).y()));
diff --git a/src/chartsqml2/declarativeopenglrendernode.cpp b/src/chartsqml2/declarativeopenglrendernode.cpp
index a0b4ec7f..742a9301 100644
--- a/src/chartsqml2/declarativeopenglrendernode.cpp
+++ b/src/chartsqml2/declarativeopenglrendernode.cpp
@@ -88,6 +88,26 @@ DeclarativeOpenGLRenderNode::~DeclarativeOpenGLRenderNode()
qDeleteAll(m_mouseEvents);
}
+static const char *vertexSourceCore =
+ "#version 150\n"
+ "in vec2 points;\n"
+ "uniform vec2 min;\n"
+ "uniform vec2 delta;\n"
+ "uniform float pointSize;\n"
+ "uniform mat4 matrix;\n"
+ "void main() {\n"
+ " vec2 normalPoint = vec2(-1, -1) + ((points - min) / delta);\n"
+ " gl_Position = matrix * vec4(normalPoint, 0, 1);\n"
+ " gl_PointSize = pointSize;\n"
+ "}";
+static const char *fragmentSourceCore =
+ "#version 150\n"
+ "uniform vec3 color;\n"
+ "out vec4 fragColor;\n"
+ "void main() {\n"
+ " fragColor = vec4(color,1);\n"
+ "}\n";
+
static const char *vertexSource =
"attribute highp vec2 points;\n"
"uniform highp vec2 min;\n"
@@ -111,8 +131,13 @@ void DeclarativeOpenGLRenderNode::initGL()
recreateFBO();
m_program = new QOpenGLShaderProgram;
- m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, vertexSource);
- m_program->addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentSource);
+ if (QOpenGLContext::currentContext()->format().profile() == QSurfaceFormat::CoreProfile) {
+ m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, vertexSourceCore);
+ m_program->addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentSourceCore);
+ } else {
+ m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, vertexSource);
+ m_program->addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentSource);
+ }
m_program->bindAttributeLocation("points", 0);
m_program->link();
diff --git a/tests/auto/qchart/tst_qchart.cpp b/tests/auto/qchart/tst_qchart.cpp
index 3e835792..7347f16b 100644
--- a/tests/auto/qchart/tst_qchart.cpp
+++ b/tests/auto/qchart/tst_qchart.cpp
@@ -40,6 +40,7 @@
#include <QtCharts/QStackedBarSeries>
#include <QtCharts/QValueAxis>
#include <QtCharts/QBarCategoryAxis>
+#include <QtCharts/QDateTimeAxis>
#include "tst_definitions.h"
QT_CHARTS_USE_NAMESPACE
@@ -122,6 +123,8 @@ private slots:
void createDefaultAxesForLineSeries();
void axisPolarOrientation();
void backgroundRoundness();
+ void zoomInAndOut_data();
+ void zoomInAndOut();
private:
void createTestData();
@@ -1088,6 +1091,115 @@ void tst_QChart::backgroundRoundness()
QVERIFY(m_chart->backgroundRoundness() == 100.0);
}
+void tst_QChart::zoomInAndOut_data()
+{
+ const qreal hourInMSecs = 60.0 * 60.0 * 1000.0;
+
+ QTest::addColumn<QString>("axisXType");
+ QTest::addColumn<QString>("axisYType");
+ QTest::addColumn<qreal>("minX");
+ QTest::addColumn<qreal>("maxX");
+ QTest::addColumn<qreal>("minY");
+ QTest::addColumn<qreal>("maxY");
+
+ QTest::newRow("value-value-normal") << "QValueAxis" << "QValueAxis" << 0.0 << 100.0 << 0.0 << 100.0;
+ QTest::newRow("value-value-small") << "QValueAxis" << "QValueAxis" << -1e-12 << 1e-13 << -1e-12 << 1e-13;
+ QTest::newRow("value-value-mixed") << "QValueAxis" << "QValueAxis" << 0.0 << 100.0 << -1e-12 << 1e-13;
+
+ QTest::newRow("datetime-datetime-normal") << "QDateTimeAxis" << "QDateTimeAxis"
+ << 0.0 << hourInMSecs << 0.0 << hourInMSecs;
+ QTest::newRow("datetime-datetime-small") << "QDateTimeAxis" << "QDateTimeAxis"
+ << 0.0 << 60.0 << 0.0 << 60.0;
+ QTest::newRow("datetime-datetime-mixed") << "QDateTimeAxis" << "QDateTimeAxis"
+ << 0.0 << hourInMSecs << 0.0 << 60.0;
+}
+
+#define CHECK_AXIS_RANGES_MATCH \
+ if (valueAxisX) { \
+ QVERIFY(valueAxisX->min() == minX); \
+ QVERIFY(valueAxisX->max() == maxX); \
+ } else if (dateTimeAxisX) { \
+ QVERIFY(dateTimeAxisX->min().toMSecsSinceEpoch() == minX); \
+ QVERIFY(dateTimeAxisX->max().toMSecsSinceEpoch() == maxX); \
+ } \
+ if (valueAxisY) { \
+ QVERIFY(valueAxisY->min() == minY); \
+ QVERIFY(valueAxisY->max() == maxY); \
+ } else if (dateTimeAxisY) { \
+ QVERIFY(dateTimeAxisY->min().toMSecsSinceEpoch() == minY); \
+ QVERIFY(dateTimeAxisY->max().toMSecsSinceEpoch() == maxY); \
+ }
+
+void tst_QChart::zoomInAndOut()
+{
+ QFETCH(QString, axisXType);
+ QFETCH(QString, axisYType);
+ QFETCH(qreal, minX);
+ QFETCH(qreal, maxX);
+ QFETCH(qreal, minY);
+ QFETCH(qreal, maxY);
+
+ createTestData();
+ QAbstractAxis *axisX = 0;
+ QAbstractAxis *axisY = 0;
+ QValueAxis *valueAxisX = 0;
+ QValueAxis *valueAxisY = 0;
+ QDateTimeAxis *dateTimeAxisX = 0;
+ QDateTimeAxis *dateTimeAxisY = 0;
+
+ if (axisXType == "QValueAxis") {
+ axisX = valueAxisX = new QValueAxis(m_chart);
+ valueAxisX->setRange(minX, maxX);
+ } else if (axisXType == "QDateTimeAxis") {
+ axisX = dateTimeAxisX = new QDateTimeAxis(m_chart);
+ dateTimeAxisX->setRange(QDateTime::fromMSecsSinceEpoch(minX), QDateTime::fromMSecsSinceEpoch(maxX));
+ }
+ if (axisXType == "QValueAxis") {
+ axisY = valueAxisY = new QValueAxis(m_chart);
+ valueAxisY->setRange(minY, maxY);
+ } else if (axisXType == "QDateTimeAxis") {
+ axisY = dateTimeAxisY = new QDateTimeAxis(m_chart);
+ dateTimeAxisY->setRange(QDateTime::fromMSecsSinceEpoch(minY), QDateTime::fromMSecsSinceEpoch(maxY));
+ }
+
+ m_chart->setAxisX(axisX, m_chart->series().first());
+ m_chart->setAxisY(axisY, m_chart->series().first());
+ CHECK_AXIS_RANGES_MATCH
+
+ m_chart->zoomIn();
+ if (valueAxisX) {
+ QVERIFY(valueAxisX->min() != minX);
+ QVERIFY(valueAxisX->max() != maxX);
+ } else if (dateTimeAxisX) {
+ QVERIFY(dateTimeAxisX->min().toMSecsSinceEpoch() != minX);
+ QVERIFY(dateTimeAxisX->max().toMSecsSinceEpoch() != maxX);
+ }
+ if (valueAxisY) {
+ QVERIFY(valueAxisY->min() != minY);
+ QVERIFY(valueAxisY->max() != maxY);
+ } else if (dateTimeAxisY) {
+ QVERIFY(dateTimeAxisY->min().toMSecsSinceEpoch() != minY);
+ QVERIFY(dateTimeAxisY->max().toMSecsSinceEpoch() != maxY);
+ }
+
+ m_chart->zoomReset();
+ CHECK_AXIS_RANGES_MATCH
+
+ m_chart->zoomIn();
+ m_chart->zoomIn();
+ m_chart->zoomReset();
+ CHECK_AXIS_RANGES_MATCH
+
+ m_chart->zoomOut();
+ m_chart->zoomReset();
+ CHECK_AXIS_RANGES_MATCH
+
+ m_chart->zoomOut();
+ m_chart->zoomOut();
+ m_chart->zoomReset();
+ CHECK_AXIS_RANGES_MATCH
+}
+
QTEST_MAIN(tst_QChart)
#include "tst_qchart.moc"
diff --git a/tests/auto/qvalueaxis/tst_qvalueaxis.cpp b/tests/auto/qvalueaxis/tst_qvalueaxis.cpp
index d5d69a5b..4de89cb1 100644
--- a/tests/auto/qvalueaxis/tst_qvalueaxis.cpp
+++ b/tests/auto/qvalueaxis/tst_qvalueaxis.cpp
@@ -285,6 +285,7 @@ void tst_QValueAxis::range_raw_data()
QTest::newRow("1.0 - 101.0") << (qreal)-1.0 << (qreal)101.0;
QTest::newRow("25.0 - 75.0") << (qreal)25.0 << (qreal)75.0;
QTest::newRow("101.0") << (qreal)40.0 << (qreal)60.0;
+ QTest::newRow("smallNumbers") << (qreal)-1e-12 << (qreal)1e-13;
}
void tst_QValueAxis::range_raw()
diff --git a/tests/manual/chartwidgettest/mainwidget.cpp b/tests/manual/chartwidgettest/mainwidget.cpp
index 3ff15810..ebb00f22 100644
--- a/tests/manual/chartwidgettest/mainwidget.cpp
+++ b/tests/manual/chartwidgettest/mainwidget.cpp
@@ -48,13 +48,14 @@
#include <QtWidgets/QLabel>
#include <QtWidgets/QSpacerItem>
#include <QtWidgets/QMessageBox>
-#include <qmath.h>
#include <QtCore/QDebug>
#include <QtCore/QRandomGenerator>
#include <QtGui/QStandardItemModel>
#include <QtCharts/QBarCategoryAxis>
#include <QtWidgets/QOpenGLWidget>
+#include <qmath.h>
+
QT_CHARTS_USE_NAMESPACE
MainWidget::MainWidget(QWidget *parent) :