mirror of
https://github.com/GoldenCheetah/GoldenCheetah.git
synced 2026-02-13 16:18:42 +00:00
Move LTM Preset charts to Athlete class
.. lots of work to do to clean this up, especially keeping the presets updated when renaming is done. .. also need to save away after changes. .. also need to create a much better default set of presets taking into account the more recent additions such as Estimates amd Bests and new metrics
This commit is contained in:
@@ -42,6 +42,7 @@
|
||||
#endif
|
||||
#include "IntervalItem.h"
|
||||
#include "IntervalTreeView.h"
|
||||
#include "LTMSettings.h"
|
||||
|
||||
#include "GcUpgrade.h" // upgrade wizard
|
||||
#include "GcCrashDialog.h" // recovering from a crash?
|
||||
@@ -98,6 +99,11 @@ Athlete::Athlete(Context *context, const QDir &home)
|
||||
QMessageBox::warning(context->mainWindow, tr("Reading HR Zones File"), hrzones_->warningString());
|
||||
}
|
||||
|
||||
// read athlete's charts.xml and translate etc
|
||||
LTMSettings reader;
|
||||
reader.readChartXML(context->athlete->home, presets);
|
||||
translateDefaultCharts(presets);
|
||||
|
||||
// Metadata
|
||||
rideMetadata_ = new RideMetadata(context,true);
|
||||
rideMetadata_->hide();
|
||||
@@ -399,3 +405,44 @@ Athlete::checkCPX(RideItem*ride)
|
||||
}
|
||||
cpxCache = newList;
|
||||
}
|
||||
|
||||
void
|
||||
Athlete::translateDefaultCharts(QList<LTMSettings>&charts)
|
||||
{
|
||||
// Map default (english) chart name to external (Localized) name
|
||||
// New default charts need to be added to this list to be translated
|
||||
QMap<QString, QString> chartNameMap;
|
||||
chartNameMap.insert("PMC", tr("PMC"));
|
||||
chartNameMap.insert("Track Weight", tr("Track Weight"));
|
||||
chartNameMap.insert("Time In Power Zone (Stacked)", tr("Time In Power Zone (Stacked)"));
|
||||
chartNameMap.insert("Time In Power Zone (Bar)", tr("Time In Power Zone (Bar)"));
|
||||
chartNameMap.insert("Time In HR Zone", tr("Time In HR Zone"));
|
||||
chartNameMap.insert("Power Distribution", tr("Power Distribution"));
|
||||
chartNameMap.insert("KPI Tracker", tr("KPI Tracker"));
|
||||
chartNameMap.insert("Critical Power Trend", tr("Critical Power Trend"));
|
||||
chartNameMap.insert("Aerobic Power", tr("Aerobic Power"));
|
||||
chartNameMap.insert("Aerobic WPK", tr("Aerobic WPK"));
|
||||
chartNameMap.insert("Power Variance", tr("Power Variance"));
|
||||
chartNameMap.insert("Power Profile", tr("Power Profile"));
|
||||
chartNameMap.insert("Anaerobic Power", tr("Anaerobic Power"));
|
||||
chartNameMap.insert("Anaerobic WPK", tr("Anaerobic WPK"));
|
||||
chartNameMap.insert("Power & Speed Trend", tr("Power & Speed Trend"));
|
||||
chartNameMap.insert("Cardiovascular Response", tr("Cardiovascular Response"));
|
||||
chartNameMap.insert("Tempo & Threshold Time", tr("Tempo & Threshold Time"));
|
||||
chartNameMap.insert("Training Mix", tr("Training Mix"));
|
||||
chartNameMap.insert("Time & Distance", tr("Time & Distance"));
|
||||
chartNameMap.insert("Skiba Power", tr("Skiba Power"));
|
||||
chartNameMap.insert("Daniels Power", tr("Daniels Power"));
|
||||
chartNameMap.insert("PM Ramp & Peak", tr("PM Ramp & Peak"));
|
||||
chartNameMap.insert("Skiba PM", tr("Skiba PM"));
|
||||
chartNameMap.insert("Daniels PM", tr("Daniels PM"));
|
||||
chartNameMap.insert("Device Reliability", tr("Device Reliability"));
|
||||
chartNameMap.insert("Withings Weight", tr("Withings Weight"));
|
||||
chartNameMap.insert("Stress and Distance", tr("Stress and Distance"));
|
||||
chartNameMap.insert("Calories vs Duration", tr("Calories vs Duration"));
|
||||
|
||||
for(int i=0; i<charts.count(); i++) {
|
||||
// Replace chart name for localized version, default to english name
|
||||
charts[i].name = chartNameMap.value(charts[i].name, charts[i].name);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,6 +47,7 @@ class IntervalItem;
|
||||
class IntervalTreeView;
|
||||
class QSqlTableModel;
|
||||
class PDEstimate;
|
||||
class LTMSettings;
|
||||
|
||||
class Context;
|
||||
|
||||
@@ -88,6 +89,10 @@ class Athlete : public QObject
|
||||
// ride metadata definitions
|
||||
RideMetadata *rideMetadata() { return rideMetadata_; }
|
||||
|
||||
// preset charts
|
||||
QList<LTMSettings> presets;
|
||||
void translateDefaultCharts(QList<LTMSettings>&charts);
|
||||
|
||||
// indexes / filters
|
||||
#ifdef GC_HAVE_LUCENE
|
||||
Lucene *lucene;
|
||||
|
||||
@@ -85,6 +85,9 @@ class Context : public QObject
|
||||
// when config has changed - and to get a
|
||||
// signal emitted to notify its children
|
||||
|
||||
// preset charts
|
||||
void notifyPresetsChanged() { emit presetsChanged(); }
|
||||
|
||||
// filters
|
||||
void setHomeFilter(QStringList&f) { homeFilters=f; ishomefiltered=true; emit homeFilterChanged(); }
|
||||
void clearHomeFilter() { homeFilters.clear(); ishomefiltered=false; emit homeFilterChanged(); }
|
||||
@@ -132,6 +135,7 @@ class Context : public QObject
|
||||
void homeFilterChanged();
|
||||
|
||||
void configChanged();
|
||||
void presetsChanged();
|
||||
|
||||
void rideSelected(RideItem*);
|
||||
void rideAdded(RideItem *);
|
||||
|
||||
@@ -94,6 +94,7 @@ EditChartDialog::cancelClicked()
|
||||
void
|
||||
LTMSettings::writeChartXML(QDir home, QList<LTMSettings> charts)
|
||||
{
|
||||
qDebug()<<"write chart.xml !";
|
||||
LTMChartParser::serialize(QString(home.path() + "/charts.xml"), charts);
|
||||
}
|
||||
|
||||
|
||||
120
src/LTMTool.cpp
120
src/LTMTool.cpp
@@ -66,11 +66,6 @@ LTMTool::LTMTool(Context *context, LTMSettings *settings) : QWidget(context->mai
|
||||
basicsettingsLayout->addRow(new QLabel(tr(""))); // spacing
|
||||
#endif
|
||||
|
||||
// read charts.xml and translate etc
|
||||
LTMSettings reader;
|
||||
reader.readChartXML(context->athlete->home, presets);
|
||||
translateDefaultCharts(presets);
|
||||
|
||||
// Basic Controls
|
||||
QWidget *basic = new QWidget(this);
|
||||
basic->setContentsMargins(0,0,0,0);
|
||||
@@ -157,13 +152,6 @@ LTMTool::LTMTool(Context *context, LTMSettings *settings) : QWidget(context->mai
|
||||
charts->setEditTriggers(QAbstractItemView::SelectedClicked); // allow edit
|
||||
charts->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
|
||||
charts->setIndentation(0);
|
||||
foreach(LTMSettings chart, presets) {
|
||||
QTreeWidgetItem *add;
|
||||
add = new QTreeWidgetItem(charts->invisibleRootItem());
|
||||
add->setFlags(add->flags() | Qt::ItemIsEditable);
|
||||
add->setText(0, chart.name);
|
||||
}
|
||||
charts->setCurrentItem(charts->invisibleRootItem()->child(0));
|
||||
|
||||
applyButton = new QPushButton(tr("Apply")); // connected in LTMWindow.cpp
|
||||
QHBoxLayout *buttons = new QHBoxLayout;
|
||||
@@ -1085,6 +1073,26 @@ LTMTool::LTMTool(Context *context, LTMSettings *settings) : QWidget(context->mai
|
||||
connect(dateSetting, SIGNAL(useStandardRange()), this, SIGNAL(useStandardRange()));
|
||||
connect(dateSetting, SIGNAL(useCustomRange(DateRange)), this, SIGNAL(useCustomRange(DateRange)));
|
||||
connect(dateSetting, SIGNAL(useThruToday()), this, SIGNAL(useThruToday()));
|
||||
|
||||
// watch for changes to the preset charts
|
||||
connect(context, SIGNAL(presetsChanged()), this, SLOT(presetsChanged()));
|
||||
|
||||
// but setup for the first time
|
||||
presetsChanged();
|
||||
}
|
||||
|
||||
void
|
||||
LTMTool::presetsChanged()
|
||||
{
|
||||
// rebuild the preset chart list as the presets have changed
|
||||
charts->clear();
|
||||
foreach(LTMSettings chart, context->athlete->presets) {
|
||||
QTreeWidgetItem *add;
|
||||
add = new QTreeWidgetItem(charts->invisibleRootItem());
|
||||
add->setFlags(add->flags() | Qt::ItemIsEditable);
|
||||
add->setText(0, chart.name);
|
||||
}
|
||||
charts->setCurrentItem(charts->invisibleRootItem()->child(0));
|
||||
}
|
||||
|
||||
void
|
||||
@@ -1221,10 +1229,10 @@ void
|
||||
LTMTool::addCurrent()
|
||||
{
|
||||
// give the chart a name
|
||||
if (settings->name == "") settings->name = QString("Chart %1").arg(presets.count()+1);
|
||||
if (settings->name == "") settings->name = QString("Chart %1").arg(context->athlete->presets.count()+1);
|
||||
|
||||
// add the current chart to the presets with a name using the chart title
|
||||
presets.append(*settings);
|
||||
context->athlete->presets.append(*settings);
|
||||
|
||||
// add to the list
|
||||
QTreeWidgetItem *add;
|
||||
@@ -1232,7 +1240,7 @@ LTMTool::addCurrent()
|
||||
add->setFlags(add->flags() | Qt::ItemIsEditable);
|
||||
add->setText(0, settings->name);
|
||||
|
||||
// save charts.xml
|
||||
context->notifyPresetsChanged();
|
||||
}
|
||||
|
||||
// set the estimateSelection based upon what is available
|
||||
@@ -1920,46 +1928,6 @@ LTMTool::setFilter(QStringList files)
|
||||
emit filterChanged();
|
||||
}
|
||||
|
||||
void
|
||||
LTMTool::translateDefaultCharts(QList<LTMSettings>&charts)
|
||||
{
|
||||
// Map default (english) chart name to external (Localized) name
|
||||
// New default charts need to be added to this list to be translated
|
||||
QMap<QString, QString> chartNameMap;
|
||||
chartNameMap.insert("PMC", tr("PMC"));
|
||||
chartNameMap.insert("Track Weight", tr("Track Weight"));
|
||||
chartNameMap.insert("Time In Power Zone (Stacked)", tr("Time In Power Zone (Stacked)"));
|
||||
chartNameMap.insert("Time In Power Zone (Bar)", tr("Time In Power Zone (Bar)"));
|
||||
chartNameMap.insert("Time In HR Zone", tr("Time In HR Zone"));
|
||||
chartNameMap.insert("Power Distribution", tr("Power Distribution"));
|
||||
chartNameMap.insert("KPI Tracker", tr("KPI Tracker"));
|
||||
chartNameMap.insert("Critical Power Trend", tr("Critical Power Trend"));
|
||||
chartNameMap.insert("Aerobic Power", tr("Aerobic Power"));
|
||||
chartNameMap.insert("Aerobic WPK", tr("Aerobic WPK"));
|
||||
chartNameMap.insert("Power Variance", tr("Power Variance"));
|
||||
chartNameMap.insert("Power Profile", tr("Power Profile"));
|
||||
chartNameMap.insert("Anaerobic Power", tr("Anaerobic Power"));
|
||||
chartNameMap.insert("Anaerobic WPK", tr("Anaerobic WPK"));
|
||||
chartNameMap.insert("Power & Speed Trend", tr("Power & Speed Trend"));
|
||||
chartNameMap.insert("Cardiovascular Response", tr("Cardiovascular Response"));
|
||||
chartNameMap.insert("Tempo & Threshold Time", tr("Tempo & Threshold Time"));
|
||||
chartNameMap.insert("Training Mix", tr("Training Mix"));
|
||||
chartNameMap.insert("Time & Distance", tr("Time & Distance"));
|
||||
chartNameMap.insert("Skiba Power", tr("Skiba Power"));
|
||||
chartNameMap.insert("Daniels Power", tr("Daniels Power"));
|
||||
chartNameMap.insert("PM Ramp & Peak", tr("PM Ramp & Peak"));
|
||||
chartNameMap.insert("Skiba PM", tr("Skiba PM"));
|
||||
chartNameMap.insert("Daniels PM", tr("Daniels PM"));
|
||||
chartNameMap.insert("Device Reliability", tr("Device Reliability"));
|
||||
chartNameMap.insert("Withings Weight", tr("Withings Weight"));
|
||||
chartNameMap.insert("Stress and Distance", tr("Stress and Distance"));
|
||||
chartNameMap.insert("Calories vs Duration", tr("Calories vs Duration"));
|
||||
|
||||
for(int i=0; i<charts.count(); i++) {
|
||||
// Replace chart name for localized version, default to english name
|
||||
charts[i].name = chartNameMap.value(charts[i].name, charts[i].name);
|
||||
}
|
||||
}
|
||||
|
||||
// metricDetails gives access to the metric details catalog by symbol
|
||||
MetricDetail*
|
||||
@@ -2002,13 +1970,18 @@ LTMTool::translateMetrics(Context *context, LTMSettings *settings) // settings o
|
||||
delete ltmTool;
|
||||
}
|
||||
|
||||
//void
|
||||
//LTMTool::okClicked()
|
||||
//{
|
||||
//// take the edited versions of the name first
|
||||
//for(int i=0; i<charts->invisibleRootItem()->childCount(); i++)
|
||||
//(presets)[i].name = charts->invisibleRootItem()->child(i)->text(0);
|
||||
//}
|
||||
#if 0 // need a way of knowing controls have closed ...
|
||||
void
|
||||
LTMTool::okClicked()
|
||||
{
|
||||
// take the edited versions of the name first
|
||||
for(int i=0; i<charts->invisibleRootItem()->childCount(); i++)
|
||||
(context->athlete->presets)[i].name = charts->invisibleRootItem()->child(i)->text(0);
|
||||
|
||||
// let everyone know once we're done
|
||||
context->notifyPresetsChanged();
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
LTMTool::importClicked()
|
||||
@@ -2037,7 +2010,7 @@ LTMTool::importClicked()
|
||||
imported = handler.getSettings();
|
||||
|
||||
// now append to the QList and QTreeWidget
|
||||
presets += imported;
|
||||
context->athlete->presets += imported;
|
||||
foreach (LTMSettings chart, imported) {
|
||||
QTreeWidgetItem *add;
|
||||
add = new QTreeWidgetItem(charts->invisibleRootItem());
|
||||
@@ -2073,7 +2046,7 @@ LTMTool::exportClicked()
|
||||
if (msgBox.exec() != QMessageBox::Ok)
|
||||
return;
|
||||
}
|
||||
LTMChartParser::serialize(filenames[0], presets);
|
||||
LTMChartParser::serialize(filenames[0], context->athlete->presets);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2088,9 +2061,10 @@ LTMTool::upClicked()
|
||||
QTreeWidgetItem *moved;
|
||||
charts->invisibleRootItem()->insertChild(index-1, moved=charts->invisibleRootItem()->takeChild(index));
|
||||
charts->setCurrentItem(moved);
|
||||
LTMSettings save = (presets)[index];
|
||||
presets.removeAt(index);
|
||||
presets.insert(index-1, save);
|
||||
LTMSettings save = (context->athlete->presets)[index];
|
||||
context->athlete->presets.removeAt(index);
|
||||
context->athlete->presets.insert(index-1, save);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2105,9 +2079,9 @@ LTMTool::downClicked()
|
||||
QTreeWidgetItem *moved;
|
||||
charts->invisibleRootItem()->insertChild(index+1, moved=charts->invisibleRootItem()->takeChild(index));
|
||||
charts->setCurrentItem(moved);
|
||||
LTMSettings save = (presets)[index];
|
||||
presets.removeAt(index);
|
||||
presets.insert(index+1, save);
|
||||
LTMSettings save = (context->athlete->presets)[index];
|
||||
context->athlete->presets.removeAt(index);
|
||||
context->athlete->presets.insert(index+1, save);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2115,7 +2089,9 @@ void
|
||||
LTMTool::renameClicked()
|
||||
{
|
||||
// which one is selected?
|
||||
if (charts->currentItem()) charts->editItem(charts->currentItem(), 0);
|
||||
if (charts->currentItem()) {
|
||||
charts->editItem(charts->currentItem(), 0);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
@@ -2130,7 +2106,7 @@ LTMTool::deleteClicked()
|
||||
int index = charts->invisibleRootItem()->indexOfChild(charts->currentItem());
|
||||
|
||||
// zap!
|
||||
presets.removeAt(index);
|
||||
context->athlete->presets.removeAt(index);
|
||||
delete charts->invisibleRootItem()->takeChild(index);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -78,9 +78,6 @@ class LTMTool : public QWidget
|
||||
SearchFilterBox *searchBox;
|
||||
#endif
|
||||
|
||||
// preset charts
|
||||
QList<LTMSettings> presets;
|
||||
|
||||
// basic tab: accessed by LTMWindow hence public
|
||||
QComboBox *groupBy;
|
||||
QCheckBox *shadeZones;
|
||||
@@ -112,8 +109,10 @@ class LTMTool : public QWidget
|
||||
void clearFilter();
|
||||
void setFilter(QStringList);
|
||||
|
||||
void presetsChanged();
|
||||
void exportClicked();
|
||||
void importClicked();
|
||||
//void okClicked(); // !!! need to address this
|
||||
void upClicked();
|
||||
void downClicked();
|
||||
void renameClicked();
|
||||
@@ -123,7 +122,6 @@ class LTMTool : public QWidget
|
||||
private:
|
||||
|
||||
// Helper function for default charts translation
|
||||
void translateDefaultCharts(QList<LTMSettings>&charts);
|
||||
QwtPlotCurve::CurveStyle curveStyle(RideMetric::MetricType);
|
||||
QwtSymbol::Style symbolStyle(RideMetric::MetricType);
|
||||
|
||||
|
||||
@@ -783,7 +783,7 @@ LTMWindow::applyClicked()
|
||||
QDateTime end = settings.end;
|
||||
|
||||
// apply preset
|
||||
settings = ltmTool->presets[selected];
|
||||
settings = context->athlete->presets[selected];
|
||||
|
||||
// now get back the local chart setup
|
||||
settings.ltmTool = ltmTool;
|
||||
@@ -805,10 +805,10 @@ LTMWindow::applyClicked()
|
||||
void
|
||||
LTMWindow::saveClicked()
|
||||
{
|
||||
EditChartDialog editor(context, &settings, ltmTool->presets);
|
||||
EditChartDialog editor(context, &settings, context->athlete->presets);
|
||||
if (editor.exec()) {
|
||||
ltmTool->presets.append(settings);
|
||||
settings.writeChartXML(context->athlete->home, ltmTool->presets);
|
||||
context->athlete->presets.append(settings);
|
||||
settings.writeChartXML(context->athlete->home, context->athlete->presets);
|
||||
//ltmTool->presetPicker->insertItem(ltmTool->presets.count()-1, settings.name, ltmTool->presets.count()-1);
|
||||
//ltmTool->presetPicker->setCurrentIndex(ltmTool->presets.count()-1);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user