utilities: allow disabling and moving toggles + support for extra row (#1181)

* quickToggles: Allow disabling and moving toggles and support for extra row

* edit: README

* splitIndex logic edit

* fix

---------

Co-authored-by: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com>
This commit is contained in:
Ezekiel Gonzales 2026-03-15 16:38:50 +08:00 committed by GitHub
parent 63c86e950b
commit 4c93de1513
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 174 additions and 55 deletions

View file

@ -661,7 +661,37 @@ default, you must create it manually.
"enabled": false
}
]
},
"quickToggles": [
{
"id": "wifi",
"enabled": true
},
{
"id": "bluetooth",
"enabled": true
},
{
"id": "mic",
"enabled": true
},
{
"enabled": true,
"id": "settings"
},
{
"id": "gameMode",
"enabled": true
},
{
"id": "dnd",
"enabled": true
},
{
"id": "vpn",
"enabled": true
}
]
}
}
```

View file

@ -334,7 +334,8 @@ Singleton {
vpn: {
enabled: utilities.vpn.enabled,
provider: utilities.vpn.provider
}
},
quickToggles: utilities.quickToggles
};
}

View file

@ -32,4 +32,35 @@ JsonObject {
property bool enabled: false
property list<var> provider: ["netbird"]
}
property list<var> quickToggles: [
{
id: "wifi",
enabled: true
},
{
id: "bluetooth",
enabled: true
},
{
id: "mic",
enabled: true
},
{
id: "settings",
enabled: true
},
{
id: "gameMode",
enabled: true
},
{
id: "dnd",
enabled: true
},
{
id: "vpn",
enabled: false
}
]
}

View file

@ -14,6 +14,30 @@ StyledRect {
required property var visibilities
required property Item popouts
readonly property var quickToggles: {
const seenIds = new Set();
return Config.utilities.quickToggles.filter(item => {
if (!item.enabled)
return false;
if (seenIds.has(item.id)) {
return false;
}
if (item.id === "vpn") {
return Config.utilities.vpn.provider.some(p =>
typeof p === "object" ? (p.enabled === true) : false
);
}
seenIds.add(item.id);
return true;
});
}
readonly property int splitIndex: Math.ceil(quickToggles.length / 2)
readonly property bool needExtraRow: quickToggles.length > 6
Layout.fillWidth: true
implicitHeight: layout.implicitHeight + Appearance.padding.large * 2
@ -32,17 +56,39 @@ StyledRect {
font.pointSize: Appearance.font.size.normal
}
RowLayout {
Layout.alignment: Qt.AlignHCenter
ToggleRow {
rowModel: root.needExtraRow ? root.quickToggles.slice(0, root.splitIndex) : root.quickToggles
}
ToggleRow {
visible: root.needExtraRow
rowModel: root.needExtraRow ? root.quickToggles.slice(root.splitIndex) : []
}
}
component ToggleRow: RowLayout {
property var rowModel: []
Layout.fillWidth: true
spacing: Appearance.spacing.small
Toggle {
Repeater {
model: parent.rowModel
delegate: DelegateChooser {
role: "id"
DelegateChoice {
roleValue: "wifi"
delegate: Toggle {
icon: "wifi"
checked: Nmcli.wifiEnabled
onClicked: Nmcli.toggleWifi()
}
Toggle {
}
DelegateChoice {
roleValue: "bluetooth"
delegate: Toggle {
icon: "bluetooth"
checked: Bluetooth.defaultAdapter?.enabled ?? false
onClicked: {
@ -51,8 +97,10 @@ StyledRect {
adapter.enabled = !adapter.enabled;
}
}
Toggle {
}
DelegateChoice {
roleValue: "mic"
delegate: Toggle {
icon: "mic"
checked: !Audio.sourceMuted
onClicked: {
@ -61,8 +109,10 @@ StyledRect {
audio.muted = !audio.muted;
}
}
Toggle {
}
DelegateChoice {
roleValue: "settings"
delegate: Toggle {
icon: "settings"
inactiveOnColour: Colours.palette.m3onSurfaceVariant
toggle: false
@ -71,28 +121,35 @@ StyledRect {
root.popouts.detach("network");
}
}
Toggle {
}
DelegateChoice {
roleValue: "gameMode"
delegate: Toggle {
icon: "gamepad"
checked: GameMode.enabled
onClicked: GameMode.enabled = !GameMode.enabled
}
Toggle {
}
DelegateChoice {
roleValue: "dnd"
delegate: Toggle {
icon: "notifications_off"
checked: Notifs.dnd
onClicked: Notifs.dnd = !Notifs.dnd
}
Toggle {
}
DelegateChoice {
roleValue: "vpn"
delegate: Toggle {
icon: "vpn_key"
checked: VPN.connected
enabled: !VPN.connecting
visible: Config.utilities.vpn.provider.some(p => typeof p === "object" ? (p.enabled === true) : false)
onClicked: VPN.toggle()
}
}
}
}
}
component Toggle: IconButton {
Layout.fillWidth: true