mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
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>
This commit is contained in:
parent
2943b1cbde
commit
5a8d7617ce
5 changed files with 97 additions and 3 deletions
|
@ -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,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue