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 "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: { vpn: {
enabled: utilities.vpn.enabled, enabled: utilities.vpn.enabled,
provider: utilities.vpn.provider provider: utilities.vpn.provider
} },
quickToggles: utilities.quickToggles
}; };
} }

View file

@ -32,4 +32,35 @@ JsonObject {
property bool enabled: false property bool enabled: false
property list<var> provider: ["netbird"] 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 var visibilities
required property Item popouts 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 Layout.fillWidth: true
implicitHeight: layout.implicitHeight + Appearance.padding.large * 2 implicitHeight: layout.implicitHeight + Appearance.padding.large * 2
@ -32,64 +56,97 @@ StyledRect {
font.pointSize: Appearance.font.size.normal font.pointSize: Appearance.font.size.normal
} }
RowLayout { ToggleRow {
Layout.alignment: Qt.AlignHCenter rowModel: root.needExtraRow ? root.quickToggles.slice(0, root.splitIndex) : root.quickToggles
spacing: Appearance.spacing.small }
Toggle { ToggleRow {
icon: "wifi" visible: root.needExtraRow
checked: Nmcli.wifiEnabled rowModel: root.needExtraRow ? root.quickToggles.slice(root.splitIndex) : []
onClicked: Nmcli.toggleWifi() }
} }
Toggle { component ToggleRow: RowLayout {
icon: "bluetooth" property var rowModel: []
checked: Bluetooth.defaultAdapter?.enabled ?? false
onClicked: { Layout.fillWidth: true
const adapter = Bluetooth.defaultAdapter; spacing: Appearance.spacing.small
if (adapter)
adapter.enabled = !adapter.enabled; Repeater {
model: parent.rowModel
delegate: DelegateChooser {
role: "id"
DelegateChoice {
roleValue: "wifi"
delegate: Toggle {
icon: "wifi"
checked: Nmcli.wifiEnabled
onClicked: Nmcli.toggleWifi()
}
} }
} DelegateChoice {
roleValue: "bluetooth"
Toggle { delegate: Toggle {
icon: "mic" icon: "bluetooth"
checked: !Audio.sourceMuted checked: Bluetooth.defaultAdapter?.enabled ?? false
onClicked: { onClicked: {
const audio = Audio.source?.audio; const adapter = Bluetooth.defaultAdapter;
if (audio) if (adapter)
audio.muted = !audio.muted; adapter.enabled = !adapter.enabled;
}
}
} }
} DelegateChoice {
roleValue: "mic"
Toggle { delegate: Toggle {
icon: "settings" icon: "mic"
inactiveOnColour: Colours.palette.m3onSurfaceVariant checked: !Audio.sourceMuted
toggle: false onClicked: {
onClicked: { const audio = Audio.source?.audio;
root.visibilities.utilities = false; if (audio)
root.popouts.detach("network"); audio.muted = !audio.muted;
}
}
}
DelegateChoice {
roleValue: "settings"
delegate: Toggle {
icon: "settings"
inactiveOnColour: Colours.palette.m3onSurfaceVariant
toggle: false
onClicked: {
root.visibilities.utilities = false;
root.popouts.detach("network");
}
}
}
DelegateChoice {
roleValue: "gameMode"
delegate: Toggle {
icon: "gamepad"
checked: GameMode.enabled
onClicked: GameMode.enabled = !GameMode.enabled
}
}
DelegateChoice {
roleValue: "dnd"
delegate: Toggle {
icon: "notifications_off"
checked: Notifs.dnd
onClicked: Notifs.dnd = !Notifs.dnd
}
}
DelegateChoice {
roleValue: "vpn"
delegate: Toggle {
icon: "vpn_key"
checked: VPN.connected
enabled: !VPN.connecting
onClicked: VPN.toggle()
}
} }
}
Toggle {
icon: "gamepad"
checked: GameMode.enabled
onClicked: GameMode.enabled = !GameMode.enabled
}
Toggle {
icon: "notifications_off"
checked: Notifs.dnd
onClicked: Notifs.dnd = !Notifs.dnd
}
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()
} }
} }
} }