diff --git a/src/Charts/RideSummaryWindow.cpp b/src/Charts/RideSummaryWindow.cpp
index 97bfac8f0..7ffad0a1e 100644
--- a/src/Charts/RideSummaryWindow.cpp
+++ b/src/Charts/RideSummaryWindow.cpp
@@ -475,6 +475,10 @@ RideSummaryWindow::htmlSummary()
return summary;
}
+ // activities counts by sport to select training zones
+ int nActivities, nRides, nRuns, nSwims;
+ context->athlete->rideCache->getRideTypeCounts(specification, nActivities, nRides, nRuns, nSwims);
+
// set those colors
summary = GCColor::css(ridesummary);
summary += "
";
@@ -540,8 +544,6 @@ RideSummaryWindow::htmlSummary()
if (ride->isRun()) averageColumn << "pace";
if (ride->isSwim()) averageColumn << "pace_swim";
} else {
- int nActivities, nRides, nRuns, nSwims;
- context->athlete->rideCache->getRideTypeCounts(specification, nActivities, nRides, nRuns, nSwims);
if (nRuns > 0) averageColumn << "pace";
if (nSwims > 0) averageColumn << "pace_swim";
}
@@ -633,8 +635,6 @@ RideSummaryWindow::htmlSummary()
} else {
// For data range use base metric for single sport if homogeneous
// or combined if mixed
- int nActivities, nRides, nRuns, nSwims;
- context->athlete->rideCache->getRideTypeCounts(specification, nActivities, nRides, nRuns, nSwims);
pmc = context->athlete->getPMCFor(
nActivities == nRides ? "coggan_tss" :
nActivities == nRuns ? "govss" :
@@ -771,7 +771,9 @@ RideSummaryWindow::htmlSummary()
const RideMetric *m = factory.rideMetric(symbol);
if (!m) break;
- if (ridesummary && !m->isRelevantForRide(rideItem)) continue; // don't display non relevant metric
+ if ((ridesummary && !m->isRelevantForRide(rideItem)) ||
+ (!ridesummary && !context->athlete->rideCache->isMetricRelevantForRides(specification, m)))
+ continue; // don't display non relevant metric
// HTML table row
QString s("| %1%2: | %3 |
");
@@ -934,8 +936,6 @@ RideSummaryWindow::htmlSummary()
int numzones = 0;
int range = -1;
- int nActivities, nRides, nRuns, nSwims;
- context->athlete->rideCache->getRideTypeCounts(specification, nActivities, nRides, nRuns, nSwims);
//
// Time In Pace Zones for Running and Swimming activities
@@ -1207,6 +1207,17 @@ RideSummaryWindow::htmlSummary()
activities++;
}
+ // Select relevant metrics for activities of each sport
+ QStringList rideMetrics, runMetrics, swimMetrics;
+ for (j = 0; j< metricColumn.count(); ++j) {
+ QString symbol = metricColumn[j];
+ const RideMetric *m = factory.rideMetric(symbol);
+
+ if (context->athlete->rideCache->isMetricRelevantForRides(specification, m, RideCache::OnlyRides)) rideMetrics << symbol;
+ if (context->athlete->rideCache->isMetricRelevantForRides(specification, m, RideCache::OnlyRuns)) runMetrics << symbol;
+ if (context->athlete->rideCache->isMetricRelevantForRides(specification, m, RideCache::OnlySwims)) swimMetrics << symbol;
+ }
+
// some people have a LOT of metrics, so we only show so many since
// you quickly run out of screen space, but if they have > 4 we can
// take out elevation and work from the totals/
@@ -1214,7 +1225,9 @@ RideSummaryWindow::htmlSummary()
int totalCols;
if (metricColumn.count() > 4) totalCols = 2;
else totalCols = rtotalColumn.count();
- int metricCols = metricColumn.count() > 7 ? 7 : metricColumn.count();
+ int rideCols = rideMetrics.count() > 7 ? 7 : rideMetrics.count();
+ int runCols = runMetrics.count() > 7 ? 7 : runMetrics.count();
+ int swimCols = swimMetrics.count() > 7 ? 7 : swimMetrics.count();
//Rides first
if (context->ishomefiltered || context->isfiltered || filtered) {
@@ -1244,8 +1257,8 @@ RideSummaryWindow::htmlSummary()
summary += QString("%1 | ").arg(m->name());
}
- for (j = 0; j< metricCols; ++j) {
- QString symbol = metricColumn[j];
+ for (j = 0; j< rideCols; ++j) {
+ QString symbol = rideMetrics[j];
const RideMetric *m = factory.rideMetric(symbol);
summary += QString("%1 | ").arg(m->name());
@@ -1263,8 +1276,8 @@ RideSummaryWindow::htmlSummary()
if (units == "seconds" || units == tr("seconds")) units = "";
summary += QString("%1 | ").arg(units);
}
- for (j = 0; j< metricCols; ++j) {
- QString symbol = metricColumn[j];
+ for (j = 0; j< rideCols; ++j) {
+ QString symbol = rideMetrics[j];
const RideMetric *m = factory.rideMetric(symbol);
QString units = m->units(useMetricUnits);
@@ -1305,8 +1318,8 @@ RideSummaryWindow::htmlSummary()
QString value = ride->getStringForSymbol(symbol,useMetricUnits);
summary += QString("%1 | ").arg(value);
}
- for (j = 0; j< metricCols; ++j) {
- QString symbol = metricColumn[j];
+ for (j = 0; j< rideCols; ++j) {
+ QString symbol = rideMetrics[j];
// get this value
QString value = ride->getStringForSymbol(symbol,useMetricUnits);
@@ -1344,8 +1357,8 @@ RideSummaryWindow::htmlSummary()
summary += QString("%1 | ").arg(m->name());
}
- for (j = 0; j< metricCols; ++j) {
- QString symbol = metricColumn[j];
+ for (j = 0; j< runCols; ++j) {
+ QString symbol = runMetrics[j];
const RideMetric *m = factory.rideMetric(symbol);
summary += QString("%1 | ").arg(m->name());
@@ -1363,8 +1376,8 @@ RideSummaryWindow::htmlSummary()
if (units == "seconds" || units == tr("seconds")) units = "";
summary += QString("%1 | ").arg(units);
}
- for (j = 0; j< metricCols; ++j) {
- QString symbol = metricColumn[j];
+ for (j = 0; j< runCols; ++j) {
+ QString symbol = runMetrics[j];
const RideMetric *m = factory.rideMetric(symbol);
QString units = m->units(useMetricUnits);
@@ -1404,8 +1417,8 @@ RideSummaryWindow::htmlSummary()
QString value = ride->getStringForSymbol(symbol,useMetricUnits);
summary += QString("%1 | ").arg(value);
}
- for (j = 0; j< metricCols; ++j) {
- QString symbol = metricColumn[j];
+ for (j = 0; j< runCols; ++j) {
+ QString symbol = runMetrics[j];
// get this value
QString value = ride->getStringForSymbol(symbol,useMetricUnits);
@@ -1443,8 +1456,8 @@ RideSummaryWindow::htmlSummary()
summary += QString("%1 | ").arg(m->name());
}
- for (j = 0; j< metricCols; ++j) {
- QString symbol = metricColumn[j];
+ for (j = 0; j< swimCols; ++j) {
+ QString symbol = swimMetrics[j];
const RideMetric *m = factory.rideMetric(symbol);
summary += QString("%1 | ").arg(m->name());
@@ -1462,8 +1475,8 @@ RideSummaryWindow::htmlSummary()
if (units == "seconds" || units == tr("seconds")) units = "";
summary += QString("%1 | ").arg(units);
}
- for (j = 0; j< metricCols; ++j) {
- QString symbol = metricColumn[j];
+ for (j = 0; j< swimCols; ++j) {
+ QString symbol = swimMetrics[j];
const RideMetric *m = factory.rideMetric(symbol);
QString units = m->units(useMetricUnits);
@@ -1503,8 +1516,8 @@ RideSummaryWindow::htmlSummary()
QString value = ride->getStringForSymbol(symbol,useMetricUnits);
summary += QString("%1 | ").arg(value);
}
- for (j = 0; j< metricCols; ++j) {
- QString symbol = metricColumn[j];
+ for (j = 0; j< swimCols; ++j) {
+ QString symbol = swimMetrics[j];
// get this value
QString value = ride->getStringForSymbol(symbol,useMetricUnits);
@@ -2158,9 +2171,21 @@ RideSummaryWindow::htmlCompareSummary() const
// case we ever come back here or use it for other things.
summary += " | "; // spacing
+ QStringList relevantMetricsList;
foreach (QString symbol, metricsList) {
const RideMetric *m = factory.rideMetric(symbol);
+ // Skip metrics not relevant for all ranges in compare pane
+ bool isRelevant = false;
+ foreach(CompareDateRange x, context->compareDateRanges) {
+ if (x.context->athlete->rideCache->isMetricRelevantForRides(x.specification, m)) {
+ isRelevant = true;
+ break;
+ }
+ }
+ if (!isRelevant) continue;
+ relevantMetricsList << symbol;
+
QString name, units;
if (!(m->units(context->athlete->useMetricUnits) == "seconds" || m->units(context->athlete->useMetricUnits) == tr("seconds")))
units = m->units(context->athlete->useMetricUnits);
@@ -2187,7 +2212,7 @@ RideSummaryWindow::htmlCompareSummary() const
summary += "" + dr.name + " | ";
summary += " | "; // spacing
- foreach (QString symbol, metricsList) {
+ foreach (QString symbol, relevantMetricsList) {
// the values ...
const RideMetric *m = factory.rideMetric(symbol);
diff --git a/src/Core/RideCache.cpp b/src/Core/RideCache.cpp
index ea59ebebb..c4d992e42 100644
--- a/src/Core/RideCache.cpp
+++ b/src/Core/RideCache.cpp
@@ -902,3 +902,25 @@ RideCache::getRideTypeCounts(Specification specification, int& nActivities,
else nRides++;
}
}
+
+bool
+RideCache::isMetricRelevantForRides(Specification specification,
+ const RideMetric* metric,
+ SportRestriction sport)
+{
+ // loop through and aggregate
+ foreach (RideItem *ride, rides_) {
+
+ // skip filtered rides
+ if (!specification.pass(ride)) continue;
+
+ // skip non selected sports when restriction supplied
+ if ((sport == OnlyRides) && (ride->isSwim || ride->isRun)) continue;
+ if ((sport == OnlyRuns) && !ride->isRun) continue;
+ if ((sport == OnlySwims) && !ride->isSwim) continue;
+
+ if (metric->isRelevantForRide(ride)) return true;
+ }
+
+ return false;
+}
diff --git a/src/Core/RideCache.h b/src/Core/RideCache.h
index 98c8a5478..f0a7459fc 100644
--- a/src/Core/RideCache.h
+++ b/src/Core/RideCache.h
@@ -73,6 +73,11 @@ class RideCache : public QObject
// Count of activities matching specification
void getRideTypeCounts(Specification specification, int& nActivities,
int& nRides, int& nRuns, int& nSwims);
+ // Check if metric is relevant for some activity matching specification
+ enum SportRestriction { AnySport, OnlyRides, OnlyRuns, OnlySwims };
+ bool isMetricRelevantForRides(Specification specification,
+ const RideMetric* metric,
+ SportRestriction sport=AnySport);
// is running ?
bool isRunning() { return future.isRunning(); }
diff --git a/src/Gui/ComparePane.cpp b/src/Gui/ComparePane.cpp
index 20efaed3f..7143a74b6 100644
--- a/src/Gui/ComparePane.cpp
+++ b/src/Gui/ComparePane.cpp
@@ -401,6 +401,16 @@ ComparePane::refreshTable()
// get the metric name
const RideMetric *m = factory.rideMetric(metric);
if (m) {
+ // Skip metrics not relevant for all ranges in compare pane
+ bool isRelevant = false;
+ foreach(CompareDateRange x, context->compareDateRanges) {
+ if (x.context->athlete->rideCache->isMetricRelevantForRides(x.specification, m)) {
+ isRelevant = true;
+ break;
+ }
+ }
+ if (!isRelevant) continue;
+
worklist << metric;
QString units;
if (!(m->units(context->athlete->useMetricUnits) == "seconds" || m->units(context->athlete->useMetricUnits) == tr("seconds")))