diff --git a/modules/bar/components/bluetooth/AvailableDevice.qml b/modules/bar/components/bluetooth/AvailableDevice.qml new file mode 100644 index 0000000..df0c85f --- /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..1e6aad4 100644 --- a/modules/bar/components/bluetooth/BluetoothMenu.qml +++ b/modules/bar/components/bluetooth/BluetoothMenu.qml @@ -23,14 +23,28 @@ StyledPopupWindow { radius: 8 Layout.fillWidth: true RowLayout { - StyledText { - text: "Bluetooth" + RowLayout { + StyledText { + text: "Enabled" + } + + Switch { + checked: Bluetooth.defaultAdapter.enabled + onClicked: Bluetooth.defaultAdapter.enabled = checked + } } - Switch { + RowLayout { Layout.alignment: Qt.AlignRight - checked: Bluetooth.defaultAdapter.enabled - onClicked: Bluetooth.defaultAdapter.enabled = checked + StyledText { + text: "Scan" + } + + Switch { + checked: Bluetooth.defaultAdapter.discovering + onClicked: Bluetooth.defaultAdapter.discovering = true; + + } } } } @@ -76,10 +90,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..ed23fd6 100644 --- a/modules/bar/components/bluetooth/ConnectedDevice.qml +++ b/modules/bar/components/bluetooth/ConnectedDevice.qml @@ -10,7 +10,7 @@ import Quickshell.Bluetooth import Quickshell.Widgets StyledLabel { - id: device + id: root required property BluetoothDevice modelData RowLayout { @@ -19,19 +19,19 @@ StyledLabel { spacing: 8 Loader { - active: modelData.icon != undefined + active: root.modelData?.icon != undefined sourceComponent: IconImage { - implicitSize: 18 - source: Quickshell.iconPath(modelData.icon) + implicitSize: 22 + source: Quickshell.iconPath(root.modelData.icon, "device-support-unknown-symbolic") } } StyledText { - text: device.modelData.deviceName + text: root.modelData.deviceName } Loader { - active: device.modelData.batteryAvailable + active: root.modelData.batteryAvailable sourceComponent: RowLayout { StyledText { id: icon @@ -42,11 +42,11 @@ StyledLabel { states: [ State { name: "full" - when: device.modelData.battery > 0.66 + when: root.modelData.battery > 0.66 }, State { name: "medium" - when: device.modelData.battery > 0.33 + when: root.modelData.battery > 0.33 PropertyChanges { icon { text: Icons.batteryFull @@ -55,7 +55,7 @@ StyledLabel { }, State { name: "low" - when: device.modelData.battery > 0.10 + when: root.modelData.battery > 0.10 PropertyChanges { icon { text: Icons.batteryFull @@ -64,7 +64,7 @@ StyledLabel { }, State { name: "critical" - when: device.modelData.battery > 0.10 + when: root.modelData.battery > 0.10 PropertyChanges { icon { text: Icons.batteryWarning @@ -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 (root.modelData.state != BluetoothDeviceState.Connected) { return; } - modelData.disconnect(); + root.modelData.connected = false; } } } diff --git a/modules/bar/components/bluetooth/PairedDevice.qml b/modules/bar/components/bluetooth/PairedDevice.qml index e50a60c..aa479b3 100644 --- a/modules/bar/components/bluetooth/PairedDevice.qml +++ b/modules/bar/components/bluetooth/PairedDevice.qml @@ -9,7 +9,7 @@ import Quickshell.Bluetooth import Quickshell.Widgets StyledLabel { - id: device + id: root required property BluetoothDevice modelData RowLayout { @@ -18,44 +18,46 @@ StyledLabel { spacing: 8 Loader { - active: modelData.icon != undefined + active: root.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") } } StyledText { - text: device.modelData.deviceName + text: root.modelData.deviceName } RowLayout { Layout.alignment: Qt.AlignRight StyledButton { - hoverEnabled: device.modelData.state == BluetoothDeviceState.Disconnected - color: containsMouse ? Theme.palette.info : Theme.palette.base200 + hoverEnabled: root.modelData.state == BluetoothDeviceState.Disconnected + color: containsMouse ? Theme.palette.primary : Theme.palette.base200 content: StyledText { text: 'Connect' + font.pixelSize: 12 } onClicked: { if (!hoverEnabled) { return; } - device.modelData.connect(); + root.modelData.connect(); } } StyledButton { - hoverEnabled: device.modelData.state == BluetoothDeviceState.Disconnected + hoverEnabled: root.modelData.state == BluetoothDeviceState.Disconnected color: containsMouse ? Theme.palette.error : Theme.palette.base200 content: StyledText { text: 'Unpair' + font.pixelSize: 12 } onClicked: { if (!hoverEnabled) { return; } - device.modelData.forget(); + root.modelData.forget(); } } } 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"