Merge pull request #2131 from amtriathlon/multisport

Skip non relevant metrics for RideSummary in Trends view
This commit is contained in:
Alejandro Martinez
2016-10-14 10:18:51 -03:00
committed by GitHub
4 changed files with 89 additions and 27 deletions

View File

@@ -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 += "<center>";
@@ -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("<tr><td>%1%2:</td><td align=\"right\">%3</td></tr>");
@@ -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("<td align=\"center\">%1</td>").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("<td align=\"center\">%1</td>").arg(m->name());
@@ -1263,8 +1276,8 @@ RideSummaryWindow::htmlSummary()
if (units == "seconds" || units == tr("seconds")) units = "";
summary += QString("<td align=\"center\">%1</td>").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("<td align=\"center\">%1</td>").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("<td align=\"center\">%1</td>").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("<td align=\"center\">%1</td>").arg(m->name());
@@ -1363,8 +1376,8 @@ RideSummaryWindow::htmlSummary()
if (units == "seconds" || units == tr("seconds")) units = "";
summary += QString("<td align=\"center\">%1</td>").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("<td align=\"center\">%1</td>").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("<td align=\"center\">%1</td>").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("<td align=\"center\">%1</td>").arg(m->name());
@@ -1462,8 +1475,8 @@ RideSummaryWindow::htmlSummary()
if (units == "seconds" || units == tr("seconds")) units = "";
summary += QString("<td align=\"center\">%1</td>").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("<td align=\"center\">%1</td>").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 += "<td bgcolor='" + bgColor.name() + "'>&nbsp;</td>"; // 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 += "<td>" + dr.name + "</td>";
summary += "<td bgcolor='" + bgColor.name() +"'>&nbsp;</td>"; // spacing
foreach (QString symbol, metricsList) {
foreach (QString symbol, relevantMetricsList) {
// the values ...
const RideMetric *m = factory.rideMetric(symbol);

View File

@@ -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;
}

View File

@@ -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(); }

View File

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