From 61139bd469ab28fc766b8ef68aca956424840423 Mon Sep 17 00:00:00 2001 From: Jaap-Jan de Wit | DodoTech Date: Mon, 3 Aug 2026 15:50:31 +0200 Subject: [PATCH] Move the SFTP and S3 connection into the right-hand pane MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit THE CONNECT BAR IS GONE. It was a 44-pixel strip across the top of the file screen holding a heading, a picker, a password box and a button — chrome spanning both panes in order to configure one of them, drawn at full width whether or not anything was ever going to be connected. Underneath it sat a pane that was empty for exactly the same reason, saying so in a sentence nobody had to be told twice. So the pane says it instead. Disconnected, the right-hand half is an invitation where the listing would be: what the screen is for, what pressing the button costs, and one thing to press. SELECT HOST opens the picker in place — the same combo, the same password box, the same CONNECT — and the sentence and the button go away with it, because by then they have been read or they have not. Two steps rather than a picker sitting open, and that is not decoration. The reason the pane is empty is the question, and a combo box in the middle of it is a form with no question above it. The two steps also keep the panel inside its budget, which is the pane's height less whatever the queue has taken — 268 pixels with three transfers on it. Neither shape reaches the floor, and the layout suite measures both. IsChoosingRemote is cleared by everything that changes what the picker would be picking: connecting, disconnecting, moving between the SFTP and S3 tabs, and losing the vault. The last two are the ones that would rot quietly — a picker surviving a hop to the other tab offers hosts on a screen showing buckets, and one surviving a lock offers a list that has just been emptied because its rows carried decrypted secrets. CANCEL takes the typed password with it, which is a secret nobody asked to keep. WHERE THE TWO CONNECTED FACTS WENT. The address chip and DISCONNECT are a strip of their own inside the remote pane, above the listing — not three more cells in the header beside UP, REFRESH and DELETE. That pane is 381 pixels wide at the window's minimum and a fourth control in that row would have pushed one of the three off the edge; the number is written into the markup so the next thing added to either row is measured against it rather than tried. The status line did not fit there either. What is left after a 170-pixel address and a DISCONNECT is about eighty pixels, which turns every sentence into its first word and an ellipsis, so while a session is open it is in the queue's own strip at the foot of the screen, which spans the window. The other half of the time it is inside the invitation, beside the button that provoked it. One home in each state rather than two homes in one and none in the other. The header label reads HOST or BUCKET now, which is the only thing on the screen naming the kind — the bar that printed SFTP or S3 is gone and the tab in the strip says it either way, whether or not this screen is showing. The opening status text was "Choose a host and connect to browse its files", which the invitation now says in a heading, a sentence and a button. It is "Nothing is open yet.": a state rather than an instruction. That string is shared with the phone, where it still reads correctly under the picker card that head shows directly. Desktop only, and the phone is unchanged rather than merely untouched. Its FilesScreen is one pane at a time, so the picker *is* what it shows before a connection exists; it binds none of the new members. Four tests. Three in the layout suite — the picker open over a full queue, which is the tall shape and the one that has to be measured with the panes at their least; the bucket picker, which is a row shorter because an object store has nothing to type; and a session open with a long enough address to prove the chip gives way before DISCONNECT does. The fourth is the picker's lifecycle in ShellFlowTests, over all four things that put it away. 302 tests pass across the two suites. --- README.md | 7 +- .../Views/TransfersScreen.axaml | 338 ++++++++++++------ .../ViewModels/TransfersViewModel.cs | 66 +++- .../ScreenLayoutTests.cs | 77 ++++ .../ShellFlowTests.cs | 61 ++++ 5 files changed, 427 insertions(+), 122 deletions(-) diff --git a/README.md b/README.md index eb2d290..e7d038e 100644 --- a/README.md +++ b/README.md @@ -193,9 +193,10 @@ launch, because no device key is registered. ### Moving files -**FILES** in the nav rail is a two-pane browser: this machine on the left, the host on the right, and a -queue underneath. Choose a host, press **CONNECT**, then select a file in either pane and press the arrow -pointing the way you want it to go. +**SFTP** and **S3** in the tab strip are a two-pane browser: this machine on the left, the remote on the +right, and a queue underneath. The right-hand pane opens on an invitation rather than a listing — press +**SELECT HOST**, choose one, press **CONNECT** — and once something is open, select a file in either pane +and press the arrow pointing the way you want it to go. Two things about it are worth expecting rather than discovering. diff --git a/src/DodoSSH.Client.App/Views/TransfersScreen.axaml b/src/DodoSSH.Client.App/Views/TransfersScreen.axaml index 2a2d0a9..1d9d638 100644 --- a/src/DodoSSH.Client.App/Views/TransfersScreen.axaml +++ b/src/DodoSSH.Client.App/Views/TransfersScreen.axaml @@ -14,6 +14,21 @@ panes are symmetrical apart from one column: PERMS is remote-only, because a POSIX mode is not a fact about a file on the machine this client is developed on. + ── v3 ──────────────────────────────────────────────────────────────────────────────────────────────── + ◆ THE CONNECT BAR IS GONE, and everything it held is inside the right-hand pane now. + + It was a 44-pixel strip across the top of the screen holding a heading, a picker, a password box and a + button — chrome spanning both panes to configure one of them, and drawn at full width whether or not + anything was ever going to be connected. Underneath it sat a pane that was empty for exactly the same + reason, saying so in a sentence nobody had to be told twice. + + So the pane says it instead. Disconnected, the right-hand half is an invitation where the listing would + be: what this screen is for, what pressing the button will cost, and the button. Connected, the + invitation is replaced by the listing and the connection states itself in a strip above it, beside the + control that closes it — which is the arrangement the two facts were always about. The heading the bar + carried is not reprinted anywhere: the tab in the strip says SFTP or S3, and it says it whether or not + this screen is showing. + What the design has and this does not: `sftp over bastion-eu`, which needs jump hosts the connection layer has not got. See docs/design-import-gaps.md. --> @@ -71,105 +86,10 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -