187 lines
3.9 KiB
QML
187 lines
3.9 KiB
QML
pragma ComponentBehavior: Bound
|
|
|
|
import QtQuick
|
|
import QtQuick.Layouts
|
|
import Quickshell
|
|
import Quickshell.Bluetooth
|
|
import Quickshell.Networking as QSNetwork
|
|
import ZShell.Components
|
|
import ZShell.Config
|
|
import qs.Components
|
|
import qs.Services
|
|
import qs.Helpers
|
|
import qs.Daemons
|
|
import qs.Modules.Settings
|
|
import qs.Modules.Bar.Popouts as BarPopouts
|
|
|
|
CustomRect {
|
|
id: root
|
|
|
|
readonly property bool needExtraRow: quickToggles.length > 6
|
|
required property BarPopouts.Wrapper popouts
|
|
readonly property var quickToggles: {
|
|
const seenIds = new Set();
|
|
|
|
return Config.utilities.quickToggles.values.filter(item => {
|
|
if (!item.enabled)
|
|
return false;
|
|
|
|
if (seenIds.has(item.id)) {
|
|
return false;
|
|
}
|
|
|
|
if (item.id === "bluetooth" && !Bluetooth.defaultAdapter)
|
|
return false;
|
|
|
|
if (item.id === "wifi" && !QSNetwork.Networking.devices.values.some(n => n.type === QSNetwork.DeviceType.Wifi))
|
|
return false;
|
|
|
|
seenIds.add(item.id);
|
|
return true;
|
|
});
|
|
}
|
|
readonly property int splitIndex: Math.ceil(quickToggles.length / 2)
|
|
required property PersistentProperties visibilities
|
|
|
|
color: Colors.tPalette.m3surfaceContainer
|
|
implicitHeight: layout.implicitHeight + Tokens.padding.extraLargeIncreased
|
|
radius: Tokens.rounding.smallest
|
|
|
|
ColumnLayout {
|
|
id: layout
|
|
|
|
anchors.fill: parent
|
|
anchors.margins: Tokens.padding.large
|
|
spacing: Tokens.spacing.normal
|
|
|
|
CustomText {
|
|
font.pointSize: Tokens.font.size.normal
|
|
text: qsTr("Quick Toggles")
|
|
}
|
|
|
|
QuickToggleRow {
|
|
model: root.needExtraRow ? root.quickToggles.slice(0, root.splitIndex) : root.quickToggles
|
|
}
|
|
|
|
QuickToggleRow {
|
|
model: root.needExtraRow ? root.quickToggles.slice(root.splitIndex) : []
|
|
visible: root.needExtraRow
|
|
}
|
|
}
|
|
|
|
component QuickToggleRow: ButtonRow {
|
|
property alias model: repeater.model
|
|
|
|
Layout.fillWidth: true
|
|
spacing: Tokens.spacing.small
|
|
|
|
Repeater {
|
|
id: repeater
|
|
|
|
delegate: DelegateChooser {
|
|
role: "id"
|
|
|
|
DelegateChoice {
|
|
roleValue: "wifi"
|
|
|
|
delegate: Toggle {
|
|
checked: Network.wifiEnabled
|
|
icon: checked ? "wifi" : "wifi_off"
|
|
|
|
onClicked: Network.toggleWifi()
|
|
}
|
|
}
|
|
|
|
DelegateChoice {
|
|
roleValue: "bluetooth"
|
|
|
|
delegate: Toggle {
|
|
checked: Bluetooth.defaultAdapter?.enabled ?? false // qmllint disable unresolved-type
|
|
icon: "bluetooth"
|
|
|
|
onClicked: {
|
|
const adapter = Bluetooth.defaultAdapter; // qmllint disable unresolved-type
|
|
if (adapter)
|
|
adapter.enabled = !adapter.enabled;
|
|
}
|
|
}
|
|
}
|
|
|
|
DelegateChoice {
|
|
roleValue: "mic"
|
|
|
|
delegate: Toggle {
|
|
checked: !Audio.sourceMuted
|
|
icon: checked ? "mic" : "mic_off"
|
|
|
|
onClicked: {
|
|
const audio = Audio.source?.audio;
|
|
if (audio)
|
|
audio.muted = !audio.muted;
|
|
}
|
|
}
|
|
}
|
|
|
|
DelegateChoice {
|
|
roleValue: "audio"
|
|
|
|
delegate: Toggle {
|
|
checked: !Audio.muted
|
|
icon: checked ? "volume_up" : "volume_off"
|
|
|
|
onClicked: {
|
|
const audio = Audio.sink?.audio;
|
|
if (audio)
|
|
audio.muted = !audio.muted;
|
|
}
|
|
}
|
|
}
|
|
|
|
DelegateChoice {
|
|
roleValue: "gameMode"
|
|
|
|
delegate: Toggle {
|
|
checked: GameMode.enabled
|
|
icon: "gamepad"
|
|
|
|
onClicked: GameMode.enabled = !GameMode.enabled
|
|
}
|
|
}
|
|
|
|
DelegateChoice {
|
|
roleValue: "dnd"
|
|
|
|
delegate: Toggle {
|
|
checked: NotifServer.dnd
|
|
icon: "notifications_off"
|
|
|
|
onClicked: NotifServer.dnd = !NotifServer.dnd
|
|
}
|
|
}
|
|
|
|
DelegateChoice {
|
|
roleValue: "settings"
|
|
|
|
delegate: Toggle {
|
|
icon: "settings"
|
|
inactiveOnColor: Colors.palette.m3onSurfaceVariant
|
|
isToggle: false
|
|
|
|
onClicked: {
|
|
root.visibilities.sidebar = false;
|
|
root.visibilities.settings = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
component Toggle: IconButton {
|
|
fillWidth: true
|
|
inactiveColor: Colors.layer(Colors.palette.m3surfaceContainerHighest, 2)
|
|
isRound: true
|
|
isToggle: true
|
|
shapeMorph: true
|
|
}
|
|
}
|