From 7625a8109baab592b882dce43fea0ff418686296 Mon Sep 17 00:00:00 2001 From: Benjamin Palko Date: Tue, 29 Jul 2025 16:28:47 -0400 Subject: [PATCH] add available devices and fix formatting/icons --- .../components/bluetooth/AvailableDevice.qml | 49 +++++++++++++++++++ .../components/bluetooth/BluetoothMenu.qml | 32 ++++++++---- .../components/bluetooth/ConnectedDevice.qml | 11 +++-- .../bar/components/bluetooth/PairedDevice.qml | 8 +-- services/Bluetooth.qml | 7 +-- shell.qml | 2 + 6 files changed, 89 insertions(+), 20 deletions(-) create mode 100644 modules/bar/components/bluetooth/AvailableDevice.qml diff --git a/modules/bar/components/bluetooth/AvailableDevice.qml b/modules/bar/components/bluetooth/AvailableDevice.qml new file mode 100644 index 0000000..14363b0 --- /dev/null +++ b/modules/bar/components/bluetooth/AvailableDevice.qml @@ -0,0 +1,49 @@ +pragma ComponentBehavior: Bound + +import qs.config +import qs.widgets +import QtQuick +import QtQuick.Layouts +import Quickshell +import Quickshell.Bluetooth +import Quickshell.Widgets + +StyledLabel { + id: root + required property BluetoothDevice modelData + + RowLayout { + id: row + + spacing: 8 + + Loader { + active: root.modelData.icon != undefined + sourceComponent: IconImage { + implicitSize: 22 + source: Quickshell.iconPath(root.modelData.icon, "device-support-unknown-symbolic") + } + } + + StyledText { + text: root.modelData.deviceName + } + + StyledButton { + Layout.alignment: Qt.AlignRight + hoverEnabled: !root.modelData.pairing + color: containsMouse ? Theme.palette.primary : Theme.palette.base200 + content: StyledText { + text: 'Pair' + font.pixelSize: 12 + } + onClicked: { + if (!hoverEnabled) { + return; + } + root.modelData.trusted = true; + root.modelData.pair(); + } + } + } +} diff --git a/modules/bar/components/bluetooth/BluetoothMenu.qml b/modules/bar/components/bluetooth/BluetoothMenu.qml index b85fec6..15e1cce 100644 --- a/modules/bar/components/bluetooth/BluetoothMenu.qml +++ b/modules/bar/components/bluetooth/BluetoothMenu.qml @@ -23,14 +23,26 @@ StyledPopupWindow { radius: 8 Layout.fillWidth: true RowLayout { - StyledText { - text: "Bluetooth" + RowLayout { + StyledText { + text: "Bluetooth" + } + + Switch { + checked: Bluetooth.defaultAdapter.enabled + onClicked: Bluetooth.defaultAdapter.enabled = checked + } } - Switch { + StyledButton { Layout.alignment: Qt.AlignRight - checked: Bluetooth.defaultAdapter.enabled - onClicked: Bluetooth.defaultAdapter.enabled = checked + onClicked: { + Bluetooth.defaultAdapter.discovering = true; + Bluetooth.defaultAdapter.discoverableTimeout = 10; + } + content: StyledText { + text: "Scan" + } } } } @@ -76,10 +88,12 @@ StyledPopupWindow { text: "Available Devices" } - DeviceList { - devices: Bluetooth.availableDevices - onDeviceActivated: device => { - device.pair(); + ColumnLayout { + Repeater { + model: Bluetooth.availableDevices + delegate: AvailableDevice { + Layout.fillWidth: true + } } } } diff --git a/modules/bar/components/bluetooth/ConnectedDevice.qml b/modules/bar/components/bluetooth/ConnectedDevice.qml index c59fa2b..6be9a58 100644 --- a/modules/bar/components/bluetooth/ConnectedDevice.qml +++ b/modules/bar/components/bluetooth/ConnectedDevice.qml @@ -19,10 +19,10 @@ StyledLabel { spacing: 8 Loader { - active: modelData.icon != undefined + active: device.modelData.icon != undefined sourceComponent: IconImage { - implicitSize: 18 - source: Quickshell.iconPath(modelData.icon) + implicitSize: 22 + source: Quickshell.iconPath(device.modelData.icon, "device-support-unknown-symbolic") } } @@ -82,12 +82,13 @@ StyledLabel { color: containsMouse ? Theme.palette.error : Theme.palette.base200 content: StyledText { text: 'Disconnect' + font.pixelSize: 12 } onClicked: { - if (modelData.state != BluetoothDeviceState.Connected) { + if (device.modelData.state != BluetoothDeviceState.Connected) { return; } - modelData.disconnect(); + device.modelData.connected = false; } } } diff --git a/modules/bar/components/bluetooth/PairedDevice.qml b/modules/bar/components/bluetooth/PairedDevice.qml index e50a60c..51be91e 100644 --- a/modules/bar/components/bluetooth/PairedDevice.qml +++ b/modules/bar/components/bluetooth/PairedDevice.qml @@ -20,8 +20,8 @@ StyledLabel { Loader { active: modelData.icon != undefined sourceComponent: IconImage { - implicitSize: 18 - source: Quickshell.iconPath(device.modelData.icon) + implicitSize: 22 + source: Quickshell.iconPath(root.modelData.icon, "device-support-unknown-symbolic") } } @@ -33,9 +33,10 @@ StyledLabel { Layout.alignment: Qt.AlignRight StyledButton { hoverEnabled: device.modelData.state == BluetoothDeviceState.Disconnected - color: containsMouse ? Theme.palette.info : Theme.palette.base200 + color: containsMouse ? Theme.palette.primary : Theme.palette.base200 content: StyledText { text: 'Connect' + font.pixelSize: 12 } onClicked: { if (!hoverEnabled) { @@ -50,6 +51,7 @@ StyledLabel { color: containsMouse ? Theme.palette.error : Theme.palette.base200 content: StyledText { text: 'Unpair' + font.pixelSize: 12 } onClicked: { if (!hoverEnabled) { diff --git a/services/Bluetooth.qml b/services/Bluetooth.qml index d802ac8..65363ed 100644 --- a/services/Bluetooth.qml +++ b/services/Bluetooth.qml @@ -1,5 +1,6 @@ pragma Singleton +import QtQuick import Quickshell import Quickshell.Bluetooth @@ -7,9 +8,9 @@ Singleton { id: root property BluetoothAdapter defaultAdapter: Bluetooth.defaultAdapter - property list connectedDevices: defaultAdapter.devices.values.filter(device => device.connected) - property list pairedDevices: defaultAdapter.devices.values.filter(device => device.paired && !device.connected) - property list availableDevices: defaultAdapter.devices.values.filter(device => !device.paired) + property list connectedDevices: defaultAdapter?.devices.values.filter(device => device.state == BluetoothDeviceState.Connected) + property list pairedDevices: defaultAdapter?.devices.values.filter(device => device.bonded && device.state == BluetoothDeviceState.Disconnected) + property list availableDevices: defaultAdapter?.devices.values.filter(device => !device.bonded && device.deviceName != "") function isConnected(BluetoothDevice: device) { return device.state == BluetoothDeviceState.Connected; diff --git a/shell.qml b/shell.qml index 6d3fd32..6c722f8 100644 --- a/shell.qml +++ b/shell.qml @@ -1,3 +1,5 @@ +//@ pragma IconTheme WhiteSur-dark + import Quickshell import "modules" import "modules/bar"