From d64b11055051b9570728a77ba73c13bcacfca4b3 Mon Sep 17 00:00:00 2001 From: Zac Gaetano Date: Thu, 7 May 2026 15:40:49 +0000 Subject: [PATCH] feat(ui): add MainWindow XAML with participants DataGrid, settings sidebar, alert banner --- .../Converters/BoolToVisibilityConverter.cs | 18 ++ .../Converters/EnumDescriptionConverter.cs | 52 ++++++ src/TeamsISO.App/MainWindow.xaml | 161 +++++++++++++++++- src/TeamsISO.App/MainWindow.xaml.cs | 6 + 4 files changed, 231 insertions(+), 6 deletions(-) create mode 100644 src/TeamsISO.App/Converters/BoolToVisibilityConverter.cs create mode 100644 src/TeamsISO.App/Converters/EnumDescriptionConverter.cs diff --git a/src/TeamsISO.App/Converters/BoolToVisibilityConverter.cs b/src/TeamsISO.App/Converters/BoolToVisibilityConverter.cs new file mode 100644 index 0000000..fc5cd96 --- /dev/null +++ b/src/TeamsISO.App/Converters/BoolToVisibilityConverter.cs @@ -0,0 +1,18 @@ +using System.Globalization; +using System.Windows; +using System.Windows.Data; + +namespace TeamsISO.App.Converters; + +[ValueConversion(typeof(bool), typeof(Visibility))] +public sealed class BoolToVisibilityConverter : IValueConverter +{ + public Visibility TrueValue { get; set; } = Visibility.Visible; + public Visibility FalseValue { get; set; } = Visibility.Collapsed; + + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) => + value is true ? TrueValue : FalseValue; + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => + throw new NotSupportedException(); +} diff --git a/src/TeamsISO.App/Converters/EnumDescriptionConverter.cs b/src/TeamsISO.App/Converters/EnumDescriptionConverter.cs new file mode 100644 index 0000000..00f86ea --- /dev/null +++ b/src/TeamsISO.App/Converters/EnumDescriptionConverter.cs @@ -0,0 +1,52 @@ +using System.Globalization; +using System.Windows.Data; +using TeamsISO.Engine.Domain; + +namespace TeamsISO.App.Converters; + +/// +/// Renders engine enum values into operator-friendly strings. +/// +public sealed class EnumDescriptionConverter : IValueConverter +{ + public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) => value switch + { + TargetFramerate fr => fr switch + { + TargetFramerate.Fps23_976 => "23.976 fps", + TargetFramerate.Fps24 => "24 fps", + TargetFramerate.Fps25 => "25 fps", + TargetFramerate.Fps29_97 => "29.97 fps", + TargetFramerate.Fps30 => "30 fps", + TargetFramerate.Fps50 => "50 fps", + TargetFramerate.Fps59_94 => "59.94 fps", + TargetFramerate.Fps60 => "60 fps", + _ => fr.ToString() + }, + TargetResolution r => r switch + { + TargetResolution.R720p => "720p", + TargetResolution.R1080p => "1080p", + TargetResolution.R4K => "4K", + _ => r.ToString() + }, + AspectMode a => a switch + { + AspectMode.Pillarbox => "Pillarbox", + AspectMode.Letterbox => "Letterbox", + AspectMode.Stretch => "Stretch", + _ => a.ToString() + }, + AudioMode m => m switch + { + AudioMode.Auto => "Auto (isolated → mixed fallback)", + AudioMode.Isolated => "Isolated", + AudioMode.Mixed => "Mixed", + _ => m.ToString() + }, + _ => value + }; + + public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) => + throw new NotSupportedException(); +} diff --git a/src/TeamsISO.App/MainWindow.xaml b/src/TeamsISO.App/MainWindow.xaml index 89319a7..461b7ff 100644 --- a/src/TeamsISO.App/MainWindow.xaml +++ b/src/TeamsISO.App/MainWindow.xaml @@ -1,10 +1,159 @@ - - - + xmlns:vm="clr-namespace:TeamsISO.App.ViewModels" + xmlns:conv="clr-namespace:TeamsISO.App.Converters" + Title="TeamsISO" Height="700" Width="1100" + Background="#202225" Foreground="#E8E8E8"> + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/TeamsISO.App/MainWindow.xaml.cs b/src/TeamsISO.App/MainWindow.xaml.cs index d32a3d7..34664bb 100644 --- a/src/TeamsISO.App/MainWindow.xaml.cs +++ b/src/TeamsISO.App/MainWindow.xaml.cs @@ -1,4 +1,5 @@ using System.Windows; +using TeamsISO.App.ViewModels; namespace TeamsISO.App; @@ -8,4 +9,9 @@ public partial class MainWindow : Window { InitializeComponent(); } + + public MainWindow(MainViewModel viewModel) : this() + { + DataContext = viewModel; + } }