summaryrefslogtreecommitdiff
path: root/components/controls/CircularProgress.qml
blob: a15cd900bdb626c42f419ddb898c6a1a53e8e825 (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
import ".."
import qs.services
import qs.config
import QtQuick
import QtQuick.Shapes

Shape {
    id: root

    property real value
    property int startAngle: -90
    property int strokeWidth: Appearance.padding.smaller
    property int padding: 0
    property int spacing: Appearance.spacing.small
    property color fgColour: Colours.palette.m3primary
    property color bgColour: Colours.palette.m3secondaryContainer

    readonly property real size: Math.min(width, height)
    readonly property real arcRadius: (size - padding - strokeWidth) / 2
    readonly property real vValue: value || 1 / 360
    readonly property real gapAngle: ((spacing + strokeWidth) / (arcRadius || 1)) * (180 / Math.PI)

    preferredRendererType: Shape.CurveRenderer
    asynchronous: true

    ShapePath {
        fillColor: "transparent"
        strokeColor: root.bgColour
        strokeWidth: root.strokeWidth
        capStyle: Appearance.rounding.scale === 0 ? ShapePath.SquareCap : ShapePath.RoundCap

        PathAngleArc {
            startAngle: root.startAngle + 360 * root.vValue + root.gapAngle
            sweepAngle: Math.max(-root.gapAngle, 360 * (1 - root.vValue) - root.gapAngle * 2)
            radiusX: root.arcRadius
            radiusY: root.arcRadius
            centerX: root.size / 2
            centerY: root.size / 2
        }

        Behavior on strokeColor {
            CAnim {
                duration: Appearance.anim.durations.large
            }
        }
    }

    ShapePath {
        fillColor: "transparent"
        strokeColor: root.fgColour
        strokeWidth: root.strokeWidth
        capStyle: Appearance.rounding.scale === 0 ? ShapePath.SquareCap : ShapePath.RoundCap

        PathAngleArc {
            startAngle: root.startAngle
            sweepAngle: 360 * root.vValue
            radiusX: root.arcRadius
            radiusY: root.arcRadius
            centerX: root.size / 2
            centerY: root.size / 2
        }

        Behavior on strokeColor {
            CAnim {
                duration: Appearance.anim.durations.large
            }
        }
    }
}