From 53f9899d5ac5fe69f3205acb44044f1881203753 Mon Sep 17 00:00:00 2001 From: Ryan Hughes Date: Wed, 13 May 2026 19:05:26 -0400 Subject: [PATCH] Show discovered devices and shrink bluetooth header buttons - Scan and Manage are now small icon-only buttons in the header beside the On/Off pill, with hover tooltips via the new PillButton.tooltipText prop (backed by QtQuick.Controls ToolTip). - New discoveredDevices list pulls everything in Bluetooth.devices that isn't paired/connected/bonded/trusted. While scanning, those appear under a 'Discovered' header. Click pairs and connects. - Empty-state text only shows when there are no known and no discovered devices, otherwise it would push down real entries. --- .../plugins/bar/common/PillButton.qml | 6 + .../plugins/bar/widgets/bluetoothPanel.qml | 105 ++++++++++++------ 2 files changed, 76 insertions(+), 35 deletions(-) diff --git a/default/quickshell/omarchy-shell/plugins/bar/common/PillButton.qml b/default/quickshell/omarchy-shell/plugins/bar/common/PillButton.qml index 06c009c3..1228c2cb 100644 --- a/default/quickshell/omarchy-shell/plugins/bar/common/PillButton.qml +++ b/default/quickshell/omarchy-shell/plugins/bar/common/PillButton.qml @@ -1,10 +1,12 @@ import QtQuick +import QtQuick.Controls Rectangle { id: root property string text: "" property string iconText: "" + property string tooltipText: "" property color foreground: "#cacccc" property color background: "transparent" property color hoverBackground: Qt.rgba(foreground.r, foreground.g, foreground.b, 0.12) @@ -17,6 +19,10 @@ Rectangle { property bool active: false property color activeBackground: Qt.rgba(foreground.r, foreground.g, foreground.b, 0.18) + ToolTip.visible: tooltipText !== "" && mouseArea.containsMouse + ToolTip.text: tooltipText + ToolTip.delay: 400 + signal clicked() signal rightClicked() diff --git a/default/quickshell/omarchy-shell/plugins/bar/widgets/bluetoothPanel.qml b/default/quickshell/omarchy-shell/plugins/bar/widgets/bluetoothPanel.qml index db7c57eb..166b0ecb 100644 --- a/default/quickshell/omarchy-shell/plugins/bar/widgets/bluetoothPanel.qml +++ b/default/quickshell/omarchy-shell/plugins/bar/widgets/bluetoothPanel.qml @@ -92,48 +92,49 @@ Item { font.bold: true } - Common.PillButton { + Row { anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter - iconText: root.adapter && root.adapter.enabled ? "󰂯" : "󰂲" - text: root.adapter && root.adapter.enabled ? "On" : "Off" - foreground: root.bar.foreground - horizontalPadding: 10 - verticalPadding: 4 - active: root.adapter && root.adapter.enabled - onClicked: if (root.adapter) root.adapter.enabled = !root.adapter.enabled - } - } + spacing: 4 - // Action row: scan toggle and TUI launcher. - Row { - width: parent.width - spacing: 8 + Common.PillButton { + iconText: "󰂳" + tooltipText: !root.adapter ? "" : !root.adapter.enabled ? "Bluetooth is off" + : root.adapter.discovering ? "Stop scanning" : "Scan for devices" + foreground: root.bar.foreground + horizontalPadding: 6 + verticalPadding: 4 + iconSize: 14 + enabled: root.adapter !== null && root.adapter.enabled + opacity: enabled ? 1 : 0.4 + active: root.adapter && root.adapter.discovering + onClicked: if (root.adapter) root.adapter.discovering = !root.adapter.discovering + } - Common.PillButton { - width: (parent.width - parent.spacing) / 2 - iconText: "󰂳" - text: root.adapter && root.adapter.discovering ? "Scanning…" : "Scan" - foreground: root.bar.foreground - horizontalPadding: 10 - verticalPadding: 6 - enabled: root.adapter !== null && root.adapter.enabled - opacity: enabled ? 1 : 0.4 - active: root.adapter && root.adapter.discovering - onClicked: if (root.adapter) root.adapter.discovering = !root.adapter.discovering - } + Common.PillButton { + iconText: "󱁤" + tooltipText: "Open Impala (TUI)" + foreground: root.bar.foreground + horizontalPadding: 6 + verticalPadding: 4 + iconSize: 14 + onClicked: { root.bar.run("omarchy-launch-bluetooth"); root.popupOpen = false } + } - Common.PillButton { - width: (parent.width - parent.spacing) / 2 - iconText: "󱁤" - text: "Manage…" - foreground: root.bar.foreground - horizontalPadding: 10 - verticalPadding: 6 - onClicked: { root.bar.run("omarchy-launch-bluetooth"); root.popupOpen = false } + Common.PillButton { + iconText: root.adapter && root.adapter.enabled ? "󰂯" : "󰂲" + text: root.adapter && root.adapter.enabled ? "On" : "Off" + tooltipText: root.adapter && root.adapter.enabled ? "Turn Bluetooth off" : "Turn Bluetooth on" + foreground: root.bar.foreground + horizontalPadding: 10 + verticalPadding: 4 + active: root.adapter && root.adapter.enabled + onClicked: if (root.adapter) root.adapter.enabled = !root.adapter.enabled + } } } + // Paired / known devices. Repeater { model: root.knownDevices @@ -147,6 +148,8 @@ Item { if (modelData && modelData.batteryAvailable) label += " " + Math.round(modelData.battery * 100) + "%" return label } + tooltipText: modelData && modelData.connected ? "Click to disconnect · right-click to forget" + : "Click to connect · right-click to forget" foreground: root.bar.foreground horizontalPadding: 10 verticalPadding: 6 @@ -161,12 +164,44 @@ Item { } } + // Discovered (unpaired) devices, only shown while scanning. + Text { + visible: root.adapter && root.adapter.discovering && root.discoveredDevices.length > 0 + text: "Discovered" + color: Qt.darker(root.bar.foreground, 1.4) + font.family: root.bar.fontFamily + font.pixelSize: 10 + font.bold: true + } + + Repeater { + model: root.adapter && root.adapter.discovering ? root.discoveredDevices : [] + + Common.PillButton { + required property var modelData + + width: parent.width + iconText: "󰂯" + text: modelData ? (modelData.deviceName || modelData.name || modelData.address || "Unknown") : "" + tooltipText: "Click to pair and connect" + foreground: Qt.darker(root.bar.foreground, 1.2) + horizontalPadding: 10 + verticalPadding: 6 + + onClicked: { + if (!modelData) return + modelData.pair() + } + } + } + Text { visible: root.knownDevices.length === 0 + && (!root.adapter || !root.adapter.discovering || root.discoveredDevices.length === 0) text: !root.adapter ? "No Bluetooth adapter" : !root.adapter.enabled ? "Turn Bluetooth on to scan" : root.adapter.discovering ? "Scanning for devices…" - : "No paired devices. Hit Scan to find new ones." + : "No paired devices. Tap the scan icon to find new ones." color: Qt.darker(root.bar.foreground, 1.5) font.family: root.bar.fontFamily font.pixelSize: 11