From c9cd48d5c5284dbed5e1d5d3fe07eb3ed9fc4ea1 Mon Sep 17 00:00:00 2001 From: Mark Liversedge Date: Mon, 29 Dec 2014 19:30:30 +0000 Subject: [PATCH] Interval Season Ranking .. how does this interval rank for the season it belongs to ? .. if out of season then rank for all time. --- src/RideFileCache.cpp | 28 +++++++++++++ src/RideFileCache.h | 2 + src/RideSummaryWindow.cpp | 85 ++++++++++++++++++++++++++++++++++++--- src/Season.cpp | 18 +++++++++ src/Season.h | 3 ++ 5 files changed, 131 insertions(+), 5 deletions(-) diff --git a/src/RideFileCache.cpp b/src/RideFileCache.cpp index bb7e44649..18781e726 100644 --- a/src/RideFileCache.cpp +++ b/src/RideFileCache.cpp @@ -1794,6 +1794,34 @@ void RideFileCache::doubleArrayForDistribution(QVector &into, QVector values; + + foreach(RideItem*item, context->athlete->rideCache->rides()) { + if (!spec.pass(item)) continue; + + // get the best for this one + values << RideFileCache::best(context, item->fileName, series, duration); + } + + // sort the list + qSort(values.begin(), values.end(), qGreater()); + + // get the ranking and count + of = values.count(); + + // where do we fit? + for (int i=0; iintervals().size() > 0) { + + Season rideSeason; + bool wantRank=false; + if (!ride->isRun() && ride->areDataPresent()->watts == true) { + rideSeason = context->athlete->seasons->seasonFor(ride->startTime().date()); + wantRank = true; + } bool firstRow = true; QString s; if (appsettings->contains(GC_SETTINGS_INTERVAL_METRICS)) @@ -914,6 +950,9 @@ RideSummaryWindow::htmlSummary() if (firstRow) { summary += ""; summary += ""+tr("Interval Name")+""; + if (wantRank) { + summary += "" + tr("Rank ") + rideSeason.name + ""; + } foreach (QString symbol, intervalMetrics) { RideMetricPtr m = metrics.value(symbol); if (!m) continue; @@ -936,13 +975,47 @@ RideSummaryWindow::htmlSummary() summary += ""; firstRow = false; } - if (even) - summary += ""; - else { - summary += ""; - } + + // odd even coloring + if (even) summary += "watts; + duration += f.recIntSecs(); + } + double value = duration ? (total / duration) : 0; + + Specification spec; + spec.setDateRange(DateRange(rideSeason.start, rideSeason.end)); + + rank = RideFileCache::rank(context, RideFile::watts, duration, value, spec, of); + + rankString = rankingString(rank); + + } + } + + // top 3 efforts this season get color + if (wantRank && rank <= 3) summary += " id=\"sharp\" "; + summary += ">"; summary += "" + interval.name + ""; + + if (wantRank) summary += "" + rankString + ""; + + foreach (QString symbol, intervalMetrics) { RideMetricPtr m = metrics.value(symbol); if (!m) continue; @@ -958,6 +1031,8 @@ RideSummaryWindow::htmlSummary() summary += s.arg(m->value(useMetricUnits), 0, 'f', m->precision()); } } + + summary += ""; } summary += ""; diff --git a/src/Season.cpp b/src/Season.cpp index a8fd170a2..0ffb0d96e 100644 --- a/src/Season.cpp +++ b/src/Season.cpp @@ -397,6 +397,24 @@ Seasons::writeSeasons() seasonsChanged(); // signal! } +Season +Seasons::seasonFor(QDate date) +{ + foreach(Season season, seasons) + if (date >= season.start && date <= season.end) + return season; + + // if not found just return an all dates season + Season returning; // just retun an all dates + returning.setName(tr("All Dates")); + returning.setType(Season::temporary); + returning.setStart(QDate::currentDate().addYears(-50)); + returning.setEnd(QDate::currentDate().addYears(50)); + returning.setId(QUuid("{00000000-0000-0000-0000-000000000001}")); + + return returning; +} + SeasonTreeView::SeasonTreeView(Context *context) : context(context) { setDragDropMode(QAbstractItemView::InternalMove); diff --git a/src/Season.h b/src/Season.h index 2e06da399..80ee3c0fc 100644 --- a/src/Season.h +++ b/src/Season.h @@ -146,6 +146,9 @@ class Seasons : public QObject { void writeSeasons(); QList seasons; + // get first season the date falls within + Season seasonFor(QDate); + signals: void seasonsChanged();