From d7024f3d7727ab8670523e36543b20f678e36750 Mon Sep 17 00:00:00 2001 From: Benjamin Palko Date: Sat, 26 Jul 2025 13:39:24 -0400 Subject: [PATCH 1/3] create bluetooth button --- config/Dimensions.qml | 8 ++++++++ constants/Icons.qml | 1 + modules/bar/Bar.qml | 4 ++++ modules/bar/components/Bluetooth.qml | 29 ++++++++++++++++++++++++++++ 4 files changed, 42 insertions(+) create mode 100644 modules/bar/components/Bluetooth.qml diff --git a/config/Dimensions.qml b/config/Dimensions.qml index afaa224..6b3deaf 100644 --- a/config/Dimensions.qml +++ b/config/Dimensions.qml @@ -13,6 +13,7 @@ Singleton { property Clock clock: Clock {} property Pipewire pipewire: Pipewire {} property Network network: Network {} + property Bluetooth bluetooth: Bluetooth {} property Storage storage: Storage {} property Memory memory: Memory {} property Cpu cpu: Cpu {} @@ -62,6 +63,13 @@ Singleton { property int verticalPadding: 6 } + component Bluetooth: QtObject { + property int fontSize: 16 + property int height: 30 + property int horizontalPadding: 8 + property int verticalPadding: 6 + } + component Storage: QtObject { property int iconSize: 14 property int fontSize: 14 diff --git a/constants/Icons.qml b/constants/Icons.qml index f484252..cdfef99 100644 --- a/constants/Icons.qml +++ b/constants/Icons.qml @@ -5,6 +5,7 @@ import Quickshell Singleton { property string bell: "\u{E05d}" property string bellRing: "\u{E224}" + property string bluetooth: "\u{E060}" property string brickWall: "\u{E586}" property string coffee: "\u{E09a}" property string cpu: "\u{E0ad}" diff --git a/modules/bar/Bar.qml b/modules/bar/Bar.qml index 7bd20f8..3cfbb46 100644 --- a/modules/bar/Bar.qml +++ b/modules/bar/Bar.qml @@ -108,6 +108,10 @@ Scope { anchors.verticalCenter: parent.verticalCenter } + Bluetooth { + anchors.verticalCenter: parent.verticalCenter + } + Storage { anchors.verticalCenter: parent.verticalCenter } diff --git a/modules/bar/components/Bluetooth.qml b/modules/bar/components/Bluetooth.qml new file mode 100644 index 0000000..9b4174c --- /dev/null +++ b/modules/bar/components/Bluetooth.qml @@ -0,0 +1,29 @@ +import "../../../config/" +import "../../../constants/" +import "../../../styled/" + +Clickable { + id: clickable + + implicitWidth: text.width + implicitHeight: Dimensions.bluetooth.height + + onClicked: {} + + StyledText { + id: text + + font.family: Theme.lucide.font.family + font.pixelSize: Dimensions.bluetooth.fontSize + font.bold: true + text: Icons.bluetooth + + color: clickable.containsMouse ? Theme.palette.base300 : Theme.palette.basecontent + + anchors.verticalCenter: parent.verticalCenter + topPadding: Dimensions.bluetooth.verticalPadding + bottomPadding: Dimensions.bluetooth.verticalPadding + leftPadding: Dimensions.bluetooth.horizontalPadding + rightPadding: Dimensions.bluetooth.horizontalPadding + } +} From c0125912b1c6780aaad9e92ad24db299a4361a7e Mon Sep 17 00:00:00 2001 From: Benjamin Palko Date: Sat, 26 Jul 2025 13:54:07 -0400 Subject: [PATCH 2/3] move bluetooth and create popup menu --- modules/bar/Bar.qml | 3 +- .../components/{ => bluetooth}/Bluetooth.qml | 22 ++++++++++---- .../components/bluetooth/BluetoothMenu.qml | 30 +++++++++++++++++++ 3 files changed, 48 insertions(+), 7 deletions(-) rename modules/bar/components/{ => bluetooth}/Bluetooth.qml (60%) create mode 100644 modules/bar/components/bluetooth/BluetoothMenu.qml diff --git a/modules/bar/Bar.qml b/modules/bar/Bar.qml index 3cfbb46..66eae2c 100644 --- a/modules/bar/Bar.qml +++ b/modules/bar/Bar.qml @@ -1,10 +1,11 @@ +import qs.config import QtQuick import Quickshell import "components" +import "components/bluetooth" import "components/hyprland" import "components/mpris" import "components/tray" -import "../../config/" Scope { PanelWindow { diff --git a/modules/bar/components/Bluetooth.qml b/modules/bar/components/bluetooth/Bluetooth.qml similarity index 60% rename from modules/bar/components/Bluetooth.qml rename to modules/bar/components/bluetooth/Bluetooth.qml index 9b4174c..b39e7b8 100644 --- a/modules/bar/components/Bluetooth.qml +++ b/modules/bar/components/bluetooth/Bluetooth.qml @@ -1,14 +1,16 @@ -import "../../../config/" -import "../../../constants/" -import "../../../styled/" +import qs.config +import qs.constants +import qs.styled Clickable { - id: clickable + id: root implicitWidth: text.width implicitHeight: Dimensions.bluetooth.height - onClicked: {} + onClicked: { + popup.opened = !popup.opened; + } StyledText { id: text @@ -18,7 +20,7 @@ Clickable { font.bold: true text: Icons.bluetooth - color: clickable.containsMouse ? Theme.palette.base300 : Theme.palette.basecontent + color: root.containsMouse ? Theme.palette.base300 : Theme.palette.basecontent anchors.verticalCenter: parent.verticalCenter topPadding: Dimensions.bluetooth.verticalPadding @@ -26,4 +28,12 @@ Clickable { leftPadding: Dimensions.bluetooth.horizontalPadding rightPadding: Dimensions.bluetooth.horizontalPadding } + + BluetoothMenu { + id: popup + + anchor.item: root + anchor.rect.x: root.width / 2 - width / 2 + anchor.rect.y: root.height + 8 + } } diff --git a/modules/bar/components/bluetooth/BluetoothMenu.qml b/modules/bar/components/bluetooth/BluetoothMenu.qml new file mode 100644 index 0000000..59e102b --- /dev/null +++ b/modules/bar/components/bluetooth/BluetoothMenu.qml @@ -0,0 +1,30 @@ +import qs.config +import qs.styled +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts +import Quickshell.Bluetooth + +StyledPopupWindow { + id: root + + backgroundColor: Theme.palette.base300 + margins: 8 + radius: 8 + + property BluetoothAdapter defaultAdapter: Bluetooth.defaultAdapter + + content: ColumnLayout { + + RowLayout { + StyledText { + text: root.defaultAdapter.name + } + + Switch { + checked: root.defaultAdapter.enabled + onClicked: root.defaultAdapter.enabled = checked + } + } + } +} From 45646b6b5e5b725ae30124d74ed94f377978a01d Mon Sep 17 00:00:00 2001 From: Benjamin Palko Date: Sat, 26 Jul 2025 19:05:09 -0400 Subject: [PATCH 3/3] add bluetooth menu (its fucked my lsp is dying --- constants/Icons.qml | 1 + .../components/bluetooth/BluetoothMenu.qml | 64 ++++++++++++++++--- .../bar/components/bluetooth/DeviceList.qml | 46 +++++++++++++ services/Bluetooth.qml | 21 ++++++ 4 files changed, 122 insertions(+), 10 deletions(-) create mode 100644 modules/bar/components/bluetooth/DeviceList.qml create mode 100644 services/Bluetooth.qml diff --git a/constants/Icons.qml b/constants/Icons.qml index cdfef99..4126c27 100644 --- a/constants/Icons.qml +++ b/constants/Icons.qml @@ -6,6 +6,7 @@ Singleton { property string bell: "\u{E05d}" property string bellRing: "\u{E224}" property string bluetooth: "\u{E060}" + property string bluetoothConnected: "\u{E1b8}" property string brickWall: "\u{E586}" property string coffee: "\u{E09a}" property string cpu: "\u{E0ad}" diff --git a/modules/bar/components/bluetooth/BluetoothMenu.qml b/modules/bar/components/bluetooth/BluetoothMenu.qml index 59e102b..ed896c3 100644 --- a/modules/bar/components/bluetooth/BluetoothMenu.qml +++ b/modules/bar/components/bluetooth/BluetoothMenu.qml @@ -1,29 +1,73 @@ +pragma ComponentBehavior: Bound + import qs.config +import qs.constants +import qs.services import qs.styled import QtQuick import QtQuick.Controls import QtQuick.Layouts -import Quickshell.Bluetooth +import Quickshell.Widgets StyledPopupWindow { id: root backgroundColor: Theme.palette.base300 - margins: 8 + margins: 16 radius: 8 - property BluetoothAdapter defaultAdapter: Bluetooth.defaultAdapter - content: ColumnLayout { + spacing: 8 + WrapperRectangle { + margin: 16 + color: Theme.palette.base200 + radius: 8 + Layout.fillWidth: true + RowLayout { + StyledText { + text: "Bluetooth" + } - RowLayout { - StyledText { - text: root.defaultAdapter.name + Switch { + checked: Bluetooth.defaultAdapter.enabled + onClicked: Bluetooth.defaultAdapter.enabled = checked + } } + } - Switch { - checked: root.defaultAdapter.enabled - onClicked: root.defaultAdapter.enabled = checked + WrapperRectangle { + margin: 16 + color: Theme.palette.base200 + radius: 8 + ColumnLayout { + spacing: 8 + + StyledText { + font.bold: true + text: "Connected Devices" + } + + DeviceList { + devices: Bluetooth.connectedDevices + } + + StyledText { + font.bold: true + text: "Paired Devices" + } + + DeviceList { + devices: Bluetooth.pairedDevices + } + + StyledText { + font.bold: true + text: "Available Devices" + } + + DeviceList { + devices: Bluetooth.availableDevices + } } } } diff --git a/modules/bar/components/bluetooth/DeviceList.qml b/modules/bar/components/bluetooth/DeviceList.qml new file mode 100644 index 0000000..fa21d27 --- /dev/null +++ b/modules/bar/components/bluetooth/DeviceList.qml @@ -0,0 +1,46 @@ +import qs.config +import qs.constants +import qs.services +import qs.styled +import QtQuick +import QtQuick.Layouts + +ColumnLayout { + id: root + required property var devices + + Repeater { + model: devices + delegate: Clickable { + id: device + required property var modelData + + implicitWidth: row.width + implicitHeight: row.height + Layout.fillWidth: true + + RowLayout { + id: row + + StyledText { + topPadding: 8 + bottomPadding: 8 + leftPadding: 8 + text: device.modelData.deviceName + } + StyledText { + font.family: Theme.lucide.font.family + font.pixelSize: 10 + font.bold: true + text: device.modelData.connected ? Icons.bluetoothConnected : Icons.bluetooth + + topPadding: 8 + bottomPadding: 8 + rightPadding: 8 + + color: device.containsMouse ? Theme.palette.base300 : Theme.palette.basecontent + } + } + } + } +} diff --git a/services/Bluetooth.qml b/services/Bluetooth.qml new file mode 100644 index 0000000..0904672 --- /dev/null +++ b/services/Bluetooth.qml @@ -0,0 +1,21 @@ +pragma Singleton + +import Quickshell +import Quickshell.Bluetooth + +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) + property list availableDevices: defaultAdapter.devices.values.filter(device => !device.paired) + + function isConnected(BluetoothDevice: device) { + return device.state == BluetoothDeviceState.Connected; + } + + function isConnecting(BluetoothDevice: device) { + return device.state == BluetoothDeviceState.Connecting; + } +}