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