using System.Windows; using System.Windows.Shapes; using TeamsISO.App.Services; using TeamsISO.App.ViewModels; namespace TeamsISO.App; public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); StateChanged += OnWindowStateChanged; } public MainWindow(MainViewModel viewModel) : this() { DataContext = viewModel; } /// Custom min button — chrome'd window has no system caption buttons. private void OnMinimize(object sender, RoutedEventArgs e) => WindowState = WindowState.Minimized; /// Toggles maximize/restore. Bound to the maximize button + double-click on the drag region. private void OnMaximizeRestore(object sender, RoutedEventArgs e) => WindowState = WindowState == WindowState.Maximized ? WindowState.Normal : WindowState.Maximized; /// Custom close button. private void OnClose(object sender, RoutedEventArgs e) => Close(); /// Opens the About dialog — version, NDI runtime, build SHA. private void OnAboutClick(object sender, RoutedEventArgs e) { var about = new AboutWindow { Owner = this }; about.ShowDialog(); } /// /// Toggle behavior: if Teams is already running, ask to stop it; otherwise /// launch via TeamsLauncher's fallback chain. First step toward the /// Embedded-Teams roadmap (Phase E.1). /// private void OnLaunchTeamsClick(object sender, RoutedEventArgs e) { if (TeamsLauncher.IsRunning()) { var confirm = MessageBox.Show( "Microsoft Teams is currently running.\n\nClose all Teams windows now?", "TeamsISO — Stop Teams", MessageBoxButton.YesNo, MessageBoxImage.Question); if (confirm != MessageBoxResult.Yes) return; var asked = TeamsLauncher.StopAll(); if (TeamsLauncher.IsRunning()) { MessageBox.Show( asked == 0 ? "No Teams windows responded to close." : $"Sent close to {asked} Teams window(s); some may still be exiting.", "TeamsISO — Stop Teams", MessageBoxButton.OK, MessageBoxImage.Information); } return; } if (!TeamsLauncher.TryLaunch(out var error)) { MessageBox.Show( $"Could not launch Microsoft Teams.\n\n{error}", "TeamsISO — Launch Teams", MessageBoxButton.OK, MessageBoxImage.Warning); } } /// /// Swap the maximize-button glyph between the "single rectangle" (when normal) and the /// "two-overlapping-rectangles" (when maximized) variants, matching the Windows 11 /// caption-button conventions. /// private void OnWindowStateChanged(object? sender, EventArgs e) { if (FindName("MaximizeIcon") is not Path icon) return; icon.Data = WindowState == WindowState.Maximized // Two-rectangle "restore" glyph ? System.Windows.Media.Geometry.Parse("M 2,0 L 10,0 L 10,8 M 0,2 L 8,2 L 8,10 L 0,10 Z") // Single-rectangle "maximize" glyph : System.Windows.Media.Geometry.Parse("M 0,0 L 10,0 L 10,10 L 0,10 Z"); } }