summaryrefslogtreecommitdiffstats
path: root/src/datavisualization/engine/scatter3dcontroller.cpp
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@digia.com>2014-01-21 08:55:03 +0200
committerMiikka Heikkinen <miikka.heikkinen@digia.com>2014-01-21 09:41:47 +0200
commit177f9d385c8cd062c4bad78cf6b794a96fa025ad (patch)
tree14b362622d07a93ea56b077e23894a7384a3ddaa /src/datavisualization/engine/scatter3dcontroller.cpp
parent818e29d4c4fd4344df20328ec3fe693acc67e11a (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.cpp73
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);