diff options
author | Berthold Stoeger <bstoeger@mail.tuwien.ac.at> | 2021-02-12 10:56:48 +0100 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2021-02-13 13:02:54 -0800 |
commit | 5a8d7617ce3d1b54f22a0438f593e844757ecc46 (patch) | |
tree | 3ec045749e4535fa38094300dcb639299e4a7b2d /stats/statsview.cpp | |
parent | 2943b1cbde1a60ef00f1878a27f811246d9b2bc3 (diff) | |
download | subsurface-5a8d7617ce3d1b54f22a0438f593e844757ecc46.tar.gz |
statistics: implement primitive "restrict to selection" feature
Allow the user to restrict the analyzed dives based on the
current selection. One button restricts to the current selection
and one button resets the restriction.
Thus, the user can for example select bars in the bar chart
or a range in the scatter plot and perform statistics on
these sets.
The restriction works on top of the filter.
The UI can certainly be improved, but it is a start.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
Diffstat (limited to 'stats/statsview.cpp')
-rw-r--r-- | stats/statsview.cpp | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/stats/statsview.cpp b/stats/statsview.cpp index 09a984bdb..148611cfc 100644 --- a/stats/statsview.cpp +++ b/stats/statsview.cpp @@ -39,6 +39,7 @@ StatsView::StatsView(QQuickItem *parent) : QQuickItem(parent), xAxis(nullptr), yAxis(nullptr), draggedItem(nullptr), + restrictDives(false), rootNode(nullptr) { setFlag(ItemHasContents, true); @@ -496,6 +497,25 @@ void StatsView::reset() grid.reset(); } +void StatsView::restrictToSelection() +{ + restrictedDives = getDiveSelection(); + std::sort(restrictedDives.begin(), restrictedDives.end()); // Sort by pointer for quick lookup + restrictDives = true; + plot(state); +} + +void StatsView::unrestrict() +{ + restrictDives = false; + plot(state); +} + +int StatsView::restrictionCount() const +{ + return restrictDives ? (int)restrictedDives.size() : -1; +} + void StatsView::plot(const StatsState &stateIn) { state = stateIn; @@ -518,7 +538,19 @@ void StatsView::plotChart() return; reset(); - const std::vector<dive *> dives = DiveFilter::instance()->visibleDives(); + std::vector<dive *> dives; + if (restrictDives) { + std::vector<dive *> visible = DiveFilter::instance()->visibleDives(); + dives.reserve(visible.size()); + for (dive *d: visible) { + // binary search + auto it = std::lower_bound(restrictedDives.begin(), restrictedDives.end(), d); + if (it != restrictedDives.end() && *it == d) + dives.push_back(d); + } + } else { + dives = DiveFilter::instance()->visibleDives(); + } switch (state.type) { case ChartType::DiscreteBar: return plotBarChart(dives, state.subtype, state.var1, state.var1Binner, state.var2, |