Train View Perspective Switch - Add Map Workout option

So workouts with GPS data but no video can use LiveMap chart,
without messing with basic slope workouts
Update default layout to include a perspective for each mode
Part of #3899
This commit is contained in:
Alejandro Martinez
2022-08-07 14:28:15 -03:00
parent f015322040
commit be797ffb31
6 changed files with 300 additions and 74 deletions

View File

@@ -1906,6 +1906,7 @@ AddPerspectiveDialog::AddPerspectiveDialog(QWidget *parent, Context *context, QS
trainSwitch->addItem(tr("Erg Workout"), Perspective::Erg);
trainSwitch->addItem(tr("Slope Workout"), Perspective::Slope);
trainSwitch->addItem(tr("Video Workout"), Perspective::Video);
trainSwitch->addItem(tr("Map Workout"), Perspective::Map);
trainSwitch->setCurrentIndex(trainswitch);
form->addRow(new QLabel(tr("Switch for")), trainSwitch);
}

View File

@@ -76,7 +76,7 @@ class Perspective : public GcWindow
void setExpression(QString);
// trainswitch
enum switchenum { None=0, Erg=1, Slope=2, Video=3 };
enum switchenum { None=0, Erg=1, Slope=2, Video=3, Map=4 };
int trainSwitch() const { return trainswitch; }
void setTrainSwitch(int x) { trainswitch = (switchenum)x; }

View File

