summaryrefslogtreecommitdiff
path: root/components/controls/CircularProgress.qml
diff options
context:
space:
mode:
Diffstat (limited to 'components/controls/CircularProgress.qml')
-rw-r--r--components/controls/CircularProgress.qml72
1 files changed, 72 insertions, 0 deletions
diff --git a/components/controls/CircularProgress.qml b/components/controls/CircularProgress.qml
new file mode 100644
index 0000000..aa0de5c
--- /dev/null
+++ b/components/controls/CircularProgress.qml
@@ -0,0 +1,72 @@
+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: 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 {
+ ColorAnimation {
+ duration: Appearance.anim.durations.large
+ easing.type: Easing.BezierSpline
+ easing.bezierCurve: Appearance.anim.curves.standard
+ }
+ }
+ }
+
+ ShapePath {
+ fillColor: "transparent"
+ strokeColor: root.fgColour
+ strokeWidth: root.strokeWidth
+ capStyle: 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 {
+ ColorAnimation {
+ duration: Appearance.anim.durations.large
+ easing.type: Easing.BezierSpline
+ easing.bezierCurve: Appearance.anim.curves.standard
+ }
+ }
+ }
+}