using System.ComponentModel; using System.Windows; using Explorer.App.Settings; using Explorer.Hosting; using Explorer.Presentation.ViewModels; namespace Explorer.App; public partial class SettingsWindow : Window { private readonly MainViewModel _vm; private readonly SettingsDraft _draft; private readonly string _originalTheme; public SettingsDraft Draft => _draft; public SettingsWindow(MainViewModel vm) { _vm = vm; var prefs = vm.CurrentPreferences(); _originalTheme = prefs.Theme; _draft = SettingsDraft.From(prefs); _draft.PropertyChanged += OnDraftChanged; var shell = new SettingsShell(_draft, SettingsCatalog.Create()); DataContext = shell; InitializeComponent(); shell.PropertyChanged += OnShellChanged; ShowSelectedPage(); Closed += (_, _) => { _draft.PropertyChanged -= OnDraftChanged; shell.PropertyChanged -= OnShellChanged; }; } private void OnShellChanged(object? sender, PropertyChangedEventArgs e) { if (e.PropertyName is nameof(SettingsShell.SelectedCategory) or null) { ShowSelectedPage(); } } private void ShowSelectedPage() { PageHost.Children.Clear(); if (DataContext is not SettingsShell shell) { return; } var page = shell.SelectedCategory.Page; PageHost.Children.Add(page); page.DataContext = _draft; } private void OnDraftChanged(object? sender, PropertyChangedEventArgs e) { if (e.PropertyName is nameof(SettingsDraft.Theme) or nameof(SettingsDraft.IsDarkTheme) or nameof(SettingsDraft.IsLightTheme)) { _vm.Theme = _draft.Theme; } } private async void OnOk(object sender, RoutedEventArgs e) { var prefs = _draft.ApplyTo(_vm.CurrentPreferences()); await _vm.ApplyPreferencesAsync(prefs).ConfigureAwait(true); ApplyBackgroundHostAutostart(prefs.BackgroundHostAtLogon); DialogResult = true; Close(); } private void ApplyBackgroundHostAutostart(bool enabled) { if (enabled) { var exe = HostLogonAutostart.FindHostExecutable(); if (exe is null) { MessageBox.Show( this, "Explorer.Host.exe was not found next to Explorer Workbench, so the sign-in task was not registered.", "Background host", MessageBoxButton.OK, MessageBoxImage.Warning); return; } if (!HostLogonAutostart.TryRegister(exe, out var error)) { MessageBox.Show(this, error, "Background host", MessageBoxButton.OK, MessageBoxImage.Warning); } return; } if (!HostLogonAutostart.TryUnregister(out var unregisterError)) { MessageBox.Show(this, unregisterError, "Background host", MessageBoxButton.OK, MessageBoxImage.Warning); } } private void OnCancel(object sender, RoutedEventArgs e) { _vm.Theme = _originalTheme; } }