diff options
author | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2014-01-21 08:55:03 +0200 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2014-01-21 09:41:47 +0200 |
commit | 177f9d385c8cd062c4bad78cf6b794a96fa025ad (patch) | |
tree | 14b362622d07a93ea56b077e23894a7384a3ddaa /src/datavisualization/engine/scatter3dcontroller.cpp | |
parent | 818e29d4c4fd4344df20328ec3fe693acc67e11a (diff) |
Selection correction for scatter when data changes
Implements item 3) in QTRD-2645
Task-number: QTRD-264
Change-Id: Ibe758bbfb3b4a74b55589a410b402bbdf07ea64f
Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>
Diffstat (limited to 'src/datavisualization/engine/scatter3dcontroller.cpp')
-rw-r--r-- | src/datavisualization/engine/scatter3dcontroller.cpp | 73 |
1 files changed, 59 insertions, 14 deletions
diff --git a/src/datavisualization/engine/scatter3dcontroller.cpp b/src/datavisualization/engine/scatter3dcontroller.cpp index 4527ac2a..6aa10a11 100644 --- a/src/datavisualization/engine/scatter3dcontroller.cpp +++ b/src/datavisualization/engine/scatter3dcontroller.cpp @@ -29,11 +29,14 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION +static const int insertRemoveRecordReserveSize = 31; + Scatter3DController::Scatter3DController(QRect boundRect, Q3DScene *scene) : Abstract3DController(boundRect, scene), m_renderer(0), m_selectedItem(invalidSelectionIndex()), - m_selectedItemSeries(0) + m_selectedItemSeries(0), + m_recordInsertsAndRemoves(false) { // Setting a null axis creates a new default axis according to orientation and graph type. // Note: These cannot be set in Abstract3DController constructor, as they will call virtual @@ -62,11 +65,11 @@ void Scatter3DController::initializeOpenGL() void Scatter3DController::synchDataToRenderer() { - Abstract3DController::synchDataToRenderer(); - if (!isInitialized()) return; + Abstract3DController::synchDataToRenderer(); + // Notify changes to renderer if (m_changeTracker.selectedItemChanged) { m_renderer->updateSelectedItem(m_selectedItem, m_selectedItemSeries); @@ -157,11 +160,6 @@ void Scatter3DController::handleItemsRemoved(int startIndex, int count) Q_UNUSED(count) // TODO should dirty only affected values? QScatter3DSeries *series = static_cast<QScatterDataProxy *>(sender())->series(); - if (series->isVisible()) { - adjustValueAxisRange(); - m_isDataDirty = true; - } - if (series == m_selectedItemSeries) { // If items removed from selected series before the selection, adjust the selection int selectedItem = m_selectedItem; @@ -175,6 +173,16 @@ void Scatter3DController::handleItemsRemoved(int startIndex, int count) } } + if (series->isVisible()) { + adjustValueAxisRange(); + m_isDataDirty = true; + } + + if (m_recordInsertsAndRemoves) { + InsertRemoveRecord record(false, startIndex, count, series); + m_insertRemoveRecords.append(record); + } + emitNeedRender(); } @@ -184,11 +192,6 @@ void Scatter3DController::handleItemsInserted(int startIndex, int count) Q_UNUSED(count) // TODO should dirty only affected values? QScatter3DSeries *series = static_cast<QScatterDataProxy *>(sender())->series(); - if (series->isVisible()) { - adjustValueAxisRange(); - m_isDataDirty = true; - } - if (series == m_selectedItemSeries) { // If items inserted to selected series before the selection, adjust the selection int selectedItem = m_selectedItem; @@ -198,9 +201,33 @@ void Scatter3DController::handleItemsInserted(int startIndex, int count) } } + if (series->isVisible()) { + adjustValueAxisRange(); + m_isDataDirty = true; + } + + if (m_recordInsertsAndRemoves) { + InsertRemoveRecord record(true, startIndex, count, series); + m_insertRemoveRecords.append(record); + } + emitNeedRender(); } +void Scatter3DController::startRecordingRemovesAndInserts() +{ + m_recordInsertsAndRemoves = false; + + if (m_scene->selectionQueryPosition() != Q3DScene::invalidSelectionPoint()) { + m_recordInsertsAndRemoves = true; + if (m_insertRemoveRecords.size()) { + m_insertRemoveRecords.clear(); + // Reserve some space for remove/insert records to avoid unnecessary reallocations. + m_insertRemoveRecords.reserve(insertRemoveRecordReserveSize); + } + } +} + void Scatter3DController::handleAxisAutoAdjustRangeChangedInOrientation( QAbstract3DAxis::AxisOrientation orientation, bool autoAdjust) { @@ -229,7 +256,25 @@ void Scatter3DController::handlePendingClick() int index = m_renderer->clickedIndex(); QScatter3DSeries *series = static_cast<QScatter3DSeries *>(m_renderer->clickedSeries()); - // TODO: Adjust position according to inserts/removes in the series + // Adjust position according to recorded events + int recordCount = m_insertRemoveRecords.size(); + if (recordCount) { + for (int i = 0; i < recordCount; i++) { + const InsertRemoveRecord &record = m_insertRemoveRecords.at(i); + if (series == record.m_series && record.m_startIndex <= index) { + if (record.m_isInsert) { + index += record.m_count; + } else { + if ((record.m_startIndex + record.m_count) > index) { + index = -1; // Selected row removed + break; + } else { + index -= record.m_count; // Move selected item down by amount of items removed + } + } + } + } + } setSelectedItem(index, series); |