diff options
Diffstat (limited to 'src/datavis3d/engine/scatter3dcontroller.cpp')
-rw-r--r-- | src/datavis3d/engine/scatter3dcontroller.cpp | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/src/datavis3d/engine/scatter3dcontroller.cpp b/src/datavis3d/engine/scatter3dcontroller.cpp index ef56fc23..3b0a2c1f 100644 --- a/src/datavis3d/engine/scatter3dcontroller.cpp +++ b/src/datavis3d/engine/scatter3dcontroller.cpp @@ -35,7 +35,8 @@ Scatter3DController::Scatter3DController(QRect boundRect) m_mousePos(QPoint(0, 0)), m_isSlicingActivated(false), m_renderer(0), - m_data(0) + m_data(0), + m_selectedItemIndex(noSelectionIndex()) { // Default axes setAxisX(new QValueAxis()); @@ -62,6 +63,9 @@ void Scatter3DController::initializeOpenGL() m_renderer = new Scatter3DRenderer(this); setRenderer(m_renderer); synchDataToRenderer(); + + QObject::connect(m_renderer, &Scatter3DRenderer::selectedItemIndexChanged, this, + &Scatter3DController::handleSelectedItemIndexChanged, Qt::QueuedConnection); } void Scatter3DController::synchDataToRenderer() @@ -77,6 +81,11 @@ void Scatter3DController::synchDataToRenderer() m_changeTracker.slicingActiveChanged = false; } + if (m_changeTracker.selectedItemIndexChanged) { + m_renderer->updateSelectedItemIndex(m_selectedItemIndex); + m_changeTracker.selectedItemIndexChanged = false; + } + if (m_isDataDirty) { m_renderer->updateDataModel(m_data); m_isDataDirty = false; @@ -243,6 +252,7 @@ void Scatter3DController::setDataProxy(QScatterDataProxy *proxy) adjustValueAxisRange(); m_isDataDirty = true; + setSelectedItemIndex(noSelectionIndex()); } QScatterDataProxy *Scatter3DController::dataProxy() @@ -255,6 +265,7 @@ void Scatter3DController::handleArrayReset() setSlicingActive(false); adjustValueAxisRange(); m_isDataDirty = true; + setSelectedItemIndex(noSelectionIndex()); } void Scatter3DController::handleItemsAdded(int startIndex, int count) @@ -282,6 +293,8 @@ void Scatter3DController::handleItemsRemoved(int startIndex, int count) // TODO should dirty only affected values? adjustValueAxisRange(); m_isDataDirty = true; + if (startIndex >= m_data->itemCount()) + setSelectedItemIndex(noSelectionIndex()); } void Scatter3DController::handleItemsInserted(int startIndex, int count) @@ -293,6 +306,14 @@ void Scatter3DController::handleItemsInserted(int startIndex, int count) m_isDataDirty = true; } +void Scatter3DController::handleSelectedItemIndexChanged(int index) +{ + if (index != m_selectedItemIndex) { + m_selectedItemIndex = index; + emit selectedItemIndexChanged(index); + } +} + void Scatter3DController::handleAxisAutoAdjustRangeChangedInOrientation( QAbstractAxis::AxisOrientation orientation, bool autoAdjust) { @@ -329,6 +350,25 @@ void Scatter3DController::setSelectionMode(QDataVis::SelectionMode mode) Abstract3DController::setSelectionMode(mode); } +void Scatter3DController::setSelectedItemIndex(int index) +{ + // TODO If items not within axis ranges are culled from drawing, should they be + // TODO unselectable as well? + if (index < 0 || index >= m_data->itemCount()) + index = noSelectionIndex(); + + if (index != m_selectedItemIndex) { + m_selectedItemIndex = index; + m_changeTracker.selectedItemIndexChanged = true; + emit selectedItemIndexChanged(index); + } +} + +int Scatter3DController::selectedItemIndex() const +{ + return m_selectedItemIndex; +} + QPoint Scatter3DController::mousePosition() { return m_mousePos; |