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
|
/*
* Copyright (C) 2023 Arseniy Movshev <dodoradio@outlook.com>
* 2019 Florent Revest <revestflo@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 3 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, see <http://www.gnu.org/licenses/>.
*/
import QtQuick 2.15
import org.asteroid.controls 1.0
import org.asteroid.health 1.0
import org.asteroid.sensorlogd 1.0
Item {
id: graph
width: parent.width*0.9
anchors.horizontalCenter: parent.horizontalCenter
property var labelsArr: []
property var valueDivisionsInterval: 0
property var valueDivisionsCount: 0
property var startValueDivision: 0
property real valuesDelta: hrGraph.relativeMode ? hrGraph.maxValue - hrGraph.minValue : hrGraph.maxValue
property var timeDivisionsCount: 0
property var timeDivisionsInterval: 0
property var startTimeDivision: 0
property var timeDelta: 0
property var minTimeSeconds: 0
function dataLoadingDone() {
labelsRepeater.model = labelsArr.length
}
Component.onCompleted: { // I am so so sorry about this code.
console.log(typeof hrDataLoader.getTodayData())
hrGraph.loadGraphData(hrDataLoader.getTodayData())
console.log("minValue", hrGraph.minValue, "maxValue",hrGraph.maxValue)
//values divisions
valueDivisionsInterval = valuesDelta >= 50 ? (valuesDelta >= 100 ? 20: 10) : 5
valueDivisionsCount = hrGraph.relativeMode ? (Math.ceil(hrGraph.maxValue/valueDivisionsInterval)) - (Math.ceil(hrGraph.minValue/valueDivisionsInterval)) : Math.ceil(hrGraph.maxValue/valueDivisionsInterval) + 1
startValueDivision = hrGraph.relativeMode ? Math.ceil(hrGraph.minValue/valueDivisionsInterval)*valueDivisionsInterval : 0
//times divisions
minTimeSeconds = dateToDaySecs(hrGraph.minTime)
timeDelta = dateToDaySecs(hrGraph.maxTime) - minTimeSeconds
timeDivisionsCount = Math.floor(timeDelta/3600) // get number of hours and divide
timeDivisionsInterval = timeDivisionsCount > 11 ? 4 : 2
timeDivisionsCount = timeDivisionsCount/timeDivisionsInterval
startTimeDivision = hrGraph.minTime.getHours() + 1
labelsRepeater.model = graph.timeDivisionsCount
}
HrDataLoader { id: hrDataLoader }
Item { // labels column
id: markerParent
width: parent.width/8
anchors {
left: parent.left
top: hrGraph.top
bottom: hrGraph.bottom
topMargin: hrGraph.lineWidth/2
bottomMargin: anchors.topMargin
}
Repeater {
model: graph.valueDivisionsCount
delegate: Label {
anchors.right: parent.right
property real value: graph.startValueDivision + graph.valueDivisionsInterval*index
text: value
font.pixelSize: Dims.w(5)
y: parent.height - (parent.height)*(value/graph.valuesDelta) - height/2
verticalAlignment: Text.AlignVCenter
}
}
}
HeartrateGraph {
id: hrGraph
anchors {
left: markerParent.right
right: parent.right
top: parent.top
bottom: labelsRow.top
}
relativeMode: false
lineWidth: 4
}
Item { //labels row
id: labelsRow
height: Dims.w(5)
anchors {
bottom: parent.bottom
left: hrGraph.left
right: hrGraph.right
rightMargin: hrGraph.lineWidth/2
leftMargin: anchors.rightMargin
}
Repeater {
id: labelsRepeater
model: 0
delegate: Label {
id: dowLabel
// anchors.horizontalCenter: parent.horizontalCenter
horizontalAlignment: Text.AlignHCenter
property var value: graph.startTimeDivision + index*graph.timeDivisionsInterval
text: value + ":00"
x: ((value*3600-graph.minTimeSeconds)/graph.timeDelta)*parent.width
onValueChanged: console.log("value",value, "mintimeseconds", graph.minTimeSeconds, "timeDelta", graph.timeDelta,"x",x,"text",text)
font.pixelSize: Dims.w(5)
}
}
}
function dateToDaySecs(date) {
return (date.getHours()*3600 + date.getMinutes()*60 + date.getSeconds())
}
}
|