summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/datavisualization/axis/qcategory3daxis.cpp10
-rw-r--r--src/datavisualization/doc/src/qtdatavisualization-qml-bars3d.qdoc29
-rw-r--r--src/datavisualization/engine/abstract3dcontroller.cpp29
-rw-r--r--src/datavisualization/engine/abstract3dcontroller_p.h1
-rw-r--r--src/datavisualization/engine/bars3dcontroller.cpp94
-rw-r--r--src/datavisualization/engine/bars3dcontroller_p.h7
-rw-r--r--src/datavisualization/engine/q3dbars.cpp42
-rw-r--r--src/datavisualization/engine/q3dbars.h5
-rw-r--r--src/datavisualizationqml2/declarativebars.cpp18
-rw-r--r--src/datavisualizationqml2/declarativebars_p.h5
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;