teamsiso/src/TeamsISO.App.WinUI/Views/OnboardingDialog.xaml

105 lines
4.9 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"?>
<ContentDialog
x:Class="TeamsISO.App.WinUI.Views.OnboardingDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Welcome to TeamsISO"
PrimaryButtonText="Get started"
SecondaryButtonText="Skip"
DefaultButton="Primary"
Background="{ThemeResource BgElevated}"
BorderBrush="{ThemeResource BorderStrong}">
<!--
First-launch only. Three sections, one pane deep — no carousel,
no celebration. Operator-tone copy ("Pick your NDI groups" not
"Welcome to TeamsISO!"). Skippable from the first frame.
Suppressed after dismissal via UIPreferences (Phase 7).
-->
<StackPanel Spacing="20" MinWidth="500" MaxWidth="540">
<TextBlock Style="{StaticResource TextSubtle}" TextWrapping="Wrap">
TeamsISO sits between Microsoft Teams' NDI broadcast and your live-production switcher.
One-time setup gets you to the participants table.
</TextBlock>
<StackPanel Spacing="10">
<StackPanel Orientation="Horizontal" Spacing="10">
<Border Width="28" Height="28"
CornerRadius="14"
Background="{ThemeResource AccentCyanMuted}">
<TextBlock Text="1"
Style="{StaticResource TextBody}"
FontWeight="SemiBold"
Foreground="{ThemeResource AccentCyanText}"
HorizontalAlignment="Center"
VerticalAlignment="Center"/>
</Border>
<TextBlock Text="Install the NDI Runtime"
Style="{StaticResource TextHeading}"
VerticalAlignment="Center"/>
</StackPanel>
<TextBlock Style="{StaticResource TextSubtle}"
Margin="38,0,0,0"
TextWrapping="Wrap">
From https://ndi.video/tools/. TeamsISO won't start without it — the engine relies on
NDI 5 for discovery and routing. If the runtime is missing, you'll see a launch error;
install it then relaunch.
</TextBlock>
</StackPanel>
<StackPanel Spacing="10">
<StackPanel Orientation="Horizontal" Spacing="10">
<Border Width="28" Height="28"
CornerRadius="14"
Background="{ThemeResource AccentCyanMuted}">
<TextBlock Text="2"
Style="{StaticResource TextBody}"
FontWeight="SemiBold"
Foreground="{ThemeResource AccentCyanText}"
HorizontalAlignment="Center"
VerticalAlignment="Center"/>
</Border>
<TextBlock Text="Enable Teams NDI broadcast"
Style="{StaticResource TextHeading}"
VerticalAlignment="Center"/>
</StackPanel>
<TextBlock Style="{StaticResource TextSubtle}"
Margin="38,0,0,0"
TextWrapping="Wrap">
Teams admin must enable NDI broadcast for your tenant. In Teams, Settings → Devices →
"Allow NDI usage." Per-participant streams will appear as TeamsISO discovers them.
</TextBlock>
</StackPanel>
<StackPanel Spacing="10">
<StackPanel Orientation="Horizontal" Spacing="10">
<Border Width="28" Height="28"
CornerRadius="14"
Background="{ThemeResource AccentCyanMuted}">
<TextBlock Text="3"
Style="{StaticResource TextBody}"
FontWeight="SemiBold"
Foreground="{ThemeResource AccentCyanText}"
HorizontalAlignment="Center"
VerticalAlignment="Center"/>
</Border>
<TextBlock Text="Pick your transcoder topology"
Style="{StaticResource TextHeading}"
VerticalAlignment="Center"/>
</StackPanel>
<TextBlock Style="{StaticResource TextSubtle}"
Margin="38,0,0,0"
TextWrapping="Wrap">
Defaults to 1920×1080 at 30 fps with letterbox aspect. Adjust under Settings → Routing.
Recording outputs land in %USERPROFILE%\Videos\TeamsISO\&lt;date&gt;\.
</TextBlock>
</StackPanel>
<CheckBox x:Name="DontShowAgain"
Content="Don't show this again"
IsChecked="True"/>
</StackPanel>
</ContentDialog>