aboutsummaryrefslogtreecommitdiffstats
path: root/stats
diff options
context:
space:
mode:
Diffstat (limited to 'stats')
-rw-r--r--stats/barseries.cpp15
-rw-r--r--stats/boxseries.cpp15
-rw-r--r--stats/pieseries.cpp15
-rw-r--r--stats/scatterseries.cpp37
-rw-r--r--stats/statsselection.cpp40
-rw-r--r--stats/statsselection.h6
6 files changed, 72 insertions, 56 deletions
diff --git a/stats/barseries.cpp b/stats/barseries.cpp
index 0f931e367..95b02111e 100644
--- a/stats/barseries.cpp
+++ b/stats/barseries.cpp
@@ -411,17 +411,16 @@ void BarSeries::unhighlight()
highlighted = Index();
}
-bool BarSeries::selectItemsUnderMouse(const QPointF &pos, SelectionModifier)
+bool BarSeries::selectItemsUnderMouse(const QPointF &pos, SelectionModifier modifier)
{
Index index = getItemUnderMouse(pos);
- if (index.bar < 0) {
- setSelection({}, nullptr);
- return false;
- }
- const std::vector<dive *> &dives = items[index.bar].subitems[index.subitem].dives;
- setSelection(dives, dives.empty() ? nullptr : dives.front());
- return true;
+ std::vector<dive *> divesUnderMouse;
+ if (index.bar >= 0)
+ divesUnderMouse = items[index.bar].subitems[index.subitem].dives;
+ processSelection(std::move(divesUnderMouse), modifier);
+
+ return index.bar >= 0;
}
void BarSeries::divesSelected(const QVector<dive *> &)
diff --git a/stats/boxseries.cpp b/stats/boxseries.cpp
index 09f9ccf9c..1bbfa2cfc 100644
--- a/stats/boxseries.cpp
+++ b/stats/boxseries.cpp
@@ -146,17 +146,16 @@ void BoxSeries::unhighlight()
highlighted = -1;
}
-bool BoxSeries::selectItemsUnderMouse(const QPointF &pos, SelectionModifier)
+bool BoxSeries::selectItemsUnderMouse(const QPointF &pos, SelectionModifier modifier)
{
int index = getItemUnderMouse(pos);
- if (index < 0) {
- setSelection({}, nullptr);
- return false;
- }
- const std::vector<dive *> &dives = items[index]->q.dives;
- setSelection(dives, dives.empty() ? nullptr : dives.front());
- return true;
+ std::vector<dive *> divesUnderMouse;
+ if (index >= 0)
+ divesUnderMouse = items[index]->q.dives;
+ processSelection(std::move(divesUnderMouse), modifier);
+
+ return index >= 0;
}
void BoxSeries::divesSelected(const QVector<dive *> &)
diff --git a/stats/pieseries.cpp b/stats/pieseries.cpp
index 30d28774a..2a518debe 100644
--- a/stats/pieseries.cpp
+++ b/stats/pieseries.cpp
@@ -266,17 +266,16 @@ void PieSeries::unhighlight()
highlighted = -1;
}
-bool PieSeries::selectItemsUnderMouse(const QPointF &pos, SelectionModifier)
+bool PieSeries::selectItemsUnderMouse(const QPointF &pos, SelectionModifier modifier)
{
int index = getItemUnderMouse(pos);
- if (index < 0) {
- setSelection({}, nullptr);
- return false;
- }
- const std::vector<dive *> &dives = items[index].dives;
- setSelection(dives, dives.empty() ? nullptr : dives.front());
- return true;
+ std::vector<dive *> divesUnderMouse;
+ if (index >= 0)
+ divesUnderMouse = items[index].dives;
+ processSelection(std::move(divesUnderMouse), modifier);
+
+ return index >= 0;
}
void PieSeries::divesSelected(const QVector<dive *> &)
diff --git a/stats/scatterseries.cpp b/stats/scatterseries.cpp
index 38385edd1..9f5607159 100644
--- a/stats/scatterseries.cpp
+++ b/stats/scatterseries.cpp
@@ -98,41 +98,14 @@ std::vector<int> ScatterSeries::getItemsInRect(const QRectF &rect) const
bool ScatterSeries::selectItemsUnderMouse(const QPointF &point, SelectionModifier modifier)
{
- std::vector<struct dive *> selected;
std::vector<int> indices = getItemsUnderMouse(point);
+ std::vector<struct dive *> divesUnderMouse;
- if (modifier.ctrl) {
- // When shift is pressed, add the items under the mouse to the selection
- // or, if all items under the mouse are selected, remove them.
- selected = getDiveSelection();
- selected.reserve(indices.size() + selected.size());
- bool allSelected = std::all_of(indices.begin(), indices.end(),
- [this] (int idx) { return items[idx].d->selected; });
- if (allSelected) {
- // Remove items under cursor from selection. This could be made more efficient.
- for (int idx: indices) {
- auto it = std::find(selected.begin(), selected.end(), items[idx].d);
- if (it != selected.end()) {
- // Move last element to deselected element. If this already was
- // the last element, this is a no-op. Then, chop off last element.
- *it = selected.back();
- selected.pop_back();
- }
- }
- } else {
- // Add items under cursor to selection
- for (int idx: indices) {
- if (std::find(selected.begin(), selected.end(), items[idx].d) == selected.end())
- selected.push_back(items[idx].d);
- }
- }
- } else {
- selected.reserve(indices.size());
- for(int idx: indices)
- selected.push_back(items[idx].d);
- }
+ divesUnderMouse.reserve(indices.size());
+ for(int idx: indices)
+ divesUnderMouse.push_back(items[idx].d);
- setSelection(selected, selected.empty() ? nullptr : selected.front());
+ processSelection(std::move(divesUnderMouse), modifier);
return !indices.empty();
}
diff --git a/stats/statsselection.cpp b/stats/statsselection.cpp
index 38bbd7f8b..82652ee68 100644
--- a/stats/statsselection.cpp
+++ b/stats/statsselection.cpp
@@ -1,2 +1,42 @@
// SPDX-License-Identifier: GPL-2.0
#include "statsselection.h"
+#include "core/dive.h"
+#include "core/selection.h"
+
+#include <algorithm>
+
+void processSelection(std::vector<dive *> dives, SelectionModifier modifier)
+{
+ std::vector<dive *> selected;
+
+ if (modifier.ctrl) {
+ // When shift is pressed, add the items under the mouse to the selection
+ // or, if all items under the mouse are selected, remove them.
+ selected = getDiveSelection();
+ bool allSelected = std::all_of(dives.begin(), dives.end(),
+ [] (const dive *d) { return d->selected; });
+ if (allSelected) {
+ // Remove items under cursor from selection. This could be made more efficient.
+ for (const dive *d: dives) {
+ auto it = std::find(selected.begin(), selected.end(), d);
+ if (it != selected.end()) {
+ // Move last element to deselected element. If this already was
+ // the last element, this is a no-op. Then, chop off last element.
+ *it = selected.back();
+ selected.pop_back();
+ }
+ }
+ } else {
+ // Add items under cursor to selection
+ selected.reserve(dives.size() + selected.size());
+ for (dive *d: dives) {
+ if (std::find(selected.begin(), selected.end(), d) == selected.end())
+ selected.push_back(d);
+ }
+ }
+ } else {
+ selected = std::move(dives);
+ }
+
+ setSelection(selected, selected.empty() ? nullptr : selected.front());
+}
diff --git a/stats/statsselection.h b/stats/statsselection.h
index e3f590466..9e606c533 100644
--- a/stats/statsselection.h
+++ b/stats/statsselection.h
@@ -4,6 +4,10 @@
#ifndef STATS_SELECTION_H
#define STATS_SELECTION_H
+#include <vector>
+
+struct dive;
+
struct SelectionModifier {
unsigned int ctrl : 1;
unsigned int shift : 1;
@@ -12,4 +16,6 @@ struct SelectionModifier {
SelectionModifier() : ctrl(0), shift(0) {}
};
+void processSelection(std::vector<dive *> dives, SelectionModifier modifier);
+
#endif