feat: app icon, FPS, drops counter, --version, About dialog, Stop Teams toggle
Six related polish items, all building on tonight's groundwork.
1. App icon: teamsiso.ico generated from dragon-mark.png at 7 sizes (16-256), wired as ApplicationIcon in the WPF csproj, MainWindow.Icon, AboutWindow.Icon, and ARPPRODUCTICON in the WiX MSI. Taskbar / window / Add-Remove-Programs all show the dragon mark now.
2. Running incoming FPS: ring buffer of last 30 frame timestamps in IsoPipeline; ComputeFps() returns moving-average rate. Surfaced on IsoHealthStats.IncomingFps and shown in the Source column of the participants DataGrid as 'WxH · 59.94 fps'. Resets cleanly on every supervisor restart.
3. Drops counter: FrameProcessor.Stats already aggregated FramesDropped (closest-frame strategy when the receiver outpaces the processor) and FramesDuplicated; just plumbed _liveProcessor through IsoPipeline so GetStats() can read them. Exposed in the Live column under the in/out counters as a coral-tinted 'drop N'.
4. Console --version flag: prints engine version (with embedded git SHA), .NET version, OS, NDI runtime banner, expected prefix, exit-code legend, plus a wilddragon.net link. Useful for support tickets.
5. About dialog: chromeless modal with the dragon mark + version / .NET / OS / NDI runtime fields and a link to wilddragon.net. Triggered by clicking the rail logo.
6. Teams launcher Stop toggle: TeamsLauncher gains IsRunning() and StopAll(). The rail's Teams button now toggles — if Teams is up, ask to close all Teams windows via WM_CLOSE; otherwise launch as before. Confirms before stopping so we don't kill the user's call mid-transition.
Tests: 74/74 unit + 9/9 NDI integration green throughout. MSI builds clean and now embeds the dragon icon for ARP.
2026-05-08 13:50:19 -04:00
|
|
|
<Window x:Class="TeamsISO.App.AboutWindow"
|
|
|
|
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
|
|
|
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
|
|
|
xmlns:shell="clr-namespace:System.Windows.Shell;assembly=PresentationFramework"
|
|
|
|
|
Title="About TeamsISO"
|
|
|
|
|
Icon="/Assets/teamsiso.ico"
|
|
|
|
|
Width="460" Height="500"
|
|
|
|
|
WindowStartupLocation="CenterOwner"
|
|
|
|
|
WindowStyle="None"
|
|
|
|
|
ResizeMode="NoResize"
|
|
|
|
|
Background="{DynamicResource Wd.Canvas}"
|
|
|
|
|
UseLayoutRounding="True"
|
|
|
|
|
TextOptions.TextFormattingMode="Ideal"
|
|
|
|
|
TextOptions.TextRenderingMode="ClearType">
|
|
|
|
|
|
|
|
|
|
<shell:WindowChrome.WindowChrome>
|
|
|
|
|
<shell:WindowChrome
|
|
|
|
|
CaptionHeight="32"
|
|
|
|
|
ResizeBorderThickness="0"
|
|
|
|
|
CornerRadius="0"
|
|
|
|
|
GlassFrameThickness="0"
|
|
|
|
|
UseAeroCaptionButtons="False"/>
|
|
|
|
|
</shell:WindowChrome.WindowChrome>
|
|
|
|
|
|
|
|
|
|
<Border BorderBrush="{DynamicResource Wd.Border}" BorderThickness="1">
|
|
|
|
|
<Grid>
|
|
|
|
|
<Grid.RowDefinitions>
|
|
|
|
|
<RowDefinition Height="Auto"/>
|
|
|
|
|
<RowDefinition Height="*"/>
|
|
|
|
|
<RowDefinition Height="Auto"/>
|
|
|
|
|
</Grid.RowDefinitions>
|
|
|
|
|
|
|
|
|
|
<!-- Caption -->
|
|
|
|
|
<Grid Grid.Row="0">
|
|
|
|
|
<Grid.ColumnDefinitions>
|
|
|
|
|
<ColumnDefinition Width="*"/>
|
|
|
|
|
<ColumnDefinition Width="Auto"/>
|
|
|
|
|
</Grid.ColumnDefinitions>
|
|
|
|
|
<TextBlock Text="About TeamsISO"
|
|
|
|
|
Style="{StaticResource Wd.Text.Caption}"
|
|
|
|
|
Margin="20,12,0,0"
|
|
|
|
|
VerticalAlignment="Center"/>
|
|
|
|
|
<Button Grid.Column="1"
|
|
|
|
|
Style="{StaticResource Wd.Button.CaptionClose}"
|
|
|
|
|
Click="OnClose"
|
|
|
|
|
shell:WindowChrome.IsHitTestVisibleInChrome="True">
|
|
|
|
|
<Path Data="M 0,0 L 10,10 M 10,0 L 0,10"
|
|
|
|
|
Stroke="{DynamicResource Wd.Text.Primary}"
|
|
|
|
|
StrokeThickness="1.2"
|
|
|
|
|
Width="10" Height="10"
|
|
|
|
|
Stretch="None"/>
|
|
|
|
|
</Button>
|
|
|
|
|
</Grid>
|
|
|
|
|
|
|
|
|
|
<!-- Body -->
|
|
|
|
|
<StackPanel Grid.Row="1"
|
|
|
|
|
Margin="32,16,32,16"
|
|
|
|
|
VerticalAlignment="Top">
|
|
|
|
|
<Image Source="/Assets/dragon-mark.png"
|
|
|
|
|
Width="80" Height="80"
|
|
|
|
|
HorizontalAlignment="Center"
|
|
|
|
|
Margin="0,0,0,16"
|
|
|
|
|
RenderOptions.BitmapScalingMode="HighQuality"/>
|
|
|
|
|
|
|
|
|
|
<TextBlock Text="TeamsISO"
|
|
|
|
|
Style="{StaticResource Wd.Text.Title}"
|
|
|
|
|
FontSize="28"
|
|
|
|
|
HorizontalAlignment="Center"/>
|
|
|
|
|
|
|
|
|
|
<TextBlock Text="Per-participant NDI ISO Controller for Microsoft Teams"
|
|
|
|
|
Style="{StaticResource Wd.Text.Subtle}"
|
|
|
|
|
Foreground="{DynamicResource Wd.Text.Tertiary}"
|
|
|
|
|
HorizontalAlignment="Center"
|
|
|
|
|
TextAlignment="Center"
|
|
|
|
|
Margin="0,4,0,0"
|
|
|
|
|
TextWrapping="Wrap"/>
|
|
|
|
|
|
|
|
|
|
<Border Style="{StaticResource Wd.Card}"
|
|
|
|
|
Margin="0,20,0,0"
|
|
|
|
|
Padding="16">
|
|
|
|
|
<Grid>
|
|
|
|
|
<Grid.RowDefinitions>
|
|
|
|
|
<RowDefinition Height="Auto"/>
|
|
|
|
|
<RowDefinition Height="Auto"/>
|
|
|
|
|
<RowDefinition Height="Auto"/>
|
|
|
|
|
<RowDefinition Height="Auto"/>
|
|
|
|
|
</Grid.RowDefinitions>
|
|
|
|
|
<Grid.ColumnDefinitions>
|
|
|
|
|
<ColumnDefinition Width="Auto"/>
|
|
|
|
|
<ColumnDefinition Width="*"/>
|
|
|
|
|
</Grid.ColumnDefinitions>
|
|
|
|
|
|
|
|
|
|
<TextBlock Grid.Row="0" Grid.Column="0" Text="Version"
|
|
|
|
|
Style="{StaticResource Wd.Text.Subtle}"
|
|
|
|
|
Foreground="{DynamicResource Wd.Text.Tertiary}"
|
|
|
|
|
Margin="0,0,16,4"/>
|
|
|
|
|
<TextBlock Grid.Row="0" Grid.Column="1"
|
|
|
|
|
x:Name="VersionText"
|
|
|
|
|
Style="{StaticResource Wd.Text.Mono}"
|
|
|
|
|
FontSize="11"
|
|
|
|
|
Foreground="{DynamicResource Wd.Text.Primary}"
|
|
|
|
|
TextWrapping="Wrap"
|
|
|
|
|
Margin="0,0,0,4"/>
|
|
|
|
|
|
|
|
|
|
<TextBlock Grid.Row="1" Grid.Column="0" Text=".NET"
|
|
|
|
|
Style="{StaticResource Wd.Text.Subtle}"
|
|
|
|
|
Foreground="{DynamicResource Wd.Text.Tertiary}"
|
|
|
|
|
Margin="0,0,16,4"/>
|
|
|
|
|
<TextBlock Grid.Row="1" Grid.Column="1"
|
|
|
|
|
x:Name="RuntimeText"
|
|
|
|
|
Style="{StaticResource Wd.Text.Mono}"
|
|
|
|
|
FontSize="11"
|
|
|
|
|
Foreground="{DynamicResource Wd.Text.Primary}"
|
|
|
|
|
Margin="0,0,0,4"/>
|
|
|
|
|
|
|
|
|
|
<TextBlock Grid.Row="2" Grid.Column="0" Text="OS"
|
|
|
|
|
Style="{StaticResource Wd.Text.Subtle}"
|
|
|
|
|
Foreground="{DynamicResource Wd.Text.Tertiary}"
|
|
|
|
|
Margin="0,0,16,4"/>
|
|
|
|
|
<TextBlock Grid.Row="2" Grid.Column="1"
|
|
|
|
|
x:Name="OsText"
|
|
|
|
|
Style="{StaticResource Wd.Text.Mono}"
|
|
|
|
|
FontSize="11"
|
|
|
|
|
Foreground="{DynamicResource Wd.Text.Primary}"
|
|
|
|
|
Margin="0,0,0,4"/>
|
|
|
|
|
|
|
|
|
|
<TextBlock Grid.Row="3" Grid.Column="0" Text="NDI runtime"
|
|
|
|
|
Style="{StaticResource Wd.Text.Subtle}"
|
|
|
|
|
Foreground="{DynamicResource Wd.Text.Tertiary}"
|
|
|
|
|
Margin="0,0,16,0"/>
|
|
|
|
|
<TextBlock Grid.Row="3" Grid.Column="1"
|
|
|
|
|
x:Name="NdiText"
|
|
|
|
|
Style="{StaticResource Wd.Text.Mono}"
|
|
|
|
|
FontSize="11"
|
|
|
|
|
Foreground="{DynamicResource Wd.Text.Primary}"
|
|
|
|
|
TextWrapping="Wrap"/>
|
|
|
|
|
</Grid>
|
|
|
|
|
</Border>
|
2026-05-10 09:41:29 -04:00
|
|
|
|
|
|
|
|
<!-- Quick-jump shortcuts to the data directories -->
|
|
|
|
|
<StackPanel Orientation="Horizontal"
|
|
|
|
|
HorizontalAlignment="Center"
|
|
|
|
|
Margin="0,12,0,0">
|
|
|
|
|
<Button Style="{StaticResource Wd.Button.Ghost}"
|
|
|
|
|
Content="Logs"
|
|
|
|
|
Click="OnOpenLogs"
|
|
|
|
|
Padding="14,6"
|
|
|
|
|
Margin="0,0,8,0"
|
|
|
|
|
ToolTip="Open %LOCALAPPDATA%\TeamsISO\Logs in Explorer"/>
|
|
|
|
|
<Button Style="{StaticResource Wd.Button.Ghost}"
|
|
|
|
|
Content="Notes"
|
|
|
|
|
Click="OnOpenNotes"
|
|
|
|
|
Padding="14,6"
|
|
|
|
|
ToolTip="Open %LOCALAPPDATA%\TeamsISO\Notes in Explorer"/>
|
|
|
|
|
</StackPanel>
|
feat: app icon, FPS, drops counter, --version, About dialog, Stop Teams toggle
Six related polish items, all building on tonight's groundwork.
1. App icon: teamsiso.ico generated from dragon-mark.png at 7 sizes (16-256), wired as ApplicationIcon in the WPF csproj, MainWindow.Icon, AboutWindow.Icon, and ARPPRODUCTICON in the WiX MSI. Taskbar / window / Add-Remove-Programs all show the dragon mark now.
2. Running incoming FPS: ring buffer of last 30 frame timestamps in IsoPipeline; ComputeFps() returns moving-average rate. Surfaced on IsoHealthStats.IncomingFps and shown in the Source column of the participants DataGrid as 'WxH · 59.94 fps'. Resets cleanly on every supervisor restart.
3. Drops counter: FrameProcessor.Stats already aggregated FramesDropped (closest-frame strategy when the receiver outpaces the processor) and FramesDuplicated; just plumbed _liveProcessor through IsoPipeline so GetStats() can read them. Exposed in the Live column under the in/out counters as a coral-tinted 'drop N'.
4. Console --version flag: prints engine version (with embedded git SHA), .NET version, OS, NDI runtime banner, expected prefix, exit-code legend, plus a wilddragon.net link. Useful for support tickets.
5. About dialog: chromeless modal with the dragon mark + version / .NET / OS / NDI runtime fields and a link to wilddragon.net. Triggered by clicking the rail logo.
6. Teams launcher Stop toggle: TeamsLauncher gains IsRunning() and StopAll(). The rail's Teams button now toggles — if Teams is up, ask to close all Teams windows via WM_CLOSE; otherwise launch as before. Confirms before stopping so we don't kill the user's call mid-transition.
Tests: 74/74 unit + 9/9 NDI integration green throughout. MSI builds clean and now embeds the dragon icon for ARP.
2026-05-08 13:50:19 -04:00
|
|
|
</StackPanel>
|
|
|
|
|
|
|
|
|
|
<!-- Footer -->
|
|
|
|
|
<Border Grid.Row="2"
|
|
|
|
|
BorderBrush="{DynamicResource Wd.Border}"
|
|
|
|
|
BorderThickness="0,1,0,0"
|
|
|
|
|
Padding="20,12">
|
|
|
|
|
<Grid>
|
|
|
|
|
<Grid.ColumnDefinitions>
|
|
|
|
|
<ColumnDefinition Width="*"/>
|
|
|
|
|
<ColumnDefinition Width="Auto"/>
|
|
|
|
|
</Grid.ColumnDefinitions>
|
|
|
|
|
<TextBlock Style="{StaticResource Wd.Text.Mono}"
|
|
|
|
|
Foreground="{DynamicResource Wd.Text.Tertiary}"
|
|
|
|
|
VerticalAlignment="Center">
|
|
|
|
|
<Hyperlink x:Name="WebsiteLink"
|
|
|
|
|
Foreground="{DynamicResource Wd.Accent.Cyan}"
|
|
|
|
|
TextDecorations="None"
|
|
|
|
|
Click="OnWebsiteClick">
|
|
|
|
|
wilddragon.net
|
|
|
|
|
</Hyperlink>
|
|
|
|
|
<Run Text=" · © Wild Dragon LLC"/>
|
|
|
|
|
</TextBlock>
|
2026-05-10 09:41:29 -04:00
|
|
|
<StackPanel Grid.Column="1" Orientation="Horizontal">
|
|
|
|
|
<Button Style="{StaticResource Wd.Button.Ghost}"
|
|
|
|
|
Content="Export diagnostics"
|
|
|
|
|
Click="OnExportDiagnostics"
|
|
|
|
|
MinWidth="150"
|
|
|
|
|
Margin="0,0,8,0"
|
|
|
|
|
ToolTip="Bundle logs + config + presets into a zip in your Downloads folder. Attach the zip to a bug report."/>
|
|
|
|
|
<Button Style="{StaticResource Wd.Button.Ghost}"
|
|
|
|
|
Content="Check for updates"
|
|
|
|
|
Click="OnCheckUpdate"
|
|
|
|
|
x:Name="UpdateButton"
|
|
|
|
|
MinWidth="140"
|
|
|
|
|
Margin="0,0,8,0"
|
|
|
|
|
ToolTip="Ask forge.wilddragon.net whether a newer release tag exists than the one you're running."/>
|
|
|
|
|
<Button Style="{StaticResource Wd.Button.Ghost}"
|
|
|
|
|
Content="Show welcome"
|
|
|
|
|
Click="OnShowOnboarding"
|
|
|
|
|
MinWidth="120"
|
|
|
|
|
Margin="0,0,8,0"
|
|
|
|
|
ToolTip="Re-open the first-launch welcome dialog with the setup checklist."/>
|
|
|
|
|
<Button Style="{StaticResource Wd.Button.Ghost}"
|
|
|
|
|
Content="Close"
|
|
|
|
|
Click="OnClose"
|
|
|
|
|
MinWidth="80"/>
|
|
|
|
|
</StackPanel>
|
feat: app icon, FPS, drops counter, --version, About dialog, Stop Teams toggle
Six related polish items, all building on tonight's groundwork.
1. App icon: teamsiso.ico generated from dragon-mark.png at 7 sizes (16-256), wired as ApplicationIcon in the WPF csproj, MainWindow.Icon, AboutWindow.Icon, and ARPPRODUCTICON in the WiX MSI. Taskbar / window / Add-Remove-Programs all show the dragon mark now.
2. Running incoming FPS: ring buffer of last 30 frame timestamps in IsoPipeline; ComputeFps() returns moving-average rate. Surfaced on IsoHealthStats.IncomingFps and shown in the Source column of the participants DataGrid as 'WxH · 59.94 fps'. Resets cleanly on every supervisor restart.
3. Drops counter: FrameProcessor.Stats already aggregated FramesDropped (closest-frame strategy when the receiver outpaces the processor) and FramesDuplicated; just plumbed _liveProcessor through IsoPipeline so GetStats() can read them. Exposed in the Live column under the in/out counters as a coral-tinted 'drop N'.
4. Console --version flag: prints engine version (with embedded git SHA), .NET version, OS, NDI runtime banner, expected prefix, exit-code legend, plus a wilddragon.net link. Useful for support tickets.
5. About dialog: chromeless modal with the dragon mark + version / .NET / OS / NDI runtime fields and a link to wilddragon.net. Triggered by clicking the rail logo.
6. Teams launcher Stop toggle: TeamsLauncher gains IsRunning() and StopAll(). The rail's Teams button now toggles — if Teams is up, ask to close all Teams windows via WM_CLOSE; otherwise launch as before. Confirms before stopping so we don't kill the user's call mid-transition.
Tests: 74/74 unit + 9/9 NDI integration green throughout. MSI builds clean and now embeds the dragon icon for ARP.
2026-05-08 13:50:19 -04:00
|
|
|
</Grid>
|
|
|
|
|
</Border>
|
|
|
|
|
</Grid>
|
|
|
|
|
</Border>
|
|
|
|
|
</Window>
|