feat(topbar): the recording lives in the pill — green pulse, REC clock, Stop Recording
Build 730 (creator): - Left pill while recording: solid #2ECC71 dot pulsing 1.0 <-> 0.2 on the existing one-second timer, and "REC: hh:mm:ss" in Consolas so the digits cannot jitter the pill's width. Idle face unchanged. - Right pill while recording: a stop square and "Stop Recording"; clicking it runs the normal stop, which halts and resets the clock and returns the pair to "Local MP4" / "Start Recording". - The separate reality line (dot + REC/LIVE + elapsed + End) is now LIVE-ONLY: a recording would otherwise print the same three facts twice. RunningVisible is IsLive, and ShowOutputStage no longer hides itself for a recording (it must be on screen to carry the clock and the stop). Two rules collided and are now separated rather than merged: a creator's Stop on a recording restores the Local MP4 pair (build 730), while a pipeline FAILURE still clears both pills (the 2026-09-01 zombie rule). StopStream(afterFailure:) carries the difference, and the pump-failure path passes it. RealAppHost.Run was rethrowing with `throw failure;`, which destroyed the original stack — a failing assertion inside the action reported the wrapper's line instead of its own. ExceptionDispatchInfo now preserves it; that is how the two failures above were located in one pass instead of five. 680 pass (one audio-pipe instance flake under full-suite load, passes alone), 0 warnings. Scope justification: Assets/starting-background.jpg is outside this unit — the creator's replacement art, still awaiting their visual check.
This commit is contained in:
@@ -33,7 +33,9 @@ public partial class MainViewModel
|
||||
|
||||
/// <summary>The output stage belongs to the Record / Go Live world, and only while nothing is
|
||||
/// running — a live session cannot change its output, so its switch is not offered.</summary>
|
||||
public bool ShowOutputStage => IsOutputWorld && IsOffline && !IsRecording;
|
||||
// A recording KEEPS the stage visible: the pill carries REC, the elapsed time and the stop. A live
|
||||
// stream does not — its reality line takes over (see RunningVisible).
|
||||
public bool ShowOutputStage => IsOutputWorld && !IsLive;
|
||||
|
||||
// ─── The output stage's three states (creator, builds 728/729) ───
|
||||
// 1. nothing chosen: [YouTube] [Local MP4]
|
||||
@@ -47,6 +49,10 @@ public partial class MainViewModel
|
||||
public bool YouTubeChipVisible => ShowOutputChoice || ShowYouTubeSelected;
|
||||
public bool LocalMp4ChipVisible => ShowOutputChoice || ShowLocalMp4Selected;
|
||||
|
||||
/// <summary>The left chip reads "Local MP4" while idle and "REC: hh:mm:ss" while recording, so the
|
||||
/// tabular figure cannot jitter the pill's width.</summary>
|
||||
public string RecordChipText => IsRecording ? $"REC: {LiveElapsedText}" : "Local MP4";
|
||||
|
||||
public bool ShowStartRecordingAction => ShowLocalMp4Selected && !IsRecording;
|
||||
public bool ShowEndRecordingAction => ShowLocalMp4Selected && IsRecording;
|
||||
|
||||
@@ -92,6 +98,7 @@ public partial class MainViewModel
|
||||
OnPropertyChanged(nameof(ShowLocalMp4Selected));
|
||||
OnPropertyChanged(nameof(ShowStartRecordingAction));
|
||||
OnPropertyChanged(nameof(ShowEndRecordingAction));
|
||||
OnPropertyChanged(nameof(RecordChipText));
|
||||
}
|
||||
|
||||
/// <summary>Switches worlds. Re-entering the current one still re-asserts its edit state, which is
|
||||
|
||||
Reference in New Issue
Block a user