aboutsummaryrefslogtreecommitdiffstats
path: root/stats
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2021-02-08 17:07:37 +0100
committerGravatar Dirk Hohndel <dirk@hohndel.org>2021-02-13 13:02:54 -0800
commit64b82b16a26bcaa624cc35e775b821e33133bdbb (patch)
tree184f58141f2a0377bc16686c3a2724770b8dbd8c /stats
parent21b8cded56854f81327f4f553e32a15ffe5c7b82 (diff)
downloadsubsurface-64b82b16a26bcaa624cc35e775b821e33133bdbb.tar.gz
statistics: make selection keyboard modifiers more general
Up to now, we passed a "shiftPressed" flag to the individual selection functions. To be more general replace by a struct with "shift" and "ctrl" flags. While doing this: 1) Move the struct into a new statsselection file for better encapsulation. 2) Change shift to control in the scatter series, since individual selection of items is usually done with control, not shift. Shift usually means "select range". Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
Diffstat (limited to 'stats')
-rw-r--r--stats/CMakeLists.txt2
-rw-r--r--stats/barseries.cpp2
-rw-r--r--stats/barseries.h2
-rw-r--r--stats/boxseries.cpp2
-rw-r--r--stats/boxseries.h2
-rw-r--r--stats/pieseries.cpp2
-rw-r--r--stats/pieseries.h2
-rw-r--r--stats/scatterseries.cpp8
-rw-r--r--stats/scatterseries.h4
-rw-r--r--stats/statsselection.cpp2
-rw-r--r--stats/statsselection.h15
-rw-r--r--stats/statsseries.cpp2
-rw-r--r--stats/statsseries.h6
-rw-r--r--stats/statsview.cpp13
-rw-r--r--stats/statsview.h3
15 files changed, 45 insertions, 22 deletions
diff --git a/stats/CMakeLists.txt b/stats/CMakeLists.txt
index 1381797da..1525d7f69 100644
--- a/stats/CMakeLists.txt
+++ b/stats/CMakeLists.txt
@@ -36,6 +36,8 @@ set(SUBSURFACE_STATS_SRCS
statsgrid.cpp
statshelper.h
statshelper.cpp
+ statsselection.h
+ statsselection.cpp
statsseries.h
statsseries.cpp
statsstate.h
diff --git a/stats/barseries.cpp b/stats/barseries.cpp
index 3220bbd1a..0f931e367 100644
--- a/stats/barseries.cpp
+++ b/stats/barseries.cpp
@@ -411,7 +411,7 @@ void BarSeries::unhighlight()
highlighted = Index();
}
-bool BarSeries::selectItemsUnderMouse(const QPointF &pos, bool)
+bool BarSeries::selectItemsUnderMouse(const QPointF &pos, SelectionModifier)
{
Index index = getItemUnderMouse(pos);
if (index.bar < 0) {
diff --git a/stats/barseries.h b/stats/barseries.h
index d5cfb10e4..6779e5b6c 100644
--- a/stats/barseries.h
+++ b/stats/barseries.h
@@ -69,7 +69,7 @@ public:
void updatePositions() override;
bool hover(QPointF pos) override;
void unhighlight() override;
- bool selectItemsUnderMouse(const QPointF &point, bool shiftPressed) override;
+ bool selectItemsUnderMouse(const QPointF &point, SelectionModifier modifier) override;
private:
BarSeries(StatsView &view, StatsAxis *xAxis, StatsAxis *yAxis,
diff --git a/stats/boxseries.cpp b/stats/boxseries.cpp
index 78a3d258f..09f9ccf9c 100644
--- a/stats/boxseries.cpp
+++ b/stats/boxseries.cpp
@@ -146,7 +146,7 @@ void BoxSeries::unhighlight()
highlighted = -1;
}
-bool BoxSeries::selectItemsUnderMouse(const QPointF &pos, bool)
+bool BoxSeries::selectItemsUnderMouse(const QPointF &pos, SelectionModifier)
{
int index = getItemUnderMouse(pos);
if (index < 0) {
diff --git a/stats/boxseries.h b/stats/boxseries.h
index cd54ea86b..75e6cfa49 100644
--- a/stats/boxseries.h
+++ b/stats/boxseries.h
@@ -23,7 +23,7 @@ public:
void updatePositions() override;
bool hover(QPointF pos) override;
void unhighlight() override;
- bool selectItemsUnderMouse(const QPointF &point, bool shiftPressed) override;
+ bool selectItemsUnderMouse(const QPointF &point, SelectionModifier modifier) override;
// Note: this expects that all items are added with increasing pos
// and that no bar is inside another bar, i.e. lowerBound and upperBound
diff --git a/stats/pieseries.cpp b/stats/pieseries.cpp
index 5d940c2b2..30d28774a 100644
--- a/stats/pieseries.cpp
+++ b/stats/pieseries.cpp
@@ -266,7 +266,7 @@ void PieSeries::unhighlight()
highlighted = -1;
}
-bool PieSeries::selectItemsUnderMouse(const QPointF &pos, bool)
+bool PieSeries::selectItemsUnderMouse(const QPointF &pos, SelectionModifier)
{
int index = getItemUnderMouse(pos);
if (index < 0) {
diff --git a/stats/pieseries.h b/stats/pieseries.h
index 83e9acba7..1a132ebc3 100644
--- a/stats/pieseries.h
+++ b/stats/pieseries.h
@@ -28,7 +28,7 @@ public:
void updatePositions() override;
bool hover(QPointF pos) override;
void unhighlight() override;
- bool selectItemsUnderMouse(const QPointF &point, bool shiftPressed) override;
+ bool selectItemsUnderMouse(const QPointF &point, SelectionModifier modifier) override;
std::vector<QString> binNames();
diff --git a/stats/scatterseries.cpp b/stats/scatterseries.cpp
index 63fdaae1b..38385edd1 100644
--- a/stats/scatterseries.cpp
+++ b/stats/scatterseries.cpp
@@ -96,12 +96,12 @@ std::vector<int> ScatterSeries::getItemsInRect(const QRectF &rect) const
return res;
}
-bool ScatterSeries::selectItemsUnderMouse(const QPointF &point, bool shiftPressed)
+bool ScatterSeries::selectItemsUnderMouse(const QPointF &point, SelectionModifier modifier)
{
std::vector<struct dive *> selected;
std::vector<int> indices = getItemsUnderMouse(point);
- if (shiftPressed) {
+ 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();
@@ -141,13 +141,13 @@ bool ScatterSeries::supportsLassoSelection() const
return true;
}
-void ScatterSeries::selectItemsInRect(const QRectF &rect, bool shiftPressed, const std::vector<dive *> &oldSelection)
+void ScatterSeries::selectItemsInRect(const QRectF &rect, SelectionModifier modifier, const std::vector<dive *> &oldSelection)
{
std::vector<struct dive *> selected;
std::vector<int> indices = getItemsInRect(rect);
selected.reserve(oldSelection.size() + indices.size());
- if (shiftPressed) {
+ if (modifier.ctrl) {
selected = oldSelection;
// Ouch - this primitive merging of the selections grows with O(n^2). Fix this.
for (int idx: indices) {
diff --git a/stats/scatterseries.h b/stats/scatterseries.h
index 1b8db0337..eeb28415b 100644
--- a/stats/scatterseries.h
+++ b/stats/scatterseries.h
@@ -27,9 +27,9 @@ public:
// Note: this expects that all items are added with increasing pos!
void append(dive *d, double pos, double value);
- bool selectItemsUnderMouse(const QPointF &point, bool shiftPressed) override;
+ bool selectItemsUnderMouse(const QPointF &point, SelectionModifier modifier) override;
bool supportsLassoSelection() const override;
- void selectItemsInRect(const QRectF &rect, bool shiftPressed, const std::vector<dive *> &oldSelection) override;
+ void selectItemsInRect(const QRectF &rect, SelectionModifier modifier, const std::vector<dive *> &oldSelection) override;
private:
// Get items under mouse.
diff --git a/stats/statsselection.cpp b/stats/statsselection.cpp
new file mode 100644
index 000000000..38bbd7f8b
--- /dev/null
+++ b/stats/statsselection.cpp
@@ -0,0 +1,2 @@
+// SPDX-License-Identifier: GPL-2.0
+#include "statsselection.h"
diff --git a/stats/statsselection.h b/stats/statsselection.h
new file mode 100644
index 000000000..e3f590466
--- /dev/null
+++ b/stats/statsselection.h
@@ -0,0 +1,15 @@
+// SPDX-License-Identifier: GPL-2.0
+// Functions and data structures handling dive selections.
+
+#ifndef STATS_SELECTION_H
+#define STATS_SELECTION_H
+
+struct SelectionModifier {
+ unsigned int ctrl : 1;
+ unsigned int shift : 1;
+ // Note: default member initializers for bit-fields becomes available with C++20.
+ // Therefore, for now an inline constructor.
+ SelectionModifier() : ctrl(0), shift(0) {}
+};
+
+#endif
diff --git a/stats/statsseries.cpp b/stats/statsseries.cpp
index 379628fe1..08d0c031d 100644
--- a/stats/statsseries.cpp
+++ b/stats/statsseries.cpp
@@ -22,6 +22,6 @@ bool StatsSeries::supportsLassoSelection() const
return false;
}
-void StatsSeries::selectItemsInRect(const QRectF &, bool, const std::vector<dive *> &)
+void StatsSeries::selectItemsInRect(const QRectF &, SelectionModifier, const std::vector<dive *> &)
{
}
diff --git a/stats/statsseries.h b/stats/statsseries.h
index 196427eaf..16c88b047 100644
--- a/stats/statsseries.h
+++ b/stats/statsseries.h
@@ -4,6 +4,8 @@
#ifndef STATS_SERIES_H
#define STATS_SERIES_H
+#include "statsselection.h"
+
#include <vector>
#include <QPointF>
@@ -20,10 +22,10 @@ public:
virtual bool hover(QPointF pos) = 0; // Called on mouse movement. Return true if an item of this series is highlighted.
virtual void unhighlight() = 0; // Unhighlight any highlighted item.
// Returns true if an item was under the mouse.
- virtual bool selectItemsUnderMouse(const QPointF &pos, bool shiftPressed) = 0;
+ virtual bool selectItemsUnderMouse(const QPointF &pos, SelectionModifier modifier) = 0;
virtual bool supportsLassoSelection() const;
// Needs only be defined if supportsLassoSelection() returns true.
- virtual void selectItemsInRect(const QRectF &rect, bool shiftPressed, const std::vector<dive *> &oldSelection);
+ virtual void selectItemsInRect(const QRectF &rect, SelectionModifier modifier, const std::vector<dive *> &oldSelection);
virtual void divesSelected(const QVector<dive *> &dives) = 0;
protected:
diff --git a/stats/statsview.cpp b/stats/statsview.cpp
index 88f394550..09a984bdb 100644
--- a/stats/statsview.cpp
+++ b/stats/statsview.cpp
@@ -39,7 +39,6 @@ StatsView::StatsView(QQuickItem *parent) : QQuickItem(parent),
xAxis(nullptr),
yAxis(nullptr),
draggedItem(nullptr),
- shiftSelection(false),
rootNode(nullptr)
{
setFlag(ItemHasContents, true);
@@ -84,10 +83,12 @@ void StatsView::mousePressEvent(QMouseEvent *event)
}
}
- bool shiftPressed = event->modifiers() & Qt::ShiftModifier;
+ SelectionModifier modifier;
+ modifier.shift = (event->modifiers() & Qt::ShiftModifier) != 0;
+ modifier.ctrl = (event->modifiers() & Qt::ControlModifier) != 0;
bool itemSelected = false;
for (auto &series: series)
- itemSelected |= series->selectItemsUnderMouse(pos, shiftPressed);
+ itemSelected |= series->selectItemsUnderMouse(pos, modifier);
// The user clicked in "empty" space. If there is a series supporting lasso-select,
// got into lasso mode. For now, we only support a rectangular lasso.
@@ -98,8 +99,8 @@ void StatsView::mousePressEvent(QMouseEvent *event)
deleteChartItem(selectionRect); // Ooops. Already a selection in place.
dragStartMouse = pos;
selectionRect = createChartItem<ChartRectLineItem>(ChartZValue::Selection, selectionLassoColor, selectionLassoWidth);
- shiftSelection = shiftPressed;
- oldSelection = shiftPressed ? getDiveSelection() : std::vector<dive *>();
+ selectionModifier = modifier;
+ oldSelection = modifier.ctrl ? getDiveSelection() : std::vector<dive *>();
grabMouse();
setKeepMouseGrab(true); // don't allow Qt to steal the grab
update();
@@ -400,7 +401,7 @@ void StatsView::mouseMoveEvent(QMouseEvent *event)
fabs(p2.x() - p1.x()), fabs(p2.y() - p1.y()));
for (auto &series: series) {
if (series->supportsLassoSelection())
- series->selectItemsInRect(rect, shiftSelection, oldSelection);
+ series->selectItemsInRect(rect, selectionModifier, oldSelection);
}
update();
}
diff --git a/stats/statsview.h b/stats/statsview.h
index 279889104..6e0fe8967 100644
--- a/stats/statsview.h
+++ b/stats/statsview.h
@@ -4,6 +4,7 @@
#include "statsstate.h"
#include "statshelper.h"
+#include "statsselection.h"
#include <memory>
#include <QFont>
#include <QImage>
@@ -145,7 +146,7 @@ private:
ChartItemPtr<RegressionItem> regressionItem;
ChartItemPtr<ChartRectLineItem> selectionRect;
QPointF dragStartMouse, dragStartItem;
- bool shiftSelection;
+ SelectionModifier selectionModifier;
std::vector<dive *> oldSelection;
void hoverEnterEvent(QHoverEvent *event) override;