summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorATMDA <atdma2600@gmail.com>2025-11-19 19:11:41 -0500
committerATMDA <atdma2600@gmail.com>2025-11-19 19:11:41 -0500
commit70ec8cea651c0f49e9ccf25b6e8685d81ac6710b (patch)
treec267c2232b705ec377de676a565dc406514702ee
parentrefactor: SettingsHeader on all panels (diff)
downloadcaelestia-shell-70ec8cea651c0f49e9ccf25b6e8685d81ac6710b.tar.gz
caelestia-shell-70ec8cea651c0f49e9ccf25b6e8685d81ac6710b.tar.bz2
caelestia-shell-70ec8cea651c0f49e9ccf25b6e8685d81ac6710b.zip
refactor: NetworkConnection util created, migrated all functions
-rw-r--r--modules/bar/popouts/Network.qml34
-rw-r--r--modules/bar/popouts/WirelessPassword.qml3
-rw-r--r--modules/controlcenter/network/NetworkingPane.qml43
-rw-r--r--modules/controlcenter/network/WirelessDetails.qml38
-rw-r--r--modules/controlcenter/network/WirelessList.qml44
-rw-r--r--modules/controlcenter/network/WirelessPasswordDialog.qml3
-rw-r--r--utils/NetworkConnection.qml122
7 files changed, 144 insertions, 143 deletions
diff --git a/modules/bar/popouts/Network.qml b/modules/bar/popouts/Network.qml
index b9f66c4..0e99613 100644
--- a/modules/bar/popouts/Network.qml
+++ b/modules/bar/popouts/Network.qml
@@ -131,27 +131,19 @@ ColumnLayout {
Nmcli.disconnectFromNetwork();
} else {
root.connectingToSsid = networkItem.modelData.ssid;
- // Check if network is secure
- if (networkItem.modelData.isSecure) {
- // Try to connect first - will show password dialog if password is needed
- Nmcli.connectToNetwork(networkItem.modelData.ssid, "", networkItem.modelData.bssid, result => {
- if (result && result.needsPassword) {
- // Password is required - show password dialog
- root.passwordNetwork = networkItem.modelData;
- root.showPasswordDialog = true;
- root.wrapper.currentName = "wirelesspassword";
- } else if (result && result.success) {
- // Connection successful with saved password
- root.connectingToSsid = "";
- } else {
- // Connection failed for other reasons
- root.connectingToSsid = "";
- }
- });
- } else {
- // Open network, no password needed
- Nmcli.connectToNetwork(networkItem.modelData.ssid, "", networkItem.modelData.bssid, null);
- }
+ NetworkConnection.handleConnect(
+ networkItem.modelData,
+ null,
+ (network) => {
+ // Password is required - show password dialog
+ root.passwordNetwork = network;
+ root.showPasswordDialog = true;
+ root.wrapper.currentName = "wirelesspassword";
+ }
+ );
+
+ // Clear connecting state if connection succeeds immediately (saved profile)
+ // This is handled by the onActiveChanged connection below
}
}
}
diff --git a/modules/bar/popouts/WirelessPassword.qml b/modules/bar/popouts/WirelessPassword.qml
index d91c87c..5da50b6 100644
--- a/modules/bar/popouts/WirelessPassword.qml
+++ b/modules/bar/popouts/WirelessPassword.qml
@@ -4,6 +4,7 @@ import qs.components
import qs.components.controls
import qs.services
import qs.config
+import qs.utils
import Quickshell
import QtQuick
import QtQuick.Layouts
@@ -452,7 +453,7 @@ ColumnLayout {
text = qsTr("Connecting...");
// Connect to network
- Nmcli.connectToNetwork(root.network.ssid, password, root.network.bssid || "", result => {
+ NetworkConnection.connectWithPassword(root.network, password, result => {
if (result && result.success)
// Connection successful, monitor will handle the rest
{} else if (result && result.needsPassword) {
diff --git a/modules/controlcenter/network/NetworkingPane.qml b/modules/controlcenter/network/NetworkingPane.qml
index 9a7a4e1..d76e8f5 100644
--- a/modules/controlcenter/network/NetworkingPane.qml
+++ b/modules/controlcenter/network/NetworkingPane.qml
@@ -415,7 +415,7 @@ Item {
if (modelData && modelData.active) {
Nmcli.disconnectFromNetwork();
} else if (modelData) {
- handleWirelessConnect(modelData);
+ NetworkConnection.handleConnect(modelData, root.session, null);
}
}
}
@@ -586,46 +586,5 @@ Item {
Nmcli.loadSavedConnections(() => {});
}
}
-
- function handleWirelessConnect(network): void {
- if (Nmcli.active && Nmcli.active.ssid !== network.ssid) {
- Nmcli.disconnectFromNetwork();
- Qt.callLater(() => {
- connectToWirelessNetwork(network);
- });
- } else {
- connectToWirelessNetwork(network);
- }
- }
-
- function connectToWirelessNetwork(network): void {
- if (network.isSecure) {
- const hasSavedProfile = Nmcli.hasSavedProfile(network.ssid);
-
- if (hasSavedProfile) {
- Nmcli.connectToNetwork(network.ssid, "", network.bssid, null);
- } else {
- Nmcli.connectToNetworkWithPasswordCheck(
- network.ssid,
- network.isSecure,
- (result) => {
- if (result.needsPassword) {
- if (Nmcli.pendingConnection) {
- Nmcli.connectionCheckTimer.stop();
- Nmcli.immediateCheckTimer.stop();
- Nmcli.immediateCheckTimer.checkCount = 0;
- Nmcli.pendingConnection = null;
- }
- root.session.network.showPasswordDialog = true;
- root.session.network.pendingNetwork = network;
- }
- },
- network.bssid
- );
- }
- } else {
- Nmcli.connectToNetwork(network.ssid, "", network.bssid, null);
- }
- }
}
diff --git a/modules/controlcenter/network/WirelessDetails.qml b/modules/controlcenter/network/WirelessDetails.qml
index 09abff3..57c06c8 100644
--- a/modules/controlcenter/network/WirelessDetails.qml
+++ b/modules/controlcenter/network/WirelessDetails.qml
@@ -8,6 +8,7 @@ import qs.components.effects
import qs.components.containers
import qs.services
import qs.config
+import qs.utils
import QtQuick
import QtQuick.Layouts
@@ -125,7 +126,7 @@ Item {
checked: root.network?.active ?? false
toggle.onToggled: {
if (checked) {
- root.handleConnect();
+ NetworkConnection.handleConnect(root.network, root.session, null);
} else {
Nmcli.disconnectFromNetwork();
}
@@ -207,39 +208,4 @@ Item {
}
}
- function handleConnect(): void {
- if (Nmcli.active && Nmcli.active.ssid !== root.network.ssid) {
- Nmcli.disconnectFromNetwork();
- Qt.callLater(() => {
- connectToNetwork();
- });
- } else {
- connectToNetwork();
- }
- }
-
- function connectToNetwork(): void {
- if (root.network.isSecure) {
- const hasSavedProfile = Nmcli.hasSavedProfile(root.network.ssid);
-
- if (hasSavedProfile) {
- Nmcli.connectToNetwork(root.network.ssid, "", root.network.bssid, null);
- } else {
- Nmcli.connectToNetworkWithPasswordCheck(root.network.ssid, root.network.isSecure, result => {
- if (result.needsPassword) {
- if (Nmcli.pendingConnection) {
- Nmcli.connectionCheckTimer.stop();
- Nmcli.immediateCheckTimer.stop();
- Nmcli.immediateCheckTimer.checkCount = 0;
- Nmcli.pendingConnection = null;
- }
- root.session.network.showPasswordDialog = true;
- root.session.network.pendingNetwork = root.network;
- }
- }, root.network.bssid);
- }
- } else {
- Nmcli.connectToNetwork(root.network.ssid, "", root.network.bssid, null);
- }
- }
}
diff --git a/modules/controlcenter/network/WirelessList.qml b/modules/controlcenter/network/WirelessList.qml
index 00af47a..18f728c 100644
--- a/modules/controlcenter/network/WirelessList.qml
+++ b/modules/controlcenter/network/WirelessList.qml
@@ -7,6 +7,7 @@ import qs.components.controls
import qs.components.containers
import qs.services
import qs.config
+import qs.utils
import QtQuick
import QtQuick.Layouts
@@ -193,7 +194,7 @@ ColumnLayout {
if (modelData.active) {
Nmcli.disconnectFromNetwork();
} else {
- handleConnect(modelData);
+ NetworkConnection.handleConnect(modelData, root.session, null);
}
}
}
@@ -217,45 +218,4 @@ ColumnLayout {
Nmcli.loadSavedConnections(() => {});
}
}
-
- function handleConnect(network): void {
- if (Nmcli.active && Nmcli.active.ssid !== network.ssid) {
- Nmcli.disconnectFromNetwork();
- Qt.callLater(() => {
- connectToNetwork(network);
- });
- } else {
- connectToNetwork(network);
- }
- }
-
- function connectToNetwork(network): void {
- if (network.isSecure) {
- const hasSavedProfile = Nmcli.hasSavedProfile(network.ssid);
-
- if (hasSavedProfile) {
- Nmcli.connectToNetwork(network.ssid, "", network.bssid, null);
- } else {
- Nmcli.connectToNetworkWithPasswordCheck(
- network.ssid,
- network.isSecure,
- (result) => {
- if (result.needsPassword) {
- if (Nmcli.pendingConnection) {
- Nmcli.connectionCheckTimer.stop();
- Nmcli.immediateCheckTimer.stop();
- Nmcli.immediateCheckTimer.checkCount = 0;
- Nmcli.pendingConnection = null;
- }
- root.session.network.showPasswordDialog = true;
- root.session.network.pendingNetwork = network;
- }
- },
- network.bssid
- );
- }
- } else {
- Nmcli.connectToNetwork(network.ssid, "", network.bssid, null);
- }
- }
} \ No newline at end of file
diff --git a/modules/controlcenter/network/WirelessPasswordDialog.qml b/modules/controlcenter/network/WirelessPasswordDialog.qml
index 4b350be..0f1a5cd 100644
--- a/modules/controlcenter/network/WirelessPasswordDialog.qml
+++ b/modules/controlcenter/network/WirelessPasswordDialog.qml
@@ -8,6 +8,7 @@ import qs.components.effects
import qs.components.containers
import qs.services
import qs.config
+import qs.utils
import Quickshell
import QtQuick
import QtQuick.Layouts
@@ -391,7 +392,7 @@ Item {
text = qsTr("Connecting...");
// Connect to network
- Nmcli.connectToNetwork(root.network.ssid, password, root.network.bssid || "", result => {
+ NetworkConnection.connectWithPassword(root.network, password, result => {
if (result && result.success)
// Connection successful, monitor will handle the rest
{} else if (result && result.needsPassword) {
diff --git a/utils/NetworkConnection.qml b/utils/NetworkConnection.qml
new file mode 100644
index 0000000..c7595b1
--- /dev/null
+++ b/utils/NetworkConnection.qml
@@ -0,0 +1,122 @@
+pragma Singleton
+
+import qs.services
+import QtQuick
+
+/**
+ * NetworkConnection
+ *
+ * Centralized utility for network connection logic. Provides a single source of truth
+ * for connecting to wireless networks, eliminating code duplication across
+ * controlcenter components and bar popouts.
+ *
+ * Usage:
+ * ```qml
+ * import qs.utils
+ *
+ * // With Session object (controlcenter)
+ * NetworkConnection.handleConnect(network, session);
+ *
+ * // Without Session object (bar popouts) - provide password dialog callback
+ * NetworkConnection.handleConnect(network, null, (network) => {
+ * // Show password dialog
+ * root.passwordNetwork = network;
+ * root.showPasswordDialog = true;
+ * });
+ * ```
+ */
+QtObject {
+ id: root
+
+ /**
+ * Handle network connection with automatic disconnection if needed.
+ * If there's an active network different from the target, disconnects first,
+ * then connects to the target network.
+ *
+ * @param network The network object to connect to (must have ssid property)
+ * @param session Optional Session object (for controlcenter - must have network property with showPasswordDialog and pendingNetwork)
+ * @param onPasswordNeeded Optional callback function(network) called when password is needed (for bar popouts)
+ */
+ function handleConnect(network, session, onPasswordNeeded): void {
+ if (!network) {
+ return;
+ }
+
+ if (Nmcli.active && Nmcli.active.ssid !== network.ssid) {
+ Nmcli.disconnectFromNetwork();
+ Qt.callLater(() => {
+ root.connectToNetwork(network, session, onPasswordNeeded);
+ });
+ } else {
+ root.connectToNetwork(network, session, onPasswordNeeded);
+ }
+ }
+
+ /**
+ * Connect to a wireless network.
+ * Handles both secured and open networks, checks for saved profiles,
+ * and shows password dialog if needed.
+ *
+ * @param network The network object to connect to (must have ssid, isSecure, bssid properties)
+ * @param session Optional Session object (for controlcenter - must have network property with showPasswordDialog and pendingNetwork)
+ * @param onPasswordNeeded Optional callback function(network) called when password is needed (for bar popouts)
+ */
+ function connectToNetwork(network, session, onPasswordNeeded): void {
+ if (!network) {
+ return;
+ }
+
+ if (network.isSecure) {
+ const hasSavedProfile = Nmcli.hasSavedProfile(network.ssid);
+
+ if (hasSavedProfile) {
+ Nmcli.connectToNetwork(network.ssid, "", network.bssid, null);
+ } else {
+ // Use password check with callback
+ Nmcli.connectToNetworkWithPasswordCheck(
+ network.ssid,
+ network.isSecure,
+ (result) => {
+ if (result.needsPassword) {
+ // Clear pending connection if exists
+ if (Nmcli.pendingConnection) {
+ Nmcli.connectionCheckTimer.stop();
+ Nmcli.immediateCheckTimer.stop();
+ Nmcli.immediateCheckTimer.checkCount = 0;
+ Nmcli.pendingConnection = null;
+ }
+
+ // Handle password dialog - use session if available, otherwise use callback
+ if (session && session.network) {
+ session.network.showPasswordDialog = true;
+ session.network.pendingNetwork = network;
+ } else if (onPasswordNeeded) {
+ onPasswordNeeded(network);
+ }
+ }
+ },
+ network.bssid
+ );
+ }
+ } else {
+ Nmcli.connectToNetwork(network.ssid, "", network.bssid, null);
+ }
+ }
+
+ /**
+ * Connect to a wireless network with a provided password.
+ * Used by password dialogs when the user has already entered a password.
+ *
+ * @param network The network object to connect to (must have ssid, bssid properties)
+ * @param password The password to use for connection
+ * @param onResult Optional callback function(result) called with connection result
+ */
+ function connectWithPassword(network, password, onResult): void {
+ if (!network) {
+ return;
+ }
+
+ Nmcli.connectToNetwork(network.ssid, password || "", network.bssid || "", onResult || null);
+ }
+}
+