diff --git a/src/AllPlot.cpp b/src/AllPlot.cpp index 2ec9247a6..8433a267b 100644 --- a/src/AllPlot.cpp +++ b/src/AllPlot.cpp @@ -2366,7 +2366,7 @@ AllPlot::refreshCalibrationMarkers() color.setAlpha(15); // almost invisible ! if (rideItem && rideItem->ride()) { - foreach(const RideFileCalibration &calibration, rideItem->ride()->calibrations()) { + foreach(const RideFileCalibration *calibration, rideItem->ride()->calibrations()) { QwtPlotMarker *mrk = new QwtPlotMarker; standard->cal_mrk.append(mrk); mrk->attach(this); @@ -2374,10 +2374,10 @@ AllPlot::refreshCalibrationMarkers() mrk->setLabelAlignment(Qt::AlignRight | Qt::AlignTop); mrk->setLinePen(QPen(color, 0, Qt::SolidLine)); if (!bydist) - mrk->setValue(calibration.start / 60.0, 0.0); + mrk->setValue(calibration->start / 60.0, 0.0); else mrk->setValue((context->athlete->useMetricUnits ? 1 : MILES_PER_KM) * - rideItem->ride()->timeToDistance(calibration.start), 0.0); + rideItem->ride()->timeToDistance(calibration->start), 0.0); //Lots of markers can clutter things, so avoid texts for now //QwtText text(false ? ("\n\n"+calibration.name) : ""); diff --git a/src/FitlogRideFile.cpp b/src/FitlogRideFile.cpp index 440f56b55..255c4a31f 100644 --- a/src/FitlogRideFile.cpp +++ b/src/FitlogRideFile.cpp @@ -142,11 +142,11 @@ FitlogFileReader::writeRideFile(Context *context, const RideFile *ride, QFile &f QDomElement laps = doc.createElement("Laps"); activity.appendChild(laps); - foreach (RideFileInterval interval, ride->intervals()) { + foreach (RideFileInterval *interval, ride->intervals()) { RideFile f(ride->startTime(), ride->recIntSecs()); - for (int i = ride->intervalBegin(interval); i < ride->dataPoints().size(); ++i) { + for (int i = ride->intervalBegin(*interval); i < ride->dataPoints().size(); ++i) { const RideFilePoint *p = ride->dataPoints()[i]; - if (p->secs >= interval.stop) + if (p->secs >= interval->stop) break; f.appendPoint(p->secs, p->cad, p->hr, p->km, p->kph, p->nm, p->watts, p->alt, p->lon, p->lat, p->headwind, @@ -167,8 +167,8 @@ FitlogFileReader::writeRideFile(Context *context, const RideFile *ride, QFile &f RideMetric::computeMetrics(context, &f, context->athlete->zones(), context->athlete->hrZones(), worklist); QDomElement lap = doc.createElement("Lap"); - lap.setAttribute("StartTime", ride->startTime().addSecs(interval.start).toString(Qt::ISODate)+"Z"); - lap.setAttribute("DurationSeconds", interval.stop-interval.start); + lap.setAttribute("StartTime", ride->startTime().addSecs(interval->start).toString(Qt::ISODate)+"Z"); + lap.setAttribute("DurationSeconds", interval->stop-interval->start); laps.appendChild(lap); QDomElement lap_distance = doc.createElement("Distance"); diff --git a/src/GcRideFile.cpp b/src/GcRideFile.cpp index bbd4af51b..415400f77 100644 --- a/src/GcRideFile.cpp +++ b/src/GcRideFile.cpp @@ -237,12 +237,12 @@ GcFileReader::writeRideFile(Context *,const RideFile *ride, QFile &file) const if (!ride->intervals().empty()) { QDomElement intervals = doc.createElement("intervals"); root.appendChild(intervals); - foreach (RideFileInterval i, ride->intervals()) { + foreach (RideFileInterval *i, ride->intervals()) { QDomElement interval = doc.createElement("interval"); intervals.appendChild(interval); - interval.setAttribute("name", i.name); - interval.setAttribute("start", QString("%1").arg(i.start)); - interval.setAttribute("stop", QString("%1").arg(i.stop)); + interval.setAttribute("name", i->name); + interval.setAttribute("start", QString("%1").arg(i->start)); + interval.setAttribute("stop", QString("%1").arg(i->stop)); } } diff --git a/src/MergeActivityWizard.cpp b/src/MergeActivityWizard.cpp index 22a69bc29..5586ab8ac 100644 --- a/src/MergeActivityWizard.cpp +++ b/src/MergeActivityWizard.cpp @@ -307,24 +307,24 @@ MergeActivityWizard::combine() // any intervals with a number name? find the last int intervalN=0; - foreach(RideFileInterval interval, ride1->intervals()) { - int x = interval.name.toInt(); - if (interval.name == QString("%1").arg(x)) { + foreach(RideFileInterval *interval, ride1->intervals()) { + int x = interval->name.toInt(); + if (interval->name == QString("%1").arg(x)) { if (x > intervalN) intervalN = x; } } // now run through the intervals for the second ride // and add them but renumber any intervals that are just numbers - foreach(RideFileInterval interval, ride2->intervals()) { - int x = interval.name.toInt(); - if (interval.name == QString("%1").arg(x)) { - interval.name = QString("%1").arg(x+intervalN); + foreach(RideFileInterval *interval, ride2->intervals()) { + int x = interval->name.toInt(); + if (interval->name == QString("%1").arg(x)) { + interval->name = QString("%1").arg(x+intervalN); } - combined->addInterval(interval.type, - interval.start + timeOffset, - interval.stop + timeOffset, - interval.name); + combined->addInterval(interval->type, + interval->start + timeOffset, + interval->stop + timeOffset, + interval->name); } } else { // MERGE @@ -380,18 +380,18 @@ MergeActivityWizard::combine() combined->clearIntervals(); // run through what we got then - foreach(RideFileInterval interval, ride1->intervals()) { - combined->addInterval(interval.type, - interval.start + offset1, - interval.stop + offset1, - interval.name); + foreach(RideFileInterval *interval, ride1->intervals()) { + combined->addInterval(interval->type, + interval->start + offset1, + interval->stop + offset1, + interval->name); } // run through what we got then - foreach(RideFileInterval interval, ride2->intervals()) { - combined->addInterval(interval.type, - interval.start + offset2, - interval.stop + offset2, - interval.name); + foreach(RideFileInterval *interval, ride2->intervals()) { + combined->addInterval(interval->type, + interval->start + offset2, + interval->stop + offset2, + interval->name); } } } diff --git a/src/PwxRideFile.cpp b/src/PwxRideFile.cpp index fafc8cdac..aacc471bb 100644 --- a/src/PwxRideFile.cpp +++ b/src/PwxRideFile.cpp @@ -749,13 +749,13 @@ PwxFileReader::writeRideFile(Context *context, const RideFile *ride, QFile &file } // interval "segments" - foreach (RideFileInterval i, ride->intervals()) { + foreach (RideFileInterval *i, ride->intervals()) { QDomElement segment = doc.createElement("segment"); root.appendChild(segment); // name QDomElement name = doc.createElement("name"); - text = doc.createTextNode(i.name); name.appendChild(text); + text = doc.createTextNode(i->name); name.appendChild(text); segment.appendChild(name); // summarydata @@ -764,13 +764,13 @@ PwxFileReader::writeRideFile(Context *context, const RideFile *ride, QFile &file // beginning QDomElement beginning = doc.createElement("beginning"); - text = doc.createTextNode(QString("%1").arg(i.start)); + text = doc.createTextNode(QString("%1").arg(i->start)); beginning.appendChild(text); summarydata.appendChild(beginning); // duration QDomElement duration = doc.createElement("duration"); - text = doc.createTextNode(QString("%1").arg(i.stop - i.start)); + text = doc.createTextNode(QString("%1").arg(i->stop - i->start)); duration.appendChild(text); summarydata.appendChild(duration); } diff --git a/src/RideFile.cpp b/src/RideFile.cpp index b6b118627..8846f5706 100644 --- a/src/RideFile.cpp +++ b/src/RideFile.cpp @@ -103,6 +103,10 @@ RideFile::~RideFile() emit deleted(); foreach(RideFilePoint *point, dataPoints_) delete point; + foreach(RideFileCalibration *calibration, calibrations_) + delete calibration; + foreach(RideFileInterval *interval, intervals_) + delete interval; delete command; if (wprime_) delete wprime_; //!!! if (data) delete data; // need a mechanism to notify the editor @@ -370,6 +374,7 @@ struct ComparePointSecs { QString RideFileInterval::typeDescription(intervaltype x) { switch (x) { + default: case ALL : return tr("ALL"); break; case DEVICE : return tr("DEVICE"); break; case USER : return tr("USER"); break; diff --git a/src/RideFile.h b/src/RideFile.h index a27993496..6836b078c 100644 --- a/src/RideFile.h +++ b/src/RideFile.h @@ -262,27 +262,15 @@ class RideFile : public QObject // QObject to emit signals // Working with INTERVALS void addInterval(RideFileInterval::IntervalType type, double start, double stop, const QString &name) { - intervals_.append(RideFileInterval(type, start, stop, name)); - } - void addInterval(double start, double stop, const QString &name) { - intervals_.append(RideFileInterval(RideFileInterval::DEVICE, start, stop, name)); - } - void addInterval(QString typeString, double start, double stop, const QString &name) { - RideFileInterval::IntervalType type = RideFileInterval::DEVICE; - if (typeString == "ROUTE") { - type = RideFileInterval::ROUTE; - } else if (typeString == "USER") { - type = RideFileInterval::USER; - } - intervals_.append(RideFileInterval(type, start, stop, name)); + intervals_.append(new RideFileInterval(type, start, stop, name)); } int intervalBegin(const RideFileInterval &interval) const; int intervalBeginSecs(const double secs) const; // Working with CAIBRATIONS - const QList &calibrations() const { return calibrations_; } + const QList &calibrations() const { return calibrations_; } void addCalibration(double start, int value, const QString &name) { - calibrations_.append(RideFileCalibration(start, value, name)); + calibrations_.append(new RideFileCalibration(start, value, name)); } // Working with REFERENCES @@ -339,7 +327,7 @@ class RideFile : public QObject // QObject to emit signals protected: // should access via IntervalItem - const QList &intervals() const { return intervals_; } + const QList &intervals() const { return intervals_; } void clearIntervals(); void fillInIntervals(); @@ -363,8 +351,8 @@ class RideFile : public QObject // QObject to emit signals RideFileDataPresent dataPresent; QString deviceType_; QString fileFormat_; - QList intervals_; - QList calibrations_; + QList intervals_; + QList calibrations_; QMap tags_; EditorData *data; WPrime *wprime_; diff --git a/src/RideItem.cpp b/src/RideItem.cpp index 19437f883..244edb17a 100644 --- a/src/RideItem.cpp +++ b/src/RideItem.cpp @@ -601,30 +601,30 @@ RideItem::updateIntervals() intervals_ << entire; int count = 1; - foreach(RideFileInterval interval, f->intervals()) { + foreach(RideFileInterval *interval, f->intervals()) { // skip peaks, they're autodiscovered now - if (interval.isPeak()) continue; + if (interval->isPeak()) continue; // skip climbs, they're autodiscovered now - if (interval.isClimb()) continue; + if (interval->isClimb()) continue; // skip entire ride, they're autodiscovered too - if (interval.start <= begin->secs && interval.stop >= end->secs) continue; + if (interval->start <= begin->secs && interval->stop >= end->secs) continue; // same as ride but offset by recintsecs - if (((interval.start - f->recIntSecs()) <= begin->secs && (interval.stop-f->recIntSecs()) >= end->secs) || - (interval.start <= begin->secs && (interval.stop+f->recIntSecs()) >= end->secs)) + if (((interval->start - f->recIntSecs()) <= begin->secs && (interval->stop-f->recIntSecs()) >= end->secs) || + (interval->start <= begin->secs && (interval->stop+f->recIntSecs()) >= end->secs)) continue; // skip empty backward intervals - if (interval.start >= interval.stop) continue; + if (interval->start >= interval->stop) continue; // create a new interval item - IntervalItem *intervalItem = new IntervalItem(f, interval.name, - interval.start, interval.stop, - f->timeToDistance(interval.start), - f->timeToDistance(interval.stop), + IntervalItem *intervalItem = new IntervalItem(f, interval->name, + interval->start, interval->stop, + f->timeToDistance(interval->start), + f->timeToDistance(interval->stop), count, standardColor(count++), RideFileInterval::USER); diff --git a/src/SplitActivityWizard.cpp b/src/SplitActivityWizard.cpp index 2319e28d0..ba2dc8a77 100644 --- a/src/SplitActivityWizard.cpp +++ b/src/SplitActivityWizard.cpp @@ -136,7 +136,7 @@ SplitActivityWizard::setIntervalsList(SplitSelect *selector) // find segments where gap is greater than minimumGap // and segment size is > minimumSize. If a segment is shorter // than minimumSize then ignore it (i.e. treat is as part of the gap) - QList segments; + QList segments; double segmentStart = 0; double segmentEnd = 0; @@ -158,7 +158,7 @@ SplitActivityWizard::setIntervalsList(SplitSelect *selector) if ((segmentEnd-segmentStart) >= minimumSegmentSize) { // we have a candidate - segments.append(RideFileInterval(RideFileInterval::USER, segmentStart, segmentEnd, + segments.append(new RideFileInterval(RideFileInterval::USER, segmentStart, segmentEnd, QString(tr("Activity Segment #%1")).arg(++counter))); } @@ -177,7 +177,7 @@ SplitActivityWizard::setIntervalsList(SplitSelect *selector) if ((segmentEnd-segmentStart) >= minimumSegmentSize) { // we have a candidate - segments.append(RideFileInterval(RideFileInterval::USER, segmentStart, segmentEnd, + segments.append(new RideFileInterval(RideFileInterval::USER, segmentStart, segmentEnd, QString(tr("Activity Segment #%1")).arg(++counter))); } @@ -191,22 +191,22 @@ SplitActivityWizard::setIntervalsList(SplitSelect *selector) double lastsecs = rideItem->ride()->dataPoints().first()->secs; int gapnum = 0; - foreach(RideFileInterval ride, segments) { - if (ride.start > lastsecs) { + foreach(RideFileInterval *ride, segments) { + if (ride->start > lastsecs) { // we have a gap gapnum++; // add to gap list RideFileInterval *gap = new RideFileInterval(RideFileInterval::USER, lastsecs, - ride.start, + ride->start, QString(tr("Gap in recording #%1")).arg(gapnum)); gaps.append(gap); // add to interval list - segments.append(RideFileInterval(*gap)); + segments.append(new RideFileInterval(*gap)); } - lastsecs = ride.stop; + lastsecs = ride->stop; } if (lastsecs < rideItem->ride()->dataPoints().last()->secs) { // gap at the end @@ -220,12 +220,12 @@ SplitActivityWizard::setIntervalsList(SplitSelect *selector) gaps.append(gap); // add to interval list - segments.append(RideFileInterval(*gap)); + segments.append(new RideFileInterval(*gap)); } // first entry in list should always be entire file // so we can mark the start and stop for splitting - segments.insert(0, RideFileInterval(RideFileInterval::USER, rideItem->ride()->dataPoints().first()->secs, + segments.insert(0, new RideFileInterval(RideFileInterval::USER, rideItem->ride()->dataPoints().first()->secs, rideItem->ride()->dataPoints().last()->secs, tr("Entire Activity"))); @@ -238,7 +238,7 @@ SplitActivityWizard::setIntervalsList(SplitSelect *selector) // first just add all the current ride intervals counter = 0; QChar zero = QLatin1Char('0'); - foreach (RideFileInterval interval, segments) { + foreach (RideFileInterval *interval, segments) { // DO NOT skip intervals that are too short //if (interval.stop - interval.start < minimumSegmentSize) continue; @@ -247,8 +247,8 @@ SplitActivityWizard::setIntervalsList(SplitSelect *selector) add->setFlags(add->flags() | Qt::ItemIsEditable); // we set these intervals as checked by default - bool checkit = (interval.name.startsWith(tr("Gap in recording")) || - interval.name == tr("Entire Activity")); + bool checkit = (interval->name.startsWith(tr("Gap in recording")) || + interval->name == tr("Entire Activity")); // disable checkbox editing (i.e. mandatory split) at gaps in recording // we have turned this off from user requests, may reinstate or choose @@ -264,7 +264,7 @@ SplitActivityWizard::setIntervalsList(SplitSelect *selector) connect(checkBox, SIGNAL(stateChanged(int)), selector, SLOT(refreshMarkers())); // interval start - int secs = interval.start; + int secs = interval->start; add->setText(1, QString("%1:%2:%3") .arg(secs/3600,2,10,zero) .arg(secs%3600/60,2,10,zero) @@ -279,32 +279,32 @@ SplitActivityWizard::setIntervalsList(SplitSelect *selector) connect(checkBox, SIGNAL(stateChanged(int)), selector, SLOT(refreshMarkers())); // interval start - secs = interval.stop; + secs = interval->stop; add->setText(3, QString("%1:%2:%3") .arg(secs/3600,2,10,zero) .arg(secs%3600/60,2,10,zero) .arg(secs%60,2,10,zero)); // interval duration - secs = interval.stop - interval.start; + secs = interval->stop - interval->start; add->setText(4, QString("%1:%2:%3") .arg(secs/3600,2,10,zero) .arg(secs%3600/60,2,10,zero) .arg(secs%60,2,10,zero)); // interval distance - double distance = rideItem->ride()->timeToDistance(interval.stop) - - rideItem->ride()->timeToDistance(interval.start); + double distance = rideItem->ride()->timeToDistance(interval->stop) - + rideItem->ride()->timeToDistance(interval->start); add->setText(5, QString("%1 %2") .arg(distance * (context->athlete->useMetricUnits ? 1 : MILES_PER_KM), 0, 'f', 2) .arg(context->athlete->useMetricUnits ? "km" : "mi")); // interval name - add->setText(6, interval.name); + add->setText(6, interval->name); // hiddden columns with dataPoint from/to - add->setText(7, QString("%1").arg(rideItem->ride()->timeIndex(interval.start))); - add->setText(8, QString("%1").arg(rideItem->ride()->timeIndex(interval.stop))); + add->setText(7, QString("%1").arg(rideItem->ride()->timeIndex(interval->start))); + add->setText(8, QString("%1").arg(rideItem->ride()->timeIndex(interval->stop))); counter++; } @@ -795,13 +795,13 @@ SplitConfirm::createRideFile(long start, long stop) // if neccessary (some folks want to keep lap markers) double startTime = wizard->rideItem->ride()->dataPoints().at(start)->secs; double stopTime = wizard->rideItem->ride()->dataPoints().at(stop)->secs; - foreach (RideFileInterval interval, wizard->rideItem->ride()->intervals()) { + foreach (RideFileInterval *interval, wizard->rideItem->ride()->intervals()) { - if (interval.start >= startTime && interval.start <= stopTime) { - if (interval.stop > stopTime) - returning->addInterval(RideFileInterval::USER, interval.start - offset, stopTime, interval.name); + if (interval->start >= startTime && interval->start <= stopTime) { + if (interval->stop > stopTime) + returning->addInterval(RideFileInterval::USER, interval->start - offset, stopTime, interval->name); else - returning->addInterval(RideFileInterval::USER, interval.start - offset, interval.stop - offset, interval.name); + returning->addInterval(RideFileInterval::USER, interval->start - offset, interval->stop - offset, interval->name); } } return returning;