summaryrefslogtreecommitdiff
path: root/modules/controlcenter
diff options
context:
space:
mode:
authorATMDA <atdma2600@gmail.com>2025-11-12 19:57:42 -0500
committerATMDA <atdma2600@gmail.com>2025-11-12 19:57:42 -0500
commit7e6f3270911d9a3b7a73532b18670a5fa613ee92 (patch)
treea81c9b43102ff29f6352380a2c94453fc8d5aa81 /modules/controlcenter
parentnotif/toasts: refactoring colors (diff)
downloadcaelestia-shell-7e6f3270911d9a3b7a73532b18670a5fa613ee92.tar.gz
caelestia-shell-7e6f3270911d9a3b7a73532b18670a5fa613ee92.tar.bz2
caelestia-shell-7e6f3270911d9a3b7a73532b18670a5fa613ee92.zip
conrolcenter: debug/rewrite of wireless panel
Diffstat (limited to 'modules/controlcenter')
-rw-r--r--modules/controlcenter/network/Details.qml55
-rw-r--r--modules/controlcenter/network/NetworkList.qml5
-rw-r--r--modules/controlcenter/network/PasswordDialog.qml283
3 files changed, 334 insertions, 9 deletions
diff --git a/modules/controlcenter/network/Details.qml b/modules/controlcenter/network/Details.qml
index a53f62e..5e636a2 100644
--- a/modules/controlcenter/network/Details.qml
+++ b/modules/controlcenter/network/Details.qml
@@ -95,10 +95,31 @@ Item {
// Callback: connection failed, show password dialog
root.session.network.showPasswordDialog = true;
root.session.network.pendingNetwork = root.network;
- }
+ },
+ root.network.bssid
);
} else {
- Network.connectToNetwork(root.network.ssid, "");
+ Network.connectToNetwork(root.network.ssid, "", root.network.bssid, null);
+ }
+ }
+ }
+
+ Button {
+ Layout.fillWidth: true
+ Layout.topMargin: Appearance.spacing.normal
+ visible: root.network && root.network.ssid && Network.savedConnections.includes(root.network.ssid)
+ color: Colours.palette.m3errorContainer
+ onColor: Colours.palette.m3onErrorContainer
+ text: qsTr("Forget Network")
+
+ onClicked: {
+ if (root.network && root.network.ssid) {
+ // Disconnect first if connected
+ if (root.network.active) {
+ Network.disconnectFromNetwork();
+ }
+ // Delete the connection profile
+ Network.forgetNetwork(root.network.ssid);
}
}
}
@@ -152,9 +173,39 @@ Item {
deviceDetails: Network.wirelessDeviceDetails
}
}
+
}
}
+ component Button: StyledRect {
+ property color onColor: Colours.palette.m3onSurface
+ property alias disabled: stateLayer.disabled
+ property alias text: label.text
+ property alias enabled: stateLayer.enabled
+
+ Layout.fillWidth: true
+ implicitHeight: label.implicitHeight + Appearance.padding.normal * 2
+ radius: Appearance.rounding.normal
+
+ StateLayer {
+ id: stateLayer
+ color: parent.onColor
+ function onClicked(): void {
+ if (parent.enabled !== false) {
+ parent.clicked();
+ }
+ }
+ }
+
+ StyledText {
+ id: label
+ anchors.centerIn: parent
+ color: parent.onColor
+ }
+
+ signal clicked
+ }
+
}
diff --git a/modules/controlcenter/network/NetworkList.qml b/modules/controlcenter/network/NetworkList.qml
index 09d7352..6c4158c 100644
--- a/modules/controlcenter/network/NetworkList.qml
+++ b/modules/controlcenter/network/NetworkList.qml
@@ -203,10 +203,11 @@ ColumnLayout {
// Callback: connection failed, show password dialog
root.session.network.showPasswordDialog = true;
root.session.network.pendingNetwork = modelData;
- }
+ },
+ modelData.bssid
);
} else {
- Network.connectToNetwork(modelData.ssid, "");
+ Network.connectToNetwork(modelData.ssid, "", modelData.bssid, null);
}
}
}
diff --git a/modules/controlcenter/network/PasswordDialog.qml b/modules/controlcenter/network/PasswordDialog.qml
index fa4788c..7aa698b 100644
--- a/modules/controlcenter/network/PasswordDialog.qml
+++ b/modules/controlcenter/network/PasswordDialog.qml
@@ -14,11 +14,37 @@ Item {
id: root
required property Session session
- readonly property var network: session.network.pendingNetwork
+ readonly property var network: {
+ // Try pendingNetwork first, then fall back to active network selection
+ if (session.network.pendingNetwork) {
+ return session.network.pendingNetwork;
+ }
+ // Fallback to active network if available
+ if (session.network.active) {
+ return session.network.active;
+ }
+ return null;
+ }
visible: session.network.showPasswordDialog
enabled: visible
focus: visible
+
+ // Ensure network is set when dialog opens
+ Component.onCompleted: {
+ if (visible && !session.network.pendingNetwork && session.network.active) {
+ session.network.pendingNetwork = session.network.active;
+ }
+ }
+
+ Connections {
+ target: root
+ function onVisibleChanged(): void {
+ if (visible && !session.network.pendingNetwork && session.network.active) {
+ session.network.pendingNetwork = session.network.active;
+ }
+ }
+ }
Keys.onEscapePressed: {
root.session.network.showPasswordDialog = false;
@@ -105,6 +131,35 @@ Item {
font.pointSize: Appearance.font.size.small
}
+ StyledText {
+ id: statusText
+
+ Layout.alignment: Qt.AlignHCenter
+ Layout.topMargin: Appearance.spacing.small
+ visible: Network.connectionStatus.length > 0 || connectButton.connecting
+ text: {
+ if (Network.connectionStatus.length > 0) {
+ return Network.connectionStatus;
+ } else if (connectButton.connecting) {
+ return qsTr("Connecting...");
+ }
+ return "";
+ }
+ color: {
+ const status = Network.connectionStatus;
+ if (status.includes("Error") || status.includes("error") || status.includes("failed")) {
+ return Colours.palette.m3error;
+ } else if (status.includes("successful") || status.includes("Connected") || status.includes("success")) {
+ return Colours.palette.m3primary;
+ }
+ return Colours.palette.m3onSurfaceVariant;
+ }
+ font.pointSize: Appearance.font.size.small
+ font.weight: (Network.connectionStatus.includes("Error") || Network.connectionStatus.includes("error")) ? 500 : 400
+ wrapMode: Text.WordWrap
+ Layout.maximumWidth: parent.width - Appearance.padding.large * 2
+ }
+
Item {
Layout.topMargin: Appearance.spacing.large
Layout.fillWidth: true
@@ -145,9 +200,17 @@ Item {
if (root.visible) {
passwordField.forceActiveFocus();
passwordField.text = "";
+ Network.connectionStatus = "";
}
}
}
+
+ Connections {
+ target: Network
+ function onConnectionStatusChanged(): void {
+ // Status updated, ensure it's visible
+ }
+ }
Keys.onReturnPressed: {
if (connectButton.enabled) {
@@ -190,12 +253,222 @@ Item {
text: qsTr("Connect")
enabled: passwordField.text.length > 0
+ property bool connecting: false
+
function onClicked(): void {
- if (root.network && passwordField.text.length > 0) {
- Network.connectToNetwork(root.network.ssid, passwordField.text);
- root.session.network.showPasswordDialog = false;
- passwordField.text = "";
+ Network.connectionStatus = "";
+
+ // Get password first
+ const password = passwordField.text;
+
+ // Try multiple ways to get the network
+ let networkToUse = null;
+
+ // Try 1: root.network (computed property)
+ if (root.network) {
+ networkToUse = root.network;
+ }
+
+ // Try 2: pendingNetwork
+ if (!networkToUse && root.session.network.pendingNetwork) {
+ networkToUse = root.session.network.pendingNetwork;
+ }
+
+ // Try 3: active network
+ if (!networkToUse && root.session.network.active) {
+ networkToUse = root.session.network.active;
+ root.session.network.pendingNetwork = networkToUse;
+ }
+
+ // Check all conditions
+ const hasNetwork = !!networkToUse;
+ const hasPassword = password && password.length > 0;
+ const notConnecting = !connecting;
+
+ if (hasNetwork && hasPassword && notConnecting) {
+ // Set status immediately
+ Network.connectionStatus = qsTr("Preparing to connect...");
+
+ // Keep dialog open and track connection
+ connecting = true;
+ connectButton.enabled = false;
+ connectButton.text = qsTr("Connecting...");
+
+ // Force immediate UI update
+ statusText.visible = true;
+
+ // Store target SSID for later comparison
+ const ssidToConnect = networkToUse.ssid || "";
+ const bssidToConnect = networkToUse.bssid || "";
+
+ // Store the SSID we're connecting to so we can compare later
+ // even if root.network changes
+ content.connectingToSsid = ssidToConnect;
+
+ // Execute connection immediately
+ Network.connectToNetwork(
+ ssidToConnect,
+ password,
+ bssidToConnect,
+ () => {
+ // Callback if connection fails - keep dialog open
+ connecting = false;
+ connectButton.enabled = true;
+ connectButton.text = qsTr("Connect");
+ content.connectingToSsid = ""; // Clear on failure
+ }
+ );
+
+ // Start connection check timer immediately
+ connectionCheckTimer.checkCount = 0;
+ connectionCheckTimer.start();
+
+ // Also check immediately after a short delay to catch quick connections
+ Qt.callLater(() => {
+ if (root.visible) {
+ closeDialogIfConnected();
+ }
+ });
+ } else {
+ // Show error in status
+ Network.connectionStatus = qsTr("Error: Cannot connect - missing network or password");
+ }
+ }
+ }
+ }
+
+ // Store the SSID we're connecting to when connection starts
+ property string connectingToSsid: ""
+
+ property string targetSsid: {
+ // Track the SSID we're trying to connect to
+ // Prefer explicitly stored connectingToSsid, then computed values
+ if (connectingToSsid && connectingToSsid.length > 0) {
+ return connectingToSsid;
+ }
+ if (root.network && root.network.ssid) {
+ return root.network.ssid;
+ }
+ if (root.session.network.pendingNetwork && root.session.network.pendingNetwork.ssid) {
+ return root.session.network.pendingNetwork.ssid;
+ }
+ return "";
+ }
+
+ function closeDialogIfConnected(): bool {
+ // Check if we're connected to the network we're trying to connect to
+ const ssid = targetSsid;
+
+ if (!ssid || ssid.length === 0) {
+ return false;
+ }
+
+ if (!Network.active) {
+ return false;
+ }
+
+ const activeSsid = Network.active.ssid || "";
+
+ if (activeSsid === ssid) {
+ // Connection succeeded - close dialog
+ connectionCheckTimer.stop();
+ aggressiveCheckTimer.stop();
+ connectionCheckTimer.checkCount = 0;
+ connectButton.connecting = false;
+ Network.connectionStatus = "";
+ root.session.network.showPasswordDialog = false;
+ passwordField.text = "";
+ content.connectingToSsid = ""; // Clear stored SSID
+ return true;
+ }
+ return false;
+ }
+
+ Timer {
+ id: connectionCheckTimer
+ interval: 1000 // Check every 1 second for faster response
+ repeat: true
+ triggeredOnStart: false
+ property int checkCount: 0
+
+ onTriggered: {
+ checkCount++;
+
+ // Try to close dialog if connected
+ const closed = content.closeDialogIfConnected();
+ if (closed) {
+ return;
+ }
+
+ if (connectButton.connecting) {
+ // Still connecting, check again
+ // Limit to 20 checks (20 seconds total)
+ if (checkCount >= 20) {
+ connectionCheckTimer.stop();
+ connectionCheckTimer.checkCount = 0;
+ connectButton.connecting = false;
+ connectButton.enabled = true;
+ connectButton.text = qsTr("Connect");
+ }
+ } else {
+ // Not connecting anymore, stop timer
+ connectionCheckTimer.stop();
+ connectionCheckTimer.checkCount = 0;
+ }
+ }
+ }
+
+ Connections {
+ target: Network
+ function onActiveChanged(): void {
+ // Check immediately when active network changes
+ if (root.visible) {
+ // Check immediately - if connected, close right away
+ if (content.closeDialogIfConnected()) {
+ return;
+ }
+
+ // Also check after a delay in case the active network isn't fully updated yet
+ Qt.callLater(() => {
+ if (root.visible) {
+ content.closeDialogIfConnected();
+ }
+ });
+ }
+ }
+ }
+
+ // Also check when dialog becomes visible
+ Connections {
+ target: root
+ function onVisibleChanged(): void {
+ if (root.visible) {
+ // Check immediately when dialog opens
+ Qt.callLater(() => {
+ if (root.visible) {
+ closeDialogIfConnected();
+ }
+ });
+ }
+ }
+ }
+
+ // Aggressive polling timer - checks every 500ms when dialog is visible and connecting
+ // This ensures we catch the connection even if signals are missed
+ Timer {
+ id: aggressiveCheckTimer
+ interval: 500
+ repeat: true
+ running: root.visible && connectButton.connecting
+ triggeredOnStart: true
+
+ onTriggered: {
+ if (root.visible && connectButton.connecting) {
+ if (content.closeDialogIfConnected()) {
+ stop();
}
+ } else {
+ stop();
}
}
}