Shortcuts you invent, rules you write, gestures you own - all still just data
Claude-Session: https://claude.ai/code/session_01Ms2FbjQy31TVf3CEvQhGM8
This commit is contained in:
@@ -45,6 +45,24 @@ Column {
|
||||
property string failedSsid: ""
|
||||
property string failedText: ""
|
||||
|
||||
// The hidden-network form. Its passphrase lives here only while the form is
|
||||
// open: the form is a Loader, so closing it destroys the field, and
|
||||
// closeHidden empties this alongside it.
|
||||
property bool hiddenOpen: false
|
||||
property string hiddenSsid: ""
|
||||
property string hiddenSecurity: "wpa-psk"
|
||||
property string hiddenPassword: ""
|
||||
|
||||
readonly property bool hiddenReady: root.hiddenSsid.trim() !== ""
|
||||
&& (root.hiddenSecurity === "none" || root.hiddenPassword !== "")
|
||||
|
||||
function closeHidden(): void {
|
||||
root.hiddenOpen = false;
|
||||
root.hiddenSsid = "";
|
||||
root.hiddenSecurity = "wpa-psk";
|
||||
root.hiddenPassword = "";
|
||||
}
|
||||
|
||||
// The list shows what matters and folds the rest: connected and saved
|
||||
// networks always render (they lead the sort, so a slice keeps them), and
|
||||
// strangers fill the remaining slots up to the cap. Everything else waits
|
||||
@@ -72,6 +90,10 @@ Column {
|
||||
root.confirmingForget = "";
|
||||
}
|
||||
|
||||
// closeAll is called from row activation, which the hidden form is not part
|
||||
// of -- opening a network's drawer should not throw away a half-typed
|
||||
// hidden SSID, but joining one should close the form.
|
||||
|
||||
// One click on a row means whatever that row's state makes it mean. The
|
||||
// connected network opens rather than reconnecting to itself.
|
||||
function activate(network: var): void {
|
||||
@@ -202,6 +224,7 @@ Column {
|
||||
|
||||
ConnectionDetails {
|
||||
width: parent.width
|
||||
connection: entry.ssid
|
||||
details: entry.details
|
||||
}
|
||||
|
||||
@@ -426,4 +449,116 @@ Column {
|
||||
: ""
|
||||
divider: false
|
||||
}
|
||||
|
||||
// ── A network that does not say it is there ─────────────────────────────
|
||||
//
|
||||
// A hidden network cannot appear in the list above by definition, so the
|
||||
// only way in is to name it. This was the last thing on the Wi-Fi card that
|
||||
// sent people back to GNOME's panel.
|
||||
|
||||
ActionRow {
|
||||
width: parent.width
|
||||
visible: Connectivity.wifiDevice !== null && Connectivity.wifiEnabled
|
||||
label: "Join a hidden network…"
|
||||
detail: "A network that does not broadcast its name — you type the name and its security"
|
||||
action: root.hiddenOpen ? "Cancel" : "Join…"
|
||||
enabled: !NetworkTools.busy
|
||||
divider: root.hiddenOpen
|
||||
onTriggered: {
|
||||
if (root.hiddenOpen) {
|
||||
root.closeHidden();
|
||||
return;
|
||||
}
|
||||
root.closeAll();
|
||||
root.hiddenOpen = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Loaded rather than hidden, for the same reason the enterprise form is:
|
||||
// closing it destroys the field, and with it the passphrase that was typed.
|
||||
Loader {
|
||||
id: hiddenLoader
|
||||
|
||||
width: parent.width
|
||||
active: root.hiddenOpen
|
||||
visible: hiddenLoader.active
|
||||
|
||||
sourceComponent: Column {
|
||||
width: hiddenLoader.width
|
||||
|
||||
TextFieldRow {
|
||||
width: parent.width
|
||||
label: "Network name"
|
||||
detail: "Exactly as whoever runs the network wrote it — a hidden network is found by name, so a typo simply never connects"
|
||||
placeholder: "office-private"
|
||||
text: root.hiddenSsid
|
||||
enabled: !NetworkTools.busy
|
||||
onAccepted: value => root.hiddenSsid = value.trim()
|
||||
}
|
||||
|
||||
OptionPickerRow {
|
||||
width: parent.width
|
||||
label: "Security"
|
||||
detail: "What the network expects. The wrong one associates and then fails, with nothing to say why."
|
||||
enabled: !NetworkTools.busy
|
||||
options: [
|
||||
{
|
||||
value: "wpa-psk",
|
||||
label: "WPA2 (password)",
|
||||
detail: "What almost every home and office network uses"
|
||||
},
|
||||
{
|
||||
value: "sae",
|
||||
label: "WPA3 (password)",
|
||||
detail: "Newer, and refused outright by anything older"
|
||||
},
|
||||
{
|
||||
value: "none",
|
||||
label: "Open",
|
||||
detail: "No password at all"
|
||||
}
|
||||
]
|
||||
current: root.hiddenSecurity
|
||||
onPicked: value => {
|
||||
root.hiddenSecurity = String(value);
|
||||
// An open network has no passphrase, so a passphrase typed
|
||||
// before the mode changed must not sit in memory waiting to
|
||||
// be sent to a network that will not ask for one.
|
||||
if (root.hiddenSecurity === "none")
|
||||
root.hiddenPassword = "";
|
||||
}
|
||||
}
|
||||
|
||||
SecretFieldRow {
|
||||
width: parent.width
|
||||
visible: root.hiddenSecurity !== "none"
|
||||
label: "Password"
|
||||
detail: "Handed to NetworkManager down a pipe, never as a command argument"
|
||||
enabled: !NetworkTools.busy
|
||||
onChanged: value => root.hiddenPassword = value
|
||||
}
|
||||
|
||||
ActionRow {
|
||||
width: parent.width
|
||||
label: "Join this network"
|
||||
detail: root.hiddenSsid.trim() === ""
|
||||
? "Give the network a name first."
|
||||
: (root.hiddenSecurity !== "none" && root.hiddenPassword === ""
|
||||
? "This network needs a password."
|
||||
: "Saves a profile that probes for " + root.hiddenSsid.trim()
|
||||
+ " by name, and connects to it.")
|
||||
action: NetworkTools.busy ? "Joining…" : "Join"
|
||||
enabled: !NetworkTools.busy && root.hiddenReady
|
||||
divider: false
|
||||
onTriggered: {
|
||||
if (!root.hiddenReady)
|
||||
return;
|
||||
const ssid = root.hiddenSsid.trim();
|
||||
NetworkTools.joinHidden(ssid, ssid, root.hiddenSecurity,
|
||||
root.hiddenPassword);
|
||||
root.closeHidden();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user