feat(topbar): the output stage — Output [YouTube] [Local MP4] One output at a time
Unit B (creator ruling 2026-11-12). Pressing Record / Go Live now changes the bar: the REC/ON-AIR pill pair becomes two labelled switches with glyphs (the YouTube mark, the record dot), under an "Output" label and beside "One output at a time". Build world shows nothing but its own segment. Two things this exposed that were not cosmetic: - **Local MP4 was not actually the default.** Both pills started unarmed, so the stage opened with no output selected; the old screen got away with it because the primary button inferred "record" from "nothing armed". RecordPillOn now starts true, which is what "pos = ON (default)" means in code. - **The stage gates the whole idle cluster, not just the switch.** Gating only the switch left the start button visible in the Build world — a Start with no output chosen. ShowOutputStage (output world, idle, not recording) wraps the cluster, so a running session hides the stage too: its output cannot change. Exclusivity stays in the view model (arming one drops the other); the XAML merely reflects it. TopBarWorldTests pins the stage's visibility and the radio pair starting at Local MP4. 680 pass, 0 warnings. Next: unit C (output-dependent primary action, End labels). 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:
@@ -41,7 +41,9 @@ public partial class MainViewModel : ViewModelBase
|
||||
// ─── IsRecording / IsLive are reality. ON-AIR needs a sign-in, and the
|
||||
// ─── pills are radio-exclusive (record-OR-live, creator ruling 2026-09-01):
|
||||
// ─── arming one clears the other.
|
||||
private bool _recordPillOn;
|
||||
// Local MP4 is the armed output at launch (creator ruling 2026-11-12: "pos = ON (default)").
|
||||
// Before that both were unarmed, so the output stage opened with nothing selected.
|
||||
private bool _recordPillOn = true;
|
||||
private bool _onAirPillOn;
|
||||
private bool _isRecording;
|
||||
|
||||
|
||||
@@ -31,6 +31,10 @@ public partial class MainViewModel
|
||||
public bool IsBuildWorld => _barWorld == BarWorld.Build;
|
||||
public bool IsOutputWorld => _barWorld == BarWorld.Output;
|
||||
|
||||
/// <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;
|
||||
|
||||
public ICommand EnterBuildWorldCommand { get; private set; } = null!;
|
||||
public ICommand EnterOutputWorldCommand { get; private set; } = null!;
|
||||
|
||||
@@ -49,5 +53,6 @@ public partial class MainViewModel
|
||||
OnPropertyChanged(nameof(IsBuildWorld));
|
||||
OnPropertyChanged(nameof(IsOutputWorld));
|
||||
EditingActive = world == BarWorld.Build;
|
||||
OnPropertyChanged(nameof(ShowOutputStage));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user