111 lines
3.2 KiB
C#
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;
|
|
}
|
|
}
|