blob: 96748325f90580b373ca24ecaa49926c4a3bd2f4 (
plain)
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
|
/*
* 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
Item {
id: barGraph
property var valuesArr: []
property var colorsArr: []
property var labelsArr: []
property var maxValue: 0
property real indicatorLineHeight: 0
signal barClicked(index: int)
function dataLoadingDone() {
barsRepeater.model = 0
labelsRepeater.model = 0 // qml doesn't refresh arrays in the same way it does other properties, so this refresh is needed
barsRepeater.model = valuesArr.length
labelsRepeater.model = labelsArr.length
}
VerticalLabels { // labels column
id: markerParent
height: parent.height
width: parent.height*0.1
anchors {
left: parent.left
top: barsRow.top
bottom: barsRow.bottom
}
endValue: barGraph.maxValue
}
Rectangle { // indicator line
id: indicatorLine
height: 1
z: 1
width: barsRepeater.count*(barGraph.width-markerParent.width)/Math.max(barGraph.valuesArr.length,3) - height/2
anchors.left: markerParent.right
y: barsRow.height*(1-(barGraph,indicatorLineHeight/barGraph.maxValue))
visible: barGraph.indicatorLineHeight != 0
}
Row { // bars
id: barsRow
z: 2
anchors {
left: markerParent.right
top: parent.top
bottom: labelsRow.top
}
Repeater {
id: barsRepeater
delegate: MouseArea { //this contains the graph column and positions it correctly
width: (barGraph.width-markerParent.width)/Math.max(barGraph.valuesArr.length,3)
height: parent.height
Rectangle {
id: bar
anchors.bottom: parent.bottom
anchors.horizontalCenter: parent.horizontalCenter
width: parent.width*2/3
radius: width/2
property int value: barGraph.valuesArr[index]
height: (value/barGraph.maxValue)*parent.height
color: barGraph.colorsArr.length > index ? barGraph.colorsArr[index] : "#FFF"
}
onClicked: barGraph.barClicked(index)
}
}
}
Row { //labels row
id: labelsRow
width: childrenRect.height
anchors {
bottom: parent.bottom
left: barsRow.left
right: barsRow.right
}
Repeater {
id: labelsRepeater
delegate: Label {
width: (barGraph.width-markerParent.width)/barGraph.valuesArr.length
id: dowLabel
// anchors.horizontalCenter: parent.horizontalCenter
horizontalAlignment: Text.AlignHCenter
text: barGraph.labelsArr[index]
font.pixelSize: Dims.w(5)
}
}
}
}
|