Compare commits

...

2 commits

Author SHA1 Message Date
Damocles
5de09fd5e2 stable label widths via minText, increase group glow 2026-04-12 17:10:21 +02:00
Damocles
7ab3b6ef75 bluetooth: show device battery percentage 2026-04-12 17:07:49 +02:00
10 changed files with 28 additions and 5 deletions

View file

@ -66,6 +66,7 @@ M.BarSection {
}
M.BarLabel {
label: root.percent + "%"
minText: "100%"
color: M.Theme.base0A
anchors.verticalCenter: parent.verticalCenter
}

View file

@ -31,7 +31,7 @@ Item {
anchors.fill: shadowSource
shadowEnabled: true
shadowColor: root.borderColor
shadowBlur: 0.6
shadowBlur: 1.0
shadowVerticalOffset: 0
shadowHorizontalOffset: 0
}

View file

@ -6,8 +6,17 @@ Text {
id: root
property string label: ""
property string tooltip: ""
property string minText: ""
text: label
width: minText ? Math.max(implicitWidth, _minMetrics.width) : implicitWidth
TextMetrics {
id: _minMetrics
text: root.minText
font.pixelSize: root.font.pixelSize
font.family: root.font.family
}
color: M.Theme.base05
font.pixelSize: M.Theme.fontSize
font.family: M.Theme.fontFamily

View file

@ -63,6 +63,7 @@ M.BarSection {
}
M.BarLabel {
label: Math.round(root.pct) + "%"
minText: "100%"
color: root._stateColor
opacity: root._blinkOpacity
anchors.verticalCenter: parent.verticalCenter

View file

@ -10,24 +10,31 @@ M.BarSection {
if (root.state === "off")
return "Bluetooth: off";
if (root.state === "connected")
return "Bluetooth: " + root.device;
return "Bluetooth: " + root.device + (root.batteryPct >= 0 ? "\nBattery: " + root.batteryPct + "%" : "");
return "Bluetooth: on";
}
property string state: "unavailable"
property string device: ""
property int batteryPct: -1
function _parse(text) {
const t = text.trim();
const lines = text.trim().split("\n");
const t = lines[0] || "";
const sep = t.indexOf(":");
root.state = sep === -1 ? t : t.slice(0, sep);
root.device = sep === -1 ? "" : t.slice(sep + 1);
root.batteryPct = -1;
for (let i = 1; i < lines.length; i++) {
if (lines[i].startsWith("bat:"))
root.batteryPct = parseInt(lines[i].slice(4)) || -1;
}
}
Process {
id: proc
running: true
command: ["sh", "-c", "s=$(bluetoothctl show 2>/dev/null); " + "[ -z \"$s\" ] && echo unavailable && exit; " + "echo \"$s\" | grep -q 'Powered: yes' || { echo off:; exit; }; " + "d=$(bluetoothctl info 2>/dev/null | awk -F': ' '/\\tName:/{n=$2}/Connected: yes/{c=1}END{if(c)print n}'); " + "[ -n \"$d\" ] && echo \"connected:$d\" || echo on:"]
command: ["sh", "-c", "s=$(bluetoothctl show 2>/dev/null); " + "[ -z \"$s\" ] && echo unavailable && exit; " + "echo \"$s\" | grep -q 'Powered: yes' || { echo off:; exit; }; " + "info=$(bluetoothctl info 2>/dev/null); " + "d=$(echo \"$info\" | awk -F': ' '/\\tName:/{n=$2}/Connected: yes/{c=1}END{if(c)print n}'); " + "[ -n \"$d\" ] && echo \"connected:$d\" || { echo on:; exit; }; " + "bat=$(echo \"$info\" | awk -F': ' '/Battery Percentage.*\\(/{gsub(/[^0-9]/,\"\",$2);print $2}'); " + "[ -n \"$bat\" ] && echo \"bat:$bat\""]
stdout: StdioCollector {
onStreamFinished: root._parse(text)
}
@ -54,7 +61,7 @@ M.BarSection {
}
M.BarLabel {
visible: root.state === "connected"
label: root.device
label: root.device + (root.batteryPct >= 0 ? " " + root.batteryPct + "%" : "")
anchors.verticalCenter: parent.verticalCenter
}

View file

@ -59,6 +59,7 @@ M.BarSection {
}
M.BarLabel {
label: root.usage.toString().padStart(2) + "%@" + root.freqGhz.toFixed(2)
minText: "99%@9.99"
color: M.Theme.base08
anchors.verticalCenter: parent.verticalCenter
}

View file

@ -39,6 +39,7 @@ M.BarSection {
}
M.BarLabel {
label: root.freePct + "% " + root.totalTb.toFixed(1)
minText: "100% 9.9"
color: M.Theme.base08
anchors.verticalCenter: parent.verticalCenter
}

View file

@ -39,6 +39,7 @@ M.BarSection {
}
M.BarLabel {
label: root.percent + "%"
minText: "100%"
color: M.Theme.base08
anchors.verticalCenter: parent.verticalCenter
}

View file

@ -30,6 +30,7 @@ M.BarSection {
}
M.BarLabel {
label: root.celsius + "\u00B0C"
minText: "100\u00B0C"
color: root._stateColor
anchors.verticalCenter: parent.verticalCenter
}

View file

@ -25,6 +25,7 @@ M.BarSection {
}
M.BarLabel {
label: Math.round(root.volume * 100) + "%"
minText: "100%"
color: root.muted ? M.Theme.base04 : M.Theme.base0E
anchors.verticalCenter: parent.verticalCenter
}