Give the window its v5b chrome and each session surface its own shell

This commit is contained in:
2026-08-08 00:49:59 +02:00
parent 1b76c51fbb
commit 43c939b697
30 changed files with 4433 additions and 1772 deletions
@@ -114,6 +114,12 @@ internal sealed class ActivityLogRowViewModel(VaultItem<ActivityLogSecret> entry
_ => "changed",
};
/// <summary>── v5b ── Whether the WHAT chip should draw in its "created" colour.</summary>
internal bool IsCreated => entry.Secret.Operation is ActivityOperation.Created;
/// <summary>── v5b ── Whether the WHAT chip should draw in its "deleted" colour.</summary>
internal bool IsDeleted => entry.Secret.Operation is ActivityOperation.Deleted;
/// <inheritdoc cref="ConnectionLogRowViewModel.Started" />
internal string At => entry.Secret.At.ToLocalTime().ToString("g", CultureInfo.CurrentCulture);
@@ -192,6 +198,24 @@ internal sealed partial class LogsViewModel : ObservableObject
: "Nothing here yet. Adding, editing or deleting anything in the keychain is recorded here — the "
+ "names of the fields that changed, never their contents.";
/// <summary>
/// ── v5b ── The mono sentence Logs.dc.html prints beside REFRESH: what one row of the showing log
/// actually records.
/// </summary>
/// <remarks>
/// Per section rather than one line for the screen, and drawn from the same fact this type's own header
/// remarks already state: an entry is written once, at close, for a connection; and once per write, per
/// device, for an activity row. Not <see cref="Status"/> itself — that is a refresh outcome, cleared to
/// empty on success — so <see cref="HeaderStatusLine"/> is the one the header actually binds, showing an
/// error over this fact when there is one to show.
/// </remarks>
internal string SectionFact => Section is LogSection.Connections
? "an entry is written once, when a connection closes"
: "one row per write, per device";
/// <summary>What the header's own status line shows: an error, if refreshing just produced one, else the fact.</summary>
internal string HeaderStatusLine => Status.Length > 0 ? Status : SectionFact;
/// <summary>Shows one of the two logs.</summary>
[RelayCommand]
private void ShowSection(LogSection section) => Section = section;
@@ -296,7 +320,11 @@ internal sealed partial class LogsViewModel : ObservableObject
OnPropertyChanged(nameof(ShowsConnections));
OnPropertyChanged(nameof(ShowsActivity));
OnPropertyChanged(nameof(EmptyMessage));
OnPropertyChanged(nameof(SectionFact));
OnPropertyChanged(nameof(HeaderStatusLine));
}
partial void OnStatusChanged(string value) => OnPropertyChanged(nameof(HeaderStatusLine));
}
/// <summary>A connection that is open right now.</summary>