34
34
#include "RideMetadata.h"
35
35
#include "SpecialFields.h"
37
LTMTool::LTMTool(MainWindow *parent, const QDir &home) : QWidget(parent), home(home), main(parent)
37
LTMTool::LTMTool(MainWindow *parent, const QDir &home, bool multi) : QWidget(parent), home(home), main(parent), active(false), _amFiltered(false)
39
setStyleSheet("QFrame { FrameStyle = QFrame::NoFrame };"
40
"QWidget { background = Qt::white; border:0 px; margin: 2px; };");
39
42
// get application settings
40
boost::shared_ptr<QSettings> appsettings = GetApplicationSettings();
41
useMetricUnits = appsettings->value(GC_UNIT).toString() == "Metric";
43
useMetricUnits = main->useMetricUnits;
43
45
QVBoxLayout *mainLayout = new QVBoxLayout(this);
44
46
mainLayout->setContentsMargins(0,0,0,0);
46
dateRangeTree = new QTreeWidget;
47
dateRangeTree->setColumnCount(1);
48
dateRangeTree->setSelectionMode(QAbstractItemView::SingleSelection);
49
dateRangeTree->header()->hide();
50
dateRangeTree->setAlternatingRowColors (true);
51
dateRangeTree->setIndentation(5);
52
allDateRanges = new QTreeWidgetItem(dateRangeTree, ROOT_TYPE);
53
allDateRanges->setText(0, tr("Date Range"));
55
dateRangeTree->expandItem(allDateRanges);
56
dateRangeTree->setContextMenuPolicy(Qt::CustomContextMenu);
47
mainLayout->setSpacing(0);
48
setContentsMargins(0,0,0,0);
50
QWidget *basicsettings = new QWidget(this);
51
mainLayout->addWidget(basicsettings);
52
QFormLayout *basicsettingsLayout = new QFormLayout(basicsettings);
53
basicsettingsLayout->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow);
56
searchBox = new SearchFilterBox(this, main);
57
connect(searchBox, SIGNAL(searchClear()), this, SLOT(clearFilter()));
58
connect(searchBox, SIGNAL(searchResults(QStringList)), this, SLOT(setFilter(QStringList)));
60
basicsettingsLayout->addRow(new QLabel(tr("Filter")), searchBox);
61
basicsettingsLayout->addRow(new QLabel(tr(""))); // spacing
65
QWidget *basic = new QWidget(this);
66
basic->setContentsMargins(0,0,0,0);
67
QVBoxLayout *basicLayout = new QVBoxLayout(basic);
68
basicLayout->setContentsMargins(0,0,0,0);
69
basicLayout->setSpacing(0);
71
QLabel *presetLabel = new QLabel(tr("Chart"));
72
QFont sameFont = presetLabel->font();
73
#ifdef Q_OS_MAC // possibly needed on others too
74
sameFont.setPointSize(sameFont.pointSize() + 2);
76
presetPicker = new QComboBox;
77
presetPicker->setSizeAdjustPolicy(QComboBox::AdjustToContents);
78
QHBoxLayout *presetrow = new QHBoxLayout;
79
presetrow->setSpacing(5);
80
presetrow->addWidget(presetLabel);
81
presetrow->addWidget(presetPicker);
82
presetrow->addStretch();
83
basicLayout->addLayout(presetrow);
84
basicLayout->addStretch();
86
dateSetting = new DateSettingsEdit(this);
87
basicsettingsLayout->addRow(new QLabel(tr("Date range")), dateSetting);
88
basicsettingsLayout->addRow(new QLabel(tr(""))); // spacing
90
groupBy = new QComboBox;
91
groupBy->addItem(tr("Days"), LTM_DAY);
92
groupBy->addItem(tr("Weeks"), LTM_WEEK);
93
groupBy->addItem(tr("Months"), LTM_MONTH);
94
groupBy->addItem(tr("Years"), LTM_YEAR);
95
groupBy->addItem(tr("Time Of Day"), LTM_TOD);
96
groupBy->setCurrentIndex(0);
97
basicsettingsLayout->addRow(new QLabel(tr("Group by")), groupBy);
98
basicsettingsLayout->addRow(new QLabel(tr(""))); // spacing
100
shadeZones = new QCheckBox(tr("Shade Zones"));
101
basicsettingsLayout->addRow(new QLabel(""), shadeZones);
103
showLegend = new QCheckBox(tr("Show Legend"));
104
basicsettingsLayout->addRow(new QLabel(""), showLegend);
106
showEvents = new QCheckBox(tr("Show Events"));
107
basicsettingsLayout->addRow(new QLabel(""), showEvents);
110
saveButton = new QPushButton(tr("Add"));
111
manageButton = new QPushButton(tr("Manage"));
112
QHBoxLayout *buttons = new QHBoxLayout;
113
buttons->addWidget(manageButton);
114
buttons->addStretch();
115
buttons->addWidget(saveButton);
116
basicLayout->addStretch();
117
basicLayout->addLayout(buttons);
58
119
metricTree = new QTreeWidget;
121
metricTree->setAttribute(Qt::WA_MacShowFocusRect, 0);
59
123
metricTree->setColumnCount(1);
60
metricTree->setSelectionMode(QAbstractItemView::ExtendedSelection);
125
metricTree->setSelectionMode(QAbstractItemView::ExtendedSelection);
127
metricTree->setSelectionMode(QAbstractItemView::SingleSelection);
61
128
metricTree->header()->hide();
62
metricTree->setAlternatingRowColors (true);
129
//metricTree->setFrameStyle(QFrame::NoFrame);
130
//metricTree->setAlternatingRowColors (true);
63
131
metricTree->setIndentation(5);
64
132
allMetrics = new QTreeWidgetItem(metricTree, ROOT_TYPE);
65
133
allMetrics->setText(0, tr("Metric"));
238
316
danielsLTR.trend = false;
239
317
danielsLTR.topN = 1;
240
318
danielsLTR.uname = danielsLTR.name = tr("Daniels LTS Ramp");
319
danielsLTR.units = "Ramp";
241
320
danielsLTR.uunits = tr("Ramp");
242
321
metrics.append(danielsLTR);
324
MetricDetail workLTS;
325
workLTS.type = METRIC_PM;
326
workLTS.symbol = "work_lts";
327
workLTS.metric = NULL; // not a factory metric
328
workLTS.penColor = QColor(Qt::blue);
329
workLTS.curveStyle = QwtPlotCurve::Lines;
330
workLTS.symbolStyle = QwtSymbol::NoSymbol;
331
workLTS.smooth = false;
332
workLTS.trend = false;
334
workLTS.uname = workLTS.name = tr("Work (Kj) Long Term Stress");
335
workLTS.units = "Stress (Kj)";
336
workLTS.uunits = tr("Stress (Kj)");
337
metrics.append(workLTS);
339
MetricDetail workSTS;
340
workSTS.type = METRIC_PM;
341
workSTS.symbol = "work_sts";
342
workSTS.metric = NULL; // not a factory metric
343
workSTS.penColor = QColor(Qt::magenta);
344
workSTS.curveStyle = QwtPlotCurve::Lines;
345
workSTS.symbolStyle = QwtSymbol::NoSymbol;
346
workSTS.smooth = false;
347
workSTS.trend = false;
349
workSTS.uname = workSTS.name = tr("Work (Kj) Short Term Stress");
350
workSTS.units = "Stress (Kj)";
351
workSTS.uunits = tr("Stress (Kj)");
352
metrics.append(workSTS);
355
workSB.type = METRIC_PM;
356
workSB.symbol = "work_sb";
357
workSB.metric = NULL; // not a factory metric
358
workSB.penColor = QColor(Qt::yellow);
359
workSB.curveStyle = QwtPlotCurve::Steps;
360
workSB.symbolStyle = QwtSymbol::NoSymbol;
361
workSB.smooth = false;
362
workSB.trend = false;
364
workSB.uname = workSB.name = tr("Work (Kj) Stress Balance");
365
workSB.units = "Stress Balance";
366
workSB.uunits = tr("Stress Balance");
367
metrics.append(workSB);
369
MetricDetail workSTR;
370
workSTR.type = METRIC_PM;
371
workSTR.symbol = "work_sr";
372
workSTR.metric = NULL; // not a factory metric
373
workSTR.penColor = QColor(Qt::darkGreen);
374
workSTR.curveStyle = QwtPlotCurve::Steps;
375
workSTR.symbolStyle = QwtSymbol::NoSymbol;
376
workSTR.smooth = false;
377
workSTR.trend = false;
379
workSTR.uname = workSTR.name = tr("Work (Kj) STS Ramp");
380
workSTR.units = "Ramp";
381
workSTR.uunits = tr("Ramp");
382
metrics.append(workSTR);
384
MetricDetail workLTR;
385
workLTR.type = METRIC_PM;
386
workLTR.symbol = "work_lr";
387
workLTR.metric = NULL; // not a factory metric
388
workLTR.penColor = QColor(Qt::darkBlue);
389
workLTR.curveStyle = QwtPlotCurve::Steps;
390
workLTR.symbolStyle = QwtSymbol::NoSymbol;
391
workLTR.smooth = false;
392
workLTR.trend = false;
394
workLTR.uname = workLTR.name = tr("Work (Kj) LTS Ramp");
395
workLTR.units = "Ramp";
396
workLTR.uunits = tr("Ramp");
397
metrics.append(workLTR);
400
MetricDetail distanceLTS;
401
distanceLTS.type = METRIC_PM;
402
distanceLTS.symbol = "distance_lts";
403
distanceLTS.metric = NULL; // not a factory metric
404
distanceLTS.penColor = QColor(Qt::blue);
405
distanceLTS.curveStyle = QwtPlotCurve::Lines;
406
distanceLTS.symbolStyle = QwtSymbol::NoSymbol;
407
distanceLTS.smooth = false;
408
distanceLTS.trend = false;
409
distanceLTS.topN = 1;
410
distanceLTS.uname = distanceLTS.name = tr("Distance (km|mi) Long Term Stress");
411
distanceLTS.units = "Stress (km|mi)";
412
distanceLTS.uunits = tr("Stress (km|mi)");
413
metrics.append(distanceLTS);
415
MetricDetail distanceSTS;
416
distanceSTS.type = METRIC_PM;
417
distanceSTS.symbol = "distance_sts";
418
distanceSTS.metric = NULL; // not a factory metric
419
distanceSTS.penColor = QColor(Qt::magenta);
420
distanceSTS.curveStyle = QwtPlotCurve::Lines;
421
distanceSTS.symbolStyle = QwtSymbol::NoSymbol;
422
distanceSTS.smooth = false;
423
distanceSTS.trend = false;
424
distanceSTS.topN = 1;
425
distanceSTS.uname = distanceSTS.name = tr("Distance (km|mi) Short Term Stress");
426
distanceSTS.units = "Stress (km|mi)";
427
distanceSTS.uunits = tr("Stress (km|mi)");
428
metrics.append(distanceSTS);
430
MetricDetail distanceSB;
431
distanceSB.type = METRIC_PM;
432
distanceSB.symbol = "distance_sb";
433
distanceSB.metric = NULL; // not a factory metric
434
distanceSB.penColor = QColor(Qt::yellow);
435
distanceSB.curveStyle = QwtPlotCurve::Steps;
436
distanceSB.symbolStyle = QwtSymbol::NoSymbol;
437
distanceSB.smooth = false;
438
distanceSB.trend = false;
440
distanceSB.uname = distanceSB.name = tr("Distance (km|mi) Stress Balance");
441
distanceSB.units = "Stress Balance";
442
distanceSB.uunits = tr("Stress Balance");
443
metrics.append(distanceSB);
445
MetricDetail distanceSTR;
446
distanceSTR.type = METRIC_PM;
447
distanceSTR.symbol = "distance_sr";
448
distanceSTR.metric = NULL; // not a factory metric
449
distanceSTR.penColor = QColor(Qt::darkGreen);
450
distanceSTR.curveStyle = QwtPlotCurve::Steps;
451
distanceSTR.symbolStyle = QwtSymbol::NoSymbol;
452
distanceSTR.smooth = false;
453
distanceSTR.trend = false;
454
distanceSTR.topN = 1;
455
distanceSTR.uname = distanceSTR.name = tr("Distance (km|mi) STS Ramp");
456
distanceSTR.units = "Ramp";
457
distanceSTR.uunits = tr("Ramp");
458
metrics.append(distanceSTR);
460
MetricDetail distanceLTR;
461
distanceLTR.type = METRIC_PM;
462
distanceLTR.symbol = "distance_lr";
463
distanceLTR.metric = NULL; // not a factory metric
464
distanceLTR.penColor = QColor(Qt::darkBlue);
465
distanceLTR.curveStyle = QwtPlotCurve::Steps;
466
distanceLTR.symbolStyle = QwtSymbol::NoSymbol;
467
distanceLTR.smooth = false;
468
distanceLTR.trend = false;
469
distanceLTR.topN = 1;
470
distanceLTR.uname = distanceLTR.name = tr("Distance (km|mi) LTS Ramp");
471
distanceLTR.units = "Ramp";
472
distanceLTR.uunits = tr("Ramp");
473
metrics.append(distanceLTR);
476
MetricDetail cogganCTL;
477
cogganCTL.type = METRIC_PM;
478
cogganCTL.symbol = "coggan_ctl";
479
cogganCTL.metric = NULL; // not a factory metric
480
cogganCTL.penColor = QColor(Qt::blue);
481
cogganCTL.curveStyle = QwtPlotCurve::Lines;
482
cogganCTL.symbolStyle = QwtSymbol::NoSymbol;
483
cogganCTL.smooth = false;
484
cogganCTL.trend = false;
486
cogganCTL.uname = cogganCTL.name = tr("Coggan Chronic Training Load");
487
cogganCTL.units = "CTL";
488
cogganCTL.uunits = "CTL";
489
metrics.append(cogganCTL);
491
MetricDetail cogganATL;
492
cogganATL.type = METRIC_PM;
493
cogganATL.symbol = "coggan_atl";
494
cogganATL.metric = NULL; // not a factory metric
495
cogganATL.penColor = QColor(Qt::magenta);
496
cogganATL.curveStyle = QwtPlotCurve::Lines;
497
cogganATL.symbolStyle = QwtSymbol::NoSymbol;
498
cogganATL.smooth = false;
499
cogganATL.trend = false;
501
cogganATL.uname = cogganATL.name = tr("Coggan Acute Training Load");
502
cogganATL.units = "ATL";
503
cogganATL.uunits = "ATL";
504
metrics.append(cogganATL);
506
MetricDetail cogganTSB;
507
cogganTSB.type = METRIC_PM;
508
cogganTSB.symbol = "coggan_tsb";
509
cogganTSB.metric = NULL; // not a factory metric
510
cogganTSB.penColor = QColor(Qt::yellow);
511
cogganTSB.curveStyle = QwtPlotCurve::Steps;
512
cogganTSB.symbolStyle = QwtSymbol::NoSymbol;
513
cogganTSB.smooth = false;
514
cogganTSB.trend = false;
516
cogganTSB.uname = cogganTSB.name = tr("Coggan Training Stress Balance");
517
cogganTSB.units = "TSB";
518
cogganTSB.uunits = "TSB";
519
metrics.append(cogganTSB);
521
MetricDetail cogganSTR;
522
cogganSTR.type = METRIC_PM;
523
cogganSTR.symbol = "coggan_sr";
524
cogganSTR.metric = NULL; // not a factory metric
525
cogganSTR.penColor = QColor(Qt::darkGreen);
526
cogganSTR.curveStyle = QwtPlotCurve::Steps;
527
cogganSTR.symbolStyle = QwtSymbol::NoSymbol;
528
cogganSTR.smooth = false;
529
cogganSTR.trend = false;
531
cogganSTR.uname = cogganSTR.name = tr("Coggan STS Ramp");
532
cogganSTR.units = "Ramp";
533
cogganSTR.uunits = tr("Ramp");
534
metrics.append(cogganSTR);
536
MetricDetail cogganLTR;
537
cogganLTR.type = METRIC_PM;
538
cogganLTR.symbol = "coggan_lr";
539
cogganLTR.metric = NULL; // not a factory metric
540
cogganLTR.penColor = QColor(Qt::darkBlue);
541
cogganLTR.curveStyle = QwtPlotCurve::Steps;
542
cogganLTR.symbolStyle = QwtSymbol::NoSymbol;
543
cogganLTR.smooth = false;
544
cogganLTR.trend = false;
546
cogganLTR.uname = cogganLTR.name = tr("Coggan LTS Ramp");
547
cogganLTR.units = "Ramp";
548
cogganLTR.uunits = tr("Ramp");
549
metrics.append(cogganLTR);
245
552
MetricDetail trimpLTS;
246
553
trimpLTS.type = METRIC_PM;
309
619
trimpLTR.trend = false;
310
620
trimpLTR.topN = 1;
311
621
trimpLTR.uname = trimpLTR.name = tr("TRIMP LTS Ramp");
622
trimpLTR.units = "Ramp";
312
623
trimpLTR.uunits = tr("Ramp");
313
624
metrics.append(trimpLTR);
316
627
SpecialFields sp;
317
628
foreach (FieldDefinition field, main->rideMetadata()->getFields()) {
318
629
if (!sp.isMetric(field.name) && (field.type == 3 || field.type == 4)) {
319
630
MetricDetail metametric;
320
631
metametric.type = METRIC_META;
321
632
QString underscored = field.name;
322
metametric.symbol = underscored.replace(" ", "_"); //XXX other special chars!!!
633
metametric.symbol = underscored.replace(" ", "_");
323
634
metametric.metric = NULL; // not a factory metric
324
635
metametric.penColor = QColor(Qt::blue);
325
636
metametric.curveStyle = QwtPlotCurve::Lines;
326
637
metametric.symbolStyle = QwtSymbol::NoSymbol;
327
638
metametric.smooth = false;
328
639
metametric.trend = false;
330
#ifdef ENABLE_METRICS_TRANSLATION
331
641
metametric.uname = metametric.name = sp.displayName(field.name);
333
metametric.uname = metametric.name = field.name;
642
metametric.units = "";
335
643
metametric.uunits = "";
336
644
metrics.append(metametric);
649
QList<FieldDefinition> measureDefinitions;
650
QList<KeywordDefinition> keywordDefinitions; //NOTE: not used in measures.xml
651
QString filename = main->home.absolutePath()+"/measures.xml";
653
if (!QFile(filename).exists()) filename = ":/xml/measures.xml";
654
RideMetadata::readXML(filename, keywordDefinitions, measureDefinitions, colorfield);
656
foreach (FieldDefinition field, measureDefinitions) {
657
if (!sp.isMetric(field.name) && (field.type == 3 || field.type == 4)) {
658
MetricDetail measure;
659
measure.type = METRIC_MEASURE;
660
QString underscored = field.name;
661
measure.symbol = field.name; // we don't bother with '_' for measures
662
measure.metric = NULL; // not a factory metric
663
measure.penColor = QColor(Qt::blue);
664
measure.curveStyle = QwtPlotCurve::Lines;
665
measure.symbolStyle = QwtSymbol::NoSymbol;
666
measure.smooth = false;
667
measure.trend = false;
670
measure.name = QString("%1 (m)").arg(sp.displayName(field.name));
673
metrics.append(measure);
348
685
metricTree->expandItem(allMetrics);
687
// read charts.xml and populate the picker
689
reader.readChartXML(home, presets);
690
// translate default chart names
691
translateDefaultCharts(presets);
692
for(int i=0; i<presets.count(); i++)
693
presetPicker->addItem(presets[i].name, i);
694
presetPicker->setCurrentIndex(-1);
350
696
configChanged(); // will reset the metric tree
352
ltmSplitter = new QSplitter;
353
ltmSplitter->setContentsMargins(0,0,0,0);
354
ltmSplitter->setOrientation(Qt::Vertical);
356
mainLayout->addWidget(ltmSplitter);
357
ltmSplitter->addWidget(dateRangeTree);
358
ltmSplitter->setCollapsible(0, true);
359
ltmSplitter->addWidget(metricTree);
360
ltmSplitter->setCollapsible(1, true);
362
connect(dateRangeTree,SIGNAL(itemSelectionChanged()),
363
this, SLOT(dateRangeTreeWidgetSelectionChanged()));
698
tabs = new QTabWidget(this);
700
mainLayout->addWidget(tabs);
701
basic->setContentsMargins(20,20,20,20);
703
// metric tree in a container for spacing etc
704
QWidget *metricContainer = new QWidget(this);
705
metricContainer->setContentsMargins(20,20,20,20);
706
QVBoxLayout *metricContainerLayout = new QVBoxLayout(metricContainer);
707
metricContainerLayout->setContentsMargins(0,0,0,0);
708
metricContainerLayout->setSpacing(0);
709
metricContainerLayout->addWidget(metricTree);
711
tabs->addTab(basicsettings, tr("Basic"));
712
tabs->addTab(basic, tr("Preset"));
713
tabs->addTab(metricContainer, tr("Custom"));
364
715
connect(metricTree,SIGNAL(itemSelectionChanged()),
365
716
this, SLOT(metricTreeWidgetSelectionChanged()));
366
717
connect(main, SIGNAL(configChanged()),
367
718
this, SLOT(configChanged()));
368
connect(dateRangeTree,SIGNAL(customContextMenuRequested(const QPoint &)),
369
this, SLOT(dateRangePopup(const QPoint &)));
370
719
connect(metricTree,SIGNAL(customContextMenuRequested(const QPoint &)),
371
720
this, SLOT(metricTreePopup(const QPoint &)));
372
connect(dateRangeTree,SIGNAL(itemChanged(QTreeWidgetItem *,int)),
373
this, SLOT(dateRangeChanged(QTreeWidgetItem*, int)));
377
LTMTool::selectDateRange(int index)
379
allDateRanges->child(index)->setSelected(true);
722
// switched between one or other
723
connect(dateSetting, SIGNAL(useStandardRange()), this, SIGNAL(useStandardRange()));
724
connect(dateSetting, SIGNAL(useCustomRange(DateRange)), this, SIGNAL(useCustomRange(DateRange)));
725
connect(dateSetting, SIGNAL(useThruToday()), this, SIGNAL(useThruToday()));
382
728
QwtPlotCurve::CurveStyle
437
764
/*----------------------------------------------------------------------
438
* Date ranges from Seasons.xml
439
766
*--------------------------------------------------------------------*/
440
void LTMTool::readSeasons()
442
QFile seasonFile(home.absolutePath() + "/seasons.xml");
443
QXmlInputSource source( &seasonFile );
444
QXmlSimpleReader xmlReader;
445
SeasonParser( handler );
446
xmlReader.setContentHandler(&handler);
447
xmlReader.setErrorHandler(&handler);
448
xmlReader.parse( source );
449
seasons = handler.getSeasons();
452
for (i=0; i <seasons.count(); i++) {
453
Season season = seasons.at(i);
454
QTreeWidgetItem *add = new QTreeWidgetItem(allDateRanges, USER_DATE);
455
add->setText(0, season.getName());
458
QDate today = QDate::currentDate();
459
QDate eom = QDate(today.year(), today.month(), today.daysInMonth());
461
// add Default Date Ranges
462
season.setName(tr("All Dates"));
463
season.setType(Season::temporary);
464
season.setStart(QDate::currentDate().addYears(-50));
465
season.setEnd(QDate::currentDate().addYears(50));
466
seasons.append(season);
468
season.setName(tr("This Year"));
469
season.setType(Season::temporary);
470
season.setStart(QDate(today.year(), 1,1));
471
season.setEnd(QDate(today.year(), 12, 31));
472
seasons.append(season);
474
season.setName(tr("This Month"));
475
season.setType(Season::temporary);
476
season.setStart(QDate(today.year(), today.month(),1));
478
seasons.append(season);
480
season.setName(tr("This Week"));
481
season.setType(Season::temporary);
483
QDate wstart = QDate::currentDate();
484
wstart = wstart.addDays(Qt::Monday - wstart.dayOfWeek());
485
QDate wend = wstart.addDays(6); // first day + 6 more
486
season.setStart(wstart);
488
seasons.append(season);
490
season.setName(tr("Last 7 days"));
491
season.setType(Season::temporary);
492
season.setStart(today.addDays(-6)); // today plus previous 6
493
season.setEnd(today);
494
seasons.append(season);
496
season.setName(tr("Last 14 days"));
497
season.setType(Season::temporary);
498
season.setStart(today.addDays(-13));
499
season.setEnd(today);
500
seasons.append(season);
502
season.setName(tr("Last 28 days"));
503
season.setType(Season::temporary);
504
season.setStart(today.addDays(-27));
505
season.setEnd(today);
506
seasons.append(season);
508
season.setName(tr("Last 3 months"));
509
season.setType(Season::temporary);
510
season.setEnd(today);
511
season.setStart(today.addMonths(-3));
512
seasons.append(season);
514
season.setName(tr("Last 6 months"));
515
season.setType(Season::temporary);
516
season.setEnd(today);
517
season.setStart(today.addMonths(-6));
518
seasons.append(season);
520
season.setName(tr("Last 12 months"));
521
season.setType(Season::temporary);
522
season.setEnd(today);
523
season.setStart(today.addMonths(-12));
524
seasons.append(season);
526
for (;i <seasons.count(); i++) {
527
Season season = seasons.at(i);
528
QTreeWidgetItem *add = new QTreeWidgetItem(allDateRanges, SYS_DATE);
529
add->setText(0, season.getName());
531
dateRangeTree->expandItem(allDateRanges);
535
768
LTMTool::metricName(QTreeWidgetItem *item)
561
LTMTool::newSeason(QString name, QDate start, QDate end, int type)
568
seasons.insert(0, add);
573
QTreeWidgetItem *item = new QTreeWidgetItem(USER_DATE);
574
item->setText(0, add.getName());
575
allDateRanges->insertChild(0, item);
576
return 0; // always add at the top
580
LTMTool::updateSeason(int index, QString name, QDate start, QDate end, int type)
582
seasons[index].setName(name);
583
seasons[index].setStart(start);
584
seasons[index].setEnd(end);
585
seasons[index].setType(type);
586
allDateRanges->child(index)->setText(0, name);
594
LTMTool::dateRangePopup(QPoint pos)
596
QTreeWidgetItem *item = dateRangeTree->itemAt(pos);
597
if (item != NULL && item->type() != ROOT_TYPE && item->type() != SYS_DATE) {
600
activeDateRange = item;
602
// create context menu
603
QMenu menu(dateRangeTree);
604
QAction *rename = new QAction(tr("Rename range"), dateRangeTree);
605
QAction *edit = new QAction(tr("Edit details"), dateRangeTree);
606
QAction *del = new QAction(tr("Delete range"), dateRangeTree);
607
menu.addAction(rename);
608
menu.addAction(edit);
611
// connect menu to functions
612
connect(rename, SIGNAL(triggered(void)), this, SLOT(renameRange(void)));
613
connect(edit, SIGNAL(triggered(void)), this, SLOT(editRange(void)));
614
connect(del, SIGNAL(triggered(void)), this, SLOT(deleteRange(void)));
617
menu.exec(dateRangeTree->mapToGlobal(pos));
622
LTMTool::renameRange()
625
activeDateRange->setFlags(activeDateRange->flags() | Qt::ItemIsEditable);
626
dateRangeTree->editItem(activeDateRange, 0);
630
LTMTool::dateRangeChanged(QTreeWidgetItem*item, int)
632
if (item != activeDateRange) return;
634
int index = allDateRanges->indexOfChild(item);
635
seasons[index].setName(item->text(0));
640
// signal date selected changed
641
dateRangeSelected(&seasons[index]);
647
// throw up modal dialog box to edit all the season
649
int index = allDateRanges->indexOfChild(activeDateRange);
650
EditSeasonDialog dialog(main, &seasons[index]);
654
activeDateRange->setText(0, seasons[index].getName());
659
// signal its changed!
660
dateRangeSelected(&seasons[index]);
665
LTMTool::deleteRange()
668
int index = allDateRanges->indexOfChild(activeDateRange);
669
delete allDateRanges->takeChild(index);
670
seasons.removeAt(index);
672
// now update season.xml
677
LTMTool::writeSeasons()
679
// update seasons.xml
680
QString file = QString(home.absolutePath() + "/seasons.xml");
681
SeasonParser::serialize(file, seasons);
685
795
LTMTool::metricTreePopup(QPoint pos)
859
998
grid->addWidget(curveStyle, 2,1);
860
999
grid->addWidget(symbol, 3,0);
861
1000
grid->addWidget(curveSymbol, 3,1);
862
grid->addWidget(color, 4,0);
863
grid->addWidget(curveColor, 4,1);
864
grid->addWidget(topN, 5,0);
865
grid->addWidget(showBest, 5,1);
866
grid->addWidget(baseline, 6, 0);
867
grid->addWidget(baseLine, 6,1);
868
grid->addWidget(curveSmooth, 7,1);
869
grid->addWidget(curveTrend, 8,1);
1001
grid->addWidget(stackLabel, 4, 0);
1002
grid->addWidget(stack, 4, 1);
1003
grid->addWidget(color, 5,0);
1004
grid->addWidget(curveColor, 5,1);
1005
grid->addWidget(fill, 6,0);
1006
grid->addWidget(fillCurve, 6,1);
1007
grid->addWidget(topN, 7,0);
1008
grid->addWidget(showBest, 7,1);
1009
grid->addWidget(outN, 8,0);
1010
grid->addWidget(showOut, 8,1);
1011
grid->addWidget(baseline, 9, 0);
1012
grid->addWidget(baseLine, 9,1);
1013
grid->addWidget(curveSmooth, 10,1);
1014
grid->addWidget(curveTrend, 11,1);
871
1016
mainLayout->addLayout(grid);
872
mainLayout->addStretch();
875
1019
QHBoxLayout *buttonLayout = new QHBoxLayout;
1101
LTMTool::clearFilter()
1104
_amFiltered = false;
1106
emit filterChanged();
1110
LTMTool::setFilter(QStringList files)
1115
emit filterChanged();
951
1119
LTMTool::translateDefaultCharts(QList<LTMSettings>&charts)
953
1121
// Map default (english) chart name to external (Localized) name
954
1122
// New default charts need to be added to this list to be translated
955
1123
QMap<QString, QString> chartNameMap;
956
chartNameMap.insert("Aerobic Power", tr("Aerobic Power"));
957
chartNameMap.insert("Anaerobic Power", tr("Anaerobic Power"));
958
chartNameMap.insert("Critical Power Trend", tr("Critical Power Trend"));
959
chartNameMap.insert("Power & Speed Trend", tr("Power & Speed Trend"));
960
chartNameMap.insert("Cardiovascular Response", tr("Cardiovascular Response"));
961
chartNameMap.insert("Training Mix", tr("Training Mix"));
962
chartNameMap.insert("Tempo & Threshold Time", tr("Tempo & Threshold Time"));
963
chartNameMap.insert("Time & Distance", tr("Time & Distance"));
964
chartNameMap.insert("Daniels Power", tr("Daniels Power"));
965
chartNameMap.insert("Skiba Power", tr("Skiba Power"));
966
chartNameMap.insert("Skiba PM", tr("Skiba PM"));
967
chartNameMap.insert("Daniels PM", tr("Daniels PM"));
1124
chartNameMap.insert("PMC", tr("PMC"));
1125
chartNameMap.insert("Track Weight", tr("Track Weight"));
1126
chartNameMap.insert("Time In Power Zone (Stacked)", tr("Time In Power Zone (Stacked)"));
1127
chartNameMap.insert("Time In Power Zone (Bar)", tr("Time In Power Zone (Bar)"));
1128
chartNameMap.insert("Time In HR Zone", tr("Time In HR Zone"));
1129
chartNameMap.insert("Power Distribution", tr("Power Distribution"));
1130
chartNameMap.insert("KPI Tracker", tr("KPI Tracker"));
1131
chartNameMap.insert("Critical Power Trend", tr("Critical Power Trend"));
1132
chartNameMap.insert("Aerobic Power", tr("Aerobic Power"));
1133
chartNameMap.insert("Aerobic WPK", tr("Aerobic WPK"));
1134
chartNameMap.insert("Power Variance", tr("Power Variance"));
1135
chartNameMap.insert("Power Profile", tr("Power Profile"));
1136
chartNameMap.insert("Anaerobic Power", tr("Anaerobic Power"));
1137
chartNameMap.insert("Anaerobic WPK", tr("Anaerobic WPK"));
1138
chartNameMap.insert("Power & Speed Trend", tr("Power & Speed Trend"));
1139
chartNameMap.insert("Cardiovascular Response", tr("Cardiovascular Response"));
1140
chartNameMap.insert("Tempo & Threshold Time", tr("Tempo & Threshold Time"));
1141
chartNameMap.insert("Training Mix", tr("Training Mix"));
1142
chartNameMap.insert("Time & Distance", tr("Time & Distance"));
1143
chartNameMap.insert("Skiba Power", tr("Skiba Power"));
1144
chartNameMap.insert("Daniels Power", tr("Daniels Power"));
1145
chartNameMap.insert("PM Ramp & Peak", tr("PM Ramp & Peak"));
1146
chartNameMap.insert("Skiba PM", tr("Skiba PM"));
1147
chartNameMap.insert("Daniels PM", tr("Daniels PM"));
1148
chartNameMap.insert("Device Reliability", tr("Device Reliability"));
1149
chartNameMap.insert("Withings Weight", tr("Withings Weight"));
1150
chartNameMap.insert("Stress and Distance", tr("Stress and Distance"));
1151
chartNameMap.insert("Calories vs Duration", tr("Calories vs Duration"));
969
1153
for(int i=0; i<charts.count(); i++) {
970
1154
// Replace chart name for localized version, default to english name
971
1155
charts[i].name = chartNameMap.value(charts[i].name, charts[i].name);
972
// For each metric in chart
973
for (int j=0; j<charts[i].metrics.count(); j++) {
974
if (charts[i].metrics[j].uname == charts[i].metrics[j].name) { // Default uname
975
for (int k=0; k<metrics.count(); k++) // Look in metrics list
976
if (metrics[k].symbol == charts[i].metrics[j].symbol) { // Replace with default translated values
977
charts[i].metrics[j].name = metrics[k].name;
978
charts[i].metrics[j].uname = metrics[k].uname;
979
charts[i].metrics[j].uunits = metrics[k].uunits;
1159
// metricDetails gives access to the metric details catalog by symbol
1161
LTMTool::metricDetails(QString symbol)
1163
for(int i = 0; i < metrics.count(); i++)
1164
if (metrics[i].symbol == symbol)
1170
LTMTool::translateMetrics(MainWindow *main, const QDir &home, LTMSettings *settings)
1172
static QMap<QString, QString> unitsMap;
1173
// LTMTool instance is created to have access to metrics catalog
1174
LTMTool* ltmTool = new LTMTool(main, home, false);
1175
if (unitsMap.isEmpty()) {
1176
foreach(MetricDetail metric, ltmTool->metrics) {
1177
if (metric.units != "") // translate units
1178
unitsMap.insert(metric.units, metric.uunits);
1179
if (metric.uunits != "") // keep already translated the same
1180
unitsMap.insert(metric.uunits, metric.uunits);
1183
for (int j=0; j < settings->metrics.count(); j++) {
1184
if (settings->metrics[j].uname == settings->metrics[j].name) {
1185
MetricDetail* mdp = ltmTool->metricDetails(settings->metrics[j].symbol);
1187
// Replace with default translated name
1188
settings->metrics[j].name = mdp->name;
1189
settings->metrics[j].uname = mdp->uname;
1190
// replace with translated units, if available
1191
if (settings->metrics[j].uunits != "")
1192
settings->metrics[j].uunits = unitsMap.value(settings->metrics[j].uunits,