1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-06-17 00:25:21 -04:00

fix(network): keep Wi-Fi when password prompt is canceled (#2651)

This commit is contained in:
jbwfu
2026-06-17 00:52:25 +08:00
committed by GitHub
parent 90f8ce5035
commit 2f39f248fc
7 changed files with 101 additions and 77 deletions
+1 -1
View File
@@ -653,7 +653,7 @@ Item {
if (!wifiPasswordModalLoader.item) if (!wifiPasswordModalLoader.item)
return; return;
if (wifiPasswordModalLoader.item.visible && timeSinceLastPrompt < 1000) { if (wifiPasswordModalLoader.item.shouldBeVisible && timeSinceLastPrompt < 1000) {
NetworkService.cancelCredentials(lastCredentialsToken); NetworkService.cancelCredentials(lastCredentialsToken);
lastCredentialsToken = token; lastCredentialsToken = token;
lastCredentialsTime = now; lastCredentialsTime = now;
+28 -45
View File
@@ -1,12 +1,22 @@
import QtQuick import QtQuick
import Quickshell
import qs.Common import qs.Common
import qs.Modals.Common
import qs.Services import qs.Services
import qs.Widgets import qs.Widgets
FloatingWindow { DankModal {
id: root id: root
layerNamespace: "dms:wifi-password"
keepPopoutsOpen: true
allowStacking: true
shouldBeVisible: false
modalWidth: 420
modalHeight: calculatedHeight
enableShadow: true
onBackgroundClicked: clearAndClose()
directContent: contentFocusScope
property bool disablePopupTransparency: true property bool disablePopupTransparency: true
property string wifiPasswordSSID: "" property string wifiPasswordSSID: ""
property string wifiPasswordInput: "" property string wifiPasswordInput: ""
@@ -102,7 +112,7 @@ FloatingWindow {
const network = NetworkService.wifiNetworks.find(n => n.ssid === ssid); const network = NetworkService.wifiNetworks.find(n => n.ssid === ssid);
requiresEnterprise = network?.enterprise || false; requiresEnterprise = network?.enterprise || false;
visible = true; open();
Qt.callLater(focusFirstField); Qt.callLater(focusFirstField);
} }
@@ -126,7 +136,7 @@ FloatingWindow {
secretValues = {}; secretValues = {};
requiresEnterprise = false; requiresEnterprise = false;
visible = true; open();
Qt.callLater(focusFirstField); Qt.callLater(focusFirstField);
} }
@@ -144,6 +154,7 @@ FloatingWindow {
isVpnPrompt = (connectionType === "vpn" || connectionType === "wireguard"); isVpnPrompt = (connectionType === "vpn" || connectionType === "wireguard");
wifiPasswordSSID = isVpnPrompt ? connectionName : ssid; wifiPasswordSSID = isVpnPrompt ? connectionName : ssid;
savePasswordCheckbox.checked = !isVpnPrompt;
requiresEnterprise = setting === "802-1x"; requiresEnterprise = setting === "802-1x";
@@ -152,7 +163,7 @@ FloatingWindow {
wifiAnonymousIdentityInput = ""; wifiAnonymousIdentityInput = "";
wifiDomainInput = ""; wifiDomainInput = "";
visible = true; open();
Qt.callLater(() => { Qt.callLater(() => {
if (reason === "wrong-password" && fieldsInfo.length === 0) { if (reason === "wrong-password" && fieldsInfo.length === 0) {
passwordInput.text = ""; passwordInput.text = "";
@@ -162,7 +173,7 @@ FloatingWindow {
} }
function hide() { function hide() {
visible = false; close();
} }
function getFieldLabel(fieldName) { function getFieldLabel(fieldName) {
@@ -242,23 +253,8 @@ FloatingWindow {
secretValues = {}; secretValues = {};
} }
objectName: "wifiPasswordModal" onShouldBeVisibleChanged: {
title: { if (shouldBeVisible) {
if (promptReason === "pkcs11")
return I18n.tr("Smartcard PIN");
if (isVpnPrompt)
return I18n.tr("VPN Password");
if (isHiddenNetwork)
return I18n.tr("Hidden Network");
return I18n.tr("Wi-Fi Password");
}
minimumSize: Qt.size(420, calculatedHeight)
maximumSize: Qt.size(420, calculatedHeight)
color: Theme.surfaceContainer
visible: false
onVisibleChanged: {
if (visible) {
Qt.callLater(focusFirstField); Qt.callLater(focusFirstField);
return; return;
} }
@@ -287,7 +283,7 @@ FloatingWindow {
return; return;
wifiPasswordSSID = NetworkService.connectingSSID; wifiPasswordSSID = NetworkService.connectingSSID;
wifiPasswordInput = ""; wifiPasswordInput = "";
visible = true; open();
NetworkService.passwordDialogShouldReopen = false; NetworkService.passwordDialogShouldReopen = false;
} }
} }
@@ -296,7 +292,7 @@ FloatingWindow {
id: contentFocusScope id: contentFocusScope
anchors.fill: parent anchors.fill: parent
focus: true focus: root.shouldBeVisible
Keys.onEscapePressed: event => { Keys.onEscapePressed: event => {
clearAndClose(); clearAndClose();
@@ -318,8 +314,6 @@ FloatingWindow {
anchors.right: buttonRow.left anchors.right: buttonRow.left
anchors.rightMargin: Theme.spacingM anchors.rightMargin: Theme.spacingM
height: headerCol.height height: headerCol.height
onPressed: windowControls.tryStartMove()
onDoubleClicked: windowControls.tryToggleMaximize()
Column { Column {
id: headerCol id: headerCol
@@ -380,14 +374,6 @@ FloatingWindow {
anchors.right: parent.right anchors.right: parent.right
spacing: Theme.spacingXS spacing: Theme.spacingXS
DankActionButton {
visible: windowControls.canMaximize
iconName: root.maximized ? "fullscreen_exit" : "fullscreen"
iconSize: Theme.iconSize - 4
iconColor: Theme.surfaceText
onClicked: windowControls.tryToggleMaximize()
}
DankActionButton { DankActionButton {
iconName: "close" iconName: "close"
iconSize: Theme.iconSize - 4 iconSize: Theme.iconSize - 4
@@ -419,7 +405,7 @@ FloatingWindow {
textColor: Theme.surfaceText textColor: Theme.surfaceText
placeholderText: I18n.tr("Network Name (SSID)") placeholderText: I18n.tr("Network Name (SSID)")
backgroundColor: "transparent" backgroundColor: "transparent"
enabled: root.visible enabled: root.shouldBeVisible
keyNavigationTab: passwordInput keyNavigationTab: passwordInput
onAccepted: passwordInput.forceActiveFocus() onAccepted: passwordInput.forceActiveFocus()
} }
@@ -449,7 +435,7 @@ FloatingWindow {
echoMode: modelData.isSecret && !passwordVisible ? TextInput.Password : TextInput.Normal echoMode: modelData.isSecret && !passwordVisible ? TextInput.Password : TextInput.Normal
placeholderText: getFieldLabel(modelData.name) placeholderText: getFieldLabel(modelData.name)
backgroundColor: "transparent" backgroundColor: "transparent"
enabled: root.visible enabled: root.shouldBeVisible
Keys.onTabPressed: event => { Keys.onTabPressed: event => {
if (index < fieldsInfo.length - 1) { if (index < fieldsInfo.length - 1) {
@@ -519,7 +505,7 @@ FloatingWindow {
text: wifiUsernameInput text: wifiUsernameInput
placeholderText: I18n.tr("Username") placeholderText: I18n.tr("Username")
backgroundColor: "transparent" backgroundColor: "transparent"
enabled: root.visible enabled: root.shouldBeVisible
keyNavigationTab: passwordInput keyNavigationTab: passwordInput
keyNavigationBacktab: domainMatchInput keyNavigationBacktab: domainMatchInput
onTextEdited: wifiUsernameInput = text onTextEdited: wifiUsernameInput = text
@@ -552,7 +538,7 @@ FloatingWindow {
echoMode: passwordVisible ? TextInput.Normal : TextInput.Password echoMode: passwordVisible ? TextInput.Normal : TextInput.Password
placeholderText: (requiresEnterprise && !isVpnPrompt) ? I18n.tr("Password") : "" placeholderText: (requiresEnterprise && !isVpnPrompt) ? I18n.tr("Password") : ""
backgroundColor: "transparent" backgroundColor: "transparent"
enabled: root.visible enabled: root.shouldBeVisible
keyNavigationTab: (requiresEnterprise && !isVpnPrompt) ? anonInput : null keyNavigationTab: (requiresEnterprise && !isVpnPrompt) ? anonInput : null
keyNavigationBacktab: (requiresEnterprise && !isVpnPrompt) ? usernameInput : null keyNavigationBacktab: (requiresEnterprise && !isVpnPrompt) ? usernameInput : null
onTextEdited: wifiPasswordInput = text onTextEdited: wifiPasswordInput = text
@@ -589,7 +575,7 @@ FloatingWindow {
text: wifiAnonymousIdentityInput text: wifiAnonymousIdentityInput
placeholderText: I18n.tr("Anonymous Identity (optional)") placeholderText: I18n.tr("Anonymous Identity (optional)")
backgroundColor: "transparent" backgroundColor: "transparent"
enabled: root.visible enabled: root.shouldBeVisible
keyNavigationTab: domainMatchInput keyNavigationTab: domainMatchInput
keyNavigationBacktab: passwordInput keyNavigationBacktab: passwordInput
onTextEdited: wifiAnonymousIdentityInput = text onTextEdited: wifiAnonymousIdentityInput = text
@@ -620,7 +606,7 @@ FloatingWindow {
text: wifiDomainInput text: wifiDomainInput
placeholderText: I18n.tr("Domain (optional)") placeholderText: I18n.tr("Domain (optional)")
backgroundColor: "transparent" backgroundColor: "transparent"
enabled: root.visible enabled: root.shouldBeVisible
keyNavigationTab: usernameInput keyNavigationTab: usernameInput
keyNavigationBacktab: anonInput keyNavigationBacktab: anonInput
onTextEdited: wifiDomainInput = text onTextEdited: wifiDomainInput = text
@@ -757,8 +743,5 @@ FloatingWindow {
} }
} }
FloatingWindowControls { onOpened: Qt.callLater(() => contentFocusScope.forceActiveFocus())
id: windowControls
targetWindow: root
}
} }
@@ -93,7 +93,7 @@ DankPopout {
shouldBeVisible: false shouldBeVisible: false
property bool credentialsPromptOpen: NetworkService.credentialsRequested property bool credentialsPromptOpen: NetworkService.credentialsRequested
property bool wifiPasswordModalOpen: PopoutService.wifiPasswordModal?.visible ?? false property bool wifiPasswordModalOpen: PopoutService.wifiPasswordModal?.shouldBeVisible ?? false
property bool polkitModalOpen: PopoutService.polkitAuthModal?.visible ?? false property bool polkitModalOpen: PopoutService.polkitAuthModal?.visible ?? false
property bool anyModalOpen: credentialsPromptOpen || wifiPasswordModalOpen || polkitModalOpen || powerMenuOpen property bool anyModalOpen: credentialsPromptOpen || wifiPasswordModalOpen || polkitModalOpen || powerMenuOpen
@@ -2,6 +2,7 @@ import QtQuick
import QtQuick.Controls import QtQuick.Controls
import Quickshell import Quickshell
import qs.Common import qs.Common
import qs.Modules.Network
import qs.Services import qs.Services
import qs.Widgets import qs.Widgets
import qs.Modals import qs.Modals
@@ -749,11 +750,9 @@ Rectangle {
event.accepted = true; event.accepted = true;
return; return;
} }
if (modelData.secured && !modelData.saved && (DMSService.apiVersion < 7 || modelData.enterprise)) { WifiConnectionActions.connectToNetwork(modelData, {
PopoutService.showWifiPasswordModal(modelData.ssid); connected: wifiDelegate.isConnected
} else { });
NetworkService.connectToWifi(modelData.ssid);
}
event.accepted = true; event.accepted = true;
} }
} }
@@ -804,15 +803,9 @@ Rectangle {
} }
onTriggered: { onTriggered: {
if (networkContextMenu.currentConnected) { WifiConnectionActions.connectToNetworkFromDetails(networkContextMenu.currentSSID, networkContextMenu.currentSecured, networkContextMenu.currentSaved, networkContextMenu.currentEnterprise, networkContextMenu.currentConnected, {
NetworkService.disconnectWifi(); disconnectWhenConnected: true
return; });
}
if (networkContextMenu.currentSecured && !networkContextMenu.currentSaved && (DMSService.apiVersion < 7 || networkContextMenu.currentEnterprise)) {
PopoutService.showWifiPasswordModal(networkContextMenu.currentSSID);
return;
}
NetworkService.connectToWifi(networkContextMenu.currentSSID);
} }
} }
@@ -0,0 +1,47 @@
pragma Singleton
pragma ComponentBehavior: Bound
import Quickshell
import qs.Services
Singleton {
id: root
function connectToNetwork(network, options) {
if (!network)
return;
const actionOptions = options || {};
const ssid = network.ssid || "";
if (!ssid)
return;
const connected = actionOptions.connected ?? network.connected ?? (ssid === NetworkService.currentWifiSSID);
if (connected) {
if (actionOptions.disconnectWhenConnected ?? false)
NetworkService.disconnectWifi();
return;
}
if (shouldPromptForCredentials(network)) {
PopoutService.showWifiPasswordModal(ssid);
return;
}
NetworkService.connectToWifi(ssid);
}
function connectToNetworkFromDetails(ssid, secured, saved, enterprise, connected, options) {
connectToNetwork({
ssid: ssid,
secured: secured,
saved: saved,
enterprise: enterprise,
connected: connected
}, options);
}
function shouldPromptForCredentials(network) {
return (network.secured ?? false) && !(network.saved ?? false);
}
}
+9 -14
View File
@@ -4,6 +4,7 @@ import QtQuick
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import qs.Common import qs.Common
import qs.Modules.Network
import qs.Modules.Settings.Widgets import qs.Modules.Settings.Widgets
import qs.Modals.Common import qs.Modals.Common
import qs.Services import qs.Services
@@ -673,15 +674,10 @@ Item {
hoverEnabled: true hoverEnabled: true
cursorShape: Qt.PointingHandCursor cursorShape: Qt.PointingHandCursor
onClicked: { onClicked: {
if (isConnected) { WifiConnectionActions.connectToNetwork(modelData, {
NetworkService.disconnectWifi(); connected: isConnected,
return; disconnectWhenConnected: true
} });
if (modelData.secured && !modelData.saved && (DMSService.apiVersion < 7 || modelData.enterprise)) {
PopoutService.showWifiPasswordModal(modelData.ssid);
return;
}
NetworkService.connectToWifi(modelData.ssid);
} }
} }
} }
@@ -1184,11 +1180,10 @@ Item {
} }
onTriggered: { onTriggered: {
if (isConnected) { WifiConnectionActions.connectToNetwork(modelData, {
NetworkService.disconnectWifi(); connected: isConnected,
return; disconnectWhenConnected: true
} });
NetworkService.connectToWifi(modelData.ssid);
} }
} }
+8 -2
View File
@@ -756,8 +756,11 @@ Singleton {
function showWifiPasswordModal(ssid) { function showWifiPasswordModal(ssid) {
if (wifiPasswordModalLoader) if (wifiPasswordModalLoader)
wifiPasswordModalLoader.active = true; wifiPasswordModalLoader.active = true;
if (wifiPasswordModal) if (wifiPasswordModal) {
wifiPasswordModal.show(ssid); wifiPasswordModal.show(ssid);
} else {
Qt.callLater(() => wifiPasswordModal?.show(ssid));
}
} }
function showWifiQRCodeModal(ssid) { function showWifiQRCodeModal(ssid) {
@@ -770,8 +773,11 @@ Singleton {
function showHiddenNetworkModal() { function showHiddenNetworkModal() {
if (wifiPasswordModalLoader) if (wifiPasswordModalLoader)
wifiPasswordModalLoader.active = true; wifiPasswordModalLoader.active = true;
if (wifiPasswordModal) if (wifiPasswordModal) {
wifiPasswordModal.showHidden(); wifiPasswordModal.showHidden();
} else {
Qt.callLater(() => wifiPasswordModal?.showHidden());
}
} }
function hideWifiPasswordModal() { function hideWifiPasswordModal() {