@@ -1,5 +1,280 @@
<layouts>
<layout name="General" style="2" type="1" expression="">
<layout name="Erg Workout" style="2" type="1" expression="" trainswitch="1">
<chart id="22" name="" title="Power" >
<property name="title" type="QString" value="Power" />
<property name="subtitle" type="QString" value="" />
<property name="widthFactor" type="double" value="6.25" />
<property name="heightFactor" type="double" value="7.14286" />
<property name="style" type="int" value="32766" />
<property name="resizable" type="bool" value="1" />
<property name="showInstant" type="bool" value="1" />
<property name="avgsecs" type="int" value="1" />
<property name="avgType" type="int" value="32634" />
<property name="dataSeries" type="int" value="5" />
<property name="style" type="int" value="2" />
</chart>
<chart id="22" name="" title="Target Power" >
<property name="title" type="QString" value="Target Power" />
<property name="subtitle" type="QString" value="" />
<property name="widthFactor" type="double" value="6.25" />
<property name="heightFactor" type="double" value="7.14286" />
<property name="style" type="int" value="-1074626538" />
<property name="resizable" type="bool" value="1" />
<property name="showInstant" type="bool" value="0" />
<property name="avgsecs" type="int" value="1" />
<property name="avgType" type="int" value="0" />
<property name="dataSeries" type="int" value="9" />
<property name="style" type="int" value="2" />
</chart>
<chart id="22" name="" title="BikeStress" >
<property name="title" type="QString" value="BikeStress" />
<property name="subtitle" type="QString" value="" />
<property name="widthFactor" type="double" value="5.55556" />
<property name="heightFactor" type="double" value="7.14286" />
<property name="style" type="int" value="1074508247" />
<property name="resizable" type="bool" value="1" />
<property name="showInstant" type="bool" value="1" />
<property name="avgsecs" type="int" value="1" />
<property name="avgType" type="int" value="32695" />
<property name="dataSeries" type="int" value="12" />
<property name="style" type="int" value="2" />
</chart>
<chart id="22" name="" title="W&apos; bal" >
<property name="title" type="QString" value="W&apos; bal" />
<property name="subtitle" type="QString" value="" />
<property name="widthFactor" type="double" value="6.25" />
<property name="heightFactor" type="double" value="7.14286" />
<property name="style" type="int" value="1074404242" />
<property name="resizable" type="bool" value="1" />
<property name="showInstant" type="bool" value="1" />
<property name="avgsecs" type="int" value="1" />
<property name="avgType" type="int" value="0" />
<property name="dataSeries" type="int" value="19" />
<property name="style" type="int" value="2" />
</chart>
<chart id="22" name="" title="Speed" >
<property name="title" type="QString" value="Speed" />
<property name="subtitle" type="QString" value="" />
<property name="widthFactor" type="double" value="6.25" />
<property name="heightFactor" type="double" value="7.14286" />
<property name="style" type="int" value="1074632372" />
<property name="resizable" type="bool" value="1" />
<property name="showInstant" type="bool" value="1" />
<property name="avgsecs" type="int" value="1" />
<property name="avgType" type="int" value="507" />
<property name="dataSeries" type="int" value="6" />
<property name="style" type="int" value="2" />
</chart>
<chart id="22" name="" title="Cadence" >
<property name="title" type="QString" value="Cadence" />
<property name="subtitle" type="QString" value="" />
<property name="widthFactor" type="double" value="5.55556" />
<property name="heightFactor" type="double" value="7.14286" />
<property name="style" type="int" value="1074485171" />
<property name="resizable" type="bool" value="1" />
<property name="showInstant" type="bool" value="1" />
<property name="avgsecs" type="int" value="1" />
<property name="avgType" type="int" value="0" />
<property name="dataSeries" type="int" value="7" />
<property name="style" type="int" value="2" />
</chart>
<chart id="36" name="" title="Workout" >
<property name="title" type="QString" value="Workout" />
<property name="subtitle" type="QString" value="" />
<property name="widthFactor" type="double" value="1" />
<property name="heightFactor" type="double" value="1.38889" />
<property name="style" type="int" value="2" />
<property name="resizable" type="bool" value="1" />
</chart>
<chart id="22" name="" title="Elapsed Time" >
<property name="title" type="QString" value="Elapsed Time" />
<property name="subtitle" type="QString" value="" />
<property name="widthFactor" type="double" value="2.63158" />
<property name="heightFactor" type="double" value="7.14286" />
<property name="style" type="int" value="-1074446813" />
<property name="resizable" type="bool" value="1" />
<property name="showInstant" type="bool" value="0" />
<property name="avgsecs" type="int" value="1" />
<property name="avgType" type="int" value="0" />
<property name="dataSeries" type="int" value="1" />
<property name="style" type="int" value="2" />
</chart>
<chart id="22" name="" title="Lap" >
<property name="title" type="QString" value="Lap" />
<property name="subtitle" type="QString" value="" />
<property name="widthFactor" type="double" value="4.16667" />
<property name="heightFactor" type="double" value="7.14286" />
<property name="style" type="int" value="-1074594344" />
<property name="resizable" type="bool" value="1" />
<property name="showInstant" type="bool" value="0" />
<property name="avgsecs" type="int" value="1" />
<property name="avgType" type="int" value="32526" />
<property name="dataSeries" type="int" value="2" />
<property name="style" type="int" value="2" />
</chart>
<chart id="22" name="" title="Distance" >
<property name="title" type="QString" value="Distance" />
<property name="subtitle" type="QString" value="" />
<property name="widthFactor" type="double" value="2.63158" />
<property name="heightFactor" type="double" value="7.14286" />
<property name="style" type="int" value="-1074488568" />
<property name="resizable" type="bool" value="1" />
<property name="showInstant" type="bool" value="0" />
<property name="avgsecs" type="int" value="1" />
<property name="avgType" type="int" value="1083336304" />
<property name="dataSeries" type="int" value="4" />
<property name="style" type="int" value="2" />
</chart>
</layout>
<layout name="Slope Workout" style="2" type="1" expression="" trainswitch="2">
<chart id="22" name="" title="Power" >
<property name="title" type="QString" value="Power" />
<property name="subtitle" type="QString" value="" />
<property name="widthFactor" type="double" value="6.25" />
<property name="heightFactor" type="double" value="7.14286" />
<property name="style" type="int" value="1074521526" />
<property name="resizable" type="bool" value="1" />
<property name="showInstant" type="bool" value="1" />
<property name="avgsecs" type="int" value="1" />
<property name="avgType" type="int" value="32634" />
<property name="dataSeries" type="int" value="5" />
<property name="style" type="int" value="2" />
</chart>
<chart id="22" name="" title="Slope" >
<property name="title" type="QString" value="Slope" />
<property name="subtitle" type="QString" value="" />
<property name="widthFactor" type="double" value="6.25" />
<property name="heightFactor" type="double" value="7.14286" />
<property name="style" type="int" value="1074439118" />
<property name="resizable" type="bool" value="1" />
<property name="showInstant" type="bool" value="0" />
<property name="avgsecs" type="int" value="1" />
<property name="avgType" type="int" value="0" />
<property name="dataSeries" type="int" value="47" />
<property name="style" type="int" value="2" />
</chart>
<chart id="22" name="" title="BikeStress" >
<property name="title" type="QString" value="BikeStress" />
<property name="subtitle" type="QString" value="" />
<property name="widthFactor" type="double" value="5.55556" />
<property name="heightFactor" type="double" value="7.14286" />
<property name="style" type="int" value="-1074527812" />
<property name="resizable" type="bool" value="1" />
<property name="showInstant" type="bool" value="1" />
<property name="avgsecs" type="int" value="1" />
<property name="avgType" type="int" value="32695" />
<property name="dataSeries" type="int" value="12" />
<property name="style" type="int" value="2" />
</chart>
<chart id="22" name="" title="W&apos; bal" >
<property name="title" type="QString" value="W&apos; bal" />
<property name="subtitle" type="QString" value="" />
<property name="widthFactor" type="double" value="6.25" />
<property name="heightFactor" type="double" value="7.14286" />
<property name="style" type="int" value="1074558961" />
<property name="resizable" type="bool" value="1" />
<property name="showInstant" type="bool" value="1" />
<property name="avgsecs" type="int" value="1" />
<property name="avgType" type="int" value="0" />
<property name="dataSeries" type="int" value="19" />
<property name="style" type="int" value="2" />
</chart>
<chart id="22" name="" title="Speed" >
<property name="title" type="QString" value="Speed" />
<property name="subtitle" type="QString" value="" />
<property name="widthFactor" type="double" value="6.25" />
<property name="heightFactor" type="double" value="7.14286" />
<property name="style" type="int" value="1074426845" />
<property name="resizable" type="bool" value="1" />
<property name="showInstant" type="bool" value="1" />
<property name="avgsecs" type="int" value="1" />
<property name="avgType" type="int" value="507" />
<property name="dataSeries" type="int" value="6" />
<property name="style" type="int" value="2" />
</chart>
<chart id="22" name="" title="Cadence" >
<property name="title" type="QString" value="Cadence" />
<property name="subtitle" type="QString" value="" />
<property name="widthFactor" type="double" value="5.55556" />
<property name="heightFactor" type="double" value="7.14286" />
<property name="style" type="int" value="-1074563303" />
<property name="resizable" type="bool" value="1" />
<property name="showInstant" type="bool" value="1" />
<property name="avgsecs" type="int" value="1" />
<property name="avgType" type="int" value="0" />
<property name="dataSeries" type="int" value="7" />
<property name="style" type="int" value="2" />
</chart>
<chart id="25" name="" title="Workout" >
<property name="title" type="QString" value="Workout" />
<property name="subtitle" type="QString" value="" />
<property name="widthFactor" type="double" value="1" />
<property name="heightFactor" type="double" value="1.42857" />
<property name="style" type="int" value="2" />
<property name="resizable" type="bool" value="1" />
</chart>
<chart id="22" name="" title="Elapsed Time" >
<property name="title" type="QString" value="Elapsed Time" />
<property name="subtitle" type="QString" value="" />
<property name="widthFactor" type="double" value="2.63158" />
<property name="heightFactor" type="double" value="7.14286" />
<property name="style" type="int" value="-1074224902" />
<property name="resizable" type="bool" value="1" />
<property name="showInstant" type="bool" value="0" />
<property name="avgsecs" type="int" value="1" />
<property name="avgType" type="int" value="0" />
<property name="dataSeries" type="int" value="1" />
<property name="style" type="int" value="2" />
</chart>
<chart id="22" name="" title="Lap" >
<property name="title" type="QString" value="Lap" />
<property name="subtitle" type="QString" value="" />
<property name="widthFactor" type="double" value="4.16667" />
<property name="heightFactor" type="double" value="7.14286" />
<property name="style" type="int" value="-1074318946" />
<property name="resizable" type="bool" value="1" />
<property name="showInstant" type="bool" value="0" />
<property name="avgsecs" type="int" value="1" />
<property name="avgType" type="int" value="32526" />
<property name="dataSeries" type="int" value="2" />
<property name="style" type="int" value="2" />
</chart>
<chart id="22" name="" title="Distance" >
<property name="title" type="QString" value="Distance" />
<property name="subtitle" type="QString" value="" />
<property name="widthFactor" type="double" value="2.63158" />
<property name="heightFactor" type="double" value="7.14286" />
<property name="style" type="int" value="-1074366956" />
<property name="resizable" type="bool" value="1" />
<property name="showInstant" type="bool" value="0" />
<property name="avgsecs" type="int" value="1" />
<property name="avgType" type="int" value="1083336304" />
<property name="dataSeries" type="int" value="4" />
<property name="style" type="int" value="2" />
</chart>
</layout>
<layout name="Video Workout" style="0" type="1" expression="" trainswitch="3">
<chart id="21" name="" title="Video" >
<property name="title" type="QString" value="Video" />
<property name="subtitle" type="QString" value="" />
<property name="widthFactor" type="double" value="1" />
<property name="heightFactor" type="double" value="1" />
<property name="style" type="int" value="0" />
<property name="resizable" type="bool" value="0" />
<property name="videoLayout" type="int" value="0" />
</chart>
</layout>
<layout name="Workout Editor" style="0" type="1" expression="" trainswitch="0">
<chart id="36" name="" title="Workout Editor" >
<property name="title" type="QString" value="Workout Editor" />
<property name="subtitle" type="QString" value="" />
<property name="widthFactor" type="double" value="1" />
<property name="heightFactor" type="double" value="1" />
<property name="style" type="int" value="0" />
<property name="resizable" type="bool" value="0" />
</chart>
</layout>
<layout name="Map Workout" style="2" type="1" expression="" trainswitch="4">
<chart id="22" name="" title="Power" >
<property name="title" type="QString" value="Power" />
<property name="subtitle" type="QString" value="" />
@@ -13,17 +288,17 @@
<property name="dataSeries" type="int" value="5" />
<property name="style" type="int" value="2" />
</chart>
<chart id="22" name="" title="Target Power" >
<property name="title" type="QString" value="Target Power" />
<chart id="22" name="" title="Slope" >
<property name="title" type="QString" value="Slope" />
<property name="subtitle" type="QString" value="" />
<property name="widthFactor" type="double" value="6.25" />
<property name="heightFactor" type="double" value="7.14286" />
<property name="style" type="int" value="1192624128" />
<property name="style" type="int" value="0" />
<property name="resizable" type="bool" value="1" />
<property name="showInstant" type="bool" value="0" />
<property name="avgsecs" type="int" value="1" />
<property name="avgType" type="int" value="0" />
<property name="dataSeries" type="int" value="9" />
<property name="dataSeries" type="int" value="47" />
<property name="style" type="int" value="2" />
</chart>
<chart id="22" name="" title="BikeStress" >
@@ -78,77 +353,22 @@
<property name="dataSeries" type="int" value="7" />
<property name="style" type="int" value="2" />
</chart>
<chart id="36" name="" title="Workout" >
<chart id="25" name="" title="Workout" >
<property name="title" type="QString" value="Workout" />
<property name="subtitle" type="QString" value="" />
<property name="widthFactor" type="double" value="1" />
<property name="heightFactor" type="double" value="1.92308" />
<property name="widthFactor" type="double" value="2" />
<property name="heightFactor" type="double" value="1.42857" />
<property name="style" type="int" value="2" />
<property name="resizable" type="bool" value="1" />
</chart>
<chart id="22" name="" title="30s Power" >
<property name="title" type="QString" value="30s Power" />
<chart id="48" name="" title="Live Map" >
<property name="title" type="QString" value="Live Map" />
<property name="subtitle" type="QString" value="" />
<property name="widthFactor" type="double" value="6.25" />
<property name="heightFactor" type="double" value="5.55556" />
<property name="style" type="int" value="0" />
<property name="resizable" type="bool" value="1" />
<property name="showInstant" type="bool" value="0" />
<property name="avgsecs" type="int" value="30" />
<property name="avgType" type="int" value="1081262080" />
<property name="dataSeries" type="int" value="5" />
<property name="style" type="int" value="2" />
</chart>
<chart id="24" name="" title="Power" >
<property name="title" type="QString" value="Power" />
<property name="subtitle" type="QString" value="" />
<property name="widthFactor" type="double" value="2.94118" />
<property name="heightFactor" type="double" value="5.55556" />
<property name="widthFactor" type="double" value="2.08333" />
<property name="heightFactor" type="double" value="1.47059" />
<property name="style" type="int" value="2" />
<property name="resizable" type="bool" value="1" />
<property name="showHr" type="int" value="0" />
<property name="showSpeed" type="int" value="0" />
<property name="showCad" type="int" value="0" />
<property name="showAlt" type="int" value="0" />
<property name="showPower" type="int" value="2" />
<property name="showHHb" type="int" value="2" />
<property name="showO2Hb" type="int" value="2" />
<property name="showtHb" type="int" value="2" />
<property name="showSmO2" type="int" value="2" />
<property name="showPow30s" type="int" value="2" />
<property name="smoothing" type="int" value="1" />
</chart>
<chart id="24" name="" title="Other" >
<property name="title" type="QString" value="Other" />
<property name="subtitle" type="QString" value="" />
<property name="widthFactor" type="double" value="3.125" />
<property name="heightFactor" type="double" value="5.55556" />
<property name="style" type="int" value="2" />
<property name="resizable" type="bool" value="1" />
<property name="showHr" type="int" value="2" />
<property name="showSpeed" type="int" value="0" />
<property name="showCad" type="int" value="2" />
<property name="showAlt" type="int" value="0" />
<property name="showPower" type="int" value="0" />
<property name="showHHb" type="int" value="2" />
<property name="showO2Hb" type="int" value="2" />
<property name="showtHb" type="int" value="2" />
<property name="showSmO2" type="int" value="2" />
<property name="showPow30s" type="int" value="0" />
<property name="smoothing" type="int" value="1" />
</chart>
<chart id="22" name="" title="Heartrate" >
<property name="title" type="QString" value="Heartrate" />
<property name="subtitle" type="QString" value="" />
<property name="widthFactor" type="double" value="5.55556" />
<property name="heightFactor" type="double" value="5.55556" />
<property name="style" type="int" value="21868" />
<property name="resizable" type="bool" value="1" />
<property name="showInstant" type="bool" value="1" />
<property name="avgsecs" type="int" value="1" />
<property name="avgType" type="int" value="27263016" />
<property name="dataSeries" type="int" value="8" />
<property name="style" type="int" value="2" />
<property name="url" type="QString" value="http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" />
</chart>
<chart id="22" name="" title="Elapsed Time" >
<property name="title" type="QString" value="Elapsed Time" />

View File

@@ -57,7 +57,7 @@ bool ErgFile::isWorkout(QString name)
return false;
}
ErgFile::ErgFile(QString filename, int mode, Context *context) :
filename(filename), mode(mode), StrictGradient(true), context(context)
filename(filename), mode(mode), StrictGradient(true), fHasGPS(false), context(context)
{
if (context->athlete->zones("Bike")) {
int zonerange = context->athlete->zones("Bike")->whichRange(QDateTime::currentDateTime().date());
@@ -66,7 +66,7 @@ ErgFile::ErgFile(QString filename, int mode, Context *context) :
reload();
}
ErgFile::ErgFile(Context *context) : mode(0), StrictGradient(true), context(context)
ErgFile::ErgFile(Context *context) : mode(0), StrictGradient(true), fHasGPS(false), context(context)
{
if (context->athlete->zones("Bike")) {
int zonerange = context->athlete->zones("Bike")->whichRange(QDateTime::currentDateTime().date());
@@ -757,9 +757,9 @@ void ErgFile::parseFromRideFileFactory()
bool fHasKm = ride->areDataPresent()->km;
bool fHasLat = ride->areDataPresent()->lat;
bool fHasLon = ride->areDataPresent()->lon;
bool fHasGPS = fHasLat && fHasLon;
bool fHasAlt = ride->areDataPresent()->alt;
bool fHasSlope = ride->areDataPresent()->slope;
fHasGPS = fHasLat && fHasLon;
if (fHasKm && fHasSlope) {} // same as crs file
else if (fHasKm && fHasAlt) {} // derive slope from distance and alt
@@ -900,9 +900,9 @@ void ErgFile::parseTTS()
// Enumerate the data types that are available.
bool fHasKm = ttsReader.hasKm();
bool fHasGPS = ttsReader.hasGPS();
bool fHasAlt = ttsReader.hasElevation();
bool fHasSlope = ttsReader.hasGradient();
fHasGPS = ttsReader.hasGPS();
if (fHasKm && fHasSlope) {} // same as crs file
else if (fHasKm && fHasAlt) {} // derive slope from distance and alt

View File

@@ -132,6 +132,7 @@ class ErgFile
bool hasGradient() const { return CRS == format; } // Has Gradient and Altitude
bool hasWatts() const { return ERG == format || MRC == format; }
bool hasGPS() const { return fHasGPS; } // Has Lat/Lon
private:
void sortLaps() const;
@@ -166,6 +167,7 @@ public:
bool valid; // did it parse ok?
int mode;
bool StrictGradient; // should gradient be strict or smoothed?
bool fHasGPS; // has Lat/Lon?
QList<ErgFilePoint> Points; // points in workout
mutable QList<ErgFileLap> Laps; // interval markers in the file
@@ -231,6 +233,7 @@ public:
// Const getters
bool hasGradient() const { return ergFile && ergFile->hasGradient(); }
bool hasWatts() const { return ergFile && ergFile->hasWatts(); }
bool hasGPS() const { return ergFile && ergFile->hasGPS(); }
double nextLap (double x) const { return !ergFile ? -1 : ergFile->nextLap(x); }
double prevLap (double x) const { return !ergFile ? -1 : ergFile->prevLap(x); }

View File

@@ -1600,12 +1600,14 @@ void TrainSidebar::Connect()
// if everything has been initialised properly (aka lazy load)
// given the connect widget is on the train view it is unlikely
// below will ever be false, but no harm in checking
qDebug() << (trainView!=NULL) << (trainView->page()!=NULL);
if (trainView && trainView->page()) {
Perspective::switchenum want=Perspective::None;
if (mediafile != "") want=Perspective::Video; // if media file selected
else want = (mode == ERG || mode == MRC) ? Perspective::Erg : Perspective::Slope; // mode always known
if (want == Perspective::Slope && ergFileQueryAdapter.hasGPS()) want=Perspective::Map; // Map without Video
qDebug()<<want<<trainView->page()->trainSwitch();
// so we want a view type and the current page isn't what
// we want then lets go find one to switch to and switch
// to the first one that matches