From e97045703a03bc8eff0e6476edbaf362cea882c3 Mon Sep 17 00:00:00 2001 From: Mark Liversedge Date: Fri, 12 Dec 2014 14:08:11 +0000 Subject: [PATCH] Add RideItem ::color, ::isRun and ::present .. as primary fields, and also load/save to cache. --- src/AllPlot.cpp | 2 +- src/Athlete.cpp | 2 ++ src/Athlete.h | 2 ++ src/PowerHist.cpp | 18 +++++++++--------- src/PowerHist.h | 4 ++-- src/RideCache.cpp | 3 +++ src/RideDB.y | 3 +++ src/RideItem.cpp | 13 ++++++++++--- src/RideItem.h | 6 ++++-- 9 files changed, 36 insertions(+), 17 deletions(-) diff --git a/src/AllPlot.cpp b/src/AllPlot.cpp index 576507eaf..addec12ff 100644 --- a/src/AllPlot.cpp +++ b/src/AllPlot.cpp @@ -5839,7 +5839,7 @@ AllPlot::pointHover(QwtPlotCurve *curve, int index) // for speed curve add pace with units according to settings // only when the activity is a run. QString paceStr; - if (curve->title() == tr("Speed") && rideItem && rideItem->isRun()) { + if (curve->title() == tr("Speed") && rideItem && rideItem->isRun) { bool metricPace = appsettings->value(this, GC_PACE, true).toBool(); QString paceunit = metricPace ? tr("min/km") : tr("min/mile"); paceStr = tr("\n%1 %2").arg(context->athlete->useMetricUnits ? kphToPace(yvalue, metricPace) : mphToPace(yvalue, metricPace)).arg(paceunit); diff --git a/src/Athlete.cpp b/src/Athlete.cpp index b01eeb7d3..b00b57fd1 100644 --- a/src/Athlete.cpp +++ b/src/Athlete.cpp @@ -126,6 +126,7 @@ Athlete::Athlete(Context *context, const QDir &homeDir) metricDB = NULL; // warn metadata we haven't got there yet ! rideMetadata_ = new RideMetadata(context,true); rideMetadata_->hide(); + colorEngine = new ColorEngine(context); // Date Ranges seasons = new Seasons(home->config()); @@ -257,6 +258,7 @@ Athlete::~Athlete() delete seasons; delete rideMetadata_; + delete colorEngine; delete zones_; delete hrzones_; } diff --git a/src/Athlete.h b/src/Athlete.h index e7e33c148..417508029 100644 --- a/src/Athlete.h +++ b/src/Athlete.h @@ -56,6 +56,7 @@ class AthleteDirectoryStructure; class RideAutoImportConfig; class RideCache; class Context; +class ColorEngine; class Athlete : public QObject { @@ -74,6 +75,7 @@ class Athlete : public QObject // metadata definitions RideMetadata *rideMetadata_; + ColorEngine *colorEngine; // zones const Zones *zones() const { return zones_; } diff --git a/src/PowerHist.cpp b/src/PowerHist.cpp index aa59fcdb4..b4fcc4236 100644 --- a/src/PowerHist.cpp +++ b/src/PowerHist.cpp @@ -349,7 +349,7 @@ PowerHist::refreshPaceZoneLabels() } pacezoneLabels.clear(); - if (!rideItem || !rideItem->isRun()) return; + if (!rideItem || !rideItem->isRun) return; if (series == RideFile::kph && context->athlete->paceZones()) { const PaceZones *zones = context->athlete->paceZones(); @@ -464,12 +464,12 @@ PowerHist::recalcCompare() } - } else if (series == RideFile::kph && !(zoned == true && (!rideItem || rideItem->isRun()))) { + } else if (series == RideFile::kph && !(zoned == true && (!rideItem || rideItem->isRun))) { array = &cid.kphArray; arrayLength = cid.kphArray.size(); - } else if (series == RideFile::kph && zoned == true && (!rideItem || rideItem->isRun())) { + } else if (series == RideFile::kph && zoned == true && (!rideItem || rideItem->isRun)) { if (cpzoned) { @@ -915,7 +915,7 @@ PowerHist::recalc(bool force) // pace scale draw int paceRange; if (series == RideFile::kph && zoned && rideItem && - rideItem->isRun() && context->athlete->paceZones() && + rideItem->isRun && context->athlete->paceZones() && (paceRange=context->athlete->paceZones()->whichRange(rideItem->dateTime.date())) != -1) { if (cpzoned) { @@ -1046,13 +1046,13 @@ PowerHist::binData(HistData &standard, QVector&x, // x-axis for data selectedArray = &standard.hrZoneSelectedArray; } - } else if (series == RideFile::kph && !(zoned == true && (!rideItem || rideItem->isRun()))) { + } else if (series == RideFile::kph && !(zoned == true && (!rideItem || rideItem->isRun))) { array = &standard.kphArray; arrayLength = standard.kphArray.size(); selectedArray = &standard.kphSelectedArray; - } else if (series == RideFile::kph && zoned == true && (!rideItem || rideItem->isRun())) { + } else if (series == RideFile::kph && zoned == true && (!rideItem || rideItem->isRun)) { if (cpzoned) { array = &standard.paceCPZoneArray; @@ -2177,7 +2177,7 @@ PowerHist::setParameterAxisTitle() break; case RideFile::kph: - if (zoned && (!rideItem || rideItem->isRun())) + if (zoned && (!rideItem || rideItem->isRun)) axislabel = tr("Pace zone"); else axislabel = QString(tr("Speed (%1)")).arg(context->athlete->useMetricUnits ? tr("kph") : tr("mph")); @@ -2278,7 +2278,7 @@ PowerHist::pointHover(QwtPlotCurve *curve, int index) // for speed series add pace with units according to settings // only when there is no ride (home) or the activity is a run. QString paceStr; - if (series == RideFile::kph && (!rideItem || rideItem->isRun())) { + if (series == RideFile::kph && (!rideItem || rideItem->isRun)) { bool metricPace = appsettings->value(this, GC_PACE, true).toBool(); QString paceunit = metricPace ? tr("min/km") : tr("min/mile"); paceStr = tr("\n%1 Pace (%2)").arg(context->athlete->useMetricUnits ? kphToPace(xvalue, metricPace) : mphToPace(xvalue, metricPace)).arg(paceunit); @@ -2331,5 +2331,5 @@ PowerHist::isZoningEnabled() return (zoned == true && (series == RideFile::watts || series == RideFile::wattsKg || series == RideFile::hr || - (series == RideFile::kph && (!rideItem || rideItem->isRun())))); + (series == RideFile::kph && (!rideItem || rideItem->isRun)))); } diff --git a/src/PowerHist.h b/src/PowerHist.h index be4b105fb..1e5fd6507 100644 --- a/src/PowerHist.h +++ b/src/PowerHist.h @@ -597,7 +597,7 @@ public: RideItem *rideItem = parent->rideItem; // only for running activities - if (! rideItem || ! rideItem->isRun()) + if (! rideItem || ! rideItem->isRun) return; const PaceZones *zones = parent->context->athlete->paceZones(); @@ -650,7 +650,7 @@ public: RideItem *rideItem = parent->rideItem; // only for running activities - if (! rideItem || ! rideItem->isRun()) + if (! rideItem || ! rideItem->isRun) return; const PaceZones *zones = parent->context->athlete->paceZones(); diff --git a/src/RideCache.cpp b/src/RideCache.cpp index d0819b884..b773a87b8 100644 --- a/src/RideCache.cpp +++ b/src/RideCache.cpp @@ -282,6 +282,9 @@ void RideCache::save() stream << "\t\t\"crc\":\"" <crc <<"\",\n"; stream << "\t\t\"timestamp\":\"" <timestamp <<"\",\n"; stream << "\t\t\"dbversion\":\"" <dbversion <<"\",\n"; + stream << "\t\t\"color\":\"" <color.name() <<"\",\n"; + stream << "\t\t\"present\":\"" <present <<"\",\n"; + stream << "\t\t\"isRun\":\"" <isRun <<"\",\n"; stream << "\t\t\"weight\":\"" <weight <<"\",\n"; // pre-computed metrics diff --git a/src/RideDB.y b/src/RideDB.y index 6bb51f52e..a4dd4f42b 100644 --- a/src/RideDB.y +++ b/src/RideDB.y @@ -126,6 +126,9 @@ ride_tuple: string ':' string { else if ($1 == "crc") jc->item.crc = $3.toULongLong(); else if ($1 == "timestamp") jc->item.timestamp = $3.toULongLong(); else if ($1 == "dbversion") jc->item.dbversion = $3.toInt(); + else if ($1 == "color") jc->item.color = QColor($3); + else if ($1 == "isRun") jc->item.isRun = $3.toInt(); + else if ($1 == "present") jc->item.present = $3; else if ($1 == "weight") jc->item.weight = $3.toDouble(); else if ($1 == "date") { QDateTime aslocal = QDateTime::fromString($3, DATETIME_FORMAT); diff --git a/src/RideItem.cpp b/src/RideItem.cpp index b94c1447e..9bf4a2d69 100644 --- a/src/RideItem.cpp +++ b/src/RideItem.cpp @@ -25,6 +25,7 @@ #include "HrZones.h" #include "PaceZones.h" #include "Settings.h" +#include "Colors.h" // for ColorEngine #include // used to create a temporary ride item that is not in the cache and just @@ -33,14 +34,14 @@ RideItem::RideItem() : ride_(NULL), context(NULL), isdirty(false), isstale(true), isedit(false), path(""), fileName(""), - fingerprint(0), crc(0), timestamp(0), dbversion(0), weight(0) { + color(QColor(1,1,1)), isRun(false), fingerprint(0), crc(0), timestamp(0), dbversion(0), weight(0) { metrics_.fill(0, RideMetricFactory::instance().metricCount()); } RideItem::RideItem(RideFile *ride, Context *context) : ride_(ride), context(context), isdirty(false), isstale(true), isedit(false), path(""), fileName(""), - fingerprint(0), crc(0), timestamp(0), dbversion(0), weight(0) + color(QColor(1,1,1)), isRun(false), fingerprint(0), crc(0), timestamp(0), dbversion(0), weight(0) { metrics_.fill(0, RideMetricFactory::instance().metricCount()); } @@ -48,7 +49,8 @@ RideItem::RideItem(RideFile *ride, Context *context) RideItem::RideItem(QString path, QString fileName, QDateTime &dateTime, Context *context) : ride_(NULL), context(context), isdirty(false), isstale(true), isedit(false), path(path), - fileName(fileName), dateTime(dateTime), fingerprint(0), crc(0), timestamp(0), dbversion(0), weight(0) + fileName(fileName), dateTime(dateTime), color(QColor(1,1,1)), isRun(false), fingerprint(0), + crc(0), timestamp(0), dbversion(0), weight(0) { metrics_.fill(0, RideMetricFactory::instance().metricCount()); } @@ -297,6 +299,11 @@ RideItem::refresh() // get weight that applies to the date getWeight(); + // first class stuff + isRun = f->isRun(); + color = context->athlete->colorEngine->colorFor(f->getTag(context->athlete->rideMetadata()->getColorField(), "")); + present = f->getTag("Data", ""); + // refresh metrics etc const RideMetricFactory &factory = RideMetricFactory::instance(); QHash computed= RideMetric::computeMetrics(context, f, context->athlete->zones(), diff --git a/src/RideItem.h b/src/RideItem.h index 180b7a2ce..ae922a167 100644 --- a/src/RideItem.h +++ b/src/RideItem.h @@ -79,10 +79,13 @@ class RideItem : public QObject // access the metric value double getForSymbol(QString name); - // get at the data + // get at the first class data QString path; QString fileName; QDateTime dateTime; + QString present; + QColor color; + bool isRun; // context the item was updated to unsigned long fingerprint; // zones @@ -114,7 +117,6 @@ class RideItem : public QObject bool isDirty() { return isdirty; } bool checkStale(); // check if we need to refresh bool isStale() { return isstale; } - bool isRun() { return ride_ ? ride_->isRun() : false; } // refresh when stale void refresh();