summaryrefslogtreecommitdiff
path: root/modules/controlcenter
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2026-01-22 09:02:54 -0500
committerFreya Murphy <freya@freyacat.org>2026-03-16 09:45:27 -0400
commit6d9f0c1526c51ed1bc8102c135aae56a0bc0e1ef (patch)
tree9c77312e5a873647d3540331413dbe691e6768f2 /modules/controlcenter
parentremove lockscreen (diff)
downloadcaelestia-shell-6d9f0c1526c51ed1bc8102c135aae56a0bc0e1ef.tar.gz
caelestia-shell-6d9f0c1526c51ed1bc8102c135aae56a0bc0e1ef.tar.bz2
caelestia-shell-6d9f0c1526c51ed1bc8102c135aae56a0bc0e1ef.zip
fix rebase
Diffstat (limited to 'modules/controlcenter')
-rw-r--r--modules/controlcenter/network/NetworkSettings.qml72
-rw-r--r--modules/controlcenter/network/NetworkingPane.qml68
-rw-r--r--modules/controlcenter/network/VpnDetails.qml396
-rw-r--r--modules/controlcenter/network/VpnList.qml686
-rw-r--r--modules/controlcenter/network/VpnSettings.qml232
-rw-r--r--modules/controlcenter/state/VpnState.qml5
-rw-r--r--modules/controlcenter/taskbar/TaskbarPane.qml757
7 files changed, 2 insertions, 2214 deletions
diff --git a/modules/controlcenter/network/NetworkSettings.qml b/modules/controlcenter/network/NetworkSettings.qml
index bda7cb1..69f4e63 100644
--- a/modules/controlcenter/network/NetworkSettings.qml
+++ b/modules/controlcenter/network/NetworkSettings.qml
@@ -63,45 +63,6 @@ ColumnLayout {
SectionHeader {
Layout.topMargin: Appearance.spacing.large
- title: qsTr("VPN")
- description: qsTr("VPN provider settings")
- visible: Config.utilities.vpn.enabled || Config.utilities.vpn.provider.length > 0
- }
-
- SectionContainer {
- visible: Config.utilities.vpn.enabled || Config.utilities.vpn.provider.length > 0
-
- ToggleRow {
- label: qsTr("VPN enabled")
- checked: Config.utilities.vpn.enabled
- toggle.onToggled: {
- Config.utilities.vpn.enabled = checked;
- Config.save();
- }
- }
-
- PropertyRow {
- showTopMargin: true
- label: qsTr("Providers")
- value: qsTr("%1").arg(Config.utilities.vpn.provider.length)
- }
-
- TextButton {
- Layout.fillWidth: true
- Layout.topMargin: Appearance.spacing.normal
- Layout.minimumHeight: Appearance.font.size.normal + Appearance.padding.normal * 2
- text: qsTr("⚙ Manage VPN Providers")
- inactiveColour: Colours.palette.m3secondaryContainer
- inactiveOnColour: Colours.palette.m3onSecondaryContainer
-
- onClicked: {
- vpnSettingsDialog.open();
- }
- }
- }
-
- SectionHeader {
- Layout.topMargin: Appearance.spacing.large
title: qsTr("Current connection")
description: qsTr("Active network connection information")
}
@@ -135,37 +96,4 @@ ColumnLayout {
value: Nmcli.active ? qsTr("%1 MHz").arg(Nmcli.active.frequency) : qsTr("N/A")
}
}
-
- Popup {
- id: vpnSettingsDialog
-
- parent: Overlay.overlay
- anchors.centerIn: parent
- width: Math.min(600, parent.width - Appearance.padding.large * 2)
- height: Math.min(700, parent.height - Appearance.padding.large * 2)
-
- modal: true
- closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
-
- background: StyledRect {
- color: Colours.palette.m3surface
- radius: Appearance.rounding.large
- }
-
- StyledFlickable {
- anchors.fill: parent
- anchors.margins: Appearance.padding.large * 1.5
- flickableDirection: Flickable.VerticalFlick
- contentHeight: vpnSettingsContent.height
- clip: true
-
- VpnSettings {
- id: vpnSettingsContent
-
- anchors.left: parent.left
- anchors.right: parent.right
- session: root.session
- }
- }
- }
}
diff --git a/modules/controlcenter/network/NetworkingPane.qml b/modules/controlcenter/network/NetworkingPane.qml
index 26cdbfa..c32fbb7 100644
--- a/modules/controlcenter/network/NetworkingPane.qml
+++ b/modules/controlcenter/network/NetworkingPane.qml
@@ -112,24 +112,6 @@ Item {
}
CollapsibleSection {
- id: vpnListSection
-
- Layout.fillWidth: true
- title: qsTr("VPN")
- expanded: true
-
- Loader {
- Layout.fillWidth: true
- sourceComponent: Component {
- VpnList {
- session: root.session
- showHeader: false
- }
- }
- }
- }
-
- CollapsibleSection {
id: ethernetListSection
Layout.fillWidth: true
@@ -172,17 +154,14 @@ Item {
Item {
id: rightPaneItem
- property var vpnPane: root.session && root.session.vpn ? root.session.vpn.active : null
property var ethernetPane: root.session && root.session.ethernet ? root.session.ethernet.active : null
property var wirelessPane: root.session && root.session.network ? root.session.network.active : null
- property var pane: vpnPane || ethernetPane || wirelessPane
- property string paneId: vpnPane ? ("vpn:" + (vpnPane.name || "")) : (ethernetPane ? ("eth:" + (ethernetPane.interface || "")) : (wirelessPane ? ("wifi:" + (wirelessPane.ssid || wirelessPane.bssid || "")) : "settings"))
+ property var pane: ethernetPane || wirelessPane
+ property string paneId: ethernetPane ? ("eth:" + (ethernetPane.interface || "")) : (wirelessPane ? ("wifi:" + (wirelessPane.ssid || wirelessPane.bssid || "")) : "settings")
property Component targetComponent: settingsComponent
property Component nextComponent: settingsComponent
function getComponentForPane() {
- if (vpnPane)
- return vpnDetailsComponent;
if (ethernetPane)
return ethernetDetailsComponent;
if (wirelessPane)
@@ -196,30 +175,12 @@ Item {
}
Connections {
- target: root.session && root.session.vpn ? root.session.vpn : null
- enabled: target !== null
-
- function onActiveChanged() {
- // Clear others when VPN is selected
- if (root.session && root.session.vpn && root.session.vpn.active) {
- if (root.session.ethernet && root.session.ethernet.active)
- root.session.ethernet.active = null;
- if (root.session.network && root.session.network.active)
- root.session.network.active = null;
- }
- rightPaneItem.nextComponent = rightPaneItem.getComponentForPane();
- }
- }
-
- Connections {
target: root.session && root.session.ethernet ? root.session.ethernet : null
enabled: target !== null
function onActiveChanged() {
// Clear others when ethernet is selected
if (root.session && root.session.ethernet && root.session.ethernet.active) {
- if (root.session.vpn && root.session.vpn.active)
- root.session.vpn.active = null;
if (root.session.network && root.session.network.active)
root.session.network.active = null;
}
@@ -234,8 +195,6 @@ Item {
function onActiveChanged() {
// Clear others when wireless is selected
if (root.session && root.session.network && root.session.network.active) {
- if (root.session.vpn && root.session.vpn.active)
- root.session.vpn.active = null;
if (root.session.ethernet && root.session.ethernet.active)
root.session.ethernet.active = null;
}
@@ -342,29 +301,6 @@ Item {
}
}
- Component {
- id: vpnDetailsComponent
-
- StyledFlickable {
- id: vpnFlickable
- flickableDirection: Flickable.VerticalFlick
- contentHeight: vpnDetailsInner.height
-
- StyledScrollBar.vertical: StyledScrollBar {
- flickable: vpnFlickable
- }
-
- VpnDetails {
- id: vpnDetailsInner
-
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.top: parent.top
- session: root.session
- }
- }
- }
-
WirelessPasswordDialog {
anchors.fill: parent
session: root.session
diff --git a/modules/controlcenter/network/VpnDetails.qml b/modules/controlcenter/network/VpnDetails.qml
deleted file mode 100644
index 1c71cd7..0000000
--- a/modules/controlcenter/network/VpnDetails.qml
+++ /dev/null
@@ -1,396 +0,0 @@
-pragma ComponentBehavior: Bound
-
-import ".."
-import "../components"
-import qs.components
-import qs.components.controls
-import qs.components.effects
-import qs.components.containers
-import qs.services
-import qs.config
-import qs.utils
-import QtQuick
-import QtQuick.Controls
-import QtQuick.Layouts
-
-DeviceDetails {
- id: root
-
- required property Session session
- readonly property var vpnProvider: root.session.vpn.active
- readonly property bool providerEnabled: {
- if (!vpnProvider || vpnProvider.index === undefined)
- return false;
- const provider = Config.utilities.vpn.provider[vpnProvider.index];
- return provider && typeof provider === "object" && provider.enabled === true;
- }
-
- device: vpnProvider
-
- headerComponent: Component {
- ConnectionHeader {
- icon: "vpn_key"
- title: root.vpnProvider?.displayName ?? qsTr("Unknown")
- }
- }
-
- sections: [
- Component {
- ColumnLayout {
- spacing: Appearance.spacing.normal
-
- SectionHeader {
- title: qsTr("Connection status")
- description: qsTr("VPN connection settings")
- }
-
- SectionContainer {
- ToggleRow {
- label: qsTr("Enable this provider")
- checked: root.providerEnabled
- toggle.onToggled: {
- if (!root.vpnProvider)
- return;
- const providers = [];
- const index = root.vpnProvider.index;
-
- // Copy providers and update enabled state
- for (let i = 0; i < Config.utilities.vpn.provider.length; i++) {
- const p = Config.utilities.vpn.provider[i];
- if (typeof p === "object") {
- const newProvider = {
- name: p.name,
- displayName: p.displayName,
- interface: p.interface
- };
-
- if (checked) {
- // Enable this one, disable others
- newProvider.enabled = (i === index);
- } else {
- // Just disable this one
- newProvider.enabled = (i === index) ? false : (p.enabled !== false);
- }
-
- providers.push(newProvider);
- } else {
- providers.push(p);
- }
- }
-
- Config.utilities.vpn.provider = providers;
- Config.save();
- }
- }
-
- RowLayout {
- Layout.fillWidth: true
- Layout.topMargin: Appearance.spacing.normal
- spacing: Appearance.spacing.normal
-
- TextButton {
- Layout.fillWidth: true
- Layout.minimumHeight: Appearance.font.size.normal + Appearance.padding.normal * 2
- visible: root.providerEnabled
- enabled: !VPN.connecting
- inactiveColour: Colours.palette.m3primaryContainer
- inactiveOnColour: Colours.palette.m3onPrimaryContainer
- text: VPN.connected ? qsTr("Disconnect") : qsTr("Connect")
-
- onClicked: {
- VPN.toggle();
- }
- }
-
- TextButton {
- Layout.fillWidth: true
- text: qsTr("Edit Provider")
- inactiveColour: Colours.palette.m3secondaryContainer
- inactiveOnColour: Colours.palette.m3onSecondaryContainer
-
- onClicked: {
- editVpnDialog.editIndex = root.vpnProvider.index;
- editVpnDialog.providerName = root.vpnProvider.name;
- editVpnDialog.displayName = root.vpnProvider.displayName;
- editVpnDialog.interfaceName = root.vpnProvider.interface;
- editVpnDialog.open();
- }
- }
-
- TextButton {
- Layout.fillWidth: true
- text: qsTr("Delete Provider")
- inactiveColour: Colours.palette.m3errorContainer
- inactiveOnColour: Colours.palette.m3onErrorContainer
-
- onClicked: {
- const providers = [];
- for (let i = 0; i < Config.utilities.vpn.provider.length; i++) {
- if (i !== root.vpnProvider.index) {
- providers.push(Config.utilities.vpn.provider[i]);
- }
- }
- Config.utilities.vpn.provider = providers;
- Config.save();
- root.session.vpn.active = null;
- }
- }
- }
- }
- }
- },
- Component {
- ColumnLayout {
- spacing: Appearance.spacing.normal
-
- SectionHeader {
- title: qsTr("Provider details")
- description: qsTr("VPN provider information")
- }
-
- SectionContainer {
- contentSpacing: Appearance.spacing.small / 2
-
- PropertyRow {
- label: qsTr("Provider")
- value: root.vpnProvider?.name ?? qsTr("Unknown")
- }
-
- PropertyRow {
- showTopMargin: true
- label: qsTr("Display name")
- value: root.vpnProvider?.displayName ?? qsTr("Unknown")
- }
-
- PropertyRow {
- showTopMargin: true
- label: qsTr("Interface")
- value: root.vpnProvider?.interface || qsTr("N/A")
- }
-
- PropertyRow {
- showTopMargin: true
- label: qsTr("Status")
- value: {
- if (!root.providerEnabled)
- return qsTr("Disabled");
- if (VPN.connecting)
- return qsTr("Connecting...");
- if (VPN.connected)
- return qsTr("Connected");
- return qsTr("Enabled (Not connected)");
- }
- }
-
- PropertyRow {
- showTopMargin: true
- label: qsTr("Enabled")
- value: root.providerEnabled ? qsTr("Yes") : qsTr("No")
- }
- }
- }
- }
- ]
-
- // Edit VPN Dialog
- Popup {
- id: editVpnDialog
-
- property int editIndex: -1
- property string providerName: ""
- property string displayName: ""
- property string interfaceName: ""
-
- parent: Overlay.overlay
- anchors.centerIn: parent
- width: Math.min(400, parent.width - Appearance.padding.large * 2)
- padding: Appearance.padding.large * 1.5
-
- modal: true
- closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
-
- opacity: 0
- scale: 0.7
-
- enter: Transition {
- Anim {
- property: "opacity"
- from: 0
- to: 1
- duration: Appearance.anim.durations.expressiveFastSpatial
- easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial
- }
- Anim {
- property: "scale"
- from: 0.7
- to: 1
- duration: Appearance.anim.durations.expressiveFastSpatial
- easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial
- }
- }
-
- exit: Transition {
- Anim {
- property: "opacity"
- from: 1
- to: 0
- duration: Appearance.anim.durations.expressiveFastSpatial
- easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial
- }
- Anim {
- property: "scale"
- from: 1
- to: 0.7
- duration: Appearance.anim.durations.expressiveFastSpatial
- easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial
- }
- }
-
- function closeWithAnimation(): void {
- close();
- }
-
- Overlay.modal: Rectangle {
- color: Qt.rgba(0, 0, 0, 0.4 * editVpnDialog.opacity)
- }
-
- background: StyledRect {
- color: Colours.palette.m3surfaceContainerHigh
- radius: Appearance.rounding.large
-
- Elevation {
- anchors.fill: parent
- radius: parent.radius
- level: 3
- z: -1
- }
- }
-
- contentItem: ColumnLayout {
- spacing: Appearance.spacing.normal
-
- StyledText {
- text: qsTr("Edit VPN Provider")
- font.pointSize: Appearance.font.size.large
- font.weight: 500
- }
-
- ColumnLayout {
- Layout.fillWidth: true
- spacing: Appearance.spacing.smaller / 2
-
- StyledText {
- text: qsTr("Display Name")
- font.pointSize: Appearance.font.size.small
- color: Colours.palette.m3onSurfaceVariant
- }
-
- StyledRect {
- Layout.fillWidth: true
- implicitHeight: 40
- color: displayNameField.activeFocus ? Colours.layer(Colours.palette.m3surfaceContainer, 3) : Colours.layer(Colours.palette.m3surfaceContainer, 2)
- radius: Appearance.rounding.small
- border.width: 1
- border.color: displayNameField.activeFocus ? Colours.palette.m3primary : Qt.alpha(Colours.palette.m3outline, 0.3)
-
- Behavior on color {
- CAnim {}
- }
- Behavior on border.color {
- CAnim {}
- }
-
- StyledTextField {
- id: displayNameField
- anchors.centerIn: parent
- width: parent.width - Appearance.padding.normal
- horizontalAlignment: TextInput.AlignLeft
- text: editVpnDialog.displayName
- onTextChanged: editVpnDialog.displayName = text
- }
- }
- }
-
- ColumnLayout {
- Layout.fillWidth: true
- spacing: Appearance.spacing.smaller / 2
-
- StyledText {
- text: qsTr("Interface (e.g., wg0, torguard)")
- font.pointSize: Appearance.font.size.small
- color: Colours.palette.m3onSurfaceVariant
- }
-
- StyledRect {
- Layout.fillWidth: true
- implicitHeight: 40
- color: interfaceNameField.activeFocus ? Colours.layer(Colours.palette.m3surfaceContainer, 3) : Colours.layer(Colours.palette.m3surfaceContainer, 2)
- radius: Appearance.rounding.small
- border.width: 1
- border.color: interfaceNameField.activeFocus ? Colours.palette.m3primary : Qt.alpha(Colours.palette.m3outline, 0.3)
-
- Behavior on color {
- CAnim {}
- }
- Behavior on border.color {
- CAnim {}
- }
-
- StyledTextField {
- id: interfaceNameField
- anchors.centerIn: parent
- width: parent.width - Appearance.padding.normal
- horizontalAlignment: TextInput.AlignLeft
- text: editVpnDialog.interfaceName
- onTextChanged: editVpnDialog.interfaceName = text
- }
- }
- }
-
- RowLayout {
- Layout.topMargin: Appearance.spacing.normal
- Layout.fillWidth: true
- spacing: Appearance.spacing.normal
-
- TextButton {
- Layout.fillWidth: true
- text: qsTr("Cancel")
- inactiveColour: Colours.tPalette.m3surfaceContainerHigh
- inactiveOnColour: Colours.palette.m3onSurface
- onClicked: editVpnDialog.closeWithAnimation()
- }
-
- TextButton {
- Layout.fillWidth: true
- text: qsTr("Save")
- enabled: editVpnDialog.interfaceName.length > 0
- inactiveColour: Colours.palette.m3primaryContainer
- inactiveOnColour: Colours.palette.m3onPrimaryContainer
-
- onClicked: {
- const providers = [];
- const oldProvider = Config.utilities.vpn.provider[editVpnDialog.editIndex];
- const wasEnabled = typeof oldProvider === "object" ? (oldProvider.enabled !== false) : true;
-
- for (let i = 0; i < Config.utilities.vpn.provider.length; i++) {
- if (i === editVpnDialog.editIndex) {
- providers.push({
- name: editVpnDialog.providerName,
- displayName: editVpnDialog.displayName || editVpnDialog.interfaceName,
- interface: editVpnDialog.interfaceName,
- enabled: wasEnabled
- });
- } else {
- providers.push(Config.utilities.vpn.provider[i]);
- }
- }
-
- Config.utilities.vpn.provider = providers;
- Config.save();
- editVpnDialog.closeWithAnimation();
- }
- }
- }
- }
- }
-}
diff --git a/modules/controlcenter/network/VpnList.qml b/modules/controlcenter/network/VpnList.qml
deleted file mode 100644
index 81f4a45..0000000
--- a/modules/controlcenter/network/VpnList.qml
+++ /dev/null
@@ -1,686 +0,0 @@
-pragma ComponentBehavior: Bound
-
-import ".."
-import qs.components
-import qs.components.controls
-import qs.components.effects
-import qs.services
-import qs.config
-import Quickshell
-import QtQuick
-import QtQuick.Controls
-import QtQuick.Layouts
-
-ColumnLayout {
- id: root
-
- required property Session session
- property bool showHeader: true
- property int pendingSwitchIndex: -1
-
- spacing: Appearance.spacing.normal
-
- Connections {
- target: VPN
- function onConnectedChanged() {
- if (!VPN.connected && root.pendingSwitchIndex >= 0) {
- const targetIndex = root.pendingSwitchIndex;
- root.pendingSwitchIndex = -1;
-
- const providers = [];
- for (let i = 0; i < Config.utilities.vpn.provider.length; i++) {
- const p = Config.utilities.vpn.provider[i];
- if (typeof p === "object") {
- const newProvider = {
- name: p.name,
- displayName: p.displayName,
- interface: p.interface,
- enabled: (i === targetIndex)
- };
- providers.push(newProvider);
- } else {
- providers.push(p);
- }
- }
- Config.utilities.vpn.provider = providers;
- Config.save();
-
- Qt.callLater(function () {
- VPN.toggle();
- });
- }
- }
- }
-
- TextButton {
- Layout.fillWidth: true
- text: qsTr("+ Add VPN Provider")
- inactiveColour: Colours.palette.m3primaryContainer
- inactiveOnColour: Colours.palette.m3onPrimaryContainer
-
- onClicked: {
- vpnDialog.showProviderSelection();
- }
- }
-
- ListView {
- id: listView
-
- Layout.fillWidth: true
- Layout.preferredHeight: contentHeight
-
- interactive: false
- spacing: Appearance.spacing.smaller
-
- model: ScriptModel {
- values: Config.utilities.vpn.provider.map((provider, index) => {
- const isObject = typeof provider === "object";
- const name = isObject ? (provider.name || "custom") : String(provider);
- const displayName = isObject ? (provider.displayName || name) : name;
- const iface = isObject ? (provider.interface || "") : "";
- const enabled = isObject ? (provider.enabled === true) : false;
-
- return {
- index: index,
- name: name,
- displayName: displayName,
- interface: iface,
- provider: provider,
- enabled: enabled
- };
- })
- }
-
- delegate: Component {
- StyledRect {
- required property var modelData
- required property int index
-
- width: ListView.view ? ListView.view.width : undefined
-
- color: Qt.alpha(Colours.tPalette.m3surfaceContainer, (root.session && root.session.vpn && root.session.vpn.active === modelData) ? Colours.tPalette.m3surfaceContainer.a : 0)
- radius: Appearance.rounding.normal
-
- StateLayer {
- function onClicked(): void {
- if (root.session && root.session.vpn) {
- root.session.vpn.active = modelData;
- }
- }
- }
-
- RowLayout {
- id: rowLayout
-
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.verticalCenter: parent.verticalCenter
- anchors.margins: Appearance.padding.normal
-
- spacing: Appearance.spacing.normal
-
- StyledRect {
- implicitWidth: implicitHeight
- implicitHeight: icon.implicitHeight + Appearance.padding.normal * 2
-
- radius: Appearance.rounding.normal
- color: modelData.enabled && VPN.connected ? Colours.palette.m3primaryContainer : Colours.tPalette.m3surfaceContainerHigh
-
- MaterialIcon {
- id: icon
-
- anchors.centerIn: parent
- text: modelData.enabled && VPN.connected ? "vpn_key" : "vpn_key_off"
- font.pointSize: Appearance.font.size.large
- fill: modelData.enabled && VPN.connected ? 1 : 0
- color: modelData.enabled && VPN.connected ? Colours.palette.m3onPrimaryContainer : Colours.palette.m3onSurface
- }
- }
-
- ColumnLayout {
- Layout.fillWidth: true
-
- spacing: 0
-
- StyledText {
- Layout.fillWidth: true
- elide: Text.ElideRight
- maximumLineCount: 1
-
- text: modelData.displayName || qsTr("Unknown")
- }
-
- RowLayout {
- Layout.fillWidth: true
- spacing: Appearance.spacing.smaller
-
- StyledText {
- Layout.fillWidth: true
- text: {
- if (modelData.enabled && VPN.connected)
- return qsTr("Connected");
- if (modelData.enabled && VPN.connecting)
- return qsTr("Connecting...");
- if (modelData.enabled)
- return qsTr("Enabled");
- return qsTr("Disabled");
- }
- color: modelData.enabled ? (VPN.connected ? Colours.palette.m3primary : Colours.palette.m3onSurface) : Colours.palette.m3outline
- font.pointSize: Appearance.font.size.small
- font.weight: modelData.enabled && VPN.connected ? 500 : 400
- elide: Text.ElideRight
- }
- }
- }
-
- StyledRect {
- implicitWidth: implicitHeight
- implicitHeight: connectIcon.implicitHeight + Appearance.padding.smaller * 2
-
- radius: Appearance.rounding.full
- color: Qt.alpha(Colours.palette.m3primaryContainer, VPN.connected && modelData.enabled ? 1 : 0)
-
- StateLayer {
- enabled: !VPN.connecting
- function onClicked(): void {
- const clickedIndex = modelData.index;
-
- if (modelData.enabled) {
- VPN.toggle();
- } else {
- if (VPN.connected) {
- root.pendingSwitchIndex = clickedIndex;
- VPN.toggle();
- } else {
- const providers = [];
- for (let i = 0; i < Config.utilities.vpn.provider.length; i++) {
- const p = Config.utilities.vpn.provider[i];
- if (typeof p === "object") {
- const newProvider = {
- name: p.name,
- displayName: p.displayName,
- interface: p.interface,
- enabled: (i === clickedIndex)
- };
- providers.push(newProvider);
- } else {
- providers.push(p);
- }
- }
- Config.utilities.vpn.provider = providers;
- Config.save();
-
- Qt.callLater(function () {
- VPN.toggle();
- });
- }
- }
- }
- }
-
- MaterialIcon {
- id: connectIcon
-
- anchors.centerIn: parent
- text: VPN.connected && modelData.enabled ? "link_off" : "link"
- color: VPN.connected && modelData.enabled ? Colours.palette.m3onPrimaryContainer : Colours.palette.m3onSurface
- }
- }
-
- StyledRect {
- implicitWidth: implicitHeight
- implicitHeight: deleteIcon.implicitHeight + Appearance.padding.smaller * 2
-
- radius: Appearance.rounding.full
- color: "transparent"
-
- StateLayer {
- function onClicked(): void {
- const providers = [];
- for (let i = 0; i < Config.utilities.vpn.provider.length; i++) {
- if (i !== modelData.index) {
- providers.push(Config.utilities.vpn.provider[i]);
- }
- }
- Config.utilities.vpn.provider = providers;
- Config.save();
- }
- }
-
- MaterialIcon {
- id: deleteIcon
-
- anchors.centerIn: parent
- text: "delete"
- color: Colours.palette.m3onSurface
- }
- }
- }
-
- implicitHeight: rowLayout.implicitHeight + Appearance.padding.normal * 2
- }
- }
- }
-
- Popup {
- id: vpnDialog
-
- property string currentState: "selection"
- property int editIndex: -1
- property string providerName: ""
- property string displayName: ""
- property string interfaceName: ""
-
- parent: Overlay.overlay
- x: Math.round((parent.width - width) / 2)
- y: Math.round((parent.height - height) / 2)
- implicitWidth: Math.min(400, parent.width - Appearance.padding.large * 2)
- padding: Appearance.padding.large * 1.5
-
- modal: true
- closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
-
- opacity: 0
- scale: 0.7
-
- enter: Transition {
- ParallelAnimation {
- Anim {
- property: "opacity"
- from: 0
- to: 1
- duration: Appearance.anim.durations.normal
- easing.bezierCurve: Appearance.anim.curves.emphasized
- }
- Anim {
- property: "scale"
- from: 0.7
- to: 1
- duration: Appearance.anim.durations.normal
- easing.bezierCurve: Appearance.anim.curves.emphasized
- }
- }
- }
-
- exit: Transition {
- ParallelAnimation {
- Anim {
- property: "opacity"
- from: 1
- to: 0
- duration: Appearance.anim.durations.small
- easing.bezierCurve: Appearance.anim.curves.emphasized
- }
- Anim {
- property: "scale"
- from: 1
- to: 0.7
- duration: Appearance.anim.durations.small
- easing.bezierCurve: Appearance.anim.curves.emphasized
- }
- }
- }
-
- function showProviderSelection(): void {
- currentState = "selection";
- open();
- }
-
- function closeWithAnimation(): void {
- close();
- }
-
- function showAddForm(providerType: string, defaultDisplayName: string): void {
- editIndex = -1;
- providerName = providerType;
- displayName = defaultDisplayName;
- interfaceName = "";
-
- if (currentState === "selection") {
- transitionToForm.start();
- } else {
- currentState = "form";
- isClosing = false;
- open();
- }
- }
-
- function showEditForm(index: int): void {
- const provider = Config.utilities.vpn.provider[index];
- const isObject = typeof provider === "object";
-
- editIndex = index;
- providerName = isObject ? (provider.name || "custom") : String(provider);
- displayName = isObject ? (provider.displayName || providerName) : providerName;
- interfaceName = isObject ? (provider.interface || "") : "";
-
- currentState = "form";
- open();
- }
-
- Overlay.modal: Rectangle {
- color: Qt.rgba(0, 0, 0, 0.4 * vpnDialog.opacity)
- }
-
- onClosed: {
- currentState = "selection";
- }
-
- SequentialAnimation {
- id: transitionToForm
-
- ParallelAnimation {
- Anim {
- target: selectionContent
- property: "opacity"
- to: 0
- duration: Appearance.anim.durations.small
- easing.bezierCurve: Appearance.anim.curves.emphasized
- }
- }
-
- ScriptAction {
- script: {
- vpnDialog.currentState = "form";
- }
- }
-
- ParallelAnimation {
- Anim {
- target: formContent
- property: "opacity"
- to: 1
- duration: Appearance.anim.durations.small
- easing.bezierCurve: Appearance.anim.curves.emphasized
- }
- }
- }
-
- background: StyledRect {
- color: Colours.palette.m3surfaceContainerHigh
- radius: Appearance.rounding.large
-
- Elevation {
- anchors.fill: parent
- radius: parent.radius
- level: 3
- z: -1
- }
-
- Behavior on implicitHeight {
- Anim {
- duration: Appearance.anim.durations.normal
- easing.bezierCurve: Appearance.anim.curves.emphasized
- }
- }
- }
-
- contentItem: Item {
- implicitHeight: vpnDialog.currentState === "selection" ? selectionContent.implicitHeight : formContent.implicitHeight
-
- Behavior on implicitHeight {
- Anim {
- duration: Appearance.anim.durations.normal
- easing.bezierCurve: Appearance.anim.curves.emphasized
- }
- }
-
- ColumnLayout {
- id: selectionContent
-
- anchors.fill: parent
- spacing: Appearance.spacing.normal
- visible: vpnDialog.currentState === "selection"
- opacity: vpnDialog.currentState === "selection" ? 1 : 0
-
- Behavior on opacity {
- Anim {
- duration: Appearance.anim.durations.small
- easing.bezierCurve: Appearance.anim.curves.emphasized
- }
- }
-
- StyledText {
- text: qsTr("Add VPN Provider")
- font.pointSize: Appearance.font.size.large
- font.weight: 500
- }
-
- StyledText {
- Layout.fillWidth: true
- text: qsTr("Choose a provider to add")
- wrapMode: Text.WordWrap
- color: Colours.palette.m3outline
- font.pointSize: Appearance.font.size.small
- }
-
- TextButton {
- Layout.topMargin: Appearance.spacing.normal
- Layout.fillWidth: true
- text: qsTr("NetBird")
- inactiveColour: Colours.tPalette.m3surfaceContainerHigh
- inactiveOnColour: Colours.palette.m3onSurface
- onClicked: {
- const providers = [];
- for (let i = 0; i < Config.utilities.vpn.provider.length; i++) {
- providers.push(Config.utilities.vpn.provider[i]);
- }
- providers.push({
- name: "netbird",
- displayName: "NetBird",
- interface: "wt0"
- });
- Config.utilities.vpn.provider = providers;
- Config.save();
- vpnDialog.closeWithAnimation();
- }
- }
-
- TextButton {
- Layout.fillWidth: true
- text: qsTr("Tailscale")
- inactiveColour: Colours.tPalette.m3surfaceContainerHigh
- inactiveOnColour: Colours.palette.m3onSurface
- onClicked: {
- const providers = [];
- for (let i = 0; i < Config.utilities.vpn.provider.length; i++) {
- providers.push(Config.utilities.vpn.provider[i]);
- }
- providers.push({
- name: "tailscale",
- displayName: "Tailscale",
- interface: "tailscale0"
- });
- Config.utilities.vpn.provider = providers;
- Config.save();
- vpnDialog.closeWithAnimation();
- }
- }
-
- TextButton {
- Layout.fillWidth: true
- text: qsTr("Cloudflare WARP")
- inactiveColour: Colours.tPalette.m3surfaceContainerHigh
- inactiveOnColour: Colours.palette.m3onSurface
- onClicked: {
- const providers = [];
- for (let i = 0; i < Config.utilities.vpn.provider.length; i++) {
- providers.push(Config.utilities.vpn.provider[i]);
- }
- providers.push({
- name: "warp",
- displayName: "Cloudflare WARP",
- interface: "CloudflareWARP"
- });
- Config.utilities.vpn.provider = providers;
- Config.save();
- vpnDialog.closeWithAnimation();
- }
- }
-
- TextButton {
- Layout.fillWidth: true
- text: qsTr("WireGuard (Custom)")
- inactiveColour: Colours.tPalette.m3surfaceContainerHigh
- inactiveOnColour: Colours.palette.m3onSurface
- onClicked: {
- vpnDialog.showAddForm("wireguard", "WireGuard");
- }
- }
-
- TextButton {
- Layout.topMargin: Appearance.spacing.normal
- Layout.fillWidth: true
- text: qsTr("Cancel")
- inactiveColour: Colours.palette.m3secondaryContainer
- inactiveOnColour: Colours.palette.m3onSecondaryContainer
- onClicked: vpnDialog.closeWithAnimation()
- }
- }
-
- ColumnLayout {
- id: formContent
-
- anchors.fill: parent
- spacing: Appearance.spacing.normal
- visible: vpnDialog.currentState === "form"
- opacity: vpnDialog.currentState === "form" ? 1 : 0
-
- Behavior on opacity {
- Anim {
- duration: Appearance.anim.durations.small
- easing.bezierCurve: Appearance.anim.curves.emphasized
- }
- }
-
- StyledText {
- text: vpnDialog.editIndex >= 0 ? qsTr("Edit VPN Provider") : qsTr("Add %1 VPN").arg(vpnDialog.displayName)
- font.pointSize: Appearance.font.size.large
- font.weight: 500
- }
-
- ColumnLayout {
- Layout.fillWidth: true
- spacing: Appearance.spacing.smaller / 2
-
- StyledText {
- text: qsTr("Display Name")
- font.pointSize: Appearance.font.size.small
- color: Colours.palette.m3onSurfaceVariant
- }
-
- StyledRect {
- Layout.fillWidth: true
- implicitHeight: 40
- color: displayNameField.activeFocus ? Colours.layer(Colours.palette.m3surfaceContainer, 3) : Colours.layer(Colours.palette.m3surfaceContainer, 2)
- radius: Appearance.rounding.small
- border.width: 1
- border.color: displayNameField.activeFocus ? Colours.palette.m3primary : Qt.alpha(Colours.palette.m3outline, 0.3)
-
- Behavior on color {
- CAnim {}
- }
- Behavior on border.color {
- CAnim {}
- }
-
- StyledTextField {
- id: displayNameField
- anchors.centerIn: parent
- width: parent.width - Appearance.padding.normal
- horizontalAlignment: TextInput.AlignLeft
- text: vpnDialog.displayName
- onTextChanged: vpnDialog.displayName = text
- }
- }
- }
-
- ColumnLayout {
- Layout.fillWidth: true
- spacing: Appearance.spacing.smaller / 2
-
- StyledText {
- text: qsTr("Interface (e.g., wg0, torguard)")
- font.pointSize: Appearance.font.size.small
- color: Colours.palette.m3onSurfaceVariant
- }
-
- StyledRect {
- Layout.fillWidth: true
- implicitHeight: 40
- color: interfaceNameField.activeFocus ? Colours.layer(Colours.palette.m3surfaceContainer, 3) : Colours.layer(Colours.palette.m3surfaceContainer, 2)
- radius: Appearance.rounding.small
- border.width: 1
- border.color: interfaceNameField.activeFocus ? Colours.palette.m3primary : Qt.alpha(Colours.palette.m3outline, 0.3)
-
- Behavior on color {
- CAnim {}
- }
- Behavior on border.color {
- CAnim {}
- }
-
- StyledTextField {
- id: interfaceNameField
- anchors.centerIn: parent
- width: parent.width - Appearance.padding.normal
- horizontalAlignment: TextInput.AlignLeft
- text: vpnDialog.interfaceName
- onTextChanged: vpnDialog.interfaceName = text
- }
- }
- }
-
- RowLayout {
- Layout.topMargin: Appearance.spacing.normal
- Layout.fillWidth: true
- spacing: Appearance.spacing.normal
-
- TextButton {
- Layout.fillWidth: true
- text: qsTr("Cancel")
- inactiveColour: Colours.tPalette.m3surfaceContainerHigh
- inactiveOnColour: Colours.palette.m3onSurface
- onClicked: vpnDialog.closeWithAnimation()
- }
-
- TextButton {
- Layout.fillWidth: true
- text: qsTr("Save")
- enabled: vpnDialog.interfaceName.length > 0
- inactiveColour: Colours.palette.m3primaryContainer
- inactiveOnColour: Colours.palette.m3onPrimaryContainer
-
- onClicked: {
- const providers = [];
- const newProvider = {
- name: vpnDialog.providerName,
- displayName: vpnDialog.displayName || vpnDialog.interfaceName,
- interface: vpnDialog.interfaceName
- };
-
- if (vpnDialog.editIndex >= 0) {
- for (let i = 0; i < Config.utilities.vpn.provider.length; i++) {
- if (i === vpnDialog.editIndex) {
- providers.push(newProvider);
- } else {
- providers.push(Config.utilities.vpn.provider[i]);
- }
- }
- } else {
- for (let i = 0; i < Config.utilities.vpn.provider.length; i++) {
- providers.push(Config.utilities.vpn.provider[i]);
- }
- providers.push(newProvider);
- }
-
- Config.utilities.vpn.provider = providers;
- Config.save();
- vpnDialog.closeWithAnimation();
- }
- }
- }
- }
- }
- }
-}
diff --git a/modules/controlcenter/network/VpnSettings.qml b/modules/controlcenter/network/VpnSettings.qml
deleted file mode 100644
index 49d801d..0000000
--- a/modules/controlcenter/network/VpnSettings.qml
+++ /dev/null
@@ -1,232 +0,0 @@
-pragma ComponentBehavior: Bound
-
-import ".."
-import "../components"
-import qs.components
-import qs.components.controls
-import qs.components.containers
-import qs.components.effects
-import qs.services
-import qs.config
-import Quickshell
-import QtQuick
-import QtQuick.Controls
-import QtQuick.Layouts
-
-ColumnLayout {
- id: root
-
- required property Session session
-
- spacing: Appearance.spacing.normal
-
- SettingsHeader {
- icon: "vpn_key"
- title: qsTr("VPN Settings")
- }
-
- SectionHeader {
- Layout.topMargin: Appearance.spacing.large
- title: qsTr("General")
- description: qsTr("VPN configuration")
- }
-
- SectionContainer {
- ToggleRow {
- label: qsTr("VPN enabled")
- checked: Config.utilities.vpn.enabled
- toggle.onToggled: {
- Config.utilities.vpn.enabled = checked;
- Config.save();
- }
- }
- }
-
- SectionHeader {
- Layout.topMargin: Appearance.spacing.large
- title: qsTr("Providers")
- description: qsTr("Manage VPN providers")
- }
-
- SectionContainer {
- contentSpacing: Appearance.spacing.normal
-
- ListView {
- Layout.fillWidth: true
- Layout.preferredHeight: contentHeight
-
- interactive: false
- spacing: Appearance.spacing.smaller
-
- model: ScriptModel {
- values: Config.utilities.vpn.provider.map((provider, index) => {
- const isObject = typeof provider === "object";
- const name = isObject ? (provider.name || "custom") : String(provider);
- const displayName = isObject ? (provider.displayName || name) : name;
- const iface = isObject ? (provider.interface || "") : "";
-
- return {
- index: index,
- name: name,
- displayName: displayName,
- interface: iface,
- provider: provider,
- isActive: index === 0
- };
- })
- }
-
- delegate: Component {
- StyledRect {
- required property var modelData
- required property int index
-
- width: ListView.view ? ListView.view.width : undefined
- color: Colours.tPalette.m3surfaceContainerHigh
- radius: Appearance.rounding.normal
-
- RowLayout {
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.verticalCenter: parent.verticalCenter
- anchors.margins: Appearance.padding.normal
- spacing: Appearance.spacing.normal
-
- MaterialIcon {
- text: modelData.isActive ? "vpn_key" : "vpn_key_off"
- font.pointSize: Appearance.font.size.large
- color: modelData.isActive ? Colours.palette.m3primary : Colours.palette.m3outline
- }
-
- ColumnLayout {
- Layout.fillWidth: true
- spacing: 0
-
- StyledText {
- text: modelData.displayName
- font.weight: modelData.isActive ? 500 : 400
- }
-
- StyledText {
- text: qsTr("%1 • %2").arg(modelData.name).arg(modelData.interface || qsTr("No interface"))
- font.pointSize: Appearance.font.size.small
- color: Colours.palette.m3outline
- }
- }
-
- IconButton {
- icon: modelData.isActive ? "arrow_downward" : "arrow_upward"
- visible: !modelData.isActive || Config.utilities.vpn.provider.length > 1
- onClicked: {
- if (modelData.isActive && index < Config.utilities.vpn.provider.length - 1) {
- // Move down
- const providers = [...Config.utilities.vpn.provider];
- const temp = providers[index];
- providers[index] = providers[index + 1];
- providers[index + 1] = temp;
- Config.utilities.vpn.provider = providers;
- Config.save();
- } else if (!modelData.isActive) {
- // Make active (move to top)
- const providers = [...Config.utilities.vpn.provider];
- const provider = providers.splice(index, 1)[0];
- providers.unshift(provider);
- Config.utilities.vpn.provider = providers;
- Config.save();
- }
- }
- }
-
- IconButton {
- icon: "delete"
- onClicked: {
- const providers = [...Config.utilities.vpn.provider];
- providers.splice(index, 1);
- Config.utilities.vpn.provider = providers;
- Config.save();
- }
- }
- }
-
- implicitHeight: 60
- }
- }
- }
-
- TextButton {
- Layout.fillWidth: true
- Layout.topMargin: Appearance.spacing.normal
- text: qsTr("+ Add Provider")
- inactiveColour: Colours.palette.m3primaryContainer
- inactiveOnColour: Colours.palette.m3onPrimaryContainer
-
- onClicked: {
- addProviderDialog.open();
- }
- }
- }
-
- SectionHeader {
- Layout.topMargin: Appearance.spacing.large
- title: qsTr("Quick Add")
- description: qsTr("Add common VPN providers")
- }
-
- SectionContainer {
- contentSpacing: Appearance.spacing.smaller
-
- TextButton {
- Layout.fillWidth: true
- text: qsTr("+ Add NetBird")
- inactiveColour: Colours.tPalette.m3surfaceContainerHigh
- inactiveOnColour: Colours.palette.m3onSurface
-
- onClicked: {
- const providers = [...Config.utilities.vpn.provider];
- providers.push({
- name: "netbird",
- displayName: "NetBird",
- interface: "wt0"
- });
- Config.utilities.vpn.provider = providers;
- Config.save();
- }
- }
-
- TextButton {
- Layout.fillWidth: true
- text: qsTr("+ Add Tailscale")
- inactiveColour: Colours.tPalette.m3surfaceContainerHigh
- inactiveOnColour: Colours.palette.m3onSurface
-
- onClicked: {
- const providers = [...Config.utilities.vpn.provider];
- providers.push({
- name: "tailscale",
- displayName: "Tailscale",
- interface: "tailscale0"
- });
- Config.utilities.vpn.provider = providers;
- Config.save();
- }
- }
-
- TextButton {
- Layout.fillWidth: true
- text: qsTr("+ Add Cloudflare WARP")
- inactiveColour: Colours.tPalette.m3surfaceContainerHigh
- inactiveOnColour: Colours.palette.m3onSurface
-
- onClicked: {
- const providers = [...Config.utilities.vpn.provider];
- providers.push({
- name: "warp",
- displayName: "Cloudflare WARP",
- interface: "CloudflareWARP"
- });
- Config.utilities.vpn.provider = providers;
- Config.save();
- }
- }
- }
-}
diff --git a/modules/controlcenter/state/VpnState.qml b/modules/controlcenter/state/VpnState.qml
deleted file mode 100644
index aa911f1..0000000
--- a/modules/controlcenter/state/VpnState.qml
+++ /dev/null
@@ -1,5 +0,0 @@
-import QtQuick
-
-QtObject {
- property var active: null
-}
diff --git a/modules/controlcenter/taskbar/TaskbarPane.qml b/modules/controlcenter/taskbar/TaskbarPane.qml
deleted file mode 100644
index ba65c1e..0000000
--- a/modules/controlcenter/taskbar/TaskbarPane.qml
+++ /dev/null
@@ -1,757 +0,0 @@
-pragma ComponentBehavior: Bound
-
-import ".."
-import "../components"
-import qs.components
-import qs.components.controls
-import qs.components.effects
-import qs.components.containers
-import qs.services
-import qs.config
-import qs.utils
-import Quickshell
-import Quickshell.Widgets
-import QtQuick
-import QtQuick.Layouts
-
-Item {
- id: root
-
- required property Session session
-
- property bool activeWindowCompact: Config.bar.activeWindow.compact ?? false
- property bool activeWindowInverted: Config.bar.activeWindow.inverted ?? false
- property bool clockShowIcon: Config.bar.clock.showIcon ?? true
- property bool persistent: Config.bar.persistent ?? true
- property bool showOnHover: Config.bar.showOnHover ?? true
- property int dragThreshold: Config.bar.dragThreshold ?? 20
- property bool showAudio: Config.bar.status.showAudio ?? true
- property bool showMicrophone: Config.bar.status.showMicrophone ?? true
- property bool showKbLayout: Config.bar.status.showKbLayout ?? false
- property bool showNetwork: Config.bar.status.showNetwork ?? true
- property bool showWifi: Config.bar.status.showWifi ?? true
- property bool showBluetooth: Config.bar.status.showBluetooth ?? true
- property bool showBattery: Config.bar.status.showBattery ?? true
- property bool showLockStatus: Config.bar.status.showLockStatus ?? true
- property bool trayBackground: Config.bar.tray.background ?? false
- property bool trayCompact: Config.bar.tray.compact ?? false
- property bool trayRecolour: Config.bar.tray.recolour ?? false
- property int workspacesShown: Config.bar.workspaces.shown ?? 5
- property bool workspacesActiveIndicator: Config.bar.workspaces.activeIndicator ?? true
- property bool workspacesOccupiedBg: Config.bar.workspaces.occupiedBg ?? false
- property bool workspacesShowWindows: Config.bar.workspaces.showWindows ?? false
- property int workspacesMaxWindowIcons: Config.bar.workspaces.maxWindowIcons ?? 0
- property bool workspacesPerMonitor: Config.bar.workspaces.perMonitorWorkspaces ?? true
- property bool scrollWorkspaces: Config.bar.scrollActions.workspaces ?? true
- property bool scrollVolume: Config.bar.scrollActions.volume ?? true
- property bool scrollBrightness: Config.bar.scrollActions.brightness ?? true
- property bool popoutActiveWindow: Config.bar.popouts.activeWindow ?? true
- property bool popoutTray: Config.bar.popouts.tray ?? true
- property bool popoutStatusIcons: Config.bar.popouts.statusIcons ?? true
- property list<string> monitorNames: Hypr.monitorNames()
- property list<string> excludedScreens: Config.bar.excludedScreens ?? []
-
- anchors.fill: parent
-
- Component.onCompleted: {
- if (Config.bar.entries) {
- entriesModel.clear();
- for (let i = 0; i < Config.bar.entries.length; i++) {
- const entry = Config.bar.entries[i];
- entriesModel.append({
- id: entry.id,
- enabled: entry.enabled !== false
- });
- }
- }
- }
-
- function saveConfig(entryIndex, entryEnabled) {
- Config.bar.activeWindow.compact = root.activeWindowCompact;
- Config.bar.activeWindow.inverted = root.activeWindowInverted;
- Config.bar.clock.showIcon = root.clockShowIcon;
- Config.bar.persistent = root.persistent;
- Config.bar.showOnHover = root.showOnHover;
- Config.bar.dragThreshold = root.dragThreshold;
- Config.bar.status.showAudio = root.showAudio;
- Config.bar.status.showMicrophone = root.showMicrophone;
- Config.bar.status.showKbLayout = root.showKbLayout;
- Config.bar.status.showNetwork = root.showNetwork;
- Config.bar.status.showWifi = root.showWifi;
- Config.bar.status.showBluetooth = root.showBluetooth;
- Config.bar.status.showBattery = root.showBattery;
- Config.bar.status.showLockStatus = root.showLockStatus;
- Config.bar.tray.background = root.trayBackground;
- Config.bar.tray.compact = root.trayCompact;
- Config.bar.tray.recolour = root.trayRecolour;
- Config.bar.workspaces.shown = root.workspacesShown;
- Config.bar.workspaces.activeIndicator = root.workspacesActiveIndicator;
- Config.bar.workspaces.occupiedBg = root.workspacesOccupiedBg;
- Config.bar.workspaces.showWindows = root.workspacesShowWindows;
- Config.bar.workspaces.maxWindowIcons = root.workspacesMaxWindowIcons;
- Config.bar.workspaces.perMonitorWorkspaces = root.workspacesPerMonitor;
- Config.bar.scrollActions.workspaces = root.scrollWorkspaces;
- Config.bar.scrollActions.volume = root.scrollVolume;
- Config.bar.scrollActions.brightness = root.scrollBrightness;
- Config.bar.popouts.activeWindow = root.popoutActiveWindow;
- Config.bar.popouts.tray = root.popoutTray;
- Config.bar.popouts.statusIcons = root.popoutStatusIcons;
- Config.bar.excludedScreens = root.excludedScreens;
-
- const entries = [];
- for (let i = 0; i < entriesModel.count; i++) {
- const entry = entriesModel.get(i);
- let enabled = entry.enabled;
- if (entryIndex !== undefined && i === entryIndex) {
- enabled = entryEnabled;
- }
- entries.push({
- id: entry.id,
- enabled: enabled
- });
- }
- Config.bar.entries = entries;
- Config.save();
- }
-
- ListModel {
- id: entriesModel
- }
-
- ClippingRectangle {
- id: taskbarClippingRect
- anchors.fill: parent
- anchors.margins: Appearance.padding.normal
- anchors.leftMargin: 0
- anchors.rightMargin: Appearance.padding.normal
-
- radius: taskbarBorder.innerRadius
- color: "transparent"
-
- Loader {
- id: taskbarLoader
-
- anchors.fill: parent
- anchors.margins: Appearance.padding.large + Appearance.padding.normal
- anchors.leftMargin: Appearance.padding.large
- anchors.rightMargin: Appearance.padding.large
-
- sourceComponent: taskbarContentComponent
- }
- }
-
- InnerBorder {
- id: taskbarBorder
- leftThickness: 0
- rightThickness: Appearance.padding.normal
- }
-
- Component {
- id: taskbarContentComponent
-
- StyledFlickable {
- id: sidebarFlickable
- flickableDirection: Flickable.VerticalFlick
- contentHeight: sidebarLayout.height
-
- StyledScrollBar.vertical: StyledScrollBar {
- flickable: sidebarFlickable
- }
-
- ColumnLayout {
- id: sidebarLayout
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.top: parent.top
-
- spacing: Appearance.spacing.normal
-
- RowLayout {
- spacing: Appearance.spacing.smaller
-
- StyledText {
- text: qsTr("Taskbar")
- font.pointSize: Appearance.font.size.large
- font.weight: 500
- }
- }
-
- SectionContainer {
- Layout.fillWidth: true
- alignTop: true
-
- StyledText {
- text: qsTr("Status Icons")
- font.pointSize: Appearance.font.size.normal
- }
-
- ConnectedButtonGroup {
- rootItem: root
-
- options: [
- {
- label: qsTr("Speakers"),
- propertyName: "showAudio",
- onToggled: function (checked) {
- root.showAudio = checked;
- root.saveConfig();
- }
- },
- {
- label: qsTr("Microphone"),
- propertyName: "showMicrophone",
- onToggled: function (checked) {
- root.showMicrophone = checked;
- root.saveConfig();
- }
- },
- {
- label: qsTr("Keyboard"),
- propertyName: "showKbLayout",
- onToggled: function (checked) {
- root.showKbLayout = checked;
- root.saveConfig();
- }
- },
- {
- label: qsTr("Network"),
- propertyName: "showNetwork",
- onToggled: function (checked) {
- root.showNetwork = checked;
- root.saveConfig();
- }
- },
- {
- label: qsTr("Wifi"),
- propertyName: "showWifi",
- onToggled: function (checked) {
- root.showWifi = checked;
- root.saveConfig();
- }
- },
- {
- label: qsTr("Bluetooth"),
- propertyName: "showBluetooth",
- onToggled: function (checked) {
- root.showBluetooth = checked;
- root.saveConfig();
- }
- },
- {
- label: qsTr("Battery"),
- propertyName: "showBattery",
- onToggled: function (checked) {
- root.showBattery = checked;
- root.saveConfig();
- }
- },
- {
- label: qsTr("Capslock"),
- propertyName: "showLockStatus",
- onToggled: function (checked) {
- root.showLockStatus = checked;
- root.saveConfig();
- }
- }
- ]
- }
- }
-
- RowLayout {
- id: mainRowLayout
- Layout.fillWidth: true
- spacing: Appearance.spacing.normal
-
- ColumnLayout {
- id: leftColumnLayout
- Layout.fillWidth: true
- Layout.alignment: Qt.AlignTop
- spacing: Appearance.spacing.normal
-
- SectionContainer {
- Layout.fillWidth: true
- alignTop: true
-
- StyledText {
- text: qsTr("Workspaces")
- font.pointSize: Appearance.font.size.normal
- }
-
- StyledRect {
- Layout.fillWidth: true
- implicitHeight: workspacesShownRow.implicitHeight + Appearance.padding.large * 2
- radius: Appearance.rounding.normal
- color: Colours.layer(Colours.palette.m3surfaceContainer, 2)
-
- Behavior on implicitHeight {
- Anim {}
- }
-
- RowLayout {
- id: workspacesShownRow
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.verticalCenter: parent.verticalCenter
- anchors.margins: Appearance.padding.large
- spacing: Appearance.spacing.normal
-
- StyledText {
- Layout.fillWidth: true
- text: qsTr("Shown")
- }
-
- CustomSpinBox {
- min: 1
- max: 20
- value: root.workspacesShown
- onValueModified: value => {
- root.workspacesShown = value;
- root.saveConfig();
- }
- }
- }
- }
-
- StyledRect {
- Layout.fillWidth: true
- implicitHeight: workspacesActiveIndicatorRow.implicitHeight + Appearance.padding.large * 2
- radius: Appearance.rounding.normal
- color: Colours.layer(Colours.palette.m3surfaceContainer, 2)
-
- Behavior on implicitHeight {
- Anim {}
- }
-
- RowLayout {
- id: workspacesActiveIndicatorRow
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.verticalCenter: parent.verticalCenter
- anchors.margins: Appearance.padding.large
- spacing: Appearance.spacing.normal
-
- StyledText {
- Layout.fillWidth: true
- text: qsTr("Active indicator")
- }
-
- StyledSwitch {
- checked: root.workspacesActiveIndicator
- onToggled: {
- root.workspacesActiveIndicator = checked;
- root.saveConfig();
- }
- }
- }
- }
-
- StyledRect {
- Layout.fillWidth: true
- implicitHeight: workspacesOccupiedBgRow.implicitHeight + Appearance.padding.large * 2
- radius: Appearance.rounding.normal
- color: Colours.layer(Colours.palette.m3surfaceContainer, 2)
-
- Behavior on implicitHeight {
- Anim {}
- }
-
- RowLayout {
- id: workspacesOccupiedBgRow
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.verticalCenter: parent.verticalCenter
- anchors.margins: Appearance.padding.large
- spacing: Appearance.spacing.normal
-
- StyledText {
- Layout.fillWidth: true
- text: qsTr("Occupied background")
- }
-
- StyledSwitch {
- checked: root.workspacesOccupiedBg
- onToggled: {
- root.workspacesOccupiedBg = checked;
- root.saveConfig();
- }
- }
- }
- }
-
- StyledRect {
- Layout.fillWidth: true
- implicitHeight: workspacesShowWindowsRow.implicitHeight + Appearance.padding.large * 2
- radius: Appearance.rounding.normal
- color: Colours.layer(Colours.palette.m3surfaceContainer, 2)
-
- Behavior on implicitHeight {
- Anim {}
- }
-
- RowLayout {
- id: workspacesShowWindowsRow
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.verticalCenter: parent.verticalCenter
- anchors.margins: Appearance.padding.large
- spacing: Appearance.spacing.normal
-
- StyledText {
- Layout.fillWidth: true
- text: qsTr("Show windows")
- }
-
- StyledSwitch {
- checked: root.workspacesShowWindows
- onToggled: {
- root.workspacesShowWindows = checked;
- root.saveConfig();
- }
- }
- }
- }
-
- StyledRect {
- Layout.fillWidth: true
- implicitHeight: workspacesMaxWindowIconsRow.implicitHeight + Appearance.padding.large * 2
- radius: Appearance.rounding.normal
- color: Colours.layer(Colours.palette.m3surfaceContainer, 2)
-
- Behavior on implicitHeight {
- Anim {}
- }
-
- RowLayout {
- id: workspacesMaxWindowIconsRow
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.verticalCenter: parent.verticalCenter
- anchors.margins: Appearance.padding.large
- spacing: Appearance.spacing.normal
-
- StyledText {
- Layout.fillWidth: true
- text: qsTr("Max window icons")
- }
-
- CustomSpinBox {
- min: 0
- max: 20
- value: root.workspacesMaxWindowIcons
- onValueModified: value => {
- root.workspacesMaxWindowIcons = value;
- root.saveConfig();
- }
- }
- }
- }
-
- StyledRect {
- Layout.fillWidth: true
- implicitHeight: workspacesPerMonitorRow.implicitHeight + Appearance.padding.large * 2
- radius: Appearance.rounding.normal
- color: Colours.layer(Colours.palette.m3surfaceContainer, 2)
-
- Behavior on implicitHeight {
- Anim {}
- }
-
- RowLayout {
- id: workspacesPerMonitorRow
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.verticalCenter: parent.verticalCenter
- anchors.margins: Appearance.padding.large
- spacing: Appearance.spacing.normal
-
- StyledText {
- Layout.fillWidth: true
- text: qsTr("Per monitor workspaces")
- }
-
- StyledSwitch {
- checked: root.workspacesPerMonitor
- onToggled: {
- root.workspacesPerMonitor = checked;
- root.saveConfig();
- }
- }
- }
- }
- }
-
- SectionContainer {
- Layout.fillWidth: true
- alignTop: true
-
- StyledText {
- text: qsTr("Scroll Actions")
- font.pointSize: Appearance.font.size.normal
- }
-
- ConnectedButtonGroup {
- rootItem: root
-
- options: [
- {
- label: qsTr("Workspaces"),
- propertyName: "scrollWorkspaces",
- onToggled: function (checked) {
- root.scrollWorkspaces = checked;
- root.saveConfig();
- }
- },
- {
- label: qsTr("Volume"),
- propertyName: "scrollVolume",
- onToggled: function (checked) {
- root.scrollVolume = checked;
- root.saveConfig();
- }
- },
- {
- label: qsTr("Brightness"),
- propertyName: "scrollBrightness",
- onToggled: function (checked) {
- root.scrollBrightness = checked;
- root.saveConfig();
- }
- }
- ]
- }
- }
- }
-
- ColumnLayout {
- id: middleColumnLayout
- Layout.fillWidth: true
- Layout.alignment: Qt.AlignTop
- spacing: Appearance.spacing.normal
-
- SectionContainer {
- Layout.fillWidth: true
- alignTop: true
-
- StyledText {
- text: qsTr("Clock")
- font.pointSize: Appearance.font.size.normal
- }
-
- SwitchRow {
- label: qsTr("Show clock icon")
- checked: root.clockShowIcon
- onToggled: checked => {
- root.clockShowIcon = checked;
- root.saveConfig();
- }
- }
- }
-
- SectionContainer {
- Layout.fillWidth: true
- alignTop: true
-
- StyledText {
- text: qsTr("Bar Behavior")
- font.pointSize: Appearance.font.size.normal
- }
-
- SwitchRow {
- label: qsTr("Persistent")
- checked: root.persistent
- onToggled: checked => {
- root.persistent = checked;
- root.saveConfig();
- }
- }
-
- SwitchRow {
- label: qsTr("Show on hover")
- checked: root.showOnHover
- onToggled: checked => {
- root.showOnHover = checked;
- root.saveConfig();
- }
- }
-
- SectionContainer {
- contentSpacing: Appearance.spacing.normal
-
- SliderInput {
- Layout.fillWidth: true
-
- label: qsTr("Drag threshold")
- value: root.dragThreshold
- from: 0
- to: 100
- suffix: "px"
- validator: IntValidator {
- bottom: 0
- top: 100
- }
- formatValueFunction: val => Math.round(val).toString()
- parseValueFunction: text => parseInt(text)
-
- onValueModified: newValue => {
- root.dragThreshold = Math.round(newValue);
- root.saveConfig();
- }
- }
- }
- }
-
- SectionContainer {
- Layout.fillWidth: true
- alignTop: true
-
- StyledText {
- text: qsTr("Active window")
- font.pointSize: Appearance.font.size.normal
- }
-
- SwitchRow {
- label: qsTr("Compact")
- checked: root.activeWindowCompact
- onToggled: checked => {
- root.activeWindowCompact = checked;
- root.saveConfig();
- }
- }
-
- SwitchRow {
- label: qsTr("Inverted")
- checked: root.activeWindowInverted
- onToggled: checked => {
- root.activeWindowInverted = checked;
- root.saveConfig();
- }
- }
- }
- }
-
- ColumnLayout {
- id: rightColumnLayout
- Layout.fillWidth: true
- Layout.alignment: Qt.AlignTop
- spacing: Appearance.spacing.normal
-
- SectionContainer {
- Layout.fillWidth: true
- alignTop: true
-
- StyledText {
- text: qsTr("Popouts")
- font.pointSize: Appearance.font.size.normal
- }
-
- SwitchRow {
- label: qsTr("Active window")
- checked: root.popoutActiveWindow
- onToggled: checked => {
- root.popoutActiveWindow = checked;
- root.saveConfig();
- }
- }
-
- SwitchRow {
- label: qsTr("Tray")
- checked: root.popoutTray
- onToggled: checked => {
- root.popoutTray = checked;
- root.saveConfig();
- }
- }
-
- SwitchRow {
- label: qsTr("Status icons")
- checked: root.popoutStatusIcons
- onToggled: checked => {
- root.popoutStatusIcons = checked;
- root.saveConfig();
- }
- }
- }
-
- SectionContainer {
- Layout.fillWidth: true
- alignTop: true
-
- StyledText {
- text: qsTr("Tray Settings")
- font.pointSize: Appearance.font.size.normal
- }
-
- ConnectedButtonGroup {
- rootItem: root
-
- options: [
- {
- label: qsTr("Background"),
- propertyName: "trayBackground",
- onToggled: function (checked) {
- root.trayBackground = checked;
- root.saveConfig();
- }
- },
- {
- label: qsTr("Compact"),
- propertyName: "trayCompact",
- onToggled: function (checked) {
- root.trayCompact = checked;
- root.saveConfig();
- }
- },
- {
- label: qsTr("Recolour"),
- propertyName: "trayRecolour",
- onToggled: function (checked) {
- root.trayRecolour = checked;
- root.saveConfig();
- }
- }
- ]
- }
- }
-
- SectionContainer {
- Layout.fillWidth: true
- alignTop: true
-
- StyledText {
- text: qsTr("Monitors")
- font.pointSize: Appearance.font.size.normal
- }
-
- ConnectedButtonGroup {
- rootItem: root
- // max 3 options per line
- rows: Math.ceil(root.monitorNames.length / 3)
-
- options: root.monitorNames.map(e => ({
- label: qsTr(e),
- propertyName: `monitor${e}`,
- onToggled: function (_) {
- // if the given monitor is in the excluded list, it should be added back
- let addedBack = excludedScreens.includes(e);
- if (addedBack) {
- const index = excludedScreens.indexOf(e);
- if (index !== -1) {
- excludedScreens.splice(index, 1);
- }
- } else {
- if (!excludedScreens.includes(e)) {
- excludedScreens.push(e);
- }
- }
- root.saveConfig();
- },
- state: !Strings.testRegexList(root.excludedScreens, e)
- }))
- }
- }
- }
- }
- }
- }
- }
-}