Give the application a settings area built from what really exists

This commit is contained in:
jaap-jan committed 2026-08-08 14:17:19 +02:00
1 parent 422d5ca10e
commit c8507b44fe
42 files changed
+3810 -1083

No files matched your search

+52 -31
View File
@@ -91,12 +91,13 @@
<Grid RowDefinitions="Auto,*,Auto,Auto">
<views:TitleBar Grid.Row="0" />
<views:TitleBar Grid.Row="0" IsVisible="{Binding !IsSettingsMode}" />
<Panel Grid.Row="1">
<!-- The unlocked application. -->
<Grid ColumnDefinitions="Auto,*" IsVisible="{Binding IsUnlocked}">
<Grid ColumnDefinitions="Auto,*" IsVisible="{Binding IsUnlocked}"
IsEnabled="{Binding !IsSettingsMode}">
<!--
The window's own furniture, at 255 pixels — see NavRail.axaml's own v5b remark. It no longer sits
@@ -176,13 +177,19 @@
by a toggle inside the screen — see ShowFiles, and the rail's own switcher segment that
calls it now; see NavRail.axaml.
Deliberately not given the session shell above: a bucket is not a host, has no terminal tab
Deliberately not given the full session shell above: a bucket is not a host, has no terminal tab
to be the other end of a cross-surface button, and pins nothing the sidebar's QUICK ACCESS
could show. Wave B's own scope is the terminal and SFTP surfaces; S3 stays the plain screen it
already was, and this is the recorded reason rather than an oversight.
could show — so no tab row, no host header, no status bar and no sidebar. Wave B's own scope
was the terminal and SFTP surfaces and left this plain; v5c-3 gives it the session shell's own
LOOK without its machinery — a 26px padded column and the same bordered, radius-12 container —
since design-notes/v5c-fidelity-notes.md calls for the fidelity pass here too, and there is
nothing this screen does that needs the parts still withheld.
-->
<Panel IsVisible="{Binding IsBucketsScreen}">
<views:TransfersScreen DataContext="{Binding Transfers}" />
<Border Margin="26" BorderBrush="{StaticResource Border}" BorderThickness="1" CornerRadius="12"
ClipToBounds="True">
<views:TransfersScreen DataContext="{Binding Transfers}" />
</Border>
</Panel>
<!-- ============ KEYCHAIN ============ -->
@@ -217,30 +224,21 @@
<views:LogsScreen x:Name="LogsPane" DataContext="{Binding LogsScreen}" />
</Panel>
<!-- ============ VAULTS ============ -->
<!--
Wrapped, for the reason the keychain and transfers screens are: the visibility is the shell's
business and the data context is the vaults view model, and both on one element would resolve
IsVaultsScreen against a type that does not have it.
v5c-2: the VAULTS panel that used to live here is gone. ShellScreen.Vaults now only ever shows
through settings mode's own SettingsVaultsPage — see MainWindowViewModel.ShowScreen, which
redirects it into EnterSettings before Screen is ever set — so IsVaultsScreen being true also
means IsSettingsMode is true, and this whole page-area Panel (bound to !IsSettingsMode, above)
is already hidden behind SettingsView by then. A Panel here would never have been drawn.
Bound to Vaults, which is the vaults themselves and the people in them — not to Vault, which
is one vault's contents and is what the keychain and hosts screens above draw.
v5c-3: IMPORT left this Panel the same way, and for the same reason. Import.dc.html draws the
importer inside the settings chrome — SettingsNav lit on Preferences, a "Back to preferences"
titlebar rather than the ordinary rail and titlebar this Panel belongs to — so ImportScreen now
lives in SettingsView.axaml behind MainWindowViewModel.IsImportOpen, beside the seven settings
pages rather than among the screens here. See ShowScreen's own translation of
ShellScreen.Import for what still reaches it: the Preferences page's own "OPEN IMPORTER" row,
and anything else that names the same destination.
-->
<Panel IsVisible="{Binding IsVaultsScreen}">
<views:VaultsScreen DataContext="{Binding Vaults}" />
</Panel>
<!-- ============ PREFERENCES ============ -->
<views:PreferencesScreen IsVisible="{Binding IsPreferencesScreen}" />
<!-- ============ IMPORT ============ -->
<!--
Reached from preferences rather than from the rail; see ShellScreen.Import. Wrapped, like
the others whose data context is their own view model.
-->
<Panel IsVisible="{Binding IsImportScreen}">
<views:ImportScreen x:Name="ImportPane" DataContext="{Binding ImportScreen}" />
</Panel>
</Panel>
@@ -319,6 +317,22 @@
</Panel>
</Grid>
<!--
v5c: the settings mode, which replaces the titlebar above and everything in this Panel below it with
its own — see SettingsView.axaml and TitleBar's own IsVisible next to it in this file. Later in the
Panel than the unlocked Grid, on the same reasoning the setup Border below gives for its own
position: Avalonia z-order draws a later sibling over an earlier one, and SettingsView's own
Background is opaque, so it covers the rail and the page area completely rather than needing them
hidden out from under it. The unlocked Grid keeps IsEnabled bound to the negation above so a Tab
press cannot walk keyboard focus into a control this mode has covered.
Earlier than the palette and the host-key decision, both further down this same Panel, so either can
still interrupt settings mode exactly as it already interrupts every other screen — a host key that
changes while the sync loop is running does not stop being worth answering because the window
happens to be showing Settings.
-->
<views:SettingsView IsVisible="{Binding IsSettingsMode}" />
<!--
Setup and unlock. Later in the Panel, so it is above the application content in Avalonia's z-order —
which covers Avalonia-drawn content and nothing else. The terminal is collapsed rather than covered;
@@ -476,11 +490,18 @@
no DataContext yields UnsetValue, IsVisible falls back to true, and the previewer would show a banner
announcing an update that does not exist.
-->
<views:UpdateBanner Grid.Row="2"
DataContext="{Binding Updates}"
IsVisible="{Binding IsBannerShowing, FallbackValue=False}" />
<!--
v5c: wrapped rather than given a third condition of its own — UpdateBanner sets its own DataContext to
UpdateViewModel on this same element, so a binding against IsSettingsMode has to live on an ancestor
whose context is still the shell. The design's settings titlebar has no room for this strip; hiding it
here rather than teaching the banner about a mode it otherwise has no reason to know about.
-->
<Panel Grid.Row="2" IsVisible="{Binding !IsSettingsMode}">
<views:UpdateBanner DataContext="{Binding Updates}"
IsVisible="{Binding IsBannerShowing, FallbackValue=False}" />
</Panel>
<views:StatusBar Grid.Row="3" />
<views:StatusBar Grid.Row="3" IsVisible="{Binding !IsSettingsMode}" />
</Grid>