dragon-iso/src/TeamsISO.App.WinUI/Views/SettingsDrawer.xaml

101 lines
4.1 KiB
Text
Raw Normal View History

feat(winui3): ThemeManager service + Settings drawer + Help/About/Onboarding Builds out the secondary surfaces of the redesigned WinUI 3 host. ThemeManager (Services/ThemeManager.cs) Single-source-of-truth for the active theme. Holds the user preference (System / Dark / Light), resolves it to ElementTheme at request, and raises a Themed event when it changes so the MainWindow can push the AppWindow title-bar button colors. Uses Windows.UI.ViewManagement UISettings to follow the OS app-mode when preference is System. Persistence to UIPreferences lands in the engine-wiring commit. MainWindow theme wiring Replaces the per-handler theme toggle with a ThemeManager subscription: click the title-bar sun/moon -> Toggle() -> Themed event -> ApplyResolvedTheme on the visual tree + the title-bar buttons. Glyph cue: sun = "current is Light, click to Dark"; moon = "current is Dark, click to Light." Initial state applied at construction so the first frame matches the preference. SettingsDrawer (Views/SettingsDrawer.xaml + .cs) UserControl that slides in from the right over the participants table. 56px header, NavigationView with five tabs (Appearance, Routing, Display, Control, Advanced), footer with Reset-to-defaults + Apply/Close. Appearance tab has the theme tri-state picker (System / Dark / Light radio group) and an "Accent peek" row showing the four brand accents (cyan / coral / live / warn) as swatches so the operator can verify Wild Dragon brand is respected on a light desk. CloseRequested event signals the host to collapse the drawer. HelpDialog (Views/HelpDialog.xaml + .cs) ContentDialog with the keyboard shortcut cheat sheet, grouped by category (Global / Participants / Look / Control surface). 540px max height with scroll, mono-spaced shortcut labels at left, body text at right. Replaces the WPF host's HelpWindow at parity. AboutDialog (Views/AboutDialog.xaml + .cs) ContentDialog with the Wild Dragon mark, version + host + engine + brand info as label/value rows, and three quick action buttons (open logs folder, open recordings, check for updates). Mirrors the WPF host's AboutWindow. OnboardingDialog (Views/OnboardingDialog.xaml + .cs) Three numbered steps (Install NDI Runtime / Enable Teams NDI / Pick transcoder topology), no carousel, operator-tone copy ("Don't show this again" defaults checked). PrimaryButtonText "Get started", SecondaryButtonText "Skip" so the dialog is skippable from the first frame as the PRODUCT.md anti-references demand. Build clean: dotnet build TeamsISO.App.WinUI -c Debug -> 0 / 0. Next: wire the drawer's CloseRequested into MainWindow (so the settings icon actually opens / collapses the drawer), then attack the runtime activation blocker (Phase 3 of the migration plan).
2026-05-13 00:13:58 -04:00
<?xml version="1.0" encoding="utf-8"?>
<UserControl
x:Class="TeamsISO.App.WinUI.Views.SettingsDrawer"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!--
Settings drawer — slides in from the right over the participants
table when the operator clicks the rail's settings icon. Esc dismiss.
Hosted inline (not as a separate Window) so the drawer feels like
part of the main surface rather than a satellite. Width fixed at
400px to give every setting a 320px input field after padding.
The five tabs mirror the WPF host's settings groups so the operator
finds the same toggles in the same places. The Appearance tab is
new — tri-state Theme picker (System / Dark / Light) plus a peek at
the accent palette so the operator can verify Wild Dragon brand is
respected on a light desk.
-->
<Grid Background="{ThemeResource BgSurface}"
BorderBrush="{ThemeResource BorderSubtle}"
BorderThickness="1,0,0,0">
<Grid.RowDefinitions>
<RowDefinition Height="56"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!-- Header -->
<Grid Grid.Row="0"
Padding="20,0,12,0"
BorderBrush="{ThemeResource BorderSubtle}"
BorderThickness="0,0,0,1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Text="Settings"
Style="{StaticResource TextTitle}"
VerticalAlignment="Center"/>
<Button x:Name="CloseButton"
Grid.Column="1"
Style="{StaticResource ButtonCaption}"
Click="OnCloseClick"
ToolTipService.ToolTip="Close (Esc)">
<FontIcon Glyph="&#xE8BB;" FontSize="12"/>
</Button>
</Grid>
<!-- Body. NavigationView swapped for a simpler horizontal tab
button strip; the WinUI 3 NavigationView's resource
dictionary expansion was crashing the XAML parser at
SettingsDrawer construction time. -->
<Grid Grid.Row="1">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackPanel Grid.Row="0"
x:Name="TabStrip"
Orientation="Horizontal"
Spacing="4"
Padding="12,8"
BorderBrush="{ThemeResource BorderSubtle}"
BorderThickness="0,0,0,1"/>
<ScrollViewer Grid.Row="1"
VerticalScrollBarVisibility="Auto"
feat(winui3): ThemeManager service + Settings drawer + Help/About/Onboarding Builds out the secondary surfaces of the redesigned WinUI 3 host. ThemeManager (Services/ThemeManager.cs) Single-source-of-truth for the active theme. Holds the user preference (System / Dark / Light), resolves it to ElementTheme at request, and raises a Themed event when it changes so the MainWindow can push the AppWindow title-bar button colors. Uses Windows.UI.ViewManagement UISettings to follow the OS app-mode when preference is System. Persistence to UIPreferences lands in the engine-wiring commit. MainWindow theme wiring Replaces the per-handler theme toggle with a ThemeManager subscription: click the title-bar sun/moon -> Toggle() -> Themed event -> ApplyResolvedTheme on the visual tree + the title-bar buttons. Glyph cue: sun = "current is Light, click to Dark"; moon = "current is Dark, click to Light." Initial state applied at construction so the first frame matches the preference. SettingsDrawer (Views/SettingsDrawer.xaml + .cs) UserControl that slides in from the right over the participants table. 56px header, NavigationView with five tabs (Appearance, Routing, Display, Control, Advanced), footer with Reset-to-defaults + Apply/Close. Appearance tab has the theme tri-state picker (System / Dark / Light radio group) and an "Accent peek" row showing the four brand accents (cyan / coral / live / warn) as swatches so the operator can verify Wild Dragon brand is respected on a light desk. CloseRequested event signals the host to collapse the drawer. HelpDialog (Views/HelpDialog.xaml + .cs) ContentDialog with the keyboard shortcut cheat sheet, grouped by category (Global / Participants / Look / Control surface). 540px max height with scroll, mono-spaced shortcut labels at left, body text at right. Replaces the WPF host's HelpWindow at parity. AboutDialog (Views/AboutDialog.xaml + .cs) ContentDialog with the Wild Dragon mark, version + host + engine + brand info as label/value rows, and three quick action buttons (open logs folder, open recordings, check for updates). Mirrors the WPF host's AboutWindow. OnboardingDialog (Views/OnboardingDialog.xaml + .cs) Three numbered steps (Install NDI Runtime / Enable Teams NDI / Pick transcoder topology), no carousel, operator-tone copy ("Don't show this again" defaults checked). PrimaryButtonText "Get started", SecondaryButtonText "Skip" so the dialog is skippable from the first frame as the PRODUCT.md anti-references demand. Build clean: dotnet build TeamsISO.App.WinUI -c Debug -> 0 / 0. Next: wire the drawer's CloseRequested into MainWindow (so the settings icon actually opens / collapses the drawer), then attack the runtime activation blocker (Phase 3 of the migration plan).
2026-05-13 00:13:58 -04:00
Padding="20">
<StackPanel x:Name="TabContent" Spacing="16"/>
</ScrollViewer>
</Grid>
feat(winui3): ThemeManager service + Settings drawer + Help/About/Onboarding Builds out the secondary surfaces of the redesigned WinUI 3 host. ThemeManager (Services/ThemeManager.cs) Single-source-of-truth for the active theme. Holds the user preference (System / Dark / Light), resolves it to ElementTheme at request, and raises a Themed event when it changes so the MainWindow can push the AppWindow title-bar button colors. Uses Windows.UI.ViewManagement UISettings to follow the OS app-mode when preference is System. Persistence to UIPreferences lands in the engine-wiring commit. MainWindow theme wiring Replaces the per-handler theme toggle with a ThemeManager subscription: click the title-bar sun/moon -> Toggle() -> Themed event -> ApplyResolvedTheme on the visual tree + the title-bar buttons. Glyph cue: sun = "current is Light, click to Dark"; moon = "current is Dark, click to Light." Initial state applied at construction so the first frame matches the preference. SettingsDrawer (Views/SettingsDrawer.xaml + .cs) UserControl that slides in from the right over the participants table. 56px header, NavigationView with five tabs (Appearance, Routing, Display, Control, Advanced), footer with Reset-to-defaults + Apply/Close. Appearance tab has the theme tri-state picker (System / Dark / Light radio group) and an "Accent peek" row showing the four brand accents (cyan / coral / live / warn) as swatches so the operator can verify Wild Dragon brand is respected on a light desk. CloseRequested event signals the host to collapse the drawer. HelpDialog (Views/HelpDialog.xaml + .cs) ContentDialog with the keyboard shortcut cheat sheet, grouped by category (Global / Participants / Look / Control surface). 540px max height with scroll, mono-spaced shortcut labels at left, body text at right. Replaces the WPF host's HelpWindow at parity. AboutDialog (Views/AboutDialog.xaml + .cs) ContentDialog with the Wild Dragon mark, version + host + engine + brand info as label/value rows, and three quick action buttons (open logs folder, open recordings, check for updates). Mirrors the WPF host's AboutWindow. OnboardingDialog (Views/OnboardingDialog.xaml + .cs) Three numbered steps (Install NDI Runtime / Enable Teams NDI / Pick transcoder topology), no carousel, operator-tone copy ("Don't show this again" defaults checked). PrimaryButtonText "Get started", SecondaryButtonText "Skip" so the dialog is skippable from the first frame as the PRODUCT.md anti-references demand. Build clean: dotnet build TeamsISO.App.WinUI -c Debug -> 0 / 0. Next: wire the drawer's CloseRequested into MainWindow (so the settings icon actually opens / collapses the drawer), then attack the runtime activation blocker (Phase 3 of the migration plan).
2026-05-13 00:13:58 -04:00
<!-- Footer: Apply / Reset -->
<Grid Grid.Row="2"
Padding="16,12"
BorderBrush="{ThemeResource BorderSubtle}"
BorderThickness="0,1,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0"
x:Name="DirtyHint"
Text="Changes apply on close."
Style="{StaticResource TextCaption}"
VerticalAlignment="Center"/>
<Button Grid.Column="1"
Style="{StaticResource ButtonTertiary}"
Content="Reset to defaults"
Margin="0,0,8,0"
Click="OnResetClick"/>
<Button Grid.Column="2"
Style="{StaticResource ButtonPrimary}"
Content="Apply"
Click="OnApplyClick"/>
</Grid>
</Grid>
</UserControl>