mirror of
https://github.com/GoldenCheetah/GoldenCheetah.git
synced 2026-02-13 08:08:42 +00:00
Merge pull request #2131 from amtriathlon/multisport
Skip non relevant metrics for RideSummary in Trends view
This commit is contained in:
@@ -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() + "'> </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() +"'> </td>"; // spacing
|
||||
|
||||
foreach (QString symbol, metricsList) {
|
||||
foreach (QString symbol, relevantMetricsList) {
|
||||
|
||||
// the values ...
|
||||
const RideMetric *m = factory.rideMetric(symbol);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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(); }
|
||||
|
||||
@@ -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")))
|
||||
|
||||
Reference in New Issue
Block a user