From 6d3ec188e82ec2412970c65eeaff503a17488677 Mon Sep 17 00:00:00 2001 From: Damocles Date: Thu, 16 Apr 2026 00:12:31 +0200 Subject: [PATCH] bluetooth: switch to hover panel, matching network behavior --- modules/Bluetooth.qml | 40 +++++++-------------------------------- modules/BluetoothMenu.qml | 7 +++++-- 2 files changed, 12 insertions(+), 35 deletions(-) diff --git a/modules/Bluetooth.qml b/modules/Bluetooth.qml index 68181dc..f991349 100644 --- a/modules/Bluetooth.qml +++ b/modules/Bluetooth.qml @@ -63,14 +63,6 @@ M.BarSection { onTriggered: proc.running = true } - Process { - id: toggle - property string cmd: "" - command: ["bluetoothctl", "power", cmd] - onRunningChanged: if (!running && cmd !== "") - proc.running = true - } - M.BarIcon { icon: "\uF294" color: root.state === "off" ? M.Theme.base04 : root.accentColor @@ -84,31 +76,13 @@ M.BarSection { required property var bar - TapHandler { - acceptedButtons: Qt.LeftButton - cursorShape: Qt.PointingHandCursor - onTapped: { - menuLoader.active = !menuLoader.active; - M.FlyoutState.visible = false; - } - } + readonly property bool _anyHover: root._hovered || bluetoothMenu.panelHovered - TapHandler { - acceptedButtons: Qt.RightButton - onTapped: { - toggle.cmd = root.state === "off" ? "on" : "off"; - toggle.running = true; - } - } - - LazyLoader { - id: menuLoader - active: false - M.BluetoothMenu { - accentColor: root.accentColor - screen: root.bar.screen - anchorX: root.mapToGlobal(root.width / 2, 0).x - (QsWindow.window?.screen?.x ?? 0) - onDismissed: menuLoader.active = false - } + M.BluetoothMenu { + id: bluetoothMenu + showPanel: root._anyHover + screen: root.bar.screen + anchorItem: root + accentColor: root.accentColor } } diff --git a/modules/BluetoothMenu.qml b/modules/BluetoothMenu.qml index b6b97d3..565baf9 100644 --- a/modules/BluetoothMenu.qml +++ b/modules/BluetoothMenu.qml @@ -6,15 +6,18 @@ import "." as M M.HoverPanel { id: menuWindow - popupMode: true contentWidth: 250 + panelNamespace: "nova-bluetooth" + + onVisibleChanged: if (visible) + scanner.running = true property var _devices: [] property bool _btEnabled: true property Process _scanner: Process { id: scanner - running: true + running: false command: ["sh", "-c", "bluetoothctl show 2>/dev/null | awk '/Powered:/{print $2; exit}';" + "echo '---DEVICES---';" + "bluetoothctl devices Paired 2>/dev/null | while read -r _ mac name; do " + "info=$(bluetoothctl info \"$mac\" 2>/dev/null); " + "conn=$(echo \"$info\" | grep -c 'Connected: yes'); " + "bat=$(echo \"$info\" | awk -F'[(): ]' '/Battery Percentage/{for(i=1;i<=NF;i++) if($i+0==$i && $i!=\"\") print $i}'); " + "echo \"$mac:$conn:${bat:-}:$name\"; " + "done"] stdout: StdioCollector { onStreamFinished: {