diff options
Diffstat (limited to 'src/charts')
-rw-r--r-- | src/charts/barchart/qbarset.cpp | 17 | ||||
-rw-r--r-- | src/charts/glwidget.cpp | 50 | ||||
-rw-r--r-- | src/charts/layout/cartesianchartlayout.cpp | 4 | ||||
-rw-r--r-- | src/charts/linechart/linechartitem.cpp | 3 | ||||
-rw-r--r-- | src/charts/scatterchart/scatterchartitem.cpp | 10 | ||||
-rw-r--r-- | src/charts/xychart/glxyseriesdata.cpp | 15 | ||||
-rw-r--r-- | src/charts/xychart/glxyseriesdata_p.h | 3 | ||||
-rw-r--r-- | src/charts/xychart/qvxymodelmapper.cpp | 2 | ||||
-rw-r--r-- | src/charts/xychart/qxymodelmapper.cpp | 29 | ||||
-rw-r--r-- | src/charts/xychart/xychart.cpp | 6 | ||||
-rw-r--r-- | src/charts/xychart/xychart_p.h | 1 |
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(); |