Files
Explorer-Workbench/src/Explorer.App/SettingsWindow.xaml.cs

111 lines
3.2 KiB
C#

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;
}
}