diff options
author | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-11-22 09:26:46 +0200 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-11-22 09:59:10 +0200 |
commit | fe2e12ffd7bb495634a66dc9c3e0d0fcbcfeb0df (patch) | |
tree | c67b57f7a0a82a81f165f007b8d44a2e16aa0db5 /src/datavisualization/engine/surface3dcontroller.cpp | |
parent | 4588556895bc14803e3ad884e89eb988b751e6be (diff) |
Multi series selection part 3: surface
Task-number: QTRD-2556
Change-Id: I3a465c1bfff95f6c89d2f473f9e235c6079b8116
Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>
Diffstat (limited to 'src/datavisualization/engine/surface3dcontroller.cpp')
-rw-r--r-- | src/datavisualization/engine/surface3dcontroller.cpp | 103 |
1 files changed, 64 insertions, 39 deletions
diff --git a/src/datavisualization/engine/surface3dcontroller.cpp b/src/datavisualization/engine/surface3dcontroller.cpp index 9bd4b508..31c8b178 100644 --- a/src/datavisualization/engine/surface3dcontroller.cpp +++ b/src/datavisualization/engine/surface3dcontroller.cpp @@ -37,7 +37,8 @@ Surface3DController::Surface3DController(QRect rect) m_isSmoothSurfaceEnabled(false), m_isSurfaceEnabled(true), m_isSurfaceGridEnabled(true), - m_selectedPoint(noSelectionPoint()) + m_selectedPoint(invalidSelectionPosition()), + m_selectedSeries(0) { // Setting a null axis creates a new default axis according to orientation and graph type. // Note: these cannot be set in the Abstract3DController constructor, as they will call virtual @@ -97,7 +98,7 @@ void Surface3DController::synchDataToRenderer() } if (m_changeTracker.selectedPointChanged) { - m_renderer->updateSelectedPoint(m_selectedPoint); + m_renderer->updateSelectedPoint(m_selectedPoint, m_selectedSeries); m_changeTracker.selectedPointChanged = false; } } @@ -115,10 +116,19 @@ void Surface3DController::handleAxisRangeChangedBySender(QObject *sender) Abstract3DController::handleAxisRangeChangedBySender(sender); // Update selected point - may be moved offscreen - setSelectedPoint(m_selectedPoint); + setSelectedPoint(m_selectedPoint, m_selectedSeries); } -QPoint Surface3DController::noSelectionPoint() +void Surface3DController::handleSeriesVisibilityChangedBySender(QObject *sender) +{ + Abstract3DController::handleSeriesVisibilityChangedBySender(sender); + + // Visibility changes may require disabling/enabling slicing, + // so just reset selection to ensure everything is still valid. + setSelectedPoint(m_selectedPoint, m_selectedSeries); +} + +QPoint Surface3DController::invalidSelectionPosition() { static QPoint noSelectionPoint(-1, -1); return noSelectionPoint; @@ -132,12 +142,13 @@ void Surface3DController::addSeries(QAbstract3DSeries *series) Abstract3DController::addSeries(series); adjustValueAxisRange(); - - // TODO: Temp until selection by series is properly implemented - setSelectedPoint(noSelectionPoint()); } else { qWarning("Surface graph only supports a single series."); } + + QSurface3DSeries *surfaceSeries = static_cast<QSurface3DSeries *>(series); + if (surfaceSeries->selectedPoint() != invalidSelectionPosition()) + setSelectedPoint(surfaceSeries->selectedPoint(), surfaceSeries); } void Surface3DController::removeSeries(QAbstract3DSeries *series) @@ -145,10 +156,10 @@ void Surface3DController::removeSeries(QAbstract3DSeries *series) if (series && series->d_ptr->m_controller == this) { Abstract3DController::removeSeries(series); - adjustValueAxisRange(); + if (m_selectedSeries == series) + setSelectedPoint(invalidSelectionPosition(), 0); - // TODO: Temp until selection by series is properly implemented - setSelectedPoint(noSelectionPoint()); + adjustValueAxisRange(); } } @@ -228,43 +239,51 @@ void Surface3DController::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_selectedPoint != 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. + setSelectedPoint(m_selectedPoint, m_selectedSeries); + + // 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 Surface3DController::setSelectedPoint(const QPoint &position) +void Surface3DController::setSelectedPoint(const QPoint &position, QSurface3DSeries *series) { // If the selection targets non-existent point, clear selection instead. QPoint pos = position; - // TODO: Selection needs to be refactored to be handled by series + // Series may already have been removed, so check it before setting the selection. + if (!m_seriesList.contains(series)) + series = 0; + const QSurfaceDataProxy *proxy = 0; - if (m_seriesList.size()) { - QSurface3DSeries *series = static_cast<QSurface3DSeries *>(m_seriesList.at(0)); - proxy = static_cast<QSurfaceDataProxy *>(series->dataProxy()); - } else { - return; - } + if (series) + proxy = series->dataProxy(); - if (pos != noSelectionPoint()) { + if (!proxy) + pos = invalidSelectionPosition(); + + if (pos != invalidSelectionPosition()) { int maxRow = proxy->rowCount() - 1; int maxCol = proxy->columnCount() - 1; if (pos.x() < 0 || pos.x() > maxRow || pos.y() < 0 || pos.y() > maxCol) - pos = noSelectionPoint(); + pos = invalidSelectionPosition(); } if (selectionMode().testFlag(QDataVis::SelectionSlice)) { - if (pos == noSelectionPoint()) { + if (pos == invalidSelectionPosition() || !series->isVisible()) { scene()->setSlicingActive(false); } else { // If the selected point is outside data window, or there is no selected point, disable slicing @@ -276,7 +295,8 @@ void Surface3DController::setSelectedPoint(const QPoint &position) float axisMaxZ = float(m_axisZ->max()); // Comparisons between float and double are not accurate, so fudge our comparison values - //a little to get all rows and columns into view that need to be visible. + // a little to get all rows and columns into view that need to be visible. + // TODO: Probably unnecessary after QTRD-2622 done const float fudgeFactor = 0.00001f; float fudgedAxisXRange = (axisMaxX - axisMinX) * fudgeFactor; float fudgedAxisZRange = (axisMaxZ - axisMinZ) * fudgeFactor; @@ -297,29 +317,34 @@ void Surface3DController::setSelectedPoint(const QPoint &position) if (pos != m_selectedPoint) { m_selectedPoint = pos; + m_selectedSeries = series; m_changeTracker.selectedPointChanged = true; - emit selectedPointChanged(pos); + + // Clear selection from other series and finally set new selection to the specified series + foreach (QAbstract3DSeries *otherSeries, m_seriesList) { + QSurface3DSeries *surfaceSeries = static_cast<QSurface3DSeries *>(otherSeries); + if (surfaceSeries != m_selectedSeries) + surfaceSeries->dptr()->setSelectedPoint(invalidSelectionPosition()); + } + if (m_selectedSeries) + m_selectedSeries->dptr()->setSelectedPoint(m_selectedPoint); + emitNeedRender(); } } -QPoint Surface3DController::selectedPoint() const -{ - return m_selectedPoint; -} - void Surface3DController::handleArrayReset() { adjustValueAxisRange(); m_isDataDirty = true; // Clear selection unless still valid - setSelectedPoint(m_selectedPoint); + setSelectedPoint(m_selectedPoint, m_selectedSeries); emitNeedRender(); } -void Surface3DController::handlePointClicked(const QPoint &position) +void Surface3DController::handlePointClicked(const QPoint &position, QSurface3DSeries *series) { - setSelectedPoint(position); + setSelectedPoint(position, series); // TODO: pass clicked to parent. (QTRD-2517) // TODO: Also hover needed? (QTRD-2131) } |