mirror of
https://github.com/GoldenCheetah/GoldenCheetah.git
synced 2026-04-15 05:32:21 +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;
|
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
|
// set those colors
|
||||||
summary = GCColor::css(ridesummary);
|
summary = GCColor::css(ridesummary);
|
||||||
summary += "<center>";
|
summary += "<center>";
|
||||||
@@ -540,8 +544,6 @@ RideSummaryWindow::htmlSummary()
|
|||||||
if (ride->isRun()) averageColumn << "pace";
|
if (ride->isRun()) averageColumn << "pace";
|
||||||
if (ride->isSwim()) averageColumn << "pace_swim";
|
if (ride->isSwim()) averageColumn << "pace_swim";
|
||||||
} else {
|
} else {
|
||||||
int nActivities, nRides, nRuns, nSwims;
|
|
||||||
context->athlete->rideCache->getRideTypeCounts(specification, nActivities, nRides, nRuns, nSwims);
|
|
||||||
if (nRuns > 0) averageColumn << "pace";
|
if (nRuns > 0) averageColumn << "pace";
|
||||||
if (nSwims > 0) averageColumn << "pace_swim";
|
if (nSwims > 0) averageColumn << "pace_swim";
|
||||||
}
|
}
|
||||||
@@ -633,8 +635,6 @@ RideSummaryWindow::htmlSummary()
|
|||||||
} else {
|
} else {
|
||||||
// For data range use base metric for single sport if homogeneous
|
// For data range use base metric for single sport if homogeneous
|
||||||
// or combined if mixed
|
// or combined if mixed
|
||||||
int nActivities, nRides, nRuns, nSwims;
|
|
||||||
context->athlete->rideCache->getRideTypeCounts(specification, nActivities, nRides, nRuns, nSwims);
|
|
||||||
pmc = context->athlete->getPMCFor(
|
pmc = context->athlete->getPMCFor(
|
||||||
nActivities == nRides ? "coggan_tss" :
|
nActivities == nRides ? "coggan_tss" :
|
||||||
nActivities == nRuns ? "govss" :
|
nActivities == nRuns ? "govss" :
|
||||||
@@ -771,7 +771,9 @@ RideSummaryWindow::htmlSummary()
|
|||||||
const RideMetric *m = factory.rideMetric(symbol);
|
const RideMetric *m = factory.rideMetric(symbol);
|
||||||
if (!m) break;
|
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
|
// HTML table row
|
||||||
QString s("<tr><td>%1%2:</td><td align=\"right\">%3</td></tr>");
|
QString s("<tr><td>%1%2:</td><td align=\"right\">%3</td></tr>");
|
||||||
@@ -934,8 +936,6 @@ RideSummaryWindow::htmlSummary()
|
|||||||
|
|
||||||
int numzones = 0;
|
int numzones = 0;
|
||||||
int range = -1;
|
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
|
// Time In Pace Zones for Running and Swimming activities
|
||||||
@@ -1207,6 +1207,17 @@ RideSummaryWindow::htmlSummary()
|
|||||||
activities++;
|
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
|
// 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
|
// you quickly run out of screen space, but if they have > 4 we can
|
||||||
// take out elevation and work from the totals/
|
// take out elevation and work from the totals/
|
||||||
@@ -1214,7 +1225,9 @@ RideSummaryWindow::htmlSummary()
|
|||||||
int totalCols;
|
int totalCols;
|
||||||
if (metricColumn.count() > 4) totalCols = 2;
|
if (metricColumn.count() > 4) totalCols = 2;
|
||||||
else totalCols = rtotalColumn.count();
|
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
|
//Rides first
|
||||||
if (context->ishomefiltered || context->isfiltered || filtered) {
|
if (context->ishomefiltered || context->isfiltered || filtered) {
|
||||||
@@ -1244,8 +1257,8 @@ RideSummaryWindow::htmlSummary()
|
|||||||
|
|
||||||
summary += QString("<td align=\"center\">%1</td>").arg(m->name());
|
summary += QString("<td align=\"center\">%1</td>").arg(m->name());
|
||||||
}
|
}
|
||||||
for (j = 0; j< metricCols; ++j) {
|
for (j = 0; j< rideCols; ++j) {
|
||||||
QString symbol = metricColumn[j];
|
QString symbol = rideMetrics[j];
|
||||||
const RideMetric *m = factory.rideMetric(symbol);
|
const RideMetric *m = factory.rideMetric(symbol);
|
||||||
|
|
||||||
summary += QString("<td align=\"center\">%1</td>").arg(m->name());
|
summary += QString("<td align=\"center\">%1</td>").arg(m->name());
|
||||||
@@ -1263,8 +1276,8 @@ RideSummaryWindow::htmlSummary()
|
|||||||
if (units == "seconds" || units == tr("seconds")) units = "";
|
if (units == "seconds" || units == tr("seconds")) units = "";
|
||||||
summary += QString("<td align=\"center\">%1</td>").arg(units);
|
summary += QString("<td align=\"center\">%1</td>").arg(units);
|
||||||
}
|
}
|
||||||
for (j = 0; j< metricCols; ++j) {
|
for (j = 0; j< rideCols; ++j) {
|
||||||
QString symbol = metricColumn[j];
|
QString symbol = rideMetrics[j];
|
||||||
const RideMetric *m = factory.rideMetric(symbol);
|
const RideMetric *m = factory.rideMetric(symbol);
|
||||||
|
|
||||||
QString units = m->units(useMetricUnits);
|
QString units = m->units(useMetricUnits);
|
||||||
@@ -1305,8 +1318,8 @@ RideSummaryWindow::htmlSummary()
|
|||||||
QString value = ride->getStringForSymbol(symbol,useMetricUnits);
|
QString value = ride->getStringForSymbol(symbol,useMetricUnits);
|
||||||
summary += QString("<td align=\"center\">%1</td>").arg(value);
|
summary += QString("<td align=\"center\">%1</td>").arg(value);
|
||||||
}
|
}
|
||||||
for (j = 0; j< metricCols; ++j) {
|
for (j = 0; j< rideCols; ++j) {
|
||||||
QString symbol = metricColumn[j];
|
QString symbol = rideMetrics[j];
|
||||||
|
|
||||||
// get this value
|
// get this value
|
||||||
QString value = ride->getStringForSymbol(symbol,useMetricUnits);
|
QString value = ride->getStringForSymbol(symbol,useMetricUnits);
|
||||||
@@ -1344,8 +1357,8 @@ RideSummaryWindow::htmlSummary()
|
|||||||
|
|
||||||
summary += QString("<td align=\"center\">%1</td>").arg(m->name());
|
summary += QString("<td align=\"center\">%1</td>").arg(m->name());
|
||||||
}
|
}
|
||||||
for (j = 0; j< metricCols; ++j) {
|
for (j = 0; j< runCols; ++j) {
|
||||||
QString symbol = metricColumn[j];
|
QString symbol = runMetrics[j];
|
||||||
const RideMetric *m = factory.rideMetric(symbol);
|
const RideMetric *m = factory.rideMetric(symbol);
|
||||||
|
|
||||||
summary += QString("<td align=\"center\">%1</td>").arg(m->name());
|
summary += QString("<td align=\"center\">%1</td>").arg(m->name());
|
||||||
@@ -1363,8 +1376,8 @@ RideSummaryWindow::htmlSummary()
|
|||||||
if (units == "seconds" || units == tr("seconds")) units = "";
|
if (units == "seconds" || units == tr("seconds")) units = "";
|
||||||
summary += QString("<td align=\"center\">%1</td>").arg(units);
|
summary += QString("<td align=\"center\">%1</td>").arg(units);
|
||||||
}
|
}
|
||||||
for (j = 0; j< metricCols; ++j) {
|
for (j = 0; j< runCols; ++j) {
|
||||||
QString symbol = metricColumn[j];
|
QString symbol = runMetrics[j];
|
||||||
const RideMetric *m = factory.rideMetric(symbol);
|
const RideMetric *m = factory.rideMetric(symbol);
|
||||||
|
|
||||||
QString units = m->units(useMetricUnits);
|
QString units = m->units(useMetricUnits);
|
||||||
@@ -1404,8 +1417,8 @@ RideSummaryWindow::htmlSummary()
|
|||||||
QString value = ride->getStringForSymbol(symbol,useMetricUnits);
|
QString value = ride->getStringForSymbol(symbol,useMetricUnits);
|
||||||
summary += QString("<td align=\"center\">%1</td>").arg(value);
|
summary += QString("<td align=\"center\">%1</td>").arg(value);
|
||||||
}
|
}
|
||||||
for (j = 0; j< metricCols; ++j) {
|
for (j = 0; j< runCols; ++j) {
|
||||||
QString symbol = metricColumn[j];
|
QString symbol = runMetrics[j];
|
||||||
|
|
||||||
// get this value
|
// get this value
|
||||||
QString value = ride->getStringForSymbol(symbol,useMetricUnits);
|
QString value = ride->getStringForSymbol(symbol,useMetricUnits);
|
||||||
@@ -1443,8 +1456,8 @@ RideSummaryWindow::htmlSummary()
|
|||||||
|
|
||||||
summary += QString("<td align=\"center\">%1</td>").arg(m->name());
|
summary += QString("<td align=\"center\">%1</td>").arg(m->name());
|
||||||
}
|
}
|
||||||
for (j = 0; j< metricCols; ++j) {
|
for (j = 0; j< swimCols; ++j) {
|
||||||
QString symbol = metricColumn[j];
|
QString symbol = swimMetrics[j];
|
||||||
const RideMetric *m = factory.rideMetric(symbol);
|
const RideMetric *m = factory.rideMetric(symbol);
|
||||||
|
|
||||||
summary += QString("<td align=\"center\">%1</td>").arg(m->name());
|
summary += QString("<td align=\"center\">%1</td>").arg(m->name());
|
||||||
@@ -1462,8 +1475,8 @@ RideSummaryWindow::htmlSummary()
|
|||||||
if (units == "seconds" || units == tr("seconds")) units = "";
|
if (units == "seconds" || units == tr("seconds")) units = "";
|
||||||
summary += QString("<td align=\"center\">%1</td>").arg(units);
|
summary += QString("<td align=\"center\">%1</td>").arg(units);
|
||||||
}
|
}
|
||||||
for (j = 0; j< metricCols; ++j) {
|
for (j = 0; j< swimCols; ++j) {
|
||||||
QString symbol = metricColumn[j];
|
QString symbol = swimMetrics[j];
|
||||||
const RideMetric *m = factory.rideMetric(symbol);
|
const RideMetric *m = factory.rideMetric(symbol);
|
||||||
|
|
||||||
QString units = m->units(useMetricUnits);
|
QString units = m->units(useMetricUnits);
|
||||||
@@ -1503,8 +1516,8 @@ RideSummaryWindow::htmlSummary()
|
|||||||
QString value = ride->getStringForSymbol(symbol,useMetricUnits);
|
QString value = ride->getStringForSymbol(symbol,useMetricUnits);
|
||||||
summary += QString("<td align=\"center\">%1</td>").arg(value);
|
summary += QString("<td align=\"center\">%1</td>").arg(value);
|
||||||
}
|
}
|
||||||
for (j = 0; j< metricCols; ++j) {
|
for (j = 0; j< swimCols; ++j) {
|
||||||
QString symbol = metricColumn[j];
|
QString symbol = swimMetrics[j];
|
||||||
|
|
||||||
// get this value
|
// get this value
|
||||||
QString value = ride->getStringForSymbol(symbol,useMetricUnits);
|
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.
|
// case we ever come back here or use it for other things.
|
||||||
summary += "<td bgcolor='" + bgColor.name() + "'> </td>"; // spacing
|
summary += "<td bgcolor='" + bgColor.name() + "'> </td>"; // spacing
|
||||||
|
|
||||||
|
QStringList relevantMetricsList;
|
||||||
foreach (QString symbol, metricsList) {
|
foreach (QString symbol, metricsList) {
|
||||||
const RideMetric *m = factory.rideMetric(symbol);
|
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;
|
QString name, units;
|
||||||
if (!(m->units(context->athlete->useMetricUnits) == "seconds" || m->units(context->athlete->useMetricUnits) == tr("seconds")))
|
if (!(m->units(context->athlete->useMetricUnits) == "seconds" || m->units(context->athlete->useMetricUnits) == tr("seconds")))
|
||||||
units = m->units(context->athlete->useMetricUnits);
|
units = m->units(context->athlete->useMetricUnits);
|
||||||
@@ -2187,7 +2212,7 @@ RideSummaryWindow::htmlCompareSummary() const
|
|||||||
summary += "<td>" + dr.name + "</td>";
|
summary += "<td>" + dr.name + "</td>";
|
||||||
summary += "<td bgcolor='" + bgColor.name() +"'> </td>"; // spacing
|
summary += "<td bgcolor='" + bgColor.name() +"'> </td>"; // spacing
|
||||||
|
|
||||||
foreach (QString symbol, metricsList) {
|
foreach (QString symbol, relevantMetricsList) {
|
||||||
|
|
||||||
// the values ...
|
// the values ...
|
||||||
const RideMetric *m = factory.rideMetric(symbol);
|
const RideMetric *m = factory.rideMetric(symbol);
|
||||||
|
|||||||
@@ -902,3 +902,25 @@ RideCache::getRideTypeCounts(Specification specification, int& nActivities,
|
|||||||
else nRides++;
|
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
|
// Count of activities matching specification
|
||||||
void getRideTypeCounts(Specification specification, int& nActivities,
|
void getRideTypeCounts(Specification specification, int& nActivities,
|
||||||
int& nRides, int& nRuns, int& nSwims);
|
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 ?
|
// is running ?
|
||||||
bool isRunning() { return future.isRunning(); }
|
bool isRunning() { return future.isRunning(); }
|
||||||
|
|||||||
@@ -401,6 +401,16 @@ ComparePane::refreshTable()
|
|||||||
// get the metric name
|
// get the metric name
|
||||||
const RideMetric *m = factory.rideMetric(metric);
|
const RideMetric *m = factory.rideMetric(metric);
|
||||||
if (m) {
|
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;
|
worklist << metric;
|
||||||
QString units;
|
QString units;
|
||||||
if (!(m->units(context->athlete->useMetricUnits) == "seconds" || m->units(context->athlete->useMetricUnits) == tr("seconds")))
|
if (!(m->units(context->athlete->useMetricUnits) == "seconds" || m->units(context->athlete->useMetricUnits) == tr("seconds")))
|
||||||
|
|||||||
Reference in New Issue
Block a user