summaryrefslogtreecommitdiffstats
path: root/src/datavisualization/engine/bars3dcontroller.cpp
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 /src/datavisualization/engine/bars3dcontroller.cpp
parent96995bda0da7ecf99d2ac4a4e417545c3506bf02 (diff)
Multi series selection part 1: bars
Task-number: QTRD-2556 Change-Id: I1f537f0b4c299028d4415f074d5eac6552bb3b9b Reviewed-by: Pasi Keränen <pasi.keranen@digia.com>
Diffstat (limited to 'src/datavisualization/engine/bars3dcontroller.cpp')
-rw-r--r--src/datavisualization/engine/bars3dcontroller.cpp123
1 files changed, 78 insertions, 45 deletions
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;