diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/datavisualization/axis/qcategory3daxis.cpp | 10 | ||||
-rw-r--r-- | src/datavisualization/doc/src/qtdatavisualization-qml-bars3d.qdoc | 29 | ||||
-rw-r--r-- | src/datavisualization/engine/abstract3dcontroller.cpp | 29 | ||||
-rw-r--r-- | src/datavisualization/engine/abstract3dcontroller_p.h | 1 | ||||
-rw-r--r-- | src/datavisualization/engine/bars3dcontroller.cpp | 94 | ||||
-rw-r--r-- | src/datavisualization/engine/bars3dcontroller_p.h | 7 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dbars.cpp | 42 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dbars.h | 5 | ||||
-rw-r--r-- | src/datavisualizationqml2/declarativebars.cpp | 18 | ||||
-rw-r--r-- | src/datavisualizationqml2/declarativebars_p.h | 5 |
10 files changed, 195 insertions, 45 deletions
diff --git a/src/datavisualization/axis/qcategory3daxis.cpp b/src/datavisualization/axis/qcategory3daxis.cpp index 0a0cc2e8..0dfe2e4a 100644 --- a/src/datavisualization/axis/qcategory3daxis.cpp +++ b/src/datavisualization/axis/qcategory3daxis.cpp @@ -53,10 +53,7 @@ namespace QtDataVisualization { * * Defines labels for axis applied to categories. If there are fewer labels than categories, the * remaining ones do not have a label. If category labels are not defined explicitly, labels are - * generated from the data row (or column) labels. - * - * \note If the graph has multiple visible series and category labels are not defined explicitly, - * changing the rows (or columns) on any of the attached series will regenerate the labels. + * generated from the data row (or column) labels of the primary series of the graph. */ /*! @@ -80,10 +77,7 @@ QCategory3DAxis::~QCategory3DAxis() * * Defines labels for axis applied to categories. If there are fewer labels than categories, the * remaining ones do not have a label. If category labels are not defined explicitly, labels are - * generated from the data row (or column) labels. - * - * \note If the graph has multiple visible series and category labels are not defined explicitly, - * changing the rows (or columns) on any of the attached series will regenerate the labels. + * generated from the data row (or column) labels of the primary series of the graph. */ QStringList QCategory3DAxis::labels() const { diff --git a/src/datavisualization/doc/src/qtdatavisualization-qml-bars3d.qdoc b/src/datavisualization/doc/src/qtdatavisualization-qml-bars3d.qdoc index 7bd30867..d61b298a 100644 --- a/src/datavisualization/doc/src/qtdatavisualization-qml-bars3d.qdoc +++ b/src/datavisualization/doc/src/qtdatavisualization-qml-bars3d.qdoc @@ -87,7 +87,7 @@ */ /*! - * \qmlproperty list<QBar3DSeries> Bars3D::seriesList + * \qmlproperty list<Bar3DSeries> Bars3D::seriesList * \default * This property holds the series of the graph. * By default, this property contains an empty list. @@ -95,7 +95,20 @@ */ /*! - * \qmlmethod void Bars3D::addSeries(QBar3DSeries *series) + * \qmlproperty Bar3DSeries Bars3D::primarySeries + * Specifies the \a series that is the primary series of the graph. The primary series + * is used to determine the row and column axis labels when the labels are not explicitly + * set to the axes. + * If the specified \a series is not already added to the graph, setting it as the + * primary series will also implicitly add it to the graph. + * If the primary series itself is removed from the graph, this property + * resets to default. + * If \a series is null, this property resets to default. + * Defaults to the first added series or zero if no series are added to the graph. + */ + +/*! + * \qmlmethod void Bars3D::addSeries(Bar3DSeries series) * Adds the \a series to the graph. A graph can contain multiple series, but only one set of axes, * so the rows and columns of all series must match for the visualized data to be meaningful. * If the graph has multiple visible series, only the first one added will @@ -105,6 +118,16 @@ */ /*! - * \qmlmethod void Bars3D::removeSeries(QBar3DSeries *series) + * \qmlmethod void Bars3D::removeSeries(Bar3DSeries series) * Remove the \a series from the graph. */ + +/*! + * \qmlmethod void Bars3D::insertSeries(int index, Bar3DSeries series) + * Inserts the \a series into the position \a index in the series list. + * If the \a series has already been added to the list, it is moved to the + * new \a index. + * \note When moving a series to a new \a index that is after its old index, + * the new position in list is calculated as if the series was still in its old + * index, so the final index is actually the \a index decremented by one. + */ diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index 454ff7a4..82d60865 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -97,15 +97,30 @@ void Abstract3DController::setRenderer(Abstract3DRenderer *renderer) void Abstract3DController::addSeries(QAbstract3DSeries *series) { - if (series && !m_seriesList.contains(series)) { - int oldSize = m_seriesList.size(); - m_seriesList.append(series); - series->d_ptr->setController(this); - QObject::connect(series, &QAbstract3DSeries::visibilityChanged, - this, &Abstract3DController::handleSeriesVisibilityChanged); + insertSeries(m_seriesList.size(), series); +} + +void Abstract3DController::insertSeries(int index, QAbstract3DSeries *series) +{ + if (series) { + if (m_seriesList.contains(series)) { + int oldIndex = m_seriesList.indexOf(series); + if (index != oldIndex) { + m_seriesList.removeOne(series); + if (oldIndex < index) + index--; + m_seriesList.insert(index, series); + } + } else { + int oldSize = m_seriesList.size(); + m_seriesList.insert(index, series); + series->d_ptr->setController(this); + QObject::connect(series, &QAbstract3DSeries::visibilityChanged, + this, &Abstract3DController::handleSeriesVisibilityChanged); + series->d_ptr->resetToTheme(*m_themeManager->activeTheme(), oldSize, false); + } if (series->isVisible()) handleSeriesVisibilityChangedBySender(series); - series->d_ptr->resetToTheme(*m_themeManager->activeTheme(), oldSize, false); } } diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index a68272d6..a11e80cd 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -170,6 +170,7 @@ public: void setRenderer(Abstract3DRenderer *renderer); virtual void addSeries(QAbstract3DSeries *series); + virtual void insertSeries(int index, QAbstract3DSeries *series); virtual void removeSeries(QAbstract3DSeries *series); QList<QAbstract3DSeries *> seriesList(); diff --git a/src/datavisualization/engine/bars3dcontroller.cpp b/src/datavisualization/engine/bars3dcontroller.cpp index c9a9706c..986b9a0e 100644 --- a/src/datavisualization/engine/bars3dcontroller.cpp +++ b/src/datavisualization/engine/bars3dcontroller.cpp @@ -36,6 +36,7 @@ Bars3DController::Bars3DController(QRect boundRect, Q3DScene *scene) : Abstract3DController(boundRect, scene), m_selectedBar(invalidSelectionPosition()), m_selectedBarSeries(0), + m_primarySeries(0), m_isBarSpecRelative(true), m_barThicknessRatio(1.0f), m_barSpacing(QSizeF(1.0, 1.0)), @@ -174,29 +175,28 @@ void Bars3DController::handleItemChanged(int rowIndex, int columnIndex) void Bars3DController::handleDataRowLabelsChanged() { - QBar3DSeries *firstSeries = 0; - if (m_seriesList.size()) - firstSeries = static_cast<QBar3DSeries *>(m_seriesList.at(0)); - if (m_axisZ && firstSeries && firstSeries->dataProxy()) { + if (m_axisZ) { // Grab a sublist equal to data window (no need to have more labels in axis) int min = int(m_axisZ->min()); int count = int(m_axisZ->max()) - min + 1; - QStringList subList = firstSeries->dataProxy()->rowLabels().mid(min, count); + QStringList subList; + if (m_primarySeries && m_primarySeries->dataProxy()) + subList = m_primarySeries->dataProxy()->rowLabels().mid(min, count); static_cast<QCategory3DAxis *>(m_axisZ)->dptr()->setDataLabels(subList); } } void Bars3DController::handleDataColumnLabelsChanged() { - QBar3DSeries *firstSeries = 0; - if (m_seriesList.size()) - firstSeries = static_cast<QBar3DSeries *>(m_seriesList.at(0)); - if (m_axisX && firstSeries && firstSeries->dataProxy()) { + if (m_axisX) { // Grab a sublist equal to data window (no need to have more labels in axis) int min = int(m_axisX->min()); int count = int(m_axisX->max()) - min + 1; - QStringList subList = static_cast<QBarDataProxy *>(firstSeries->dataProxy()) - ->columnLabels().mid(min, count); + QStringList subList; + if (m_primarySeries && m_primarySeries->dataProxy()) { + subList = static_cast<QBarDataProxy *>(m_primarySeries->dataProxy()) + ->columnLabels().mid(min, count); + } static_cast<QCategory3DAxis *>(m_axisX)->dptr()->setDataLabels(subList); } } @@ -246,31 +246,36 @@ void Bars3DController::setAxisZ(QAbstract3DAxis *axis) handleDataRowLabelsChanged(); } -void Bars3DController::addSeries(QAbstract3DSeries *series) +void Bars3DController::setPrimarySeries(QBar3DSeries *series) { - Q_ASSERT(series && series->type() == QAbstract3DSeries::SeriesTypeBar); - - bool firstAdded = !m_seriesList.size(); - - Abstract3DController::addSeries(series); - - if (series->isVisible()) - adjustAxisRanges(); + if (!series) { + if (m_seriesList.size()) + series = static_cast<QBar3DSeries *>(m_seriesList.at(0)); + } else if (!m_seriesList.contains(series)) { + // Add nonexistent series. + addSeries(series); + } - if (firstAdded) { + if (m_primarySeries != series) { + m_primarySeries = series; handleDataRowLabelsChanged(); handleDataColumnLabelsChanged(); + emit primarySeriesChanged(m_primarySeries); } +} - QBar3DSeries *barSeries = static_cast<QBar3DSeries *>(series); - if (barSeries->selectedBar() != invalidSelectionPosition()) - setSelectedBar(barSeries->selectedBar(), barSeries); +QBar3DSeries *Bars3DController::primarySeries() const +{ + return m_primarySeries; } -void Bars3DController::removeSeries(QAbstract3DSeries *series) +void Bars3DController::addSeries(QAbstract3DSeries *series) { - bool firstRemoved = (m_seriesList.size() && m_seriesList.at(0) == series); + insertSeries(m_seriesList.size(), series); +} +void Bars3DController::removeSeries(QAbstract3DSeries *series) +{ bool wasVisible = (series && series->d_ptr->m_controller == this && series->isVisible()); Abstract3DController::removeSeries(series); @@ -281,9 +286,44 @@ void Bars3DController::removeSeries(QAbstract3DSeries *series) if (wasVisible) adjustAxisRanges(); - if (firstRemoved) { + // If primary series is removed, reset it to default + if (series == m_primarySeries) { + if (m_seriesList.size()) + m_primarySeries = static_cast<QBar3DSeries *>(m_seriesList.at(0)); + else + m_primarySeries = 0; + handleDataRowLabelsChanged(); handleDataColumnLabelsChanged(); + + emit primarySeriesChanged(m_primarySeries); + } +} + +void Bars3DController::insertSeries(int index, QAbstract3DSeries *series) +{ + Q_ASSERT(series && series->type() == QAbstract3DSeries::SeriesTypeBar); + + int oldSize = m_seriesList.size(); + + Abstract3DController::insertSeries(index, series); + + if (oldSize != m_seriesList.size()) { + if (series->isVisible()) + adjustAxisRanges(); + + QBar3DSeries *barSeries = static_cast<QBar3DSeries *>(series); + if (!oldSize) { + m_primarySeries = barSeries; + handleDataRowLabelsChanged(); + handleDataColumnLabelsChanged(); + } + + if (barSeries->selectedBar() != invalidSelectionPosition()) + setSelectedBar(barSeries->selectedBar(), barSeries); + + if (!oldSize) + emit primarySeriesChanged(m_primarySeries); } } diff --git a/src/datavisualization/engine/bars3dcontroller_p.h b/src/datavisualization/engine/bars3dcontroller_p.h index 0c9bf71c..0632830e 100644 --- a/src/datavisualization/engine/bars3dcontroller_p.h +++ b/src/datavisualization/engine/bars3dcontroller_p.h @@ -63,6 +63,7 @@ private: QPoint m_selectedBar; // Points to row & column in data window. QBar3DSeries *m_selectedBarSeries; // Points to the series for which the bar is selected in // single series selection cases. + QBar3DSeries *m_primarySeries; // Category axis labels are taken from the primary series // Look'n'feel bool m_isBarSpecRelative; @@ -100,8 +101,11 @@ public: virtual void setAxisX(QAbstract3DAxis *axis); virtual void setAxisZ(QAbstract3DAxis *axis); + virtual void setPrimarySeries(QBar3DSeries *series); + virtual QBar3DSeries *primarySeries() const; virtual void addSeries(QAbstract3DSeries *series); virtual void removeSeries(QAbstract3DSeries *series); + virtual void insertSeries(int index, QAbstract3DSeries *series); virtual QList<QBar3DSeries *> barSeriesList(); virtual void handleAxisRangeChangedBySender(QObject *sender); @@ -119,6 +123,9 @@ public slots: // Renderer callback handlers void handleBarClicked(const QPoint &position, QBar3DSeries *series); +signals: + void primarySeriesChanged(QBar3DSeries *series); + protected: virtual QAbstract3DAxis *createDefaultAxis(QAbstract3DAxis::AxisOrientation orientation); diff --git a/src/datavisualization/engine/q3dbars.cpp b/src/datavisualization/engine/q3dbars.cpp index 00530f7f..3b8d837d 100644 --- a/src/datavisualization/engine/q3dbars.cpp +++ b/src/datavisualization/engine/q3dbars.cpp @@ -102,6 +102,8 @@ Q3DBars::Q3DBars(const QSurfaceFormat *format, QWindow *parent) dptr()->m_shared = new Bars3DController(geometry()); d_ptr->setVisualController(dptr()->m_shared); dptr()->m_shared->initializeOpenGL(); + QObject::connect(dptr()->m_shared, &Bars3DController::primarySeriesChanged, + this, &Q3DBars::primarySeriesChanged); } /*! @@ -112,12 +114,37 @@ Q3DBars::~Q3DBars() } /*! + * \property Q3DBars::primarySeries + * + * Specifies the \a series that is the primary series of the graph. The primary series + * is used to determine the row and column axis labels when the labels are not explicitly + * set to the axes. + * If the specified \a series is not already added to the graph, setting it as the + * primary series will also implicitly add it to the graph. + * If the primary series itself is removed from the graph, this property + * resets to default. + * If \a series is null, this property resets to default. + * Defaults to the first added series or zero if no series are added to the graph. + */ +void Q3DBars::setPrimarySeries(QBar3DSeries *series) +{ + dptr()->m_shared->setPrimarySeries(series); +} + +QBar3DSeries *Q3DBars::primarySeries() const +{ + return dptrc()->m_shared->primarySeries(); +} + +/*! * Adds the \a series to the graph. A graph can contain multiple series, but only one set of axes, * so the rows and columns of all series must match for the visualized data to be meaningful. * If the graph has multiple visible series, only the first one added will * generate the row or column labels on the axes in cases where the labels are not explicitly set * to the axes. If the newly added series has specified a selected bar, it will be highlighted and * any existing selection will be cleared. Only one added series can have an active selection. + * + * /sa seriesList() */ void Q3DBars::addSeries(QBar3DSeries *series) { @@ -133,6 +160,21 @@ void Q3DBars::removeSeries(QBar3DSeries *series) } /*! + * Inserts the \a series into the position \a index in the series list. + * If the \a series has already been added to the list, it is moved to the + * new \a index. + * \note When moving a series to a new \a index that is after its old index, + * the new position in list is calculated as if the series was still in its old + * index, so the final index is actually the \a index decremented by one. + * + * \sa addSeries(), seriesList(), seriesIndex() + */ +void Q3DBars::insertSeries(int index, QBar3DSeries *series) +{ + dptr()->m_shared->insertSeries(index, series); +} + +/*! * \return list of series added to this graph. */ QList<QBar3DSeries *> Q3DBars::seriesList() diff --git a/src/datavisualization/engine/q3dbars.h b/src/datavisualization/engine/q3dbars.h index 10535eab..251e410f 100644 --- a/src/datavisualization/engine/q3dbars.h +++ b/src/datavisualization/engine/q3dbars.h @@ -40,13 +40,17 @@ class QT_DATAVISUALIZATION_EXPORT Q3DBars : public QAbstract3DGraph Q_PROPERTY(QCategory3DAxis *rowAxis READ rowAxis WRITE setRowAxis NOTIFY rowAxisChanged) Q_PROPERTY(QCategory3DAxis *columnAxis READ columnAxis WRITE setColumnAxis NOTIFY columnAxisChanged) Q_PROPERTY(QValue3DAxis *valueAxis READ valueAxis WRITE setValueAxis NOTIFY valueAxisChanged) + Q_PROPERTY(QBar3DSeries *primarySeries READ primarySeries WRITE setPrimarySeries NOTIFY primarySeriesChanged) public: explicit Q3DBars(const QSurfaceFormat *format = 0, QWindow *parent = 0); virtual ~Q3DBars(); + void setPrimarySeries(QBar3DSeries *series); + QBar3DSeries *primarySeries() const; void addSeries(QBar3DSeries *series); void removeSeries(QBar3DSeries *series); + void insertSeries(int index, QBar3DSeries *series); QList<QBar3DSeries *> seriesList(); void setBarThickness(float thicknessRatio); @@ -75,6 +79,7 @@ signals: void rowAxisChanged(QCategory3DAxis *axis); void columnAxisChanged(QCategory3DAxis *axis); void valueAxisChanged(QValue3DAxis *axis); + void primarySeriesChanged(QBar3DSeries *series); private: Q3DBarsPrivate *dptr(); diff --git a/src/datavisualizationqml2/declarativebars.cpp b/src/datavisualizationqml2/declarativebars.cpp index 97299833..8634e91d 100644 --- a/src/datavisualizationqml2/declarativebars.cpp +++ b/src/datavisualizationqml2/declarativebars.cpp @@ -32,6 +32,9 @@ DeclarativeBars::DeclarativeBars(QQuickItem *parent) // Create the shared component on the main GUI thread. m_barsController = new Bars3DController(boundingRect().toRect(), new Declarative3DScene); AbstractDeclarative::setSharedController(m_barsController); + + QObject::connect(m_barsController, &Bars3DController::primarySeriesChanged, + this, &DeclarativeBars::primarySeriesChanged); } DeclarativeBars::~DeclarativeBars() @@ -152,6 +155,21 @@ void DeclarativeBars::removeSeries(QBar3DSeries *series) series->setParent(this); // Reparent as removing will leave series parentless } +void DeclarativeBars::insertSeries(int index, QBar3DSeries *series) +{ + m_barsController->insertSeries(index, series); +} + +void DeclarativeBars::setPrimarySeries(QBar3DSeries *series) +{ + m_barsController->setPrimarySeries(series); +} + +QBar3DSeries *DeclarativeBars::primarySeries() const +{ + return m_barsController->primarySeries(); +} + void DeclarativeBars::handleAxisXChanged(QAbstract3DAxis *axis) { emit columnAxisChanged(static_cast<QCategory3DAxis *>(axis)); diff --git a/src/datavisualizationqml2/declarativebars_p.h b/src/datavisualizationqml2/declarativebars_p.h index 6a2a3052..9c89c5a2 100644 --- a/src/datavisualizationqml2/declarativebars_p.h +++ b/src/datavisualizationqml2/declarativebars_p.h @@ -55,6 +55,7 @@ class DeclarativeBars : public AbstractDeclarative Q_PROPERTY(QSizeF barSpacing READ barSpacing WRITE setBarSpacing NOTIFY barSpacingChanged) Q_PROPERTY(bool barSpacingRelative READ isBarSpacingRelative WRITE setBarSpacingRelative NOTIFY barSpacingRelativeChanged) Q_PROPERTY(QQmlListProperty<QBar3DSeries> seriesList READ seriesList) + Q_PROPERTY(QBar3DSeries *primarySeries READ primarySeries WRITE setPrimarySeries NOTIFY primarySeriesChanged) Q_CLASSINFO("DefaultProperty", "seriesList") public: @@ -84,6 +85,9 @@ public: static void clearSeriesFunc(QQmlListProperty<QBar3DSeries> *list); Q_INVOKABLE void addSeries(QBar3DSeries *series); Q_INVOKABLE void removeSeries(QBar3DSeries *series); + Q_INVOKABLE void insertSeries(int index, QBar3DSeries *series); + void setPrimarySeries(QBar3DSeries *series); + QBar3DSeries *primarySeries() const; public slots: void handleAxisXChanged(QAbstract3DAxis *axis); @@ -98,6 +102,7 @@ signals: void barSpacingChanged(QSizeF spacing); void barSpacingRelativeChanged(bool relative); void meshFileNameChanged(QString filename); + void primarySeriesChanged(QBar3DSeries *series); private: Bars3DController *m_barsController; |