-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathfitfactorchartview.cpp
More file actions
104 lines (86 loc) · 2.9 KB
/
Copy pathfitfactorchartview.cpp
File metadata and controls
104 lines (86 loc) · 2.9 KB
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
#include "fitfactorchartview.h"
#include <QLineSeries>
#include <QLogValueAxis>
#include <QValueAxis>
FitFactorChartView::FitFactorChartView(QWidget* const parent)
: QChartView(parent)
, mExerciseCount(8)
, mMaxFFSeen(0)
, mSeriess({new QLineSeries(), new QLineSeries()})
, mXAxis(new QValueAxis())
, mYAxis(new QLogValueAxis())
{
chart()->setTitle("Fit Factor");
chart()->legend()->hide();
mXAxis->setLabelFormat("%d");
mXAxis->setTickType(QValueAxis::TicksDynamic);
mXAxis->setTickInterval(1);
mYAxis->setLabelFormat("%d");
mYAxis->setMax(1000);
mYAxis->setBase(10.0);
mYAxis->setMinorTickCount(-1);
chart()->addSeries(mSeriess[0]);
chart()->addSeries(mSeriess[1]);
chart()->addAxis(mXAxis, Qt::AlignBottom);
chart()->addAxis(mYAxis, Qt::AlignLeft);
for (size_t i = 0; i < 2; i++) {
mSeriess[i]->setPointsVisible(true);
mSeriess[i]->attachAxis(mXAxis);
mSeriess[i]->attachAxis(mYAxis);
}
chart()->setMargins(QMargins(5,5,5,5));
refreshExerciseRange();
refreshBackground();
}
void
FitFactorChartView::setExerciseCount(const qsizetype& count)
{
mExerciseCount = count;
refreshExerciseRange();
}
void
FitFactorChartView::wipeData()
{
mSeriess[0]->removePoints(0, mSeriess[0]->count());
mSeriess[1]->removePoints(0, mSeriess[1]->count());
mMaxFFSeen = 0;
// Do not reset y-axis max: there's no point, and there's a non-zero
// probability that this test will have the same max as the last test (e.g. if
// the subject is repeatedly testing the same specimen).
}
void
FitFactorChartView::refreshExerciseRange()
{
mXAxis->setRange(0.5, mExerciseCount + 0.5);
}
void
FitFactorChartView::refreshBackground()
{
QLinearGradient gradient;
gradient.setStart(0.0, 1.0);
gradient.setFinalStop(0.0, 0.0);
gradient.setCoordinateMode(QGradient::ObjectMode);
auto maxLog = std::log(mYAxis->max());
auto stopMargin = 30;
gradient.setColorAt(std::log(100 - stopMargin) / maxLog, QRgb(0xFFBBBB));
gradient.setColorAt(std::log(100 + stopMargin) / maxLog, QRgb(0xFFFFBB));
gradient.setColorAt(std::log(200 - stopMargin) / maxLog, QRgb(0xFFFFBB));
gradient.setColorAt(std::log(200 + stopMargin) / maxLog, QRgb(0xCCFFCC));
chart()->setPlotAreaBackgroundBrush(gradient);
chart()->setPlotAreaBackgroundVisible(true);
}
void
FitFactorChartView::addDatapoint(const size_t& deviceIndex,
const size_t& exercise,
const double& fitFactor)
{
assert(exercise <
static_cast<size_t>(std::numeric_limits<qsizetype>::max()) + 1 &&
"sorry, FTL doesn't support that many exercises");
mSeriess[deviceIndex]->append(QPoint(exercise + 1, fitFactor));
// Round up to the next whole log as that seems easiest to read.
mMaxFFSeen = std::max(mMaxFFSeen, fitFactor);
auto maxLog = std::log10(mMaxFFSeen);
mYAxis->setMax(std::pow(10.0, std::max(std::floor(maxLog) + 1, 3.0)));
refreshBackground();
}