aboutsummaryrefslogtreecommitdiff
path: root/src/graphs/BarGraph.qml
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)
            }
        }
    }
}