summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@digia.com>2013-11-15 12:48:13 +0200
committerMiikka Heikkinen <miikka.heikkinen@digia.com>2013-11-20 09:34:06 +0200
commit51d4a9fcba6089ba433ae126f554b50979220d07 (patch)
tree5ffdabb461efc3989224226b600a649d395ef80a
parent96995bda0da7ecf99d2ac4a4e417545c3506bf02 (diff)
Multi series selection part 1: bars
Task-number: QTRD-2556 Change-Id: I1f537f0b4c299028d4415f074d5eac6552bb3b9b Reviewed-by: Pasi Keränen <pasi.keranen@digia.com>
-rw-r--r--examples/bars/graphmodifier.cpp27
-rw-r--r--examples/bars/main.cpp11
-rw-r--r--examples/itemmodel/main.cpp4
-rw-r--r--examples/qmlbars/doc/src/qmlbars.qdoc1
-rw-r--r--examples/qmlbars/qml/qmlbars/data.qml4
-rw-r--r--examples/qmlbars/qml/qmlbars/main.qml92
-rw-r--r--src/datavisualization/data/qabstract3dseries.cpp2
-rw-r--r--src/datavisualization/data/qabstract3dseries.h1
-rw-r--r--src/datavisualization/data/qabstract3dseries_p.h1
-rw-r--r--src/datavisualization/data/qbar3dseries.cpp45
-rw-r--r--src/datavisualization/data/qbar3dseries.h5
-rw-r--r--src/datavisualization/data/qbar3dseries_p.h5
-rw-r--r--src/datavisualization/data/qscatter3dseries.cpp5
-rw-r--r--src/datavisualization/data/qscatter3dseries_p.h1
-rw-r--r--src/datavisualization/data/qsurface3dseries.cpp5
-rw-r--r--src/datavisualization/engine/abstract3dcontroller.cpp17
-rw-r--r--src/datavisualization/engine/abstract3dcontroller_p.h3
-rw-r--r--src/datavisualization/engine/abstract3drenderer.cpp24
-rw-r--r--src/datavisualization/engine/abstract3drenderer_p.h7
-rw-r--r--src/datavisualization/engine/bars3dcontroller.cpp123
-rw-r--r--src/datavisualization/engine/bars3dcontroller_p.h12
-rw-r--r--src/datavisualization/engine/bars3drenderer.cpp122
-rw-r--r--src/datavisualization/engine/bars3drenderer_p.h14
-rw-r--r--src/datavisualization/engine/engine.pri2
-rw-r--r--src/datavisualization/engine/q3dbars.cpp23
-rw-r--r--src/datavisualization/engine/q3dbars.h5
-rw-r--r--src/datavisualization/engine/scatter3drenderer.cpp37
-rw-r--r--src/datavisualization/engine/scatter3drenderer_p.h3
-rw-r--r--src/datavisualization/engine/seriesrendercache.cpp42
-rw-r--r--src/datavisualization/engine/seriesrendercache_p.h60
-rw-r--r--src/datavisualization/engine/surface3drenderer.cpp11
-rw-r--r--src/datavisualization/engine/surface3drenderer_p.h2
-rw-r--r--src/datavisualization/global/qdatavisualizationenums.h3
-rw-r--r--src/datavisualization/global/qtdatavisualizationenums.qdoc3
-rw-r--r--src/datavisualizationqml2/declarativebars.cpp12
-rw-r--r--src/datavisualizationqml2/declarativebars_p.h5
-rw-r--r--src/datavisualizationqml2/declarativeseries.cpp12
-rw-r--r--src/datavisualizationqml2/declarativeseries_p.h9
-rw-r--r--tests/barstest/chart.cpp83
-rw-r--r--tests/barstest/main.cpp5
40 files changed, 540 insertions, 308 deletions
diff --git a/examples/bars/graphmodifier.cpp b/examples/bars/graphmodifier.cpp
index efd6aa6d..132ba4d6 100644
--- a/examples/bars/graphmodifier.cpp
+++ b/examples/bars/graphmodifier.cpp
@@ -76,9 +76,9 @@ GraphModifier::GraphModifier(Q3DBars *bargraph)
//! [3]
QBar3DSeries *series = new QBar3DSeries(m_primaryData);
- series->setItemLabelFormat(QStringLiteral("@valueTitle for @colLabel @rowLabel: @valueLabel"));
+ series->setItemLabelFormat(QStringLiteral("Oulu - @colLabel @rowLabel: @valueLabel"));
QBar3DSeries *series2 = new QBar3DSeries(m_secondaryData);
- series2->setItemLabelFormat(QStringLiteral("@valueTitle for @colLabel @rowLabel: @valueLabel"));
+ series2->setItemLabelFormat(QStringLiteral("Helsinki - @colLabel @rowLabel: @valueLabel"));
series2->setVisible(false);
//! [4]
@@ -109,7 +109,7 @@ void GraphModifier::resetTemperatureData()
{
//! [5]
// Set up data
- static const qreal temp[7][12] = {
+ static const qreal tempOulu[7][12] = {
{-6.7, -11.7, -9.7, 3.3, 9.2, 14.0, 16.3, 17.8, 10.2, 2.1, -2.6, -0.3}, // 2006
{-6.8, -13.3, 0.2, 1.5, 7.9, 13.4, 16.1, 15.5, 8.2, 5.4, -2.6, -0.8}, // 2007
{-4.2, -4.0, -4.6, 1.9, 7.3, 12.5, 15.0, 12.8, 7.6, 5.1, -0.9, -1.3}, // 2008
@@ -118,14 +118,15 @@ void GraphModifier::resetTemperatureData()
{-9.0, -15.2, -3.8, 2.6, 8.3, 15.9, 18.6, 14.9, 11.1, 5.3, 1.8, -0.2}, // 2011
{-8.7, -11.3, -2.3, 0.4, 7.5, 12.2, 16.4, 14.1, 9.2, 3.1, 0.3, -12.1} // 2012
};
- static const qreal temp2[7][12] = {
- {-8.7, -11.3, -2.3, 0.4, 7.5, 12.2, 16.4, 14.1, 9.2, 3.1, 0.3, -12.1}, // 2006
- {-7.8, -8.8, -4.2, 0.7, 9.3, 13.2, 15.8, 15.5, 11.2, 0.6, 0.7, -8.4}, // 2007
- {-6.8, -13.3, 0.2, 1.5, 7.9, 13.4, 16.1, 15.5, 8.2, 5.4, -2.6, -0.8}, // 2008
- {-6.7, -11.7, -9.7, 3.3, 9.2, 14.0, 16.3, 17.8, 10.2, 2.1, -2.6, -0.3}, // 2009
- {-4.2, -4.0, -4.6, 1.9, 7.3, 12.5, 15.0, 12.8, 7.6, 5.1, -0.9, -1.3}, // 2010
- {-14.4, -12.1, -7.0, 2.3, 11.0, 12.6, 18.8, 13.8, 9.4, 3.9, -5.6, -13.0}, // 2011
- {-9.0, -15.2, -3.8, 2.6, 8.3, 15.9, 18.6, 14.9, 11.1, 5.3, 1.8, -0.2} // 2012
+
+ static const qreal tempHelsinki[7][12] = {
+ {-3.7, -7.8, -5.4, 3.4, 10.7, 15.4, 18.6, 18.7, 14.3, 8.5, 2.9, 4.1}, // 2006
+ {-1.2, -7.5, 3.1, 5.5, 10.3, 15.9, 17.4, 17.9, 11.2, 7.3, 1.1, 0.5}, // 2007
+ {-0.6, 1.2, 0.2, 6.3, 10.2, 13.8, 18.1, 15.1, 10.1, 9.4, 2.5, 0.4}, // 2008
+ {-2.9, -3.5, -0.9, 4.7, 10.9, 14.0, 17.4, 16.8, 13.2, 4.1, 2.6, -2.3}, // 2009
+ {-10.2, -8.0, -1.9, 6.6, 11.3, 14.5, 21.0, 18.8, 12.6, 6.1, -0.5, -7.3}, // 2010
+ {-4.4, -9.1, -2.0, 5.5, 9.9, 15.6, 20.8, 17.8, 13.4, 8.9, 3.6, 1.5}, // 2011
+ {-3.5, -3.2, -0.7, 4.0, 11.1, 13.4, 17.3, 15.8, 13.1, 6.4, 4.1, -5.1} // 2012
};
// Create data arrays
@@ -141,8 +142,8 @@ void GraphModifier::resetTemperatureData()
dataRow2 = new QBarDataRow(m_months.size());
for (int month = 0; month < m_months.size(); month++) {
// Add data to the row
- (*dataRow)[month].setValue(temp[year][month]);
- (*dataRow2)[month].setValue(temp2[year][month]);
+ (*dataRow)[month].setValue(tempOulu[year][month]);
+ (*dataRow2)[month].setValue(tempHelsinki[year][month]);
}
// Add the row to the set
dataSet->append(dataRow);
diff --git a/examples/bars/main.cpp b/examples/bars/main.cpp
index ecd5d353..3bac58b2 100644
--- a/examples/bars/main.cpp
+++ b/examples/bars/main.cpp
@@ -52,7 +52,7 @@ int main(int argc, char **argv)
hLayout->addLayout(vLayout);
//! [1]
- widget->setWindowTitle(QStringLiteral("Average temperatures in Oulu, Finland (2006-2012)"));
+ widget->setWindowTitle(QStringLiteral("Average temperatures in Oulu and Helsinki, Finland (2006-2012)"));
QComboBox *themeList = new QComboBox(widget);
themeList->addItem(QStringLiteral("Qt"));
@@ -108,6 +108,15 @@ int main(int argc, char **argv)
int(QDataVis::SelectionSlice | QDataVis::SelectionColumn));
selectionModeList->addItem(QStringLiteral("Slice into Column and Item"),
int(QDataVis::SelectionSlice | QDataVis::SelectionItemAndColumn));
+ selectionModeList->addItem(QStringLiteral("Multi: Bar, Row, Col"),
+ int(QDataVis::SelectionItemRowAndColumn
+ | QDataVis::SelectionMultiSeries));
+ selectionModeList->addItem(QStringLiteral("Multi, Slice: Row, Item"),
+ int(QDataVis::SelectionSlice | QDataVis::SelectionItemAndRow
+ | QDataVis::SelectionMultiSeries));
+ selectionModeList->addItem(QStringLiteral("Multi, Slice: Col, Item"),
+ int(QDataVis::SelectionSlice | QDataVis::SelectionItemAndColumn
+ | QDataVis::SelectionMultiSeries));
selectionModeList->setCurrentIndex(1);
QCheckBox *backgroundCheckBox = new QCheckBox(widget);
diff --git a/examples/itemmodel/main.cpp b/examples/itemmodel/main.cpp
index 90bac03b..3325d6a2 100644
--- a/examples/itemmodel/main.cpp
+++ b/examples/itemmodel/main.cpp
@@ -223,7 +223,7 @@ void GraphDataGenerator::selectedFromTable(int currentRow, int currentColumn,
{
Q_UNUSED(previousRow)
Q_UNUSED(previousColumn)
- m_graph->setSelectedBar(QPoint(currentRow, currentColumn));
+ m_graph->seriesList().at(0)->setSelectedBar(QPoint(currentRow, currentColumn));
}
//! [14]
@@ -275,7 +275,7 @@ int main(int argc, char **argv)
//! [3]
GraphDataGenerator generator(graph, tableWidget);
- QObject::connect(graph, &Q3DBars::selectedBarChanged, &generator,
+ QObject::connect(series, &QBar3DSeries::selectedBarChanged, &generator,
&GraphDataGenerator::selectFromTable);
QObject::connect(tableWidget, &QTableWidget::currentCellChanged, &generator,
&GraphDataGenerator::selectedFromTable);
diff --git a/examples/qmlbars/doc/src/qmlbars.qdoc b/examples/qmlbars/doc/src/qmlbars.qdoc
index 9f51f89e..79b6c4fd 100644
--- a/examples/qmlbars/doc/src/qmlbars.qdoc
+++ b/examples/qmlbars/doc/src/qmlbars.qdoc
@@ -27,6 +27,7 @@
\image qmlbars-example.png
+ TODO: **This example is no longer about remapping, as multiple series are used instead**
The interesting thing about this example is remapping the data, so we concentrate on that
and skip explaining the basic Bars3D functionality - for more detailed QML example documentation,
see \l{Qt Quick 2 Scatter Example}.
diff --git a/examples/qmlbars/qml/qmlbars/data.qml b/examples/qmlbars/qml/qmlbars/data.qml
index 64df4c6a..12ba171c 100644
--- a/examples/qmlbars/qml/qmlbars/data.qml
+++ b/examples/qmlbars/qml/qmlbars/data.qml
@@ -29,7 +29,7 @@ Item {
id: valueMapping
rowRole: "year"
columnRole: "month"
- valueRole: "expenses"
+ valueRole: "income"
}
//! [1]
@@ -37,7 +37,7 @@ Item {
id: secondaryMapping
rowRole: "year"
columnRole: "month"
- valueRole: "income"
+ valueRole: "expenses"
}
//! [0]
diff --git a/examples/qmlbars/qml/qmlbars/main.qml b/examples/qmlbars/qml/qmlbars/main.qml
index 9432d44b..e48de35b 100644
--- a/examples/qmlbars/qml/qmlbars/main.qml
+++ b/examples/qmlbars/qml/qmlbars/main.qml
@@ -35,6 +35,36 @@ Item {
id: graphAxes
}
+ property Bar3DSeries selectedSeries
+ selectedSeries: barSeries
+
+ function handleSelectionChange(series, position) {
+ if (position.x !== -1) {
+ selectedSeries = series
+ }
+ // Set tableView current row to selected bar
+ var rowRole = series.dataProxy.rowLabels[position.x];
+ var colRole = series.dataProxy.columnLabels[position.y];
+ var currentRow = tableView.currentRow
+ if (currentRow === -1 || rowRole !== graphData.model.get(currentRow).year
+ || colRole !== graphData.model.get(currentRow).month) {
+ var totalRows = tableView.rowCount;
+ for (var i = 0; i < totalRows; i++) {
+ var currentRowRole = graphData.model.get(i).year
+ var currentColRole = graphData.model.get(i).month
+ if (currentRowRole === rowRole && currentColRole === colRole) {
+ tableView.currentRow = i
+ // Workaround to 5.2 row selection issue
+ if (typeof tableView.selection != "undefined") {
+ tableView.selection.clear()
+ tableView.selection.select(i)
+ }
+ break
+ }
+ }
+ }
+ }
+
Item {
id: dataView
width: parent.width - tableView.width
@@ -50,85 +80,63 @@ Item {
font.pointSize: 35
theme: AbstractGraph3D.ThemeRetro
labelStyle: AbstractGraph3D.LabelStyleFromTheme
- barThickness: 0.5
+ barThickness: 0.7
barSpacing: Qt.size(0.5, 0.5)
barSpacingRelative: false
scene.activeCamera.cameraPreset: AbstractGraph3D.CameraPresetIsometricLeftHigh
columnAxis: graphAxes.column
- valueAxis: graphAxes.expenses
+ valueAxis: graphAxes.income
Bar3DSeries {
id: barSeries
- itemLabelFormat: "@valueTitle for @colLabel, @rowLabel: @valueLabel"
+ itemLabelFormat: "Income for @colLabel, @rowLabel: @valueLabel"
ItemModelBarDataProxy {
id: modelProxy
activeMapping: graphData.mapping
itemModel: graphData.model
}
+
+ onSelectedBarChanged: handleSelectionChange(barSeries, position)
}
Bar3DSeries {
id: secondarySeries
visible: false
- itemLabelFormat: "@valueTitle for @colLabel, @rowLabel: @valueLabel"
+ itemLabelFormat: "Expenses for @colLabel, @rowLabel: @valueLabel"
ItemModelBarDataProxy {
id: secondaryProxy
activeMapping: graphData.secondaryMapping
itemModel: graphData.model
}
- }
- onSelectedBarChanged: {
- // Set tableView current row to selected bar
- var rowRole = modelProxy.rowLabels[position.x];
- var colRole = modelProxy.columnLabels[position.y];
- var currentRow = tableView.currentRow
- if (currentRow === -1 || rowRole !== graphData.model.get(currentRow).year
- || colRole !== graphData.model.get(currentRow).month) {
- var totalRows = tableView.rowCount;
- for (var i = 0; i < totalRows; i++) {
- var currentRowRole = graphData.model.get(i).year
- var currentColRole = graphData.model.get(i).month
- if (currentRowRole === rowRole && currentColRole === colRole) {
- tableView.currentRow = i
- // Workaround to 5.2 row selection issue
- if (typeof tableView.selection != "undefined") {
- tableView.selection.clear()
- tableView.selection.select(i)
- }
- break
- }
- }
- }
+ onSelectedBarChanged: handleSelectionChange(secondarySeries, position)
}
}
}
Button {
- id: mappingToggle
+ id: seriesToggle
anchors.bottom: parent.bottom
width: tableView.width
height: 60
- text: "Show Income"
+ text: "Show Expenses"
//! [0]
onClicked: {
- if (graphData.mapping.valueRole === "expenses" && !secondarySeries.visible) {
- // Change mapping to change series data
- graphData.mapping.valueRole = "income"
+ if (!secondarySeries.visible) {
text = "Show Both"
- testGraph.valueAxis = graphAxes.income
- } else if (graphData.mapping.valueRole === "income"){
- // Show both data set in separate series
+ testGraph.valueAxis = graphAxes.expenses
+ barSeries.visible = false
secondarySeries.visible = true
- graphData.mapping.valueRole = "expenses"
- text = "Show Expenses"
+ } else if (!barSeries.visible){
+ barSeries.visible = true
+ text = "Show Income"
testGraph.valueAxis = graphAxes.income
} else {
secondarySeries.visible = false
- text = "Show Income"
- testGraph.valueAxis = graphAxes.expenses
+ text = "Show Expenses"
+ testGraph.valueAxis = graphAxes.income
}
}
//! [0]
@@ -136,7 +144,7 @@ Item {
Button {
id: shadowToggle
- anchors.bottom: mappingToggle.top
+ anchors.bottom: seriesToggle.top
width: tableView.width
height: 60
text: "Hide Shadows"
@@ -181,7 +189,7 @@ Item {
x: 0
y: 0
width: 298
- height: parent.height - mappingToggle.height - shadowToggle.height - dataToggle.height
+ height: parent.height - seriesToggle.height - shadowToggle.height - dataToggle.height
TableViewColumn{ role: "year" ; title: "Year" ; width: 80 }
TableViewColumn{ role: "month" ; title: "Month" ; width: 80 }
TableViewColumn{ role: "expenses" ; title: "Expenses" ; width: 60 }
@@ -192,7 +200,7 @@ Item {
onCurrentRowChanged: {
var rowIndex = modelProxy.activeMapping.rowCategoryIndex(graphData.model.get(currentRow).year)
var colIndex = modelProxy.activeMapping.columnCategoryIndex(graphData.model.get(currentRow).month)
- testGraph.selectedBar = Qt.point(rowIndex, colIndex)
+ mainview.selectedSeries.selectedBar = Qt.point(rowIndex, colIndex)
}
//! [2]
}
diff --git a/src/datavisualization/data/qabstract3dseries.cpp b/src/datavisualization/data/qabstract3dseries.cpp
index 52d3fda1..0ebf2aa1 100644
--- a/src/datavisualization/data/qabstract3dseries.cpp
+++ b/src/datavisualization/data/qabstract3dseries.cpp
@@ -162,6 +162,8 @@ QAbstract3DSeriesPrivate::~QAbstract3DSeriesPrivate()
void QAbstract3DSeriesPrivate::setItemLabelFormat(const QString &format)
{
m_itemLabelFormat = format;
+ if (m_controller)
+ m_controller->setSeriesDirty();
}
QAbstractDataProxy *QAbstract3DSeriesPrivate::dataProxy() const
diff --git a/src/datavisualization/data/qabstract3dseries.h b/src/datavisualization/data/qabstract3dseries.h
index 3f20a161..ccd93ad2 100644
--- a/src/datavisualization/data/qabstract3dseries.h
+++ b/src/datavisualization/data/qabstract3dseries.h
@@ -79,6 +79,7 @@ private:
friend class Bars3DController;
friend class Surface3DController;
friend class Scatter3DController;
+ friend class QBar3DSeries;
};
QT_DATAVISUALIZATION_END_NAMESPACE
diff --git a/src/datavisualization/data/qabstract3dseries_p.h b/src/datavisualization/data/qabstract3dseries_p.h
index 478fe6bb..2851c8e0 100644
--- a/src/datavisualization/data/qabstract3dseries_p.h
+++ b/src/datavisualization/data/qabstract3dseries_p.h
@@ -66,6 +66,7 @@ private:
friend class Bars3DController;
friend class Surface3DController;
friend class Scatter3DController;
+ friend class QBar3DSeries;
};
QT_DATAVISUALIZATION_END_NAMESPACE
diff --git a/src/datavisualization/data/qbar3dseries.cpp b/src/datavisualization/data/qbar3dseries.cpp
index c04f8ca2..febbd97e 100644
--- a/src/datavisualization/data/qbar3dseries.cpp
+++ b/src/datavisualization/data/qbar3dseries.cpp
@@ -136,6 +136,31 @@ QBarDataProxy *QBar3DSeries::dataProxy() const
}
/*!
+ * \property Q3DBars::selectedBar
+ *
+ * Selects a bar in a \a position. The position is the (row, column) position in
+ * the data array of the series.
+ * Only one bar can be selected at a time.
+ * To clear selection, specify an illegal \a position, e.g. (-1, -1).
+ * If this series is added to a graph, the graph can adjust the selection according to user
+ * interaction or if it becomes invalid. Selecting a bar on another added series will also
+ * clear the selection.
+ */
+void QBar3DSeries::setSelectedBar(const QPoint &position)
+{
+ // Don't do this in private to avoid loops, as that is used for callback from controller.
+ if (d_ptr->m_controller)
+ static_cast<Bars3DController *>(d_ptr->m_controller)->setSelectedBar(position, this);
+ else
+ dptr()->setSelectedBar(position);
+}
+
+QPoint QBar3DSeries::selectedBar() const
+{
+ return dptrc()->m_selectedBar;
+}
+
+/*!
* \internal
*/
QBar3DSeriesPrivate *QBar3DSeries::dptr()
@@ -154,7 +179,8 @@ const QBar3DSeriesPrivate *QBar3DSeries::dptrc() const
// QBar3DSeriesPrivate
QBar3DSeriesPrivate::QBar3DSeriesPrivate(QBar3DSeries *q)
- : QAbstract3DSeriesPrivate(q, QAbstract3DSeries::SeriesTypeBar)
+ : QAbstract3DSeriesPrivate(q, QAbstract3DSeries::SeriesTypeBar),
+ m_selectedBar(Bars3DController::noSelectionPoint())
{
m_itemLabelFormat = QStringLiteral("@valueTitle: @valueLabel");
}
@@ -180,16 +206,15 @@ void QBar3DSeriesPrivate::setDataProxy(QAbstractDataProxy *proxy)
void QBar3DSeriesPrivate::connectControllerAndProxy(Abstract3DController *newController)
{
QBarDataProxy *barDataProxy = static_cast<QBarDataProxy *>(m_dataProxy);
+ Bars3DController *controller = static_cast<Bars3DController *>(newController);
if (m_controller && barDataProxy) {
- //Disconnect old controller/old proxy
+ // Disconnect old controller/old proxy
QObject::disconnect(barDataProxy, 0, m_controller, 0);
QObject::disconnect(q_ptr, 0, m_controller, 0);
}
if (newController && barDataProxy) {
- Bars3DController *controller = static_cast<Bars3DController *>(newController);
-
QObject::connect(barDataProxy, &QBarDataProxy::arrayReset, controller,
&Bars3DController::handleArrayReset);
QObject::connect(barDataProxy, &QBarDataProxy::rowsAdded, controller,
@@ -206,14 +231,16 @@ void QBar3DSeriesPrivate::connectControllerAndProxy(Abstract3DController *newCon
&Bars3DController::handleDataRowLabelsChanged);
QObject::connect(barDataProxy, &QBarDataProxy::columnLabelsChanged, controller,
&Bars3DController::handleDataColumnLabelsChanged);
-
QObject::connect(q_ptr, &QAbstract3DSeries::visibilityChanged, controller,
&Abstract3DController::handleSeriesVisibilityChanged);
+ }
+}
- // Always clear selection on proxy change
- // TODO: setSelectedBar(noSelectionPoint());
-
- newController->handleSeriesVisibilityChanged(m_visible);
+void QBar3DSeriesPrivate::setSelectedBar(const QPoint &position)
+{
+ if (position != m_selectedBar) {
+ m_selectedBar = position;
+ emit qptr()->selectedBarChanged(m_selectedBar);
}
}
diff --git a/src/datavisualization/data/qbar3dseries.h b/src/datavisualization/data/qbar3dseries.h
index ebb37838..ec1754d1 100644
--- a/src/datavisualization/data/qbar3dseries.h
+++ b/src/datavisualization/data/qbar3dseries.h
@@ -30,6 +30,7 @@ class QT_DATAVISUALIZATION_EXPORT QBar3DSeries : public QAbstract3DSeries
{
Q_OBJECT
Q_PROPERTY(QBarDataProxy *dataProxy READ dataProxy WRITE setDataProxy NOTIFY dataProxyChanged)
+ Q_PROPERTY(QPoint selectedBar READ selectedBar WRITE setSelectedBar NOTIFY selectedBarChanged)
public:
explicit QBar3DSeries(QObject *parent = 0);
@@ -39,8 +40,12 @@ public:
void setDataProxy(QBarDataProxy *proxy);
QBarDataProxy *dataProxy() const;
+ void setSelectedBar(const QPoint &position);
+ QPoint selectedBar() const;
+
signals:
void dataProxyChanged(QBarDataProxy *proxy);
+ void selectedBarChanged(QPoint position);
protected:
explicit QBar3DSeries(QBar3DSeriesPrivate *d, QObject *parent = 0);
diff --git a/src/datavisualization/data/qbar3dseries_p.h b/src/datavisualization/data/qbar3dseries_p.h
index 3ed95a69..89edb84a 100644
--- a/src/datavisualization/data/qbar3dseries_p.h
+++ b/src/datavisualization/data/qbar3dseries_p.h
@@ -43,9 +43,14 @@ public:
virtual void setDataProxy(QAbstractDataProxy *proxy);
virtual void connectControllerAndProxy(Abstract3DController *newController);
+
+ void setSelectedBar(const QPoint &position);
+
private:
QBar3DSeries *qptr();
+ QPoint m_selectedBar;
+
private:
friend class QBar3DSeries;
};
diff --git a/src/datavisualization/data/qscatter3dseries.cpp b/src/datavisualization/data/qscatter3dseries.cpp
index 2fe61cff..f0374339 100644
--- a/src/datavisualization/data/qscatter3dseries.cpp
+++ b/src/datavisualization/data/qscatter3dseries.cpp
@@ -193,11 +193,6 @@ void QScatter3DSeriesPrivate::connectControllerAndProxy(Abstract3DController *ne
QObject::connect(q_ptr, &QAbstract3DSeries::visibilityChanged, controller,
&Abstract3DController::handleSeriesVisibilityChanged);
-
- // Always clear selection on proxy change
- // TODO: setSelectedScatter(noSelectionPoint());
-
- newController->handleSeriesVisibilityChanged(m_visible);
}
}
diff --git a/src/datavisualization/data/qscatter3dseries_p.h b/src/datavisualization/data/qscatter3dseries_p.h
index 001fb00c..b839af2e 100644
--- a/src/datavisualization/data/qscatter3dseries_p.h
+++ b/src/datavisualization/data/qscatter3dseries_p.h
@@ -43,6 +43,7 @@ public:
virtual void setDataProxy(QAbstractDataProxy *proxy);
virtual void connectControllerAndProxy(Abstract3DController *newController);
+
private:
QScatter3DSeries *qptr();
diff --git a/src/datavisualization/data/qsurface3dseries.cpp b/src/datavisualization/data/qsurface3dseries.cpp
index a4622580..d17daeb1 100644
--- a/src/datavisualization/data/qsurface3dseries.cpp
+++ b/src/datavisualization/data/qsurface3dseries.cpp
@@ -185,11 +185,6 @@ void QSurface3DSeriesPrivate::connectControllerAndProxy(Abstract3DController *ne
QObject::connect(q_ptr, &QAbstract3DSeries::visibilityChanged, controller,
&Abstract3DController::handleSeriesVisibilityChanged);
-
- // Always clear selection on proxy change
- // TODO: setSelectedPoint(noSelectionPoint());
-
- newController->handleSeriesVisibilityChanged(m_visible);
}
}
diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp
index 625794a5..7f87ac7c 100644
--- a/src/datavisualization/engine/abstract3dcontroller.cpp
+++ b/src/datavisualization/engine/abstract3dcontroller.cpp
@@ -51,6 +51,7 @@ Abstract3DController::Abstract3DController(QRect boundRect, QObject *parent) :
m_axisZ(0),
m_renderer(0),
m_isDataDirty(true),
+ m_isSeriesDirty(true),
m_renderPending(false)
{
// Set initial theme
@@ -96,6 +97,8 @@ void Abstract3DController::addSeries(QAbstract3DSeries *series)
if (series && !m_seriesList.contains(series)) {
m_seriesList.append(series);
series->d_ptr->setController(this);
+ if (series->isVisible())
+ handleSeriesVisibilityChangedBySender(series);
}
}
@@ -104,6 +107,9 @@ void Abstract3DController::removeSeries(QAbstract3DSeries *series)
if (series && series->d_ptr->m_controller == this) {
m_seriesList.removeAll(series);
series->d_ptr->setController(0);
+ m_isDataDirty = true;
+ m_isSeriesDirty = true;
+ emitNeedRender();
}
}
@@ -353,9 +359,15 @@ void Abstract3DController::synchDataToRenderer()
}
}
- // TODO: Another (per-series?) flag about series visuals being dirty?
+ if (m_isSeriesDirty) {
+ m_renderer->updateSeries(m_seriesList);
+ m_isSeriesDirty = false;
+ }
+
if (m_isDataDirty) {
- m_renderer->updateSeriesData(m_seriesList);
+ // Series list supplied above in updateSeries() is used to access the data,
+ // so no data needs to be passed in updateData()
+ m_renderer->updateData();
m_isDataDirty = false;
}
}
@@ -1086,6 +1098,7 @@ void Abstract3DController::handleSeriesVisibilityChangedBySender(QObject *sender
Q_UNUSED(sender)
m_isDataDirty = true;
+ m_isSeriesDirty = true;
emitNeedRender();
}
diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h
index 6f7112b7..c86f9672 100644
--- a/src/datavisualization/engine/abstract3dcontroller_p.h
+++ b/src/datavisualization/engine/abstract3dcontroller_p.h
@@ -194,6 +194,7 @@ protected:
QList<Q3DAbstractAxis *> m_axes; // List of all added axes
Abstract3DRenderer *m_renderer;
bool m_isDataDirty;
+ bool m_isSeriesDirty;
bool m_renderPending;
QList<QAbstract3DSeries *> m_seriesList;
@@ -306,7 +307,7 @@ public:
Q3DScene *scene();
- inline void setDataDirty() { m_isDataDirty = true; }
+ inline void setSeriesDirty() { m_isSeriesDirty = true; }
void emitNeedRender();
virtual void mouseDoubleClickEvent(QMouseEvent *event);
diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp
index 1446d39a..0f1349d1 100644
--- a/src/datavisualization/engine/abstract3drenderer.cpp
+++ b/src/datavisualization/engine/abstract3drenderer.cpp
@@ -143,11 +143,6 @@ QString Abstract3DRenderer::generateValueLabel(const QString &format, qreal valu
return Utils::formatLabel(valueFormatArray, valueParamType, value);
}
-QString Abstract3DRenderer::itemLabelFormat() const
-{
- return m_cachedItemLabelFormat;
-}
-
void Abstract3DRenderer::updateSelectionState(SelectionState state)
{
m_selectionState = state;
@@ -394,11 +389,22 @@ void Abstract3DRenderer::updateMultiHighlightGradient(const QLinearGradient &gra
fixGradient(&m_cachedMultiHighlightGradient, &m_multiHighlightGradientTexture);
}
-void Abstract3DRenderer::updateSeriesData(const QList<QAbstract3DSeries *> &seriesList)
+void Abstract3DRenderer::updateSeries(const QList<QAbstract3DSeries *> &seriesList)
{
- // TODO: To series visuals update - just use first series format for now
- if (seriesList.size())
- m_cachedItemLabelFormat = seriesList.at(0)->itemLabelFormat();
+ int visibleCount = 0;
+ foreach (QAbstract3DSeries *current, seriesList) {
+ if (current->isVisible())
+ visibleCount++;
+ }
+
+ if (visibleCount != m_visibleSeriesList.size())
+ m_visibleSeriesList.resize(visibleCount);
+
+ visibleCount = 0;
+ foreach (QAbstract3DSeries *current, seriesList) {
+ if (current->isVisible())
+ m_visibleSeriesList[visibleCount++].populate(current);
+ }
}
AxisRenderCache &Abstract3DRenderer::axisCacheForOrientation(Q3DAbstractAxis::AxisOrientation orientation)
diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h
index 24d42e37..1a95aaeb 100644
--- a/src/datavisualization/engine/abstract3drenderer_p.h
+++ b/src/datavisualization/engine/abstract3drenderer_p.h
@@ -37,6 +37,7 @@
#include "abstract3dcontroller_p.h"
#include "axisrendercache_p.h"
#include "qabstractdataproxy.h"
+#include "seriesrendercache_p.h"
//#define DISPLAY_RENDER_SPEED
@@ -67,7 +68,6 @@ protected:
QDataVis::ShadowQuality m_cachedShadowQuality;
GLfloat m_autoScaleAdjustment;
- QString m_cachedItemLabelFormat;
QString m_cachedObjFile;
QDataVis::SelectionFlags m_cachedSelectionMode;
bool m_cachedIsGridEnabled;
@@ -94,6 +94,7 @@ protected:
bool m_selectionDirty;
SelectionState m_selectionState;
QPoint m_inputPosition;
+ QVector<SeriesRenderCache> m_visibleSeriesList;
#ifdef DISPLAY_RENDER_SPEED
bool m_isFirstFrame;
@@ -106,7 +107,8 @@ protected:
public:
virtual ~Abstract3DRenderer();
- virtual void updateSeriesData(const QList<QAbstract3DSeries *> &seriesList);
+ virtual void updateData() = 0;
+ virtual void updateSeries(const QList<QAbstract3DSeries *> &seriesList);
virtual void render(GLuint defaultFboHandle);
@@ -121,7 +123,6 @@ public:
virtual void updateBackgroundEnabled(bool enable);
virtual void updateMeshFileName(const QString &objFileName);
virtual void updateScene(Q3DScene *scene);
- virtual QString itemLabelFormat() const;
virtual void updateTextures() = 0;
virtual void initSelectionBuffer() = 0;
virtual void updateSelectionState(SelectionState state);
diff --git a/src/datavisualization/engine/bars3dcontroller.cpp b/src/datavisualization/engine/bars3dcontroller.cpp
index 019a96be..995633a8 100644
--- a/src/datavisualization/engine/bars3dcontroller.cpp
+++ b/src/datavisualization/engine/bars3dcontroller.cpp
@@ -33,6 +33,7 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE
Bars3DController::Bars3DController(QRect boundRect)
: Abstract3DController(boundRect),
m_selectedBar(noSelectionPoint()),
+ m_selectedBarSeries(0),
m_isBarSpecRelative(true),
m_barThicknessRatio(1.0f),
m_barSpacing(QSizeF(1.0, 1.0)),
@@ -84,7 +85,7 @@ void Bars3DController::synchDataToRenderer()
// Needs to be done after data is set, as it needs to know the visual array.
if (m_changeTracker.selectedBarChanged) {
- m_renderer->updateSelectedBar(m_selectedBar);
+ m_renderer->updateSelectedBar(m_selectedBar, m_selectedBarSeries);
m_changeTracker.selectedBarChanged = false;
}
}
@@ -94,7 +95,7 @@ void Bars3DController::handleArrayReset()
adjustAxisRanges();
m_isDataDirty = true;
// Clear selection unless still valid
- setSelectedBar(m_selectedBar);
+ setSelectedBar(m_selectedBar, m_selectedBarSeries);
emitNeedRender();
}
@@ -124,7 +125,7 @@ void Bars3DController::handleRowsRemoved(int startIndex, int count)
m_isDataDirty = true;
// Clear selection unless still valid
- setSelectedBar(m_selectedBar);
+ setSelectedBar(m_selectedBar, m_selectedBarSeries);
emitNeedRender();
}
@@ -176,9 +177,14 @@ void Bars3DController::handleDataColumnLabelsChanged()
}
}
-void Bars3DController::handleBarClicked(const QPoint &position)
+void Bars3DController::handleBarClicked(const QPoint &position, QBar3DSeries *series)
{
- setSelectedBar(position);
+ // Series may already have been removed, so check it before setting the selection.
+ if (m_seriesList.contains(series))
+ setSelectedBar(position, series);
+ else
+ setSelectedBar(noSelectionPoint(), 0);
+
// TODO: pass clicked to parent. (QTRD-2517)
// TODO: Also hover needed? (QTRD-2131)
}
@@ -191,6 +197,15 @@ void Bars3DController::handleAxisAutoAdjustRangeChangedInOrientation(
adjustAxisRanges();
}
+void Bars3DController::handleSeriesVisibilityChangedBySender(QObject *sender)
+{
+ Abstract3DController::handleSeriesVisibilityChangedBySender(sender);
+
+ // Visibility changes may require disabling/enabling slicing,
+ // so just reset selection to ensure everything is still valid.
+ setSelectedBar(m_selectedBar, m_selectedBarSeries);
+}
+
QPoint Bars3DController::noSelectionPoint()
{
static QPoint noSelectionPos(-1, -1);
@@ -222,16 +237,20 @@ void Bars3DController::addSeries(QAbstract3DSeries *series)
handleDataRowLabelsChanged();
handleDataColumnLabelsChanged();
-
- // TODO: Temp until selection by series is properly implemented
- setSelectedBar(noSelectionPoint());
}
+
+ QBar3DSeries *barSeries = static_cast<QBar3DSeries *>(series);
+ if (barSeries->selectedBar() != noSelectionPoint())
+ setSelectedBar(barSeries->selectedBar(), barSeries);
}
void Bars3DController::removeSeries(QAbstract3DSeries *series)
{
bool firstRemoved = (m_seriesList.size() && m_seriesList.at(0) == series);
+ if (m_selectedBarSeries == series)
+ setSelectedBar(noSelectionPoint(), 0);
+
Abstract3DController::removeSeries(series);
if (firstRemoved) {
@@ -239,9 +258,6 @@ void Bars3DController::removeSeries(QAbstract3DSeries *series)
handleDataRowLabelsChanged();
handleDataColumnLabelsChanged();
-
- // TODO: Temp until selection by series is properly implemented
- setSelectedBar(noSelectionPoint());
}
}
@@ -271,7 +287,7 @@ void Bars3DController::handleAxisRangeChangedBySender(QObject *sender)
Abstract3DController::handleAxisRangeChangedBySender(sender);
// Update selected bar - may be moved offscreen
- setSelectedBar(m_selectedBar);
+ setSelectedBar(m_selectedBar, m_selectedBarSeries);
}
void Bars3DController::setBarSpecs(GLfloat thicknessRatio, const QSizeF &spacing, bool relative)
@@ -325,44 +341,37 @@ void Bars3DController::setSelectionMode(QDataVis::SelectionFlags mode)
&& (mode.testFlag(QDataVis::SelectionRow) == mode.testFlag(QDataVis::SelectionColumn))) {
qWarning("Must specify one of either row or column selection mode in conjunction with slicing mode.");
} else {
- // When setting selection mode to a new slicing mode, activate slicing
- if (mode != selectionMode()) {
- bool isSlicing = mode.testFlag(QDataVis::SelectionSlice);
- if (isSlicing && m_selectedBar != noSelectionPoint())
- scene()->setSlicingActive(true);
- else
- scene()->setSlicingActive(false);
- }
+ QDataVis::SelectionFlags oldMode = selectionMode();
Abstract3DController::setSelectionMode(mode);
+
+ if (mode != oldMode) {
+ // Refresh selection upon mode change to ensure slicing is correctly updated
+ // according to series the visibility.
+ setSelectedBar(m_selectedBar, m_selectedBarSeries);
+
+ // Special case: Always deactivate slicing when changing away from slice
+ // automanagement, as this can't be handled in setSelectedBar.
+ if (!mode.testFlag(QDataVis::SelectionSlice)
+ && oldMode.testFlag(QDataVis::SelectionSlice)) {
+ scene()->setSlicingActive(false);
+ }
+ }
}
}
-void Bars3DController::setSelectedBar(const QPoint &position)
+void Bars3DController::setSelectedBar(const QPoint &position, QBar3DSeries *series)
{
// If the selection targets non-existent bar, clear selection instead.
QPoint pos = position;
- // TODO: Selection needs to be refactored to be handled by series
- const QBarDataProxy *proxy = 0;
- if (m_seriesList.size())
- proxy = static_cast<QBar3DSeries *>(m_seriesList.at(0))->dataProxy();
- else
- return;
-
- if (pos != noSelectionPoint()) {
- int maxRow = proxy->rowCount() - 1;
- int maxCol = (pos.x() <= maxRow && pos.x() >= 0 && proxy->rowAt(pos.x()))
- ? proxy->rowAt(pos.x())->size() - 1 : -1;
-
- if (pos.x() < 0 || pos.x() > maxRow || pos.y() < 0 || pos.y() > maxCol)
- pos = noSelectionPoint();
- }
+ adjustSelectionPosition(pos, series);
if (selectionMode().testFlag(QDataVis::SelectionSlice)) {
- // If the selected bar is outside data window, or there is no selected bar, disable slicing
+ // If the selected bar is outside data window, or there is no visible selected bar, disable slicing
if (pos.x() < m_axisX->min() || pos.x() > m_axisX->max()
- || pos.y() < m_axisZ->min() || pos.y() > m_axisZ->max()) {
+ || pos.y() < m_axisZ->min() || pos.y() > m_axisZ->max()
+ || !series->isVisible()) {
scene()->setSlicingActive(false);
} else {
scene()->setSlicingActive(true);
@@ -370,19 +379,23 @@ void Bars3DController::setSelectedBar(const QPoint &position)
emitNeedRender();
}
- if (pos != m_selectedBar) {
+ if (pos != m_selectedBar || series != m_selectedBarSeries) {
m_selectedBar = pos;
+ m_selectedBarSeries = series;
m_changeTracker.selectedBarChanged = true;
- emit selectedBarChanged(pos);
+ // Clear selection from other series and set the new selection to the affected series
+ foreach (QAbstract3DSeries *otherSeries, m_seriesList) {
+ QBar3DSeries *barSeries = static_cast<QBar3DSeries *>(otherSeries);
+ if (barSeries != m_selectedBarSeries)
+ barSeries->dptr()->setSelectedBar(noSelectionPoint());
+ else
+ barSeries->dptr()->setSelectedBar(m_selectedBar);
+ }
+
emitNeedRender();
}
}
-QPoint Bars3DController::selectedBar() const
-{
- return m_selectedBar;
-}
-
void Bars3DController::adjustAxisRanges()
{
if (m_seriesList.size()) {
@@ -428,6 +441,26 @@ void Bars3DController::adjustAxisRanges()
}
}
+// Invalidate selection position if outside data for the series
+void Bars3DController::adjustSelectionPosition(QPoint &pos, const QBar3DSeries *series)
+{
+ const QBarDataProxy *proxy = 0;
+ if (series)
+ proxy = series->dataProxy();
+
+ if (!proxy)
+ pos = noSelectionPoint();
+
+ if (pos != noSelectionPoint()) {
+ int maxRow = proxy->rowCount() - 1;
+ int maxCol = (pos.x() <= maxRow && pos.x() >= 0 && proxy->rowAt(pos.x()))
+ ? proxy->rowAt(pos.x())->size() - 1 : -1;
+
+ if (pos.x() < 0 || pos.x() > maxRow || pos.y() < 0 || pos.y() > maxCol)
+ pos = noSelectionPoint();
+ }
+}
+
Q3DAbstractAxis *Bars3DController::createDefaultAxis(Q3DAbstractAxis::AxisOrientation orientation)
{
Q3DAbstractAxis *defaultAxis = 0;
diff --git a/src/datavisualization/engine/bars3dcontroller_p.h b/src/datavisualization/engine/bars3dcontroller_p.h
index f1eda225..4da6c730 100644
--- a/src/datavisualization/engine/bars3dcontroller_p.h
+++ b/src/datavisualization/engine/bars3dcontroller_p.h
@@ -61,6 +61,8 @@ private:
// Interaction
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.
// Look'n'feel
bool m_isBarSpecRelative;
@@ -89,10 +91,10 @@ public:
void setBarType(QDataVis::MeshStyle style, bool smooth = false);
void setSelectionMode(QDataVis::SelectionFlags mode);
- void setSelectedBar(const QPoint &position);
- QPoint selectedBar() const;
+ void setSelectedBar(const QPoint &position, QBar3DSeries *series);
virtual void handleAxisAutoAdjustRangeChangedInOrientation(Q3DAbstractAxis::AxisOrientation orientation, bool autoAdjust);
+ virtual void handleSeriesVisibilityChangedBySender(QObject *sender);
static QPoint noSelectionPoint();
@@ -116,16 +118,14 @@ public slots:
void handleDataColumnLabelsChanged();
// Renderer callback handlers
- void handleBarClicked(const QPoint &position);
-
-signals:
- void selectedBarChanged(QPoint position);
+ void handleBarClicked(const QPoint &position, QBar3DSeries *series);
protected:
virtual Q3DAbstractAxis *createDefaultAxis(Q3DAbstractAxis::AxisOrientation orientation);
private:
void adjustAxisRanges();
+ void adjustSelectionPosition(QPoint &pos, const QBar3DSeries *series);
Q_DISABLE_COPY(Bars3DController)
diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp
index 23932f23..7682f389 100644
--- a/src/datavisualization/engine/bars3drenderer.cpp
+++ b/src/datavisualization/engine/bars3drenderer.cpp
@@ -87,10 +87,11 @@ Bars3DRenderer::Bars3DRenderer(Bars3DController *controller)
m_scaleFactor(0),
m_maxSceneSize(40.0f),
m_visualSelectedBarPos(Bars3DController::noSelectionPoint()),
+ m_visualSelectedBarSeriesIndex(-1),
m_hasHeightAdjustmentChanged(true),
m_selectedBarPos(Bars3DController::noSelectionPoint()),
+ m_selectedBarSeries(0),
m_noZeroInRange(false),
- m_seriesCount(0),
m_seriesScale(0.0f),
m_seriesStep(0.0f),
m_seriesStart(0.0f)
@@ -151,15 +152,9 @@ void Bars3DRenderer::initializeOpenGL()
loadBackgroundMesh();
}
-void Bars3DRenderer::updateSeriesData(const QList<QAbstract3DSeries *> &seriesList)
+void Bars3DRenderer::updateData()
{
- QList<QBar3DSeries *> visibleSeries;
- foreach (QAbstract3DSeries *current, seriesList) {
- if (current->isVisible())
- visibleSeries.append(static_cast<QBar3DSeries *>(current));
- }
-
- int seriesCount = visibleSeries.size();
+ int seriesCount = m_visibleSeriesList.size();
int minRow = m_axisCacheX.min();
int maxRow = m_axisCacheX.max();
int minCol = m_axisCacheZ.min();
@@ -168,13 +163,13 @@ void Bars3DRenderer::updateSeriesData(const QList<QAbstract3DSeries *> &seriesLi
int newColumns = maxCol - minCol + 1;
int updateSize = 0;
int dataRowCount = 0;
+ int maxDataRowCount = 0;
- if (m_seriesCount != seriesCount) {
- m_seriesCount = seriesCount;
- m_renderingArrays.resize(m_seriesCount);
- m_seriesScale = 1.0f / float(m_seriesCount);
- m_seriesStep = 1.0f / float(m_seriesCount);
- m_seriesStart = -((float(m_seriesCount) - 1.0f) / 2.0f) * m_seriesStep;
+ if (m_renderingArrays.size() != seriesCount) {
+ m_renderingArrays.resize(seriesCount);
+ m_seriesScale = 1.0f / float(seriesCount);
+ m_seriesStep = 1.0f / float(seriesCount);
+ m_seriesStart = -((float(seriesCount) - 1.0f) / 2.0f) * m_seriesStep;
}
if (m_cachedRowCount != newRows || m_cachedColumnCount != newColumns) {
@@ -194,7 +189,7 @@ void Bars3DRenderer::updateSeriesData(const QList<QAbstract3DSeries *> &seriesLi
calculateSceneScalingFactors();
}
- for (int series = 0; series < m_seriesCount; series++) {
+ for (int series = 0; series < seriesCount; series++) {
if (newRows != m_renderingArrays.at(series).size()
|| newColumns != m_renderingArrays.at(series).at(0).size()) {
// Destroy old render items and reallocate new array
@@ -204,8 +199,11 @@ void Bars3DRenderer::updateSeriesData(const QList<QAbstract3DSeries *> &seriesLi
}
// Update cached data window
- QBarDataProxy *dataProxy = visibleSeries.at(series)->dataProxy();
+ QBarDataProxy *dataProxy =
+ static_cast<QBar3DSeries *>(m_visibleSeriesList.at(series).series())->dataProxy();
dataRowCount = dataProxy->rowCount();
+ if (maxDataRowCount < dataRowCount)
+ maxDataRowCount = qMin(dataRowCount, newRows);
int dataRowIndex = minRow;
GLfloat heightValue = 0.0f;
for (int i = 0; i < newRows; i++) {
@@ -248,14 +246,12 @@ void Bars3DRenderer::updateSeriesData(const QList<QAbstract3DSeries *> &seriesLi
m_renderColumns = updateSize;
if (m_renderingArrays.size())
- m_renderRows = qMin((dataRowCount - minRow), newRows);
+ m_renderRows = qMin((maxDataRowCount - minRow), newRows);
else
m_renderRows = 0;
// Reset selected bar to update selection
- updateSelectedBar(m_selectedBarPos);
-
- Abstract3DRenderer::updateSeriesData(seriesList);
+ updateSelectedBar(m_selectedBarPos, m_selectedBarSeries);
}
void Bars3DRenderer::updateScene(Q3DScene *scene)
@@ -606,9 +602,16 @@ void Bars3DRenderer::drawSlicedScene(const LabelItem &xLabel,
}
int labelCount = m_sliceCache->labelItems().size();
+ int seriesCount = 1;
+ if (m_cachedSelectionMode.testFlag(QDataVis::SelectionMultiSeries))
+ seriesCount = m_visibleSeriesList.size();
+ int adjustment = flipped ? (m_sliceSelection->size() - (labelCount * seriesCount)) : 0;
+
for (int labelNo = 0; labelNo < labelCount; labelNo++) {
// Get labels from first series only
- BarRenderItem *item = m_sliceSelection->at(labelNo * m_seriesCount);
+ // Adjustment is used in flipped cases to fix label positioning in cases when there are
+ // more actual data rows in the slice than labeled rows
+ BarRenderItem *item = m_sliceSelection->at(labelNo * seriesCount + adjustment);
// TODO: Make user controllable (QTRD-2546)
// Draw labels
int labelIndex = flipped ? m_sliceCache->labelItems().size() - 1 - labelNo : labelNo;
@@ -672,6 +675,8 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
GLfloat colPos = 0;
GLfloat rowPos = 0;
+ int seriesCount = m_visibleSeriesList.size();
+
const Q3DCamera *activeCamera = m_cachedScene->activeCamera();
// Specify viewport
@@ -777,7 +782,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
for (int bar = startBar; bar != stopBar; bar += stepBar) {
GLfloat shadowOffset = 0.0f;
float seriesPos = m_seriesStart;
- for (int series = 0; series < m_seriesCount; series++) {
+ for (int series = 0; series < seriesCount; series++) {
const BarRenderItem &item = m_renderingArrays.at(series).at(row).at(bar);
if (!item.value())
continue;
@@ -880,10 +885,12 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
for (int row = startRow; row != stopRow; row += stepRow) {
for (int bar = startBar; bar != stopBar; bar += stepBar) {
float seriesPos = m_seriesStart;
- for (int series = 0; series < m_seriesCount; series++) {
+ for (int series = 0; series < seriesCount; series++) {
const BarRenderItem &item = m_renderingArrays.at(series).at(row).at(bar);
- if (!item.value())
+ if (!item.value()) {
+ seriesPos += m_seriesStep;
continue;
+ }
if (item.height() < 0)
glCullFace(GL_FRONT);
@@ -912,7 +919,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
//#else
QVector3D barColor = QVector3D((GLdouble)row / 255.0,
(GLdouble)bar / 255.0,
- 0.0);
+ (GLdouble)series / 255.0);
//#endif
m_selectionShader->setUniformValue(m_selectionShader->MVP(), MVPMatrix);
@@ -946,7 +953,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
// Read color under cursor
QVector3D clickedColor = Utils::getSelection(m_inputPosition,
m_cachedBoundingRect.height());
- emit barClicked(selectionColorToArrayPosition(clickedColor));
+ emit barClicked(selectionColorToArrayPosition(clickedColor), selectionColorToSeries(clickedColor));
glBindFramebuffer(GL_FRAMEBUFFER, defaultFboHandle);
@@ -990,7 +997,6 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
gradientTexture = m_objectGradientTexture;
}
- // TODO: Can't call back to controller here! (QTRD-2216)
if (m_selectionDirty) {
if (m_cachedIsSlicingActivated) {
if (m_sliceSelection && m_sliceSelection->size()) {
@@ -1017,12 +1023,13 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
bool barSelectionFound = false;
BarRenderItem *selectedBar(0);
+
QVector3D modelScaler(m_scaleX * m_seriesScale, 0.0f, m_scaleZ);
bool somethingSelected = (m_visualSelectedBarPos != Bars3DController::noSelectionPoint());
for (int row = startRow; row != stopRow; row += stepRow) {
for (int bar = startBar; bar != stopBar; bar += stepBar) {
float seriesPos = m_seriesStart;
- for (int series = 0; series < m_seriesCount; series++) {
+ for (int series = 0; series < seriesCount; series++) {
BarRenderItem &item = m_renderingArrays[series][row][bar];
if (item.height() < 0)
@@ -1060,7 +1067,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
if (m_cachedSelectionMode > QDataVis::SelectionNone) {
Bars3DController::SelectionType selectionType = Bars3DController::SelectionNone;
if (somethingSelected)
- selectionType = isSelected(row, bar);
+ selectionType = isSelected(row, bar, series);
switch (selectionType) {
case Bars3DController::SelectionItem: {
@@ -1072,7 +1079,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
lightStrength = m_cachedTheme.m_highlightLightStrength;
shadowLightStrength = adjustedHighlightStrength;
// Insert position data into render item. We have no ownership, don't delete the previous one
- if (!m_cachedIsSlicingActivated) {
+ if (!m_cachedIsSlicingActivated && m_visualSelectedBarSeriesIndex == series) {
selectedBar = &item;
selectedBar->setPosition(QPoint(row, bar));
item.setTranslation(modelMatrix.column(3).toVector3D());
@@ -1081,7 +1088,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
if (m_selectionDirty && m_cachedIsSlicingActivated) {
QVector3D translation = modelMatrix.column(3).toVector3D();
if (m_cachedSelectionMode & QDataVis::SelectionColumn
- && m_seriesCount > 1) {
+ && seriesCount > 1) {
translation.setZ((m_columnDepth - ((row + 0.5f + seriesPos)
* (m_cachedBarSpacing.height())))
/ m_scaleFactor);
@@ -1124,7 +1131,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
shadowLightStrength = adjustedHighlightStrength;
if (m_cachedIsSlicingActivated) {
QVector3D translation = modelMatrix.column(3).toVector3D();
- if (m_seriesCount > 1) {
+ if (seriesCount > 1) {
translation.setZ((m_columnDepth - ((row + 0.5f + seriesPos)
* (m_cachedBarSpacing.height())))
/ m_scaleFactor);
@@ -1712,7 +1719,9 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
static const QString valueLabelTag(QStringLiteral("@valueLabel"));
// Custom format expects printf format specifier. There is no tag for it.
- labelText = generateValueLabel(itemLabelFormat(), selectedBar->value());
+ labelText = generateValueLabel(
+ m_visibleSeriesList[m_visualSelectedBarSeriesIndex].itemLabelFormat(),
+ selectedBar->value());
int selBarPosX = selectedBar->position().x();
int selBarPosY = selectedBar->position().y();
@@ -1829,13 +1838,15 @@ void Bars3DRenderer::updateBackgroundEnabled(bool enable)
}
}
-void Bars3DRenderer::updateSelectedBar(const QPoint &position)
+void Bars3DRenderer::updateSelectedBar(const QPoint &position, const QBar3DSeries *series)
{
m_selectedBarPos = position;
+ m_selectedBarSeries = series;
m_selectionDirty = true;
if (m_renderingArrays.isEmpty()) {
m_visualSelectedBarPos = Bars3DController::noSelectionPoint();
+ m_visualSelectedBarSeriesIndex = -1;
return;
}
@@ -1844,6 +1855,14 @@ void Bars3DRenderer::updateSelectedBar(const QPoint &position)
int maxX = m_renderingArrays.at(0).size() - 1;
int maxZ = maxX >= 0 ? m_renderingArrays.at(0).at(0).size() - 1 : -1;
+ m_visualSelectedBarSeriesIndex = -1;
+ for (int i = 0; i < m_visibleSeriesList.size(); i++) {
+ if (m_visibleSeriesList.at(i).series() == series) {
+ m_visualSelectedBarSeriesIndex = i;
+ break;
+ }
+ }
+
if (m_selectedBarPos == Bars3DController::noSelectionPoint()
|| adjustedX < 0 || adjustedX > maxX
|| adjustedZ < 0 || adjustedZ > maxZ) {
@@ -1983,20 +2002,25 @@ void Bars3DRenderer::calculateHeightAdjustment()
}
}
-Bars3DController::SelectionType Bars3DRenderer::isSelected(GLint row, GLint bar)
+Bars3DController::SelectionType Bars3DRenderer::isSelected(int row, int bar, int seriesIndex)
{
Bars3DController::SelectionType isSelectedType = Bars3DController::SelectionNone;
- if (row == m_visualSelectedBarPos.x() && bar == m_visualSelectedBarPos.y()
- && (m_cachedSelectionMode.testFlag(QDataVis::SelectionItem))) {
- isSelectedType = Bars3DController::SelectionItem;
- } else if (row == m_visualSelectedBarPos.x()
- && (m_cachedSelectionMode.testFlag(QDataVis::SelectionRow))) {
- isSelectedType = Bars3DController::SelectionRow;
- } else if (bar == m_visualSelectedBarPos.y()
- && (m_cachedSelectionMode.testFlag(QDataVis::SelectionColumn))) {
- isSelectedType = Bars3DController::SelectionColumn;
+ if ((m_cachedSelectionMode.testFlag(QDataVis::SelectionMultiSeries)
+ && m_visualSelectedBarSeriesIndex >= 0)
+ || seriesIndex == m_visualSelectedBarSeriesIndex) {
+ if (row == m_visualSelectedBarPos.x() && bar == m_visualSelectedBarPos.y()
+ && (m_cachedSelectionMode.testFlag(QDataVis::SelectionItem))) {
+ isSelectedType = Bars3DController::SelectionItem;
+ } else if (row == m_visualSelectedBarPos.x()
+ && (m_cachedSelectionMode.testFlag(QDataVis::SelectionRow))) {
+ isSelectedType = Bars3DController::SelectionRow;
+ } else if (bar == m_visualSelectedBarPos.y()
+ && (m_cachedSelectionMode.testFlag(QDataVis::SelectionColumn))) {
+ isSelectedType = Bars3DController::SelectionColumn;
+ }
}
+
return isSelectedType;
}
@@ -2012,6 +2036,14 @@ QPoint Bars3DRenderer::selectionColorToArrayPosition(const QVector3D &selectionC
return position;
}
+QBar3DSeries *Bars3DRenderer::selectionColorToSeries(const QVector3D &selectionColor)
+{
+ if (selectionColor == selectionSkipColor)
+ return 0;
+ else
+ return static_cast<QBar3DSeries *>(m_visibleSeriesList.at(int(selectionColor.z())).series());
+}
+
void Bars3DRenderer::updateSlicingActive(bool isSlicing)
{
if (isSlicing == m_cachedIsSlicingActivated)
diff --git a/src/datavisualization/engine/bars3drenderer_p.h b/src/datavisualization/engine/bars3drenderer_p.h
index 5424c096..08db5e06 100644
--- a/src/datavisualization/engine/bars3drenderer_p.h
+++ b/src/datavisualization/engine/bars3drenderer_p.h
@@ -96,15 +96,16 @@ private:
GLfloat m_scaleZ;
GLfloat m_scaleFactor;
GLfloat m_maxSceneSize;
- QPoint m_visualSelectedBarPos; // The selection id color
+ QPoint m_visualSelectedBarPos;
+ int m_visualSelectedBarSeriesIndex;
int m_renderRows;
int m_renderColumns;
bool m_hasHeightAdjustmentChanged;
QPoint m_selectedBarPos;
+ const QBar3DSeries *m_selectedBarSeries;
BarRenderItem m_dummyBarRenderItem;
QVector<BarRenderItemArray> m_renderingArrays;
bool m_noZeroInRange;
- int m_seriesCount;
float m_seriesScale;
float m_seriesStep;
float m_seriesStart;
@@ -113,7 +114,7 @@ public:
explicit Bars3DRenderer(Bars3DController *controller);
~Bars3DRenderer();
- void updateSeriesData(const QList<QAbstract3DSeries *> &seriesList);
+ void updateData();
void updateScene(Q3DScene *scene);
void render(GLuint defaultFboHandle = 0);
@@ -129,13 +130,13 @@ public slots:
bool relative = true);
void updateSlicingActive(bool isSlicing);
void updateBackgroundEnabled(bool enable);
- void updateSelectedBar(const QPoint &position);
+ void updateSelectedBar(const QPoint &position, const QBar3DSeries *series);
// Overloaded from abstract renderer
virtual void updateAxisRange(Q3DAbstractAxis::AxisOrientation orientation, qreal min, qreal max);
signals:
- void barClicked(QPoint position);
+ void barClicked(QPoint position, QBar3DSeries *series);
private:
virtual void initShaders(const QString &vertexShader, const QString &fragmentShader);
@@ -160,8 +161,9 @@ private:
#endif
void calculateSceneScalingFactors();
void calculateHeightAdjustment();
- Abstract3DController::SelectionType isSelected(GLint row, GLint bar);
+ Abstract3DController::SelectionType isSelected(int row, int bar, int seriesIndex);
QPoint selectionColorToArrayPosition(const QVector3D &selectionColor);
+ QBar3DSeries *selectionColorToSeries(const QVector3D &selectionColor);
Q_DISABLE_COPY(Bars3DRenderer)
diff --git a/src/datavisualization/engine/engine.pri b/src/datavisualization/engine/engine.pri
index 4c905fe9..7bf58379 100644
--- a/src/datavisualization/engine/engine.pri
+++ b/src/datavisualization/engine/engine.pri
@@ -16,6 +16,7 @@ HEADERS += $$PWD/q3dwindow_p.h \
$$PWD/scatter3dcontroller_p.h \
$$PWD/scatter3drenderer_p.h \
$$PWD/axisrendercache_p.h \
+ $$PWD/seriesrendercache_p.h \
$$PWD/abstract3drenderer_p.h \
$$PWD/selectionpointer_p.h \
$$PWD/q3dcamera.h \
@@ -42,6 +43,7 @@ SOURCES += $$PWD/q3dwindow.cpp \
$$PWD/scatter3dcontroller.cpp \
$$PWD/scatter3drenderer.cpp \
$$PWD/axisrendercache.cpp \
+ $$PWD/seriesrendercache.cpp \
$$PWD/abstract3drenderer.cpp \
$$PWD/selectionpointer.cpp \
$$PWD/q3dcamera.cpp \
diff --git a/src/datavisualization/engine/q3dbars.cpp b/src/datavisualization/engine/q3dbars.cpp
index 3baff904..60d827bd 100644
--- a/src/datavisualization/engine/q3dbars.cpp
+++ b/src/datavisualization/engine/q3dbars.cpp
@@ -119,8 +119,6 @@ Q3DBars::Q3DBars()
&Q3DBars::gridVisibleChanged);
QObject::connect(d_ptr->m_shared, &Abstract3DController::backgroundVisibleChanged, this,
&Q3DBars::backgroundVisibleChanged);
- QObject::connect(d_ptr->m_shared, &Bars3DController::selectedBarChanged, this,
- &Q3DBars::selectedBarChanged);
QObject::connect(d_ptr->m_shared, &Abstract3DController::colorStyleChanged, this,
&Q3DBars::colorStyleChanged);
QObject::connect(d_ptr->m_shared, &Abstract3DController::objectColorChanged, this,
@@ -151,7 +149,8 @@ Q3DBars::~Q3DBars()
* 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.
+ * to the axes. If 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.
*/
void Q3DBars::addSeries(QBar3DSeries *series)
{
@@ -450,24 +449,6 @@ bool Q3DBars::isBackgroundVisible() const
}
/*!
- * \property Q3DBars::selectedBar
- *
- * Selects a bar in a \a position. The position is the (row, column) position in
- * the data array of the series.
- * Only one bar can be selected at a time.
- * To clear selection, specify an illegal \a position, e.g. (-1, -1).
- */
-void Q3DBars::setSelectedBar(const QPoint &position)
-{
- d_ptr->m_shared->setSelectedBar(position);
-}
-
-QPoint Q3DBars::selectedBar() const
-{
- return d_ptr->m_shared->selectedBar();
-}
-
-/*!
* \property Q3DBars::shadowQuality
*
* Sets shadow \a quality to one of \c QDataVis::ShadowQuality. It is preset to
diff --git a/src/datavisualization/engine/q3dbars.h b/src/datavisualization/engine/q3dbars.h
index cba54dce..86a02b5d 100644
--- a/src/datavisualization/engine/q3dbars.h
+++ b/src/datavisualization/engine/q3dbars.h
@@ -47,7 +47,6 @@ class QT_DATAVISUALIZATION_EXPORT Q3DBars : public Q3DWindow
Q_PROPERTY(QtDataVisualization::QDataVis::Theme theme READ theme WRITE setTheme NOTIFY themeChanged)
Q_PROPERTY(bool gridVisible READ isGridVisible WRITE setGridVisible NOTIFY gridVisibleChanged)
Q_PROPERTY(bool backgroundVisible READ isBackgroundVisible WRITE setBackgroundVisible NOTIFY backgroundVisibleChanged)
- Q_PROPERTY(QPoint selectedBar READ selectedBar WRITE setSelectedBar NOTIFY selectedBarChanged)
Q_PROPERTY(Q3DScene* scene READ scene)
Q_PROPERTY(QtDataVisualization::QDataVis::ColorStyle colorStyle READ colorStyle WRITE setColorStyle NOTIFY colorStyleChanged)
Q_PROPERTY(QColor barColor READ barColor WRITE setBarColor NOTIFY barColorChanged)
@@ -104,9 +103,6 @@ public:
void setBackgroundVisible(bool visible);
bool isBackgroundVisible() const;
- void setSelectedBar(const QPoint &position);
- QPoint selectedBar() const;
-
void setShadowQuality(QDataVis::ShadowQuality quality);
QDataVis::ShadowQuality shadowQuality() const;
@@ -148,7 +144,6 @@ signals:
void themeChanged(QDataVis::Theme theme);
void gridVisibleChanged(bool visible);
void backgroundVisibleChanged(bool visible);
- void selectedBarChanged(QPoint position);
void colorStyleChanged(QDataVis::ColorStyle style);
void barColorChanged(QColor color);
void barGradientChanged(QLinearGradient gradient);
diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp
index 311373da..2abb4fe9 100644
--- a/src/datavisualization/engine/scatter3drenderer.cpp
+++ b/src/datavisualization/engine/scatter3drenderer.cpp
@@ -83,8 +83,7 @@ Scatter3DRenderer::Scatter3DRenderer(Scatter3DController *controller)
m_areaSize(QSizeF(0.0, 0.0)),
m_dotSizeScale(1.0f),
m_hasHeightAdjustmentChanged(true),
- m_drawingPoints(false),
- m_seriesCount(0)
+ m_drawingPoints(false)
{
initializeOpenGLFunctions();
initializeOpenGL();
@@ -141,14 +140,9 @@ void Scatter3DRenderer::initializeOpenGL()
loadBackgroundMesh();
}
-void Scatter3DRenderer::updateSeriesData(const QList<QAbstract3DSeries *> &seriesList)
+void Scatter3DRenderer::updateData()
{
- QList<QScatter3DSeries *> visibleSeries;
- foreach (QAbstract3DSeries *current, seriesList) {
- if (current->isVisible())
- visibleSeries.append(static_cast<QScatter3DSeries *>(current));
- }
- int seriesCount = visibleSeries.size();
+ int seriesCount = m_visibleSeriesList.size();
calculateSceneScalingFactors();
float minX = float(m_axisCacheX.min());
float maxX = float(m_axisCacheX.max());
@@ -158,13 +152,12 @@ void Scatter3DRenderer::updateSeriesData(const QList<QAbstract3DSeries *> &serie
float maxZ = float(m_axisCacheZ.max());
int totalDataSize = 0;
- if (m_seriesCount != seriesCount) {
- m_seriesCount = seriesCount;
- m_renderingArrays.resize(m_seriesCount);
- }
+ if (m_renderingArrays.size() != seriesCount)
+ m_renderingArrays.resize(seriesCount);
- for (int series = 0; series < m_seriesCount; series++) {
- QScatterDataProxy *dataProxy = visibleSeries.at(series)->dataProxy();
+ for (int series = 0; series < seriesCount; series++) {
+ QScatterDataProxy *dataProxy =
+ static_cast<QScatter3DSeries *>(m_visibleSeriesList.at(series).series())->dataProxy();
const QScatterDataArray &dataArray = *dataProxy->array();
int dataSize = dataArray.size();
totalDataSize += dataSize;
@@ -188,8 +181,6 @@ void Scatter3DRenderer::updateSeriesData(const QList<QAbstract3DSeries *> &serie
}
m_dotSizeScale = (GLfloat)qBound(0.01, (2.0 / qSqrt((qreal)totalDataSize)), 0.1);
m_selectedItem = 0;
-
- Abstract3DRenderer::updateSeriesData(seriesList);
}
void Scatter3DRenderer::updateScene(Q3DScene *scene)
@@ -242,6 +233,8 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
QMatrix4x4 projectionViewMatrix = projectionMatrix * viewMatrix;
+ int seriesCount = m_visibleSeriesList.size();
+
// Calculate label flipping
if (viewMatrix.row(0).x() > 0)
m_zFlipped = false;
@@ -337,7 +330,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
depthProjectionViewMatrix = depthProjectionMatrix * depthViewMatrix;
// Draw dots to depth buffer
- for (int series = 0; series < m_seriesCount; series++) {
+ for (int series = 0; series < seriesCount; series++) {
for (int dot = 0; dot < m_renderingArrays.at(series).size(); dot++) {
const ScatterRenderItem &item = m_renderingArrays.at(series).at(dot);
if (!item.isVisible())
@@ -440,7 +433,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
int totalArraySize = 0;
int dotNo = 0;
- for (int series = 0; series < m_seriesCount; series++) {
+ for (int series = 0; series < seriesCount; series++) {
arraySize = m_renderingArrays.at(series).size();
totalArraySize += arraySize;
@@ -563,9 +556,10 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
// Draw dots
bool dotSelectionFound = false;
ScatterRenderItem *selectedItem(0);
+ int selectedSeriesIndex(0);
int dotNo = 0;
- for (int series = 0; series < m_seriesCount; series++) {
+ for (int series = 0; series < seriesCount; series++) {
// TODO: Color per series. Let's just hack it while testing with 2 series QTRD-2557
QVector3D baseColor = Utils::vectorFromColor(m_cachedObjectColor) * (series + 0.25f);
QVector3D dotColor = baseColor;
@@ -610,6 +604,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
lightStrength = m_cachedTheme.m_highlightLightStrength;
// Insert data to ScatterRenderItem. We have no ownership, don't delete the previous one
selectedItem = &item;
+ selectedSeriesIndex = series;
dotSelectionFound = true;
}
@@ -1364,7 +1359,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
static const QString yLabelTag(QStringLiteral("@yLabel"));
static const QString zLabelTag(QStringLiteral("@zLabel"));
- labelText = itemLabelFormat();
+ labelText = m_visibleSeriesList[selectedSeriesIndex].itemLabelFormat();
labelText.replace(xTitleTag, m_axisCacheX.title());
labelText.replace(yTitleTag, m_axisCacheY.title());
diff --git a/src/datavisualization/engine/scatter3drenderer_p.h b/src/datavisualization/engine/scatter3drenderer_p.h
index 6513e571..bba790a1 100644
--- a/src/datavisualization/engine/scatter3drenderer_p.h
+++ b/src/datavisualization/engine/scatter3drenderer_p.h
@@ -89,13 +89,12 @@ private:
bool m_drawingPoints;
ScatterRenderItem m_dummyRenderItem;
QVector<ScatterRenderItemArray> m_renderingArrays;
- int m_seriesCount;
public:
explicit Scatter3DRenderer(Scatter3DController *controller);
~Scatter3DRenderer();
- void updateSeriesData(const QList<QAbstract3DSeries *> &seriesList);
+ void updateData();
void updateScene(Q3DScene *scene);
void render(GLuint defaultFboHandle);
diff --git a/src/datavisualization/engine/seriesrendercache.cpp b/src/datavisualization/engine/seriesrendercache.cpp
new file mode 100644
index 00000000..53bc97a1
--- /dev/null
+++ b/src/datavisualization/engine/seriesrendercache.cpp
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVisualization module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+#include "seriesrendercache_p.h"
+
+QT_DATAVISUALIZATION_BEGIN_NAMESPACE
+
+SeriesRenderCache::SeriesRenderCache()
+ : m_series(0)
+{
+}
+
+SeriesRenderCache::~SeriesRenderCache()
+{
+}
+
+void SeriesRenderCache::populate(QAbstract3DSeries *series)
+{
+ Q_ASSERT(series);
+
+ m_series = series;
+ m_itemLabelFormat = series->itemLabelFormat();
+
+ // TODO: Add other visual element extractions
+}
+
+QT_DATAVISUALIZATION_END_NAMESPACE
diff --git a/src/datavisualization/engine/seriesrendercache_p.h b/src/datavisualization/engine/seriesrendercache_p.h
new file mode 100644
index 00000000..34b1d97d
--- /dev/null
+++ b/src/datavisualization/engine/seriesrendercache_p.h
@@ -0,0 +1,60 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVisualization module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the QtDataVisualization API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+
+#ifndef SERIESRENDERCACHE_P_H
+#define SERIESRENDERCACHE_P_H
+
+#include "datavisualizationglobal_p.h"
+#include "qabstract3dseries_p.h"
+
+QT_DATAVISUALIZATION_BEGIN_NAMESPACE
+
+class SeriesRenderCache
+{
+public:
+ SeriesRenderCache();
+ virtual ~SeriesRenderCache();
+
+ void populate(QAbstract3DSeries *series);
+
+ inline const QString &itemLabelFormat() const { return m_itemLabelFormat; }
+
+ // NOTE: Series pointer can only be used to access the series when syncing with controller.
+ // It is not guaranteed to be valid while rendering and should only be used as an identifier.
+ inline QAbstract3DSeries *series() const { return m_series; }
+
+ // TODO: Add other visual elements
+
+protected:
+ QString m_itemLabelFormat;
+ QAbstract3DSeries *m_series;
+};
+
+QT_DATAVISUALIZATION_END_NAMESPACE
+
+#endif
diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp
index e8b0a0f4..85e189f8 100644
--- a/src/datavisualization/engine/surface3drenderer.cpp
+++ b/src/datavisualization/engine/surface3drenderer.cpp
@@ -197,12 +197,12 @@ void Surface3DRenderer::initializeOpenGL()
loadBackgroundMesh();
}
-void Surface3DRenderer::updateSeriesData(const QList<QAbstract3DSeries *> &seriesList)
+void Surface3DRenderer::updateData()
{
// Surface only supports single series for now, so we are only interested in the first series
const QSurfaceDataArray *array = 0;
- if (seriesList.size()) {
- QSurface3DSeries *firstSeries = static_cast<QSurface3DSeries *>(seriesList.at(0));
+ if (m_visibleSeriesList.size()) {
+ QSurface3DSeries *firstSeries = static_cast<QSurface3DSeries *>(m_visibleSeriesList.at(0).series());
m_cachedSurfaceVisible = firstSeries->isVisible(); // TODO: To series visuals update?
if (m_cachedSurfaceGridOn || m_cachedSurfaceVisible) {
QSurfaceDataProxy *dataProxy = firstSeries->dataProxy();
@@ -268,8 +268,6 @@ void Surface3DRenderer::updateSeriesData(const QList<QAbstract3DSeries *> &serie
m_sliceDataArray.clear();
m_selectionDirty = true;
-
- Abstract3DRenderer::updateSeriesData(seriesList);
}
void Surface3DRenderer::updateSliceDataModel(const QPoint &point)
@@ -1871,7 +1869,8 @@ QPoint Surface3DRenderer::selectionIdToSurfacePoint(uint id)
QString Surface3DRenderer::createSelectionLabel(qreal value, int column, int row)
{
- QString labelText = itemLabelFormat();
+ // TODO: Get from correct series once multiple series supported
+ QString labelText = m_visibleSeriesList[0].itemLabelFormat();
static const QString xTitleTag(QStringLiteral("@xTitle"));
static const QString yTitleTag(QStringLiteral("@yTitle"));
static const QString zTitleTag(QStringLiteral("@zTitle"));
diff --git a/src/datavisualization/engine/surface3drenderer_p.h b/src/datavisualization/engine/surface3drenderer_p.h
index 45222564..5ac20e0e 100644
--- a/src/datavisualization/engine/surface3drenderer_p.h
+++ b/src/datavisualization/engine/surface3drenderer_p.h
@@ -132,7 +132,7 @@ public:
explicit Surface3DRenderer(Surface3DController *controller);
~Surface3DRenderer();
- void updateSeriesData(const QList<QAbstract3DSeries *> &seriesList);
+ void updateData();
void updateScene(Q3DScene *scene);
bool updateSmoothStatus(bool enable);
void updateSurfaceGridStatus(bool enable);
diff --git a/src/datavisualization/global/qdatavisualizationenums.h b/src/datavisualization/global/qdatavisualizationenums.h
index fd6b28e1..b8114f61 100644
--- a/src/datavisualization/global/qdatavisualizationenums.h
+++ b/src/datavisualization/global/qdatavisualizationenums.h
@@ -106,7 +106,8 @@ public:
SelectionItemAndColumn = SelectionItem | SelectionColumn,
SelectionRowAndColumn = SelectionRow | SelectionColumn,
SelectionItemRowAndColumn = SelectionItem | SelectionRow | SelectionColumn,
- SelectionSlice = 8
+ SelectionSlice = 8,
+ SelectionMultiSeries = 16
};
Q_DECLARE_FLAGS(SelectionFlags, SelectionFlag)
diff --git a/src/datavisualization/global/qtdatavisualizationenums.qdoc b/src/datavisualization/global/qtdatavisualizationenums.qdoc
index 22645767..67d5d1bc 100644
--- a/src/datavisualization/global/qtdatavisualizationenums.qdoc
+++ b/src/datavisualization/global/qtdatavisualizationenums.qdoc
@@ -158,6 +158,9 @@
automatically. If you wish to control the slice view yourself via Q3DScene, do not set this
flag. When setting this mode flag, either \c SelectionRow or \c SelectionColumn must also
be set, but not both. Slicing is supported by Q3DBars and Q3DSurface only.
+ \value SelectionMultiSeries
+ Setting this mode means that items for all series at same position are selected, instead
+ of just the selected item. Multi-series selection is only supported for Q3DBars.
*/
/*!
diff --git a/src/datavisualizationqml2/declarativebars.cpp b/src/datavisualizationqml2/declarativebars.cpp
index cf74d444..55c02cce 100644
--- a/src/datavisualizationqml2/declarativebars.cpp
+++ b/src/datavisualizationqml2/declarativebars.cpp
@@ -41,8 +41,6 @@ DeclarativeBars::DeclarativeBars(QQuickItem *parent)
// Create the shared component on the main GUI thread.
m_shared = new Bars3DController(boundingRect().toRect());
AbstractDeclarative::setSharedController(m_shared);
- QObject::connect(m_shared, &Bars3DController::selectedBarChanged, this,
- &DeclarativeBars::selectedBarChanged);
QObject::connect(m_shared, &Abstract3DController::meshFileNameChanged, this,
&DeclarativeBars::meshFileNameChanged);
}
@@ -198,16 +196,6 @@ QString DeclarativeBars::meshFileName() const
return m_shared->meshFileName();
}
-void DeclarativeBars::setSelectedBar(const QPointF &position)
-{
- m_shared->setSelectedBar(position.toPoint());
-}
-
-QPointF DeclarativeBars::selectedBar() const
-{
- return QPointF(m_shared->selectedBar());
-}
-
QQmlListProperty<QBar3DSeries> DeclarativeBars::seriesList()
{
return QQmlListProperty<QBar3DSeries>(this, this,
diff --git a/src/datavisualizationqml2/declarativebars_p.h b/src/datavisualizationqml2/declarativebars_p.h
index a54e5ff7..86cd993e 100644
--- a/src/datavisualizationqml2/declarativebars_p.h
+++ b/src/datavisualizationqml2/declarativebars_p.h
@@ -57,7 +57,6 @@ class DeclarativeBars : public AbstractDeclarative
Q_PROPERTY(bool barSpacingRelative READ isBarSpacingRelative WRITE setBarSpacingRelative NOTIFY barSpacingRelativeChanged)
Q_PROPERTY(bool barSmoothingEnabled READ isBarSmoothingEnabled WRITE setBarSmoothingEnabled NOTIFY meshFileNameChanged)
Q_PROPERTY(QString meshFileName READ meshFileName WRITE setMeshFileName NOTIFY meshFileNameChanged)
- Q_PROPERTY(QPointF selectedBar READ selectedBar WRITE setSelectedBar NOTIFY selectedBarChanged)
Q_PROPERTY(QQmlListProperty<QBar3DSeries> seriesList READ seriesList)
Q_CLASSINFO("DefaultProperty", "seriesList")
@@ -92,9 +91,6 @@ public:
void setMeshFileName(const QString &objFileName);
QString meshFileName() const;
- void setSelectedBar(const QPointF &position);
- QPointF selectedBar() const;
-
QQmlListProperty<QBar3DSeries> seriesList();
static void appendSeriesFunc(QQmlListProperty<QBar3DSeries> *list, QBar3DSeries *series);
static int countSeriesFunc(QQmlListProperty<QBar3DSeries> *list);
@@ -104,7 +100,6 @@ public:
Q_INVOKABLE void removeSeries(QBar3DSeries *series);
signals:
- void selectedBarChanged(const QPointF &position);
void barThicknessChanged(qreal thicknessRatio);
void barSpacingChanged(QSizeF spacing);
void barSpacingRelativeChanged(bool relative);
diff --git a/src/datavisualizationqml2/declarativeseries.cpp b/src/datavisualizationqml2/declarativeseries.cpp
index 81bbb649..8b7c0584 100644
--- a/src/datavisualizationqml2/declarativeseries.cpp
+++ b/src/datavisualizationqml2/declarativeseries.cpp
@@ -26,6 +26,8 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE
DeclarativeBar3DSeries::DeclarativeBar3DSeries(QObject *parent)
: QBar3DSeries(parent)
{
+ QObject::connect(this, &QBar3DSeries::selectedBarChanged, this,
+ &DeclarativeBar3DSeries::selectedBarChanged);
}
DeclarativeBar3DSeries::~DeclarativeBar3DSeries()
@@ -45,6 +47,16 @@ void DeclarativeBar3DSeries::appendSeriesChildren(QQmlListProperty<QObject> *lis
reinterpret_cast<DeclarativeBar3DSeries *>(list->data)->setDataProxy(proxy);
}
+void DeclarativeBar3DSeries::setSelectedBar(const QPointF &position)
+{
+ QBar3DSeries::setSelectedBar(position.toPoint());
+}
+
+QPointF DeclarativeBar3DSeries::selectedBar() const
+{
+ return QBar3DSeries::selectedBar();
+}
+
DeclarativeScatter3DSeries::DeclarativeScatter3DSeries(QObject *parent)
: QScatter3DSeries(parent)
{
diff --git a/src/datavisualizationqml2/declarativeseries_p.h b/src/datavisualizationqml2/declarativeseries_p.h
index cb6b76c2..ac45ec3e 100644
--- a/src/datavisualizationqml2/declarativeseries_p.h
+++ b/src/datavisualizationqml2/declarativeseries_p.h
@@ -41,6 +41,9 @@ class DeclarativeBar3DSeries : public QBar3DSeries
{
Q_OBJECT
Q_PROPERTY(QQmlListProperty<QObject> seriesChildren READ seriesChildren)
+ // selectedBar property is overloaded to use QPointF instead of QPoint to work around qml bug
+ // where Qt.point(0, 0) can't be assigned due to error "Cannot assign QPointF to QPoint".
+ Q_PROPERTY(QPointF selectedBar READ selectedBar WRITE setSelectedBar NOTIFY selectedBarChanged)
Q_CLASSINFO("DefaultProperty", "seriesChildren")
public:
DeclarativeBar3DSeries(QObject *parent = 0);
@@ -48,6 +51,12 @@ public:
QQmlListProperty<QObject> seriesChildren();
static void appendSeriesChildren(QQmlListProperty<QObject> *list, QObject *element);
+
+ void setSelectedBar(const QPointF &position);
+ QPointF selectedBar() const;
+
+signals:
+ void selectedBarChanged(QPointF position);
};
class DeclarativeScatter3DSeries : public QScatter3DSeries
diff --git a/tests/barstest/chart.cpp b/tests/barstest/chart.cpp
index 496a454d..dda3aee4 100644
--- a/tests/barstest/chart.cpp
+++ b/tests/barstest/chart.cpp
@@ -112,9 +112,9 @@ GraphModifier::GraphModifier(Q3DBars *barchart)
m_chart->setTheme(QDataVis::ThemeStoneMoss);
m_chart->setShadowQuality(QDataVis::ShadowQualitySoftMedium);
- m_temperatureData->setItemLabelFormat(QStringLiteral("@valueTitle for @colLabel @rowLabel: @valueLabel"));
- m_temperatureData2->setItemLabelFormat(QStringLiteral("** @valueTitle for @colLabel @rowLabel: @valueLabel **"));
- m_genericData->setItemLabelFormat(QStringLiteral("@valueTitle for (@rowIdx, @colIdx): @valueLabel"));
+ m_temperatureData->setItemLabelFormat(QStringLiteral("1: @valueTitle for @colLabel @rowLabel: @valueLabel"));
+ m_temperatureData2->setItemLabelFormat(QStringLiteral("2: @valueTitle for @colLabel @rowLabel: @valueLabel"));
+ m_genericData->setItemLabelFormat(QStringLiteral("3: @valueTitle for (@rowIdx, @colIdx): @valueLabel"));
m_genericData->dataProxy()->setColumnLabels(genericColumnLabels);
m_chart->setFont(QFont("Times Roman", 20));
@@ -124,6 +124,18 @@ GraphModifier::GraphModifier(Q3DBars *barchart)
m_chart->releaseInputHandler(m_defaultInputHandler);
m_chart->setActiveInputHandler(m_defaultInputHandler);
+ QObject::connect(m_chart, &Q3DBars::shadowQualityChanged, this,
+ &GraphModifier::shadowQualityUpdatedByVisual);
+ QObject::connect(m_temperatureData, &QBar3DSeries::selectedBarChanged, this,
+ &GraphModifier::handleSelectionChange);
+ QObject::connect(m_temperatureData2, &QBar3DSeries::selectedBarChanged, this,
+ &GraphModifier::handleSelectionChange);
+ QObject::connect(m_genericData, &QBar3DSeries::selectedBarChanged, this,
+ &GraphModifier::handleSelectionChange);
+
+ m_chart->addSeries(m_temperatureData);
+ m_chart->addSeries(m_temperatureData2);
+
resetTemperatureData();
}
@@ -143,8 +155,6 @@ void GraphModifier::restart(bool dynamicData)
m_static = !dynamicData;
if (m_static) {
- m_chart->addSeries(m_temperatureData);
- m_chart->addSeries(m_temperatureData2);
m_chart->removeSeries(m_genericData);
m_chart->setTitle(QStringLiteral("Average temperatures in Oulu, Finland (2006-2012)"));
@@ -153,10 +163,7 @@ void GraphModifier::restart(bool dynamicData)
m_chart->setRowAxis(m_yearAxis);
m_chart->setColumnAxis(m_monthAxis);
- m_chart->setSelectionMode(QDataVis::SelectionRow | QDataVis::SelectionSlice);
} else {
- m_chart->removeSeries(m_temperatureData);
- m_chart->removeSeries(m_temperatureData2);
m_chart->addSeries(m_genericData);
m_chart->setTitle(QStringLiteral("Generic data"));
@@ -166,8 +173,6 @@ void GraphModifier::restart(bool dynamicData)
m_chart->setValueAxis(m_currentAxis);
m_chart->setRowAxis(m_genericRowAxis);
m_chart->setColumnAxis(m_genericColumnAxis);
-
- m_chart->setSelectionMode(QDataVis::SelectionRow | QDataVis::SelectionSlice);
}
}
@@ -176,9 +181,9 @@ void GraphModifier::selectBar()
QPoint targetBar(5, 5);
QPoint noSelection(-1, -1);
if (m_selectedBar != targetBar)
- m_chart->setSelectedBar(targetBar);
+ m_chart->seriesList().at(0)->setSelectedBar(targetBar);
else
- m_chart->setSelectedBar(noSelection);
+ m_chart->seriesList().at(0)->setSelectedBar(noSelection);
}
void GraphModifier::swapAxis()
@@ -216,11 +221,16 @@ void GraphModifier::releaseAxes()
void GraphModifier::releaseProxies()
{
- // Releases all series
- // Correct series will get readded back when graph is switched
- m_chart->removeSeries(m_temperatureData);
- m_chart->removeSeries(m_temperatureData2);
- m_chart->removeSeries(m_genericData);
+ // Releases all series/add all series toggle
+ if (m_chart->seriesList().size() > 0) {
+ m_chart->removeSeries(m_temperatureData);
+ m_chart->removeSeries(m_temperatureData2);
+ m_chart->removeSeries(m_genericData);
+ } else {
+ m_chart->addSeries(m_temperatureData);
+ m_chart->addSeries(m_temperatureData2);
+ m_chart->addSeries(m_genericData);
+ }
}
void GraphModifier::flipViews()
@@ -264,7 +274,7 @@ void GraphModifier::createMassiveArray()
dataArray->append(dataRow);
}
- m_chart->seriesList().at(0)->dataProxy()->resetArray(dataArray, genericRowLabels, genericColumnLabels);
+ m_genericData->dataProxy()->resetArray(dataArray, genericRowLabels, genericColumnLabels);
qDebug() << "Created Massive Array (" << arrayDimension << "), time:" << timer.elapsed();
}
@@ -336,7 +346,7 @@ void GraphModifier::addRow()
// TODO Needs to be changed to account for data window offset once it is implemented.
QString label = QStringLiteral("Add %1").arg(addCounter++);
- m_chart->seriesList().at(0)->dataProxy()->addRow(dataRow, label);
+ m_genericData->dataProxy()->addRow(dataRow, label);
}
void GraphModifier::addRows()
@@ -346,13 +356,13 @@ void GraphModifier::addRows()
for (int i = 0; i < m_rowCount; i++) {
QBarDataRow *dataRow = new QBarDataRow(m_columnCount);
for (int j = 0; j < m_columnCount; j++)
- (*dataRow)[j].setValue(qreal(j + i + m_chart->seriesList().at(0)->dataProxy()->rowCount()) + m_minval);
+ (*dataRow)[j].setValue(qreal(j + i + m_genericData->dataProxy()->rowCount()) + m_minval);
dataArray.append(dataRow);
labels.append(QStringLiteral("Add %1").arg(addCounter++));
}
// TODO Needs to be changed to account for data window offset once it is implemented.
- m_chart->seriesList().at(0)->dataProxy()->addRows(dataArray, labels);
+ m_genericData->dataProxy()->addRows(dataArray, labels);
}
void GraphModifier::insertRow()
@@ -365,7 +375,7 @@ void GraphModifier::insertRow()
// TODO Needs to be changed to account for data window offset once it is implemented.
int row = qMax(m_selectedBar.x(), 0);
QString label = QStringLiteral("Insert %1").arg(insertCounter++);
- m_chart->seriesList().at(0)->dataProxy()->insertRow(row, dataRow, label);
+ m_genericData->dataProxy()->insertRow(row, dataRow, label);
}
void GraphModifier::insertRows()
@@ -377,14 +387,14 @@ void GraphModifier::insertRows()
for (int i = 0; i < m_rowCount; i++) {
QBarDataRow *dataRow = new QBarDataRow(m_columnCount);
for (int j = 0; j < m_columnCount; j++)
- (*dataRow)[j].setValue(qreal(j + i + m_chart->seriesList().at(0)->dataProxy()->rowCount()) + m_minval);
+ (*dataRow)[j].setValue(qreal(j + i + m_genericData->dataProxy()->rowCount()) + m_minval);
dataArray.append(dataRow);
labels.append(QStringLiteral("Insert %1").arg(insertCounter++));
}
// TODO Needs to be changed to account for data window offset once it is implemented.
int row = qMax(m_selectedBar.x(), 0);
- m_chart->seriesList().at(0)->dataProxy()->insertRows(row, dataArray, labels);
+ m_genericData->dataProxy()->insertRows(row, dataArray, labels);
qDebug() << "Inserted" << m_rowCount << "rows, time:" << timer.elapsed();
}
@@ -395,7 +405,7 @@ void GraphModifier::changeItem()
int column = m_selectedBar.y();
if (row >= 0 && column >= 0) {
QBarDataItem item(qreal(rand() % 100));
- m_chart->seriesList().at(0)->dataProxy()->setItem(row, column, item);
+ m_genericData->dataProxy()->setItem(row, column, item);
}
}
@@ -404,11 +414,11 @@ void GraphModifier::changeRow()
// TODO Needs to be changed to account for data window offset once it is implemented.
int row = m_selectedBar.x();
if (row >= 0) {
- QBarDataRow *newRow = new QBarDataRow(m_chart->seriesList().at(0)->dataProxy()->rowAt(row)->size());
+ QBarDataRow *newRow = new QBarDataRow(m_genericData->dataProxy()->rowAt(row)->size());
for (int i = 0; i < newRow->size(); i++)
(*newRow)[i].setValue(qreal(rand() % int(m_maxval)) + m_minval);
QString label = QStringLiteral("Change %1").arg(changeCounter++);
- m_chart->seriesList().at(0)->dataProxy()->setRow(row, newRow, label);
+ m_genericData->dataProxy()->setRow(row, newRow, label);
}
}
@@ -421,13 +431,13 @@ void GraphModifier::changeRows()
QBarDataArray newArray;
QStringList labels;
for (int i = startRow; i <= row; i++ ) {
- QBarDataRow *newRow = new QBarDataRow(m_chart->seriesList().at(0)->dataProxy()->rowAt(i)->size());
+ QBarDataRow *newRow = new QBarDataRow(m_genericData->dataProxy()->rowAt(i)->size());
for (int j = 0; j < newRow->size(); j++)
(*newRow)[j].setValue(qreal(rand() % int(m_maxval)) + m_minval);
newArray.append(newRow);
labels.append(QStringLiteral("Change %1").arg(changeCounter++));
}
- m_chart->seriesList().at(0)->dataProxy()->setRows(startRow, newArray, labels);
+ m_genericData->dataProxy()->setRows(startRow, newArray, labels);
}
}
@@ -436,7 +446,7 @@ void GraphModifier::removeRow()
// TODO Needs to be changed to account for data window offset once it is implemented.
int row = m_selectedBar.x();
if (row >= 0)
- m_chart->seriesList().at(0)->dataProxy()->removeRows(row, 1);
+ m_genericData->dataProxy()->removeRows(row, 1);
}
void GraphModifier::removeRows()
@@ -445,7 +455,7 @@ void GraphModifier::removeRows()
int row = m_selectedBar.x();
if (row >= 0) {
int startRow = qMax(row - 2, 0);
- m_chart->seriesList().at(0)->dataProxy()->removeRows(startRow, 3);
+ m_genericData->dataProxy()->removeRows(startRow, 3);
}
}
@@ -523,7 +533,7 @@ void GraphModifier::changeSelectionMode()
{
static int selectionMode = m_chart->selectionMode();
- if (++selectionMode > (QDataVis::SelectionItemAndColumn | QDataVis::SelectionSlice))
+ if (++selectionMode > (QDataVis::SelectionItemAndColumn | QDataVis::SelectionSlice | QDataVis::SelectionMultiSeries))
selectionMode = QDataVis::SelectionNone;
m_chart->setSelectionMode((QDataVis::SelectionFlag)selectionMode);
@@ -554,7 +564,14 @@ void GraphModifier::shadowQualityUpdatedByVisual(QDataVis::ShadowQuality sq)
void GraphModifier::handleSelectionChange(const QPoint &position)
{
m_selectedBar = position;
- qDebug() << "Selected bar position:" << position;
+ int index = 0;
+ foreach (QBar3DSeries *series, m_chart->seriesList()) {
+ if (series == sender())
+ break;
+ index++;
+ }
+
+ qDebug() << "Selected bar position:" << position << "series:" << index;
}
void GraphModifier::setUseNullInputHandler(bool useNull)
diff --git a/tests/barstest/main.cpp b/tests/barstest/main.cpp
index dac9f42a..158aae15 100644
--- a/tests/barstest/main.cpp
+++ b/tests/barstest/main.cpp
@@ -329,11 +329,6 @@ int main(int argc, char **argv)
SLOT(changeShadowQuality(int)));
QObject::connect(modifier, &GraphModifier::shadowQualityChanged, shadowQuality,
&QComboBox::setCurrentIndex);
- QObject::connect(widgetchart, &Q3DBars::shadowQualityChanged, modifier,
- &GraphModifier::shadowQualityUpdatedByVisual);
- QObject::connect(widgetchart, &Q3DBars::selectedBarChanged, modifier,
- &GraphModifier::handleSelectionChange);
-
QObject::connect(fontSizeSlider, &QSlider::valueChanged, modifier,
&GraphModifier::changeFontSize);