summaryrefslogtreecommitdiff
path: root/modules/controlcenter/bluetooth
diff options
context:
space:
mode:
Diffstat (limited to 'modules/controlcenter/bluetooth')
-rw-r--r--modules/controlcenter/bluetooth/BtPane.qml44
-rw-r--r--modules/controlcenter/bluetooth/Details.qml40
-rw-r--r--modules/controlcenter/bluetooth/DeviceList.qml32
-rw-r--r--modules/controlcenter/bluetooth/Settings.qml14
4 files changed, 90 insertions, 40 deletions
diff --git a/modules/controlcenter/bluetooth/BtPane.qml b/modules/controlcenter/bluetooth/BtPane.qml
index 96dc002..8ad4b1f 100644
--- a/modules/controlcenter/bluetooth/BtPane.qml
+++ b/modules/controlcenter/bluetooth/BtPane.qml
@@ -1,6 +1,7 @@
pragma ComponentBehavior: Bound
import ".."
+import qs.components.controls
import qs.components.effects
import qs.components.containers
import qs.config
@@ -19,30 +20,57 @@ RowLayout {
spacing: 0
Item {
+ id: leftBtItem
Layout.preferredWidth: Math.floor(parent.width * 0.4)
Layout.minimumWidth: 420
Layout.fillHeight: true
- DeviceList {
+ ClippingRectangle {
+ id: leftBtClippingRect
anchors.fill: parent
- anchors.margins: Appearance.padding.large + Appearance.padding.normal
- anchors.leftMargin: Appearance.padding.large
- anchors.rightMargin: Appearance.padding.large + Appearance.padding.normal / 2
+ anchors.margins: Appearance.padding.normal
+ anchors.leftMargin: 0
+ anchors.rightMargin: Appearance.padding.normal / 2
+
+ radius: leftBtBorder.innerRadius
+ color: "transparent"
- session: root.session
+ Loader {
+ id: leftBtLoader
+
+ anchors.fill: parent
+ anchors.margins: Appearance.padding.large + Appearance.padding.normal
+ anchors.leftMargin: Appearance.padding.large
+ anchors.rightMargin: Appearance.padding.large + Appearance.padding.normal / 2
+
+ asynchronous: true
+ sourceComponent: btDeviceListComponent
+ }
}
InnerBorder {
+ id: leftBtBorder
leftThickness: 0
rightThickness: Appearance.padding.normal / 2
}
+
+ Component {
+ id: btDeviceListComponent
+
+ DeviceList {
+ anchors.fill: parent
+ session: root.session
+ }
+ }
}
Item {
+ id: rightBtItem
Layout.fillWidth: true
Layout.fillHeight: true
ClippingRectangle {
+ id: btClippingRect
anchors.fill: parent
anchors.margins: Appearance.padding.normal
anchors.leftMargin: 0
@@ -104,14 +132,20 @@ RowLayout {
id: settings
StyledFlickable {
+ id: settingsFlickable
flickableDirection: Flickable.VerticalFlick
contentHeight: settingsInner.height
+ StyledScrollBar.vertical: StyledScrollBar {
+ flickable: settingsFlickable
+ }
+
Settings {
id: settingsInner
anchors.left: parent.left
anchors.right: parent.right
+ anchors.top: parent.top
session: root.session
}
}
diff --git a/modules/controlcenter/bluetooth/Details.qml b/modules/controlcenter/bluetooth/Details.qml
index 104f673..c9d10cd 100644
--- a/modules/controlcenter/bluetooth/Details.qml
+++ b/modules/controlcenter/bluetooth/Details.qml
@@ -12,29 +12,39 @@ import Quickshell.Bluetooth
import QtQuick
import QtQuick.Layouts
-Item {
+StyledFlickable {
id: root
required property Session session
readonly property BluetoothDevice device: session.bt.active
- StyledFlickable {
- anchors.fill: parent
+ flickableDirection: Flickable.VerticalFlick
+ contentHeight: layoutWrapper.height
- flickableDirection: Flickable.VerticalFlick
- contentHeight: layout.height
+ StyledScrollBar.vertical: StyledScrollBar {
+ flickable: root
+ }
- ColumnLayout {
- id: layout
+ Item {
+ id: layoutWrapper
anchors.left: parent.left
anchors.right: parent.right
- spacing: Appearance.spacing.normal
+ anchors.top: parent.top
+ implicitHeight: layout.height
+
+ ColumnLayout {
+ id: layout
+
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.top: parent.top
+ spacing: Appearance.spacing.normal
MaterialIcon {
Layout.alignment: Qt.AlignHCenter
animate: true
- text: Icons.getBluetoothIcon(root.device.icon)
+ text: Icons.getBluetoothIcon(root.device?.icon ?? "")
font.pointSize: Appearance.font.size.extraLarge * 3
font.bold: true
}
@@ -415,8 +425,8 @@ Item {
}
}
}
+ }
}
- }
ColumnLayout {
anchors.right: fabRoot.right
@@ -562,11 +572,11 @@ Item {
Item {
id: fabRoot
- anchors.right: parent.right
- anchors.bottom: parent.bottom
-
- implicitWidth: 64
- implicitHeight: 64
+ x: root.contentX + root.width - width
+ y: root.contentY + root.height - height
+ width: 64
+ height: 64
+ z: 10000
StyledRect {
id: fabBg
diff --git a/modules/controlcenter/bluetooth/DeviceList.qml b/modules/controlcenter/bluetooth/DeviceList.qml
index 3831e4a..06700e8 100644
--- a/modules/controlcenter/bluetooth/DeviceList.qml
+++ b/modules/controlcenter/bluetooth/DeviceList.qml
@@ -25,7 +25,7 @@ ColumnLayout {
spacing: Appearance.spacing.smaller
StyledText {
- text: qsTr("Settings")
+ text: qsTr("Bluetooth")
font.pointSize: Appearance.font.size.large
font.weight: 500
}
@@ -97,7 +97,7 @@ ColumnLayout {
StyledText {
Layout.fillWidth: true
text: qsTr("Devices (%1)").arg(Bluetooth.devices.values.length)
- font.pointSize: Appearance.font.size.large
+ font.pointSize: Appearance.font.size.normal
font.weight: 500
}
@@ -163,11 +163,11 @@ ColumnLayout {
id: device
required property BluetoothDevice modelData
- readonly property bool loading: modelData.state === BluetoothDeviceState.Connecting || modelData.state === BluetoothDeviceState.Disconnecting
- readonly property bool connected: modelData.state === BluetoothDeviceState.Connected
+ readonly property bool loading: modelData && (modelData.state === BluetoothDeviceState.Connecting || modelData.state === BluetoothDeviceState.Disconnecting)
+ readonly property bool connected: modelData && modelData.state === BluetoothDeviceState.Connected
- anchors.left: parent.left
- anchors.right: parent.right
+ anchors.left: view.contentItem.left
+ anchors.right: view.contentItem.right
implicitHeight: deviceInner.implicitHeight + Appearance.padding.normal * 2
color: Qt.alpha(Colours.tPalette.m3surfaceContainer, root.session.bt.active === modelData ? Colours.tPalette.m3surfaceContainer.a : 0)
@@ -177,7 +177,8 @@ ColumnLayout {
id: stateLayer
function onClicked(): void {
- root.session.bt.active = device.modelData;
+ if (device.modelData)
+ root.session.bt.active = device.modelData;
}
}
@@ -194,20 +195,20 @@ ColumnLayout {
implicitHeight: icon.implicitHeight + Appearance.padding.normal * 2
radius: Appearance.rounding.normal
- color: device.connected ? Colours.palette.m3primaryContainer : device.modelData.bonded ? Colours.palette.m3secondaryContainer : Colours.tPalette.m3surfaceContainerHigh
+ color: device.connected ? Colours.palette.m3primaryContainer : (device.modelData && device.modelData.bonded) ? Colours.palette.m3secondaryContainer : Colours.tPalette.m3surfaceContainerHigh
StyledRect {
anchors.fill: parent
radius: parent.radius
- color: Qt.alpha(device.connected ? Colours.palette.m3onPrimaryContainer : device.modelData.bonded ? Colours.palette.m3onSecondaryContainer : Colours.palette.m3onSurface, stateLayer.pressed ? 0.1 : stateLayer.containsMouse ? 0.08 : 0)
+ color: Qt.alpha(device.connected ? Colours.palette.m3onPrimaryContainer : (device.modelData && device.modelData.bonded) ? Colours.palette.m3onSecondaryContainer : Colours.palette.m3onSurface, stateLayer.pressed ? 0.1 : stateLayer.containsMouse ? 0.08 : 0)
}
MaterialIcon {
id: icon
anchors.centerIn: parent
- text: Icons.getBluetoothIcon(device.modelData.icon)
- color: device.connected ? Colours.palette.m3onPrimaryContainer : device.modelData.bonded ? Colours.palette.m3onSecondaryContainer : Colours.palette.m3onSurface
+ text: Icons.getBluetoothIcon(device.modelData ? device.modelData.icon : "")
+ color: device.connected ? Colours.palette.m3onPrimaryContainer : (device.modelData && device.modelData.bonded) ? Colours.palette.m3onSecondaryContainer : Colours.palette.m3onSurface
font.pointSize: Appearance.font.size.large
fill: device.connected ? 1 : 0
@@ -224,13 +225,13 @@ ColumnLayout {
StyledText {
Layout.fillWidth: true
- text: device.modelData.name
+ text: device.modelData ? device.modelData.name : qsTr("Unknown")
elide: Text.ElideRight
}
StyledText {
Layout.fillWidth: true
- text: device.modelData.address + (device.connected ? qsTr(" (Connected)") : device.modelData.bonded ? qsTr(" (Paired)") : "")
+ text: (device.modelData ? device.modelData.address : "") + (device.connected ? qsTr(" (Connected)") : (device.modelData && device.modelData.bonded) ? qsTr(" (Paired)") : "")
color: Colours.palette.m3outline
font.pointSize: Appearance.font.size.small
elide: Text.ElideRight
@@ -256,7 +257,8 @@ ColumnLayout {
disabled: device.loading
function onClicked(): void {
- device.modelData.connected = !device.modelData.connected;
+ if (device.modelData)
+ device.modelData.connected = !device.modelData.connected;
}
}
@@ -265,7 +267,7 @@ ColumnLayout {
anchors.centerIn: parent
animate: true
- text: device.modelData.connected ? "link_off" : "link"
+ text: (device.modelData && device.modelData.connected) ? "link_off" : "link"
color: device.connected ? Colours.palette.m3onPrimaryContainer : Colours.palette.m3onSurface
opacity: device.loading ? 0 : 1
diff --git a/modules/controlcenter/bluetooth/Settings.qml b/modules/controlcenter/bluetooth/Settings.qml
index fb493ff..c8453b6 100644
--- a/modules/controlcenter/bluetooth/Settings.qml
+++ b/modules/controlcenter/bluetooth/Settings.qml
@@ -26,7 +26,7 @@ ColumnLayout {
StyledText {
Layout.alignment: Qt.AlignHCenter
- text: qsTr("Bluetooth settings")
+ text: qsTr("Bluetooth Settings")
font.pointSize: Appearance.font.size.large
font.bold: true
}
@@ -284,8 +284,12 @@ ColumnLayout {
CustomSpinBox {
min: 0
- value: root.session.bt.currentAdapter.discoverableTimeout
- onValueModified: value => root.session.bt.currentAdapter.discoverableTimeout = value
+ value: root.session.bt.currentAdapter?.discoverableTimeout ?? 0
+ onValueModified: value => {
+ if (root.session.bt.currentAdapter) {
+ root.session.bt.currentAdapter.discoverableTimeout = value;
+ }
+ }
}
}
@@ -345,7 +349,7 @@ ColumnLayout {
anchors.top: renameLabel.bottom
anchors.leftMargin: root.session.bt.editingAdapterName ? 0 : -Appearance.padding.normal
- text: root.session.bt.currentAdapter.name
+ text: root.session.bt.currentAdapter?.name ?? ""
readOnly: !root.session.bt.editingAdapterName
onAccepted: {
root.session.bt.editingAdapterName = false;
@@ -392,7 +396,7 @@ ColumnLayout {
function onClicked(): void {
root.session.bt.editingAdapterName = false;
- adapterNameEdit.text = Qt.binding(() => root.session.bt.currentAdapter.name);
+ adapterNameEdit.text = Qt.binding(() => root.session.bt.currentAdapter?.name ?? "");
}
}