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>
This commit is contained in:
Berthold Stoeger 2021-02-08 17:07:37 +01:00 committed by Dirk Hohndel
parent 21b8cded56
commit 64b82b16a2
16 changed files with 47 additions and 22 deletions

View file

@ -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) {