using System.Windows; using Explorer.Application; using Explorer.Hosting; using Explorer.Presentation.ViewModels; namespace Explorer.App; public partial class SettingsWindow : Window { private readonly MainViewModel _vm; private readonly string _originalTheme; public SettingsWindow(MainViewModel vm) { InitializeComponent(); _vm = vm; var prefs = vm.CurrentPreferences(); _originalTheme = prefs.Theme; ThemeDark.IsChecked = prefs.Theme != "Light"; ThemeLight.IsChecked = prefs.Theme == "Light"; GroupNetwork.IsChecked = prefs.GroupNetworkPlaces; GroupCloud.IsChecked = prefs.GroupCloudPlaces; IndexArchives.IsChecked = prefs.IndexArchiveContents; AutoIndexRemovable.IsChecked = prefs.AutoIndexRemovable; BackgroundHostAtLogon.IsChecked = prefs.BackgroundHostAtLogon; ShowHidden.IsChecked = prefs.ShowHiddenFiles; ShowProtected.IsChecked = prefs.ShowProtectedSystemLocations; AutoClearQueue.IsChecked = prefs.AutoClearQueueWhenDone; SevenZipPath.Text = prefs.SevenZipPath ?? ""; GitPath.Text = prefs.GitPath ?? ""; FfmpegPath.Text = prefs.FfmpegPath ?? ""; } private void OnThemeChanged(object sender, RoutedEventArgs e) { if (!IsLoaded) { return; } _vm.Theme = ThemeLight.IsChecked == true ? "Light" : "Dark"; } private async void OnOk(object sender, RoutedEventArgs e) { var prefs = _vm.CurrentPreferences() with { Theme = ThemeLight.IsChecked == true ? "Light" : "Dark", GroupNetworkPlaces = GroupNetwork.IsChecked == true, GroupCloudPlaces = GroupCloud.IsChecked == true, IndexArchiveContents = IndexArchives.IsChecked == true, AutoIndexRemovable = AutoIndexRemovable.IsChecked == true, BackgroundHostAtLogon = BackgroundHostAtLogon.IsChecked == true, ShowHiddenFiles = ShowHidden.IsChecked == true, ShowProtectedSystemLocations = ShowProtected.IsChecked == true, AutoClearQueueWhenDone = AutoClearQueue.IsChecked == true, SevenZipPath = string.IsNullOrWhiteSpace(SevenZipPath.Text) ? null : SevenZipPath.Text.Trim(), GitPath = string.IsNullOrWhiteSpace(GitPath.Text) ? null : GitPath.Text.Trim(), FfmpegPath = string.IsNullOrWhiteSpace(FfmpegPath.Text) ? null : FfmpegPath.Text.Trim() }; 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 OnBrowseSevenZip(object sender, RoutedEventArgs e) { var dlg = new Microsoft.Win32.OpenFileDialog { Title = "7-Zip executable", Filter = "7-Zip|7z.exe;7za.exe|Executables|*.exe|All files|*.*", FileName = SevenZipPath.Text }; if (dlg.ShowDialog(this) == true) { SevenZipPath.Text = dlg.FileName; } } private void OnBrowseGit(object sender, RoutedEventArgs e) { var dlg = new Microsoft.Win32.OpenFileDialog { Title = "Git executable", Filter = "Git|git.exe|Executables|*.exe|All files|*.*", FileName = GitPath.Text }; if (dlg.ShowDialog(this) == true) { GitPath.Text = dlg.FileName; } } private void OnBrowseFfmpeg(object sender, RoutedEventArgs e) { var dlg = new Microsoft.Win32.OpenFileDialog { Title = "FFmpeg executable", Filter = "FFmpeg|ffmpeg.exe|Executables|*.exe|All files|*.*", FileName = FfmpegPath.Text }; if (dlg.ShowDialog(this) == true) { FfmpegPath.Text = dlg.FileName; } } private void OnCancel(object sender, RoutedEventArgs e) { _vm.Theme = _originalTheme; } }