1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
/*
* Copyright (c) 2011 Eric Brandt (eric.l.brandt@gmail.com)
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc., 51
* Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "MainWindow.h"
#include "IntervalItem.h"
#include "IntervalSummaryWindow.h"
#include "Settings.h"
#include "TimeUtils.h"
IntervalSummaryWindow::IntervalSummaryWindow(MainWindow *mainWindow) : mainWindow(mainWindow)
{
setWindowTitle(tr("Interval Summary"));
setReadOnly(true);
setFrameStyle(QFrame::NoFrame);
#ifdef Q_OS_MAC
setAttribute(Qt::WA_MacShowFocusRect, 0);
#endif
connect(mainWindow, SIGNAL(intervalSelected()), this, SLOT(intervalSelected()));
}
IntervalSummaryWindow::~IntervalSummaryWindow() {
}
void IntervalSummaryWindow::intervalSelected()
{
// if no ride available don't bother
if (mainWindow->currentRideItem() == NULL || mainWindow->currentRide() == NULL) return;
QString html;
if (mainWindow->allIntervalItems() != NULL) {
for (int i=0; i<mainWindow->allIntervalItems()->childCount(); i++) {
IntervalItem *current = dynamic_cast<IntervalItem*>(mainWindow->allIntervalItems()->child(i));
if (current != NULL) {
if (current->isSelected()) {
calcInterval(current, html);
}
}
}
}
if (html.length() == 0)
html = "<i>" + tr("select an interval for summary info") + "</i>";
setHtml(html);
return;
}
void IntervalSummaryWindow::calcInterval(IntervalItem* interval, QString& html)
{
const RideFile* ride = mainWindow->currentRide();
bool metricUnits = mainWindow->useMetricUnits;
RideFile f(ride->startTime(), ride->recIntSecs());
f.mainwindow = mainWindow;
int start = ride->timeIndex(interval->start);
int end = ride->timeIndex(interval->stop);
for (int i = start; i < end; ++i) {
const RideFilePoint *p = ride->dataPoints()[i];
f.appendPoint(p->secs, p->cad, p->hr, p->km, p->kph, p->nm,
p->watts, p->alt, p->lon, p->lat, p->headwind, p->slope, p->temp, p->lrbalance, 0);
}
if (f.dataPoints().size() == 0) {
// Interval empty, do not compute any metrics
html += "<i>" + tr("empty interval") + "</tr>";
}
QString s;
if (appsettings->contains(GC_SETTINGS_INTERVAL_METRICS))
s = appsettings->value(this, GC_SETTINGS_INTERVAL_METRICS).toString();
else
s = GC_SETTINGS_INTERVAL_METRICS_DEFAULT;
QStringList intervalMetrics = s.split(",");
QHash<QString,RideMetricPtr> metrics =
RideMetric::computeMetrics(mainWindow, &f, mainWindow->zones(), mainWindow->hrZones(), intervalMetrics);
html += "<b>" + interval->text(0) + "</b>";
html += "<table align=\"center\" width=\"90%\" ";
html += "cellspacing=0 border=0>";
foreach (QString symbol, intervalMetrics) {
RideMetricPtr m = metrics.value(symbol);
if (!m) continue;
html += "<tr>";
// left column (names)
html += "<td align=\"right\" valign=\"bottom\">" + m->name() + "</td>";
// right column (values)
QString s("<td align=\"center\">%1</td>");
if (m->units(metricUnits) == "seconds" ||
m->units(metricUnits) == tr("seconds"))
html += s.arg(time_to_string(m->value(metricUnits)));
else if (m->internalName() == "Pace") {
html += s.arg(QTime(0,0,0,0).addSecs(m->value(metricUnits)*60).toString("mm:ss"));
} else
html += s.arg(m->value(metricUnits), 0, 'f', m->precision());
html += "<td align=\"left\" valign=\"bottom\">";
if (m->units(metricUnits) == "seconds" ||
m->units(metricUnits) == tr("seconds"))
; // don't do anything
else if (m->units(metricUnits).size() > 0)
html += m->units(metricUnits);
html += "</td>";
html += "</tr>";
}
html += "</table>";
}
|