summaryrefslogtreecommitdiff
path: root/modules/controlcenter/network
diff options
context:
space:
mode:
authorATMDA <atdma2600@gmail.com>2025-11-09 21:43:51 -0500
committerATMDA <atdma2600@gmail.com>2025-11-09 21:43:51 -0500
commitd8de7c7e4b1b57470297dc238b210670f87c23ba (patch)
treebd0a600ab3927db2b0f8d1d531818425dd2f56c3 /modules/controlcenter/network
parentfix: panels (i'm debugging) (diff)
downloadcaelestia-shell-d8de7c7e4b1b57470297dc238b210670f87c23ba.tar.gz
caelestia-shell-d8de7c7e4b1b57470297dc238b210670f87c23ba.tar.bz2
caelestia-shell-d8de7c7e4b1b57470297dc238b210670f87c23ba.zip
controlcenter: wifi passphrase input
fix: dependability issues with nmcli
Diffstat (limited to 'modules/controlcenter/network')
-rw-r--r--modules/controlcenter/network/Details.qml30
-rw-r--r--modules/controlcenter/network/NetworkList.qml29
-rw-r--r--modules/controlcenter/network/NetworkPane.qml6
-rw-r--r--modules/controlcenter/network/PasswordDialog.qml241
4 files changed, 297 insertions, 9 deletions
diff --git a/modules/controlcenter/network/Details.qml b/modules/controlcenter/network/Details.qml
index 86164f1..19e011f 100644
--- a/modules/controlcenter/network/Details.qml
+++ b/modules/controlcenter/network/Details.qml
@@ -79,17 +79,37 @@ Item {
checked: root.network?.active ?? false
toggle.onToggled: {
if (checked) {
- if (root.network.isSecure) {
- // TODO: Show password dialog
- root.session.network.showPasswordDialog = true;
- root.session.network.pendingNetwork = root.network;
+ // If already connected to a different network, disconnect first
+ if (Network.active && Network.active.ssid !== root.network.ssid) {
+ Network.disconnectFromNetwork();
+ // Wait a moment before connecting to new network
+ Qt.callLater(() => {
+ connectToNetwork();
+ });
} else {
- Network.connectToNetwork(root.network.ssid, "");
+ connectToNetwork();
}
} else {
Network.disconnectFromNetwork();
}
}
+
+ function connectToNetwork(): void {
+ if (root.network.isSecure) {
+ // Try connecting without password first (in case it's saved)
+ Network.connectToNetworkWithPasswordCheck(
+ root.network.ssid,
+ root.network.isSecure,
+ () => {
+ // Callback: connection failed, show password dialog
+ root.session.network.showPasswordDialog = true;
+ root.session.network.pendingNetwork = root.network;
+ }
+ );
+ } else {
+ Network.connectToNetwork(root.network.ssid, "");
+ }
+ }
}
}
}
diff --git a/modules/controlcenter/network/NetworkList.qml b/modules/controlcenter/network/NetworkList.qml
index 8dfebc7..df05de7 100644
--- a/modules/controlcenter/network/NetworkList.qml
+++ b/modules/controlcenter/network/NetworkList.qml
@@ -214,14 +214,35 @@ ColumnLayout {
if (modelData.active) {
Network.disconnectFromNetwork();
} else {
- if (modelData.isSecure) {
- root.session.network.showPasswordDialog = true;
- root.session.network.pendingNetwork = modelData;
+ // If already connected to a different network, disconnect first
+ if (Network.active && Network.active.ssid !== modelData.ssid) {
+ Network.disconnectFromNetwork();
+ // Wait a moment before connecting to new network
+ Qt.callLater(() => {
+ connectToNetwork();
+ });
} else {
- Network.connectToNetwork(modelData.ssid, "");
+ connectToNetwork();
}
}
}
+
+ function connectToNetwork(): void {
+ if (modelData.isSecure) {
+ // Try connecting without password first (in case it's saved)
+ Network.connectToNetworkWithPasswordCheck(
+ modelData.ssid,
+ modelData.isSecure,
+ () => {
+ // Callback: connection failed, show password dialog
+ root.session.network.showPasswordDialog = true;
+ root.session.network.pendingNetwork = modelData;
+ }
+ );
+ } else {
+ Network.connectToNetwork(modelData.ssid, "");
+ }
+ }
}
MaterialIcon {
diff --git a/modules/controlcenter/network/NetworkPane.qml b/modules/controlcenter/network/NetworkPane.qml
index f37eedd..5e8a75a 100644
--- a/modules/controlcenter/network/NetworkPane.qml
+++ b/modules/controlcenter/network/NetworkPane.qml
@@ -76,4 +76,10 @@ RowLayout {
}
}
}
+
+ PasswordDialog {
+ anchors.fill: parent
+ session: root.session
+ z: 1000
+ }
}
diff --git a/modules/controlcenter/network/PasswordDialog.qml b/modules/controlcenter/network/PasswordDialog.qml
new file mode 100644
index 0000000..fa4788c
--- /dev/null
+++ b/modules/controlcenter/network/PasswordDialog.qml
@@ -0,0 +1,241 @@
+pragma ComponentBehavior: Bound
+
+import ".."
+import qs.components
+import qs.components.controls
+import qs.components.effects
+import qs.components.containers
+import qs.services
+import qs.config
+import QtQuick
+import QtQuick.Layouts
+
+Item {
+ id: root
+
+ required property Session session
+ readonly property var network: session.network.pendingNetwork
+
+ visible: session.network.showPasswordDialog
+ enabled: visible
+ focus: visible
+
+ Keys.onEscapePressed: {
+ root.session.network.showPasswordDialog = false;
+ passwordField.text = "";
+ }
+
+ Rectangle {
+ anchors.fill: parent
+ color: Qt.rgba(0, 0, 0, 0.5)
+ opacity: root.visible ? 1 : 0
+
+ Behavior on opacity {
+ NumberAnimation {
+ duration: 200
+ }
+ }
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: {
+ root.session.network.showPasswordDialog = false;
+ passwordField.text = "";
+ }
+ }
+ }
+
+ StyledRect {
+ id: dialog
+
+ anchors.centerIn: parent
+
+ implicitWidth: 400
+ implicitHeight: content.implicitHeight + Appearance.padding.large * 2
+
+ radius: Appearance.rounding.normal
+ color: Colours.tPalette.m3surface
+ opacity: root.visible ? 1 : 0
+ scale: root.visible ? 1 : 0.9
+
+ Behavior on opacity {
+ NumberAnimation {
+ duration: 200
+ }
+ }
+
+ Behavior on scale {
+ NumberAnimation {
+ duration: 200
+ }
+ }
+
+ Keys.onEscapePressed: {
+ root.session.network.showPasswordDialog = false;
+ passwordField.text = "";
+ }
+
+ ColumnLayout {
+ id: content
+
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.verticalCenter: parent.verticalCenter
+ anchors.margins: Appearance.padding.large
+
+ spacing: Appearance.spacing.normal
+
+ MaterialIcon {
+ Layout.alignment: Qt.AlignHCenter
+ text: "lock"
+ font.pointSize: Appearance.font.size.extraLarge * 2
+ }
+
+ StyledText {
+ Layout.alignment: Qt.AlignHCenter
+ text: qsTr("Enter password")
+ font.pointSize: Appearance.font.size.large
+ font.weight: 500
+ }
+
+ StyledText {
+ Layout.alignment: Qt.AlignHCenter
+ text: root.network ? qsTr("Network: %1").arg(root.network.ssid) : ""
+ color: Colours.palette.m3outline
+ font.pointSize: Appearance.font.size.small
+ }
+
+ Item {
+ Layout.topMargin: Appearance.spacing.large
+ Layout.fillWidth: true
+ implicitHeight: passwordField.implicitHeight + Appearance.padding.normal * 2
+
+ StyledRect {
+ anchors.fill: parent
+ radius: Appearance.rounding.normal
+ color: Colours.tPalette.m3surfaceContainer
+ border.width: passwordField.activeFocus ? 2 : 1
+ border.color: passwordField.activeFocus ? Colours.palette.m3primary : Colours.palette.m3outline
+
+ Behavior on border.color {
+ CAnim {}
+ }
+ }
+
+ StyledTextField {
+ id: passwordField
+
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.verticalCenter: parent.verticalCenter
+ anchors.margins: Appearance.padding.normal
+
+ echoMode: TextField.Password
+ placeholderText: qsTr("Password")
+
+ Component.onCompleted: {
+ if (root.visible) {
+ forceActiveFocus();
+ }
+ }
+
+ Connections {
+ target: root
+ function onVisibleChanged(): void {
+ if (root.visible) {
+ passwordField.forceActiveFocus();
+ passwordField.text = "";
+ }
+ }
+ }
+
+ Keys.onReturnPressed: {
+ if (connectButton.enabled) {
+ connectButton.clicked();
+ }
+ }
+ Keys.onEnterPressed: {
+ if (connectButton.enabled) {
+ connectButton.clicked();
+ }
+ }
+ }
+ }
+
+ RowLayout {
+ Layout.topMargin: Appearance.spacing.normal
+ Layout.fillWidth: true
+ spacing: Appearance.spacing.normal
+
+ Button {
+ id: cancelButton
+
+ Layout.fillWidth: true
+ color: Colours.palette.m3secondaryContainer
+ onColor: Colours.palette.m3onSecondaryContainer
+ text: qsTr("Cancel")
+
+ function onClicked(): void {
+ root.session.network.showPasswordDialog = false;
+ passwordField.text = "";
+ }
+ }
+
+ Button {
+ id: connectButton
+
+ Layout.fillWidth: true
+ color: Colours.palette.m3primary
+ onColor: Colours.palette.m3onPrimary
+ text: qsTr("Connect")
+ enabled: passwordField.text.length > 0
+
+ function onClicked(): void {
+ if (root.network && passwordField.text.length > 0) {
+ Network.connectToNetwork(root.network.ssid, passwordField.text);
+ root.session.network.showPasswordDialog = false;
+ passwordField.text = "";
+ }
+ }
+ }
+ }
+ }
+ }
+
+ component Button: StyledRect {
+ property color onColor: Colours.palette.m3onSurface
+ property alias disabled: stateLayer.disabled
+ property alias text: label.text
+ property alias enabled: stateLayer.enabled
+
+ function onClicked(): void {
+ }
+
+ radius: Appearance.rounding.small
+ implicitHeight: label.implicitHeight + Appearance.padding.small * 2
+ opacity: enabled ? 1 : 0.5
+
+ StateLayer {
+ id: stateLayer
+
+ enabled: parent.enabled
+ color: parent.onColor
+
+ function onClicked(): void {
+ if (enabled) {
+ parent.onClicked();
+ }
+ }
+ }
+
+ StyledText {
+ id: label
+
+ anchors.centerIn: parent
+ animate: true
+ color: parent.onColor
+ font.pointSize: Appearance.font.size.normal
+ }
+ }
+}
+