1 #include <QLocale>
2 #include "data/data.h"
3 #include "heartrategraphitem.h"
4 #include "heartrategraph.h"
5 
6 
HeartRateGraph(QWidget * parent)7 HeartRateGraph::HeartRateGraph(QWidget *parent) : GraphTab(parent)
8 {
9 	_showTracks = true;
10 
11 	GraphView::setYUnits(tr("bpm"));
12 	setYLabel(tr("Heart rate"));
13 
14 	setSliderPrecision(0);
15 }
16 
~HeartRateGraph()17 HeartRateGraph::~HeartRateGraph()
18 {
19 	qDeleteAll(_tracks);
20 }
21 
setInfo()22 void HeartRateGraph::setInfo()
23 {
24 	if (_showTracks) {
25 		QLocale l(QLocale::system());
26 
27 		GraphView::addInfo(tr("Average"), l.toString(avg() * yScale(), 'f',
28 		  0) + UNIT_SPACE + yUnits());
29 		GraphView::addInfo(tr("Maximum"), l.toString(max() * yScale(), 'f',
30 		  0) + UNIT_SPACE + yUnits());
31 	} else
32 		clearInfo();
33 }
34 
loadData(const Data & data)35 QList<GraphItem*> HeartRateGraph::loadData(const Data &data)
36 {
37 	QList<GraphItem*> graphs;
38 
39 	for (int i = 0; i < data.tracks().count(); i++) {
40 		const Track &track = data.tracks().at(i);
41 		const Graph &graph = track.heartRate();
42 
43 		if (!graph.isValid()) {
44 			_palette.nextColor();
45 			graphs.append(0);
46 		} else {
47 			HeartRateGraphItem *gi = new HeartRateGraphItem(graph, _graphType,
48 			  _width, _palette.nextColor());
49 
50 			_tracks.append(gi);
51 			if (_showTracks)
52 				addGraph(gi);
53 
54 			_avg.append(QPointF(track.distance(), gi->avg()));
55 			graphs.append(gi);
56 		}
57 	}
58 
59 	for (int i = 0; i < data.routes().count(); i++) {
60 		_palette.nextColor();
61 		graphs.append(0);
62 	}
63 
64 	for (int i = 0; i < data.areas().count(); i++)
65 		_palette.nextColor();
66 
67 	setInfo();
68 	redraw();
69 
70 	return graphs;
71 }
72 
avg() const73 qreal HeartRateGraph::avg() const
74 {
75 	qreal sum = 0, w = 0;
76 
77 	for (int i = 0; i < _avg.size(); i++) {
78 		const QPointF &p = _avg.at(i);
79 		sum += p.y() * p.x();
80 		w += p.x();
81 	}
82 
83 	return (sum / w);
84 }
85 
clear()86 void HeartRateGraph::clear()
87 {
88 	qDeleteAll(_tracks);
89 	_tracks.clear();
90 
91 	_avg.clear();
92 
93 	GraphTab::clear();
94 }
95 
showTracks(bool show)96 void HeartRateGraph::showTracks(bool show)
97 {
98 	_showTracks = show;
99 
100 	for (int i = 0; i < _tracks.size(); i++) {
101 		if (show)
102 			addGraph(_tracks.at(i));
103 		else
104 			removeGraph(_tracks.at(i));
105 	}
106 
107 	setInfo();
108 
109 	redraw();
110 }
111