From 96e2416334e34b84ec91d19ca2a2c030a24cbf41 Mon Sep 17 00:00:00 2001 From: Mark Liversedge Date: Tue, 10 Jun 2014 11:45:56 +0100 Subject: [PATCH] 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 --- src/Athlete.cpp | 47 +++++++++++++++++ src/Athlete.h | 5 ++ src/Context.h | 4 ++ src/LTMSettings.cpp | 1 + src/LTMTool.cpp | 120 ++++++++++++++++++-------------------------- src/LTMTool.h | 6 +-- src/LTMWindow.cpp | 8 +-- 7 files changed, 111 insertions(+), 80 deletions(-) diff --git a/src/Athlete.cpp b/src/Athlete.cpp index 133aeae72..84e8d7628 100644 --- a/src/Athlete.cpp +++ b/src/Athlete.cpp @@ -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&charts) +{ + // Map default (english) chart name to external (Localized) name + // New default charts need to be added to this list to be translated + QMap 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 presets; + void translateDefaultCharts(QList&charts); + // indexes / filters #ifdef GC_HAVE_LUCENE Lucene *lucene; diff --git a/src/Context.h b/src/Context.h index b32a18110..3602eebfa 100644 --- a/src/Context.h +++ b/src/Context.h @@ -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 *); diff --git a/src/LTMSettings.cpp b/src/LTMSettings.cpp index 4ab5ac308..c32a93828 100644 --- a/src/LTMSettings.cpp +++ b/src/LTMSettings.cpp @@ -94,6 +94,7 @@ EditChartDialog::cancelClicked() void LTMSettings::writeChartXML(QDir home, QList charts) { +qDebug()<<"write chart.xml !"; LTMChartParser::serialize(QString(home.path() + "/charts.xml"), charts); } diff --git a/src/LTMTool.cpp b/src/LTMTool.cpp index 6b0301936..b3308a5fb 100644 --- a/src/LTMTool.cpp +++ b/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&charts) -{ - // Map default (english) chart name to external (Localized) name - // New default charts need to be added to this list to be translated - QMap 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; iinvisibleRootItem()->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; iinvisibleRootItem()->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); } } diff --git a/src/LTMTool.h b/src/LTMTool.h index daadef423..c09891b63 100644 --- a/src/LTMTool.h +++ b/src/LTMTool.h @@ -78,9 +78,6 @@ class LTMTool : public QWidget SearchFilterBox *searchBox; #endif - // preset charts - QList 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&charts); QwtPlotCurve::CurveStyle curveStyle(RideMetric::MetricType); QwtSymbol::Style symbolStyle(RideMetric::MetricType); diff --git a/src/LTMWindow.cpp b/src/LTMWindow.cpp index a4842bce4..b6b41a7b2 100644 --- a/src/LTMWindow.cpp +++ b/src/LTMWindow.cpp @@ -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); }