diff --git a/stats/statsvariables.cpp b/stats/statsvariables.cpp index 3b6d55761..5da823849 100644 --- a/stats/statsvariables.cpp +++ b/stats/statsvariables.cpp @@ -930,11 +930,18 @@ struct DateVariable : public StatsVariableTemplatemeandepth.mm : d->maxdepth.mm; +} struct DepthBinner : public IntRangeBinner { bool metric; - DepthBinner(int bin_size, bool metric) : IntRangeBinner(bin_size), metric(metric) + bool mean; + DepthBinner(int bin_size, bool metric, bool mean) : + IntRangeBinner(bin_size), metric(metric), mean(mean) { } QString name() const override { @@ -946,20 +953,21 @@ struct DepthBinner : public IntRangeBinner { return get_depth_unit(metric); } int to_bin_value(const dive *d) const { - return metric ? d->maxdepth.mm / 1000 / bin_size - : lrint(mm_to_feet(d->maxdepth.mm)) / bin_size; + int depth = dive_depth_in_mm(d, mean); + return metric ? depth / 1000 / bin_size + : lrint(mm_to_feet(depth)) / bin_size; } }; -static DepthBinner meter_binner5(5, true); -static DepthBinner meter_binner10(10, true); -static DepthBinner meter_binner20(20, true); -static DepthBinner feet_binner15(15, false); -static DepthBinner feet_binner30(30, false); -static DepthBinner feet_binner60(60, false); -struct DepthVariable : public StatsVariableTemplate { - QString name() const override { - return StatsTranslations::tr("Max. Depth"); +struct DepthVariableBase : public StatsVariableTemplate { + bool mean; + DepthBinner meter5, meter10, meter20; + DepthBinner feet15, feet30, feet60; + DepthVariableBase(bool mean) : + mean(mean), + meter5(5, true, mean), meter10(10, true, mean), meter20(10, true, mean), + feet15(15, false, mean), feet30(30, false, mean), feet60(60, false, mean) + { } QString unitSymbol() const override { return get_depth_unit(); @@ -969,19 +977,43 @@ struct DepthVariable : public StatsVariableTemplate binners() const override { if (prefs.units.length == units::METERS) - return { &meter_binner5, &meter_binner10, &meter_binner20 }; + return { &meter5, &meter10, &meter20 }; else - return { &feet_binner15, &feet_binner30, &feet_binner60 }; + return { &feet15, &feet30, &feet60 }; } double toFloat(const dive *d) const override { - return prefs.units.length == units::METERS ? d->maxdepth.mm / 1000.0 - : mm_to_feet(d->maxdepth.mm); + int depth = dive_depth_in_mm(d, mean); + return prefs.units.length == units::METERS ? depth / 1000.0 + : mm_to_feet(depth); } std::vector supportedOperations() const override { return { StatsOperation::Median, StatsOperation::Mean, StatsOperation::Sum }; } }; +struct MaxDepthVariable : public DepthVariableBase { + MaxDepthVariable() : DepthVariableBase(false) { + } + QString name() const override { + return StatsTranslations::tr("Max. Depth"); + } + std::vector supportedOperations() const override { + return { StatsOperation::Median, StatsOperation::Mean, StatsOperation::Sum }; + } +}; + +struct MeanDepthVariable : public DepthVariableBase { + MeanDepthVariable() : DepthVariableBase(true) + { + } + QString name() const override { + return StatsTranslations::tr("Mean Depth"); + } + std::vector supportedOperations() const override { + return { StatsOperation::Median, StatsOperation::Mean, StatsOperation::TimeWeightedMean }; + } +}; + // ============ Bottom time, binned in 5, 10, 30 min or 1 h bins ============ struct MinuteBinner : public IntRangeBinner { @@ -1734,7 +1766,8 @@ struct VisibilityVariable : public StatsVariableTemplate stats_variables = { - &date_variable, &depth_variable, &duration_variable, &sac_variable, + &date_variable, &max_depth_variable, &mean_depth_variable, &duration_variable, &sac_variable, &water_temperature_variable, &air_temperature_variable, &weight_variable, &gas_content_o2_variable, &gas_content_o2_he_max_variable, &gas_content_he_variable, &dive_mode_variable, &buddy_variable, &gas_type_variable, &suit_variable,