89 lines
2.5 KiB
QML
89 lines
2.5 KiB
QML
import QtQuick
|
|
import QtQuick.Shapes
|
|
import qs.config
|
|
|
|
// The wifi fan, drawn for the same reason as the bluetooth rune: themes ship it
|
|
// symbolic-only, which Qt renders black-on-transparent. Drawing it also lets
|
|
// each arc be lit separately, which is how signal strength is shown.
|
|
Item {
|
|
id: root
|
|
|
|
property color color: Theme.text
|
|
// Unlit arcs stay drawn, faintly, so the glyph keeps one silhouette at
|
|
// every strength instead of changing shape as the signal moves.
|
|
property color dimColor: Theme.textDim
|
|
property int size: Theme.iconSize
|
|
// Lit arcs, 0-3.
|
|
property int level: 3
|
|
// Struck through with a diagonal, for "off".
|
|
property bool struck: false
|
|
|
|
implicitWidth: root.size
|
|
implicitHeight: root.size
|
|
|
|
readonly property real cx: root.size / 2
|
|
readonly property real cy: root.size * 0.74
|
|
readonly property real stroke: Math.max(1.5, root.size * 0.085)
|
|
|
|
Rectangle {
|
|
x: root.cx - width / 2
|
|
y: root.cy - height / 2
|
|
width: Math.max(2, root.size * 0.14)
|
|
height: width
|
|
radius: width / 2
|
|
color: root.level > 0 ? root.color : root.dimColor
|
|
}
|
|
|
|
Repeater {
|
|
model: 3
|
|
|
|
Shape {
|
|
id: arc
|
|
|
|
required property int index
|
|
|
|
anchors.fill: parent
|
|
preferredRendererType: Shape.CurveRenderer
|
|
|
|
ShapePath {
|
|
strokeColor: root.level > arc.index ? root.color : root.dimColor
|
|
strokeWidth: root.stroke
|
|
fillColor: "transparent"
|
|
capStyle: ShapePath.RoundCap
|
|
|
|
// Centred on the dot, opening upwards: 225° to 315°, measured
|
|
// clockwise from three o'clock.
|
|
PathAngleArc {
|
|
centerX: root.cx
|
|
centerY: root.cy
|
|
radiusX: root.size * (0.2 + arc.index * 0.115)
|
|
radiusY: root.size * (0.2 + arc.index * 0.115)
|
|
startAngle: 225
|
|
sweepAngle: 90
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Shape {
|
|
anchors.fill: parent
|
|
visible: root.struck
|
|
preferredRendererType: Shape.CurveRenderer
|
|
|
|
ShapePath {
|
|
strokeColor: root.color
|
|
strokeWidth: root.stroke
|
|
fillColor: "transparent"
|
|
capStyle: ShapePath.RoundCap
|
|
|
|
startX: root.size * 0.12
|
|
startY: root.size * 0.88
|
|
|
|
PathLine {
|
|
x: root.size * 0.88
|
|
y: root.size * 0.12
|
|
}
|
|
}
|
|
}
|
|
}
|