ON-AIR label matches REC: shared StatusSignText style, dots carry state

This commit is contained in:
2026-08-24 10:30:18 -07:00
parent 7357836f9b
commit d5b611d8d5
4 changed files with 13 additions and 6 deletions
+1 -1
View File
@@ -10,7 +10,7 @@
- TASK 27 — YouTube Chat layer one-per-layout gate (`CanAddYouTubeChat`, AddSource refuses a second) + legacy label heal ("Chat" → "YouTube Chat" on LoadLayout; creator renames untouched; test `ChatLayerGateTests`). Creator's ask: "do the same thing with the YouTube chat layer" + make the Layers row match the (+) picklist. - TASK 27 — YouTube Chat layer one-per-layout gate (`CanAddYouTubeChat`, AddSource refuses a second) + legacy label heal ("Chat" → "YouTube Chat" on LoadLayout; creator renames untouched; test `ChatLayerGateTests`). Creator's ask: "do the same thing with the YouTube chat layer" + make the Layers row match the (+) picklist.
- TASK 19/23 status flip — code survey confirmed Control Surface UX fully shipped (thumbnail strip, two-state left panel, right panel gone, transitions, edit gating); map corrected. - TASK 19/23 status flip — code survey confirmed Control Surface UX fully shipped (thumbnail strip, two-state left panel, right panel gone, transitions, edit gating); map corrected.
- **TASK 20 step 1 — global hotkeys** (`Services/GlobalHotkeys.cs`, `MainViewModel.HandleHotkey`, `MainWindow.OnSourceInitialized` wiring): F1-F5 canonical scenes, F6 start/end stream, F7 mic mute, F8 desktop mute, F9 TRAX. `IHotkeyRegistrar` seam + `RegistrarOverride`. Test `GlobalHotkeyTests.WmHotkey_StagesScene_And_TogglesMic_And_RevokesOnClose`. Hotkeys validated by creator. - **TASK 20 step 1 — global hotkeys** (`Services/GlobalHotkeys.cs`, `MainViewModel.HandleHotkey`, `MainWindow.OnSourceInitialized` wiring): F1-F5 canonical scenes, F6 start/end stream, F7 mic mute, F8 desktop mute, F9 TRAX. `IHotkeyRegistrar` seam + `RegistrarOverride`. Test `GlobalHotkeyTests.WmHotkey_StagesScene_And_TogglesMic_And_RevokesOnClose`. Hotkeys validated by creator.
- **ON-AIR sign** (creator ask): new status light + "ON-AIR" right of REC in the top bar (`OnAirBrush`: gray offline / red public / green private); old left-of-REC hardcoded indicator removed. Test `OnAirSignTests.OnAirBrush_Follows_Offline_Public_And_Private`. - **ON-AIR sign** (creator ask): new status light + "ON-AIR" right of REC in the top bar (`OnAirBrush`: gray offline / red public / green private); old left-of-REC hardcoded indicator removed. Labels share one `StatusSignText` style in Controls.xaml (creator dinged inconsistency when ON-AIR text took the status color — labels are neutral, dots carry state). Test `OnAirSignTests.OnAirBrush_Follows_Offline_Public_And_Private`.
- Suite: 227 total, 226 pass — only failure is the known pre-existing `AudioPipelineTests.Mix_HonorsProviderGains_AndGameMute_KillsTheLoopback`. Build 0 warnings. Docs shipped same-commit. - Suite: 227 total, 226 pass — only failure is the known pre-existing `AudioPipelineTests.Mix_HonorsProviderGains_AndGameMute_KillsTheLoopback`. Build 0 warnings. Docs shipped same-commit.
- Visual pass on TASK 26/27 validated by creator (2026-08-24). - Visual pass on TASK 26/27 validated by creator (2026-08-24).
+2 -4
View File
@@ -116,13 +116,11 @@
HorizontalAlignment="Center" VerticalAlignment="Center"> HorizontalAlignment="Center" VerticalAlignment="Center">
<Ellipse Width="12" Height="12" VerticalAlignment="Center" <Ellipse Width="12" Height="12" VerticalAlignment="Center"
Fill="{Binding RecDotBrush}" Opacity="{Binding RecDotOpacity}"/> Fill="{Binding RecDotBrush}" Opacity="{Binding RecDotOpacity}"/>
<TextBlock Text="REC" FontSize="16" FontWeight="Bold" <TextBlock Text="REC" Style="{StaticResource StatusSignText}"/>
Foreground="{Binding RecTextBrush}" VerticalAlignment="Center" Margin="8,0,0,0"/>
<!-- ON-AIR sign: gray offline, red public, green private --> <!-- ON-AIR sign: gray offline, red public, green private -->
<Ellipse Width="12" Height="12" VerticalAlignment="Center" Margin="16,0,0,0" <Ellipse Width="12" Height="12" VerticalAlignment="Center" Margin="16,0,0,0"
Fill="{Binding OnAirBrush}"/> Fill="{Binding OnAirBrush}"/>
<TextBlock Text="ON-AIR" FontSize="16" FontWeight="Bold" <TextBlock Text="ON-AIR" Style="{StaticResource StatusSignText}"/>
Foreground="{Binding OnAirBrush}" VerticalAlignment="Center" Margin="8,0,0,0"/>
<Border Background="#8f1f1f" CornerRadius="3" Padding="6,1" Margin="8,0,0,0" <Border Background="#8f1f1f" CornerRadius="3" Padding="6,1" Margin="8,0,0,0"
VerticalAlignment="Center" VerticalAlignment="Center"
Visibility="{Binding IsLivePrivate, Converter={StaticResource BoolToVis}}"> Visibility="{Binding IsLivePrivate, Converter={StaticResource BoolToVis}}">
+9
View File
@@ -562,6 +562,15 @@
<Setter Property="Margin" Value="4,0,0,4"/> <Setter Property="Margin" Value="4,0,0,4"/>
</Style> </Style>
<!-- Top-bar status sign label (REC / ON-AIR): one definition so the two signs can't drift -->
<Style x:Key="StatusSignText" TargetType="TextBlock">
<Setter Property="Foreground" Value="{Binding RecTextBrush}"/>
<Setter Property="FontSize" Value="16"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="Margin" Value="8,0,0,0"/>
</Style>
<!-- Sliding pill toggle: ON = green, OFF = red (#ef4444) --> <!-- Sliding pill toggle: ON = green, OFF = red (#ef4444) -->
<Style x:Key="PillToggle" TargetType="ToggleButton"> <Style x:Key="PillToggle" TargetType="ToggleButton">
<Setter Property="Width" Value="36"/> <Setter Property="Width" Value="36"/>
+1 -1
View File
File diff suppressed because one or more lines are too long