summaryrefslogtreecommitdiffstats
path: root/src/charts
diff options
context:
space:
mode:
Diffstat (limited to 'src/charts')
-rw-r--r--src/charts/barchart/qbarset.cpp17
-rw-r--r--src/charts/glwidget.cpp50
-rw-r--r--src/charts/layout/cartesianchartlayout.cpp4
-rw-r--r--src/charts/linechart/linechartitem.cpp3
-rw-r--r--src/charts/scatterchart/scatterchartitem.cpp10
-rw-r--r--src/charts/xychart/glxyseriesdata.cpp15
-rw-r--r--src/charts/xychart/glxyseriesdata_p.h3
-rw-r--r--src/charts/xychart/qvxymodelmapper.cpp2
-rw-r--r--src/charts/xychart/qxymodelmapper.cpp29
-rw-r--r--src/charts/xychart/xychart.cpp6
-rw-r--r--src/charts/xychart/xychart_p.h1
11 files changed, 98 insertions, 42 deletions
diff --git a/src/charts/barchart/qbarset.cpp b/src/charts/barchart/qbarset.cpp
index f62fc806..c065787f 100644
--- a/src/charts/barchart/qbarset.cpp
+++ b/src/charts/barchart/qbarset.cpp
@@ -280,12 +280,19 @@ QT_CHARTS_BEGIN_NAMESPACE
/*!
\qmlproperty QVariantList BarSet::values
- The values of the bar set. You can set either a list of reals or a list of points as values. If you set a list of
- reals as values, the values are automatically completed to points by using the index of a value as it's
- x-coordinate. For example the following sets have equal values:
+ The values of the bar set. You can set either a list of reals or a list of points as values.
+
+ If you set a list of reals as values, the values directly define the bar set values.
+
+ If you set a list of points as values, the x-coordinate of the point specifies its zero-based
+ index in the bar set. The size of the bar set is the highest x-coordinate value + 1.
+ If a point is missing for any x-coordinate between zero and the highest value,
+ it gets value zero.
+
+ For example the following sets have equal values:
\code
- myBarSet1.values = [0, 5, 1, 5];
- myBarSet2.values = [Qt.point(0, 0), Qt.point(1, 5), Qt.point(2, 1), Qt.point(3, 5)];
+ myBarSet1.values = [5, 0, 1, 5];
+ myBarSet2.values = [Qt.point(0, 5), Qt.point(2, 1), Qt.point(3, 5)];
\endcode
*/
diff --git a/src/charts/glwidget.cpp b/src/charts/glwidget.cpp
index c0070dcd..189a2894 100644
--- a/src/charts/glwidget.cpp
+++ b/src/charts/glwidget.cpp
@@ -178,31 +178,33 @@ void GLWidget::paintGL()
QOpenGLBuffer *vbo = m_seriesBufferMap.value(i.key());
GLXYSeriesData *data = i.value();
- m_program->setUniformValue(m_colorUniformLoc, data->color);
- m_program->setUniformValue(m_minUniformLoc, data->min);
- m_program->setUniformValue(m_deltaUniformLoc, data->delta);
- m_program->setUniformValue(m_matrixUniformLoc, data->matrix);
-
- if (!vbo) {
- vbo = new QOpenGLBuffer;
- m_seriesBufferMap.insert(i.key(), vbo);
- vbo->create();
+ if (data->visible) {
+ m_program->setUniformValue(m_colorUniformLoc, data->color);
+ m_program->setUniformValue(m_minUniformLoc, data->min);
+ m_program->setUniformValue(m_deltaUniformLoc, data->delta);
+ m_program->setUniformValue(m_matrixUniformLoc, data->matrix);
+
+ if (!vbo) {
+ vbo = new QOpenGLBuffer;
+ m_seriesBufferMap.insert(i.key(), vbo);
+ vbo->create();
+ }
+ vbo->bind();
+ if (data->dirty) {
+ vbo->allocate(data->array.constData(), data->array.count() * sizeof(GLfloat));
+ data->dirty = false;
+ }
+
+ glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
+ if (data->type == QAbstractSeries::SeriesTypeLine) {
+ glLineWidth(data->width);
+ glDrawArrays(GL_LINE_STRIP, 0, data->array.size() / 2);
+ } else { // Scatter
+ m_program->setUniformValue(m_pointSizeUniformLoc, data->width);
+ glDrawArrays(GL_POINTS, 0, data->array.size() / 2);
+ }
+ vbo->release();
}
- vbo->bind();
- if (data->dirty) {
- vbo->allocate(data->array.constData(), data->array.count() * sizeof(GLfloat));
- data->dirty = false;
- }
-
- glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
- if (data->type == QAbstractSeries::SeriesTypeLine) {
- glLineWidth(data->width);
- glDrawArrays(GL_LINE_STRIP, 0, data->array.size() / 2);
- } else { // Scatter
- m_program->setUniformValue(m_pointSizeUniformLoc, data->width);
- glDrawArrays(GL_POINTS, 0, data->array.size() / 2);
- }
- vbo->release();
}
#ifdef QDEBUG_TRACE_GL_FPS
diff --git a/src/charts/layout/cartesianchartlayout.cpp b/src/charts/layout/cartesianchartlayout.cpp
index 7a3d8638..80a852a7 100644
--- a/src/charts/layout/cartesianchartlayout.cpp
+++ b/src/charts/layout/cartesianchartlayout.cpp
@@ -233,11 +233,11 @@ QRectF CartesianChartLayout::calculateAxisMinimum(const QRectF &minimum, const Q
switch (axis->axis()->alignment()) {
case Qt::AlignLeft:
left.setWidth(left.width() + size.width());
- left.setHeight(qMax(left.height() * 2, size.height()));
+ left.setHeight(qMax(left.height(), size.height()));
break;
case Qt::AlignRight:
right.setWidth(right.width() + size.width());
- right.setHeight(qMax(right.height() * 2, size.height()));
+ right.setHeight(qMax(right.height(), size.height()));
break;
case Qt::AlignTop:
top.setWidth(qMax(top.width(), size.width()));
diff --git a/src/charts/linechart/linechartitem.cpp b/src/charts/linechart/linechartitem.cpp
index afb1284d..ab1e8a47 100644
--- a/src/charts/linechart/linechartitem.cpp
+++ b/src/charts/linechart/linechartitem.cpp
@@ -347,6 +347,7 @@ void LineChartItem::handleUpdated()
bool doGeometryUpdate =
(m_pointsVisible != m_series->pointsVisible())
|| (m_series->pointsVisible() && (m_linePen != m_series->pen()));
+ bool visibleChanged = m_series->isVisible() != isVisible();
setVisible(m_series->isVisible());
setOpacity(m_series->opacity());
m_pointsVisible = m_series->pointsVisible();
@@ -358,6 +359,8 @@ void LineChartItem::handleUpdated()
m_pointLabelsClipping = m_series->pointLabelsClipping();
if (doGeometryUpdate)
updateGeometry();
+ else if (m_series->useOpenGL() && visibleChanged)
+ refreshGlChart();
update();
}
diff --git a/src/charts/scatterchart/scatterchartitem.cpp b/src/charts/scatterchart/scatterchartitem.cpp
index cc1ecb60..df31b7d7 100644
--- a/src/charts/scatterchart/scatterchartitem.cpp
+++ b/src/charts/scatterchart/scatterchartitem.cpp
@@ -256,15 +256,21 @@ void ScatterChartItem::setBrush(const QBrush &brush)
void ScatterChartItem::handleUpdated()
{
- int count = m_items.childItems().count();
+ if (m_series->useOpenGL()) {
+ if ((m_series->isVisible() != m_visible)) {
+ m_visible = m_series->isVisible();
+ refreshGlChart();
+ }
+ return;
+ }
+ int count = m_items.childItems().count();
if (count == 0)
return;
bool recreate = m_visible != m_series->isVisible()
|| m_size != m_series->markerSize()
|| m_shape != m_series->markerShape();
-
m_visible = m_series->isVisible();
m_size = m_series->markerSize();
m_shape = m_series->markerShape();
diff --git a/src/charts/xychart/glxyseriesdata.cpp b/src/charts/xychart/glxyseriesdata.cpp
index 37da55b1..9a6f330a 100644
--- a/src/charts/xychart/glxyseriesdata.cpp
+++ b/src/charts/xychart/glxyseriesdata.cpp
@@ -50,6 +50,7 @@ void GLXYSeriesDataManager::setPoints(QXYSeries *series, const AbstractDomain *d
if (!data) {
data = new GLXYSeriesData;
data->type = series->type();
+ data->visible = series->isVisible();
QColor sc;
if (data->type == QAbstractSeries::SeriesTypeScatter) {
QScatterSeries *scatter = static_cast<QScatterSeries *>(series);
@@ -68,6 +69,8 @@ void GLXYSeriesDataManager::setPoints(QXYSeries *series, const AbstractDomain *d
data->color = QVector3D(float(sc.redF()), float(sc.greenF()), float(sc.blueF()));
connect(series, &QXYSeries::useOpenGLChanged, this,
&GLXYSeriesDataManager::handleSeriesOpenGLChange);
+ connect(series, &QXYSeries::visibleChanged, this,
+ &GLXYSeriesDataManager::handleSeriesVisibilityChange);
m_seriesDataMap.insert(series, data);
m_mapDirty = true;
}
@@ -174,6 +177,18 @@ void GLXYSeriesDataManager::handleSeriesOpenGLChange()
removeSeries(series);
}
+void GLXYSeriesDataManager::handleSeriesVisibilityChange()
+{
+ QXYSeries *series = qobject_cast<QXYSeries *>(sender());
+ if (series) {
+ GLXYSeriesData *data = m_seriesDataMap.value(series);
+ if (data) {
+ data->visible = series->isVisible();
+ data->dirty = true;
+ }
+ }
+}
+
void GLXYSeriesDataManager::handleScatterColorChange()
{
QScatterSeries *series = qobject_cast<QScatterSeries *>(sender());
diff --git a/src/charts/xychart/glxyseriesdata_p.h b/src/charts/xychart/glxyseriesdata_p.h
index 578ab217..4a22e575 100644
--- a/src/charts/xychart/glxyseriesdata_p.h
+++ b/src/charts/xychart/glxyseriesdata_p.h
@@ -58,6 +58,7 @@ struct GLXYSeriesData {
QAbstractSeries::SeriesType type;
QVector2D min;
QVector2D delta;
+ bool visible;
QMatrix4x4 matrix;
public:
GLXYSeriesData &operator=(const GLXYSeriesData &data) {
@@ -68,6 +69,7 @@ public:
type = data.type;
min = data.min;
delta = data.delta;
+ visible = data.visible;
matrix = data.matrix;
return *this;
}
@@ -103,6 +105,7 @@ public Q_SLOTS:
void cleanup();
void handleSeriesPenChange();
void handleSeriesOpenGLChange();
+ void handleSeriesVisibilityChange();
void handleScatterColorChange();
void handleScatterMarkerSizeChange();
diff --git a/src/charts/xychart/qvxymodelmapper.cpp b/src/charts/xychart/qvxymodelmapper.cpp
index fb7f63ab..3b68d809 100644
--- a/src/charts/xychart/qvxymodelmapper.cpp
+++ b/src/charts/xychart/qvxymodelmapper.cpp
@@ -120,7 +120,7 @@ QT_CHARTS_BEGIN_NAMESPACE
Minimal and default value is: -1 (count limited by the number of rows in the model)
*/
/*!
- \qmlproperty int VXYModelMapper::columnCount
+ \qmlproperty int VXYModelMapper::rowCount
Defines the number of rows of the model that are mapped as the data for series. The default value is
-1 (count limited by the number of rows in the model).
*/
diff --git a/src/charts/xychart/qxymodelmapper.cpp b/src/charts/xychart/qxymodelmapper.cpp
index b6037858..3b2ccd83 100644
--- a/src/charts/xychart/qxymodelmapper.cpp
+++ b/src/charts/xychart/qxymodelmapper.cpp
@@ -32,6 +32,7 @@
#include <QtCharts/QXYSeries>
#include <QtCore/QAbstractItemModel>
#include <QtCore/QDateTime>
+#include <QtCore/QDebug>
QT_CHARTS_BEGIN_NAMESPACE
@@ -544,15 +545,27 @@ void QXYModelMapperPrivate::initializeXYFromModel()
int pointPos = 0;
QModelIndex xIndex = xModelIndex(pointPos);
QModelIndex yIndex = yModelIndex(pointPos);
- while (xIndex.isValid() && yIndex.isValid()) {
- QPointF point;
- point.setX(valueFromModel(xIndex));
- point.setY(valueFromModel(yIndex));
- m_series->append(point);
- pointPos++;
- xIndex = xModelIndex(pointPos);
- yIndex = yModelIndex(pointPos);
+
+ if (xIndex.isValid() && yIndex.isValid()) {
+ while (xIndex.isValid() && yIndex.isValid()) {
+ QPointF point;
+ point.setX(valueFromModel(xIndex));
+ point.setY(valueFromModel(yIndex));
+ m_series->append(point);
+ pointPos++;
+ xIndex = xModelIndex(pointPos);
+ yIndex = yModelIndex(pointPos);
+ // Don't warn about invalid index after the first, those are valid and used to
+ // determine when we should end looping.
+ }
+ } else {
+ // Invalid index right off the bat means series will be left empty, so output a warning
+ if (!xIndex.isValid())
+ qWarning() << __FUNCTION__ << QStringLiteral("Invalid X coordinate index in model mapper.");
+ else if (!yIndex.isValid())
+ qWarning() << __FUNCTION__ << QStringLiteral("Invalid Y coordinate index in model mapper.");
}
+
blockSeriesSignals(false);
}
diff --git a/src/charts/xychart/xychart.cpp b/src/charts/xychart/xychart.cpp
index 28553d55..7493ea43 100644
--- a/src/charts/xychart/xychart.cpp
+++ b/src/charts/xychart/xychart.cpp
@@ -126,6 +126,12 @@ void XYChart::updateGlChart()
updateGeometry();
}
+// Doesn't update gl geometry, but refreshes the chart
+void XYChart::refreshGlChart()
+{
+ presenter()->updateGLWidget();
+}
+
//handlers
void XYChart::handlePointAdded(int index)
diff --git a/src/charts/xychart/xychart_p.h b/src/charts/xychart/xychart_p.h
index c0348c18..c5737cca 100644
--- a/src/charts/xychart/xychart_p.h
+++ b/src/charts/xychart/xychart_p.h
@@ -88,6 +88,7 @@ Q_SIGNALS:
protected:
virtual void updateChart(QVector<QPointF> &oldPoints, QVector<QPointF> &newPoints, int index = -1);
virtual void updateGlChart();
+ virtual void refreshGlChart();
private:
inline bool isEmpty();