From 54421760c33f77de78fee58d637552d2e00d464b Mon Sep 17 00:00:00 2001 From: MutantAura <44103205+MutantAura@users.noreply.github.com> Date: Sun, 21 Aug 2022 14:07:28 +0100 Subject: [PATCH] Check if game directories have been updated before refreshing GUI (#3607) * Check if game directories have been updated before refreshing list on save. * Cleanup spacing * Add Avalonia and reset value after saving * Fix Avalonia * Fix multiple directories not being added in GTK --- .../Ui/ViewModels/SettingsViewModel.cs | 21 ++++++++++-- .../Ui/Windows/SettingsWindow.axaml.cs | 7 +++- Ryujinx/Ui/Windows/SettingsWindow.cs | 32 ++++++++++++------- 3 files changed, 45 insertions(+), 15 deletions(-) diff --git a/Ryujinx.Ava/Ui/ViewModels/SettingsViewModel.cs b/Ryujinx.Ava/Ui/ViewModels/SettingsViewModel.cs index a7cf710e7..32f08ff93 100644 --- a/Ryujinx.Ava/Ui/ViewModels/SettingsViewModel.cs +++ b/Ryujinx.Ava/Ui/ViewModels/SettingsViewModel.cs @@ -49,6 +49,7 @@ namespace Ryujinx.Ava.Ui.ViewModels private float _previousVolumeLevel; private float _volume; private bool _isVulkanAvailable = true; + private bool _directoryChanged = false; private List _gpuIds = new List(); private KeyboardHotkeys _keyboardHotkeys; private int _graphicsBackendIndex; @@ -112,6 +113,17 @@ namespace Ryujinx.Ava.Ui.ViewModels } } + public bool DirectoryChanged + { + get => _directoryChanged; + set + { + _directoryChanged = value; + + OnPropertyChanged(); + } + } + public bool EnableDiscordIntegration { get; set; } public bool CheckUpdatesOnStart { get; set; } public bool ShowConfirmExit { get; set; } @@ -397,10 +409,14 @@ namespace Ryujinx.Ava.Ui.ViewModels public async Task SaveSettings() { - List gameDirs = new List(GameDirectories); - ConfigurationState config = ConfigurationState.Instance; + if (_directoryChanged) + { + List gameDirs = new List(GameDirectories); + config.Ui.GameDirs.Value = gameDirs; + } + if (_validTzRegions.Contains(TimeZone)) { config.System.TimeZone.Value = TimeZone; @@ -465,7 +481,6 @@ namespace Ryujinx.Ava.Ui.ViewModels config.System.SystemTimeOffset.Value = systemTimeOffset.Seconds; config.Graphics.ShadersDumpPath.Value = ShaderDumpPath; - config.Ui.GameDirs.Value = gameDirs; config.System.FsGlobalAccessLogMode.Value = FsGlobalAccessLogMode; config.System.MemoryManagerMode.Value = (MemoryManagerMode)MemoryMode; diff --git a/Ryujinx.Ava/Ui/Windows/SettingsWindow.axaml.cs b/Ryujinx.Ava/Ui/Windows/SettingsWindow.axaml.cs index 97e9bfed4..5b2ea276c 100644 --- a/Ryujinx.Ava/Ui/Windows/SettingsWindow.axaml.cs +++ b/Ryujinx.Ava/Ui/Windows/SettingsWindow.axaml.cs @@ -162,6 +162,7 @@ namespace Ryujinx.Ava.Ui.Windows if (!string.IsNullOrWhiteSpace(path) && Directory.Exists(path) && !ViewModel.GameDirectories.Contains(path)) { ViewModel.GameDirectories.Add(path); + ViewModel.DirectoryChanged = true; } else { @@ -170,6 +171,7 @@ namespace Ryujinx.Ava.Ui.Windows if (!string.IsNullOrWhiteSpace(path)) { ViewModel.GameDirectories.Add(path); + ViewModel.DirectoryChanged = true; } } } @@ -181,6 +183,7 @@ namespace Ryujinx.Ava.Ui.Windows foreach (string path in selected) { ViewModel.GameDirectories.Remove(path); + ViewModel.DirectoryChanged = true; } } @@ -232,10 +235,12 @@ namespace Ryujinx.Ava.Ui.Windows ControllerSettings?.SaveCurrentProfile(); - if (Owner is MainWindow window) + if (Owner is MainWindow window && ViewModel.DirectoryChanged) { window.ViewModel.LoadApplications(); } + + ViewModel.DirectoryChanged = false; } protected override void OnClosed(EventArgs e) diff --git a/Ryujinx/Ui/Windows/SettingsWindow.cs b/Ryujinx/Ui/Windows/SettingsWindow.cs index fc3373db1..c07ad1155 100644 --- a/Ryujinx/Ui/Windows/SettingsWindow.cs +++ b/Ryujinx/Ui/Windows/SettingsWindow.cs @@ -34,6 +34,7 @@ namespace Ryujinx.Ui.Windows private long _systemTimeOffset; private float _previousVolumeLevel; + private bool _directoryChanged = false; #pragma warning disable CS0649, IDE0044 [GUI] CheckButton _traceLogToggle; @@ -501,14 +502,22 @@ namespace Ryujinx.Ui.Windows private void SaveSettings() { - List gameDirs = new List(); - - _gameDirsBoxStore.GetIterFirst(out TreeIter treeIter); - for (int i = 0; i < _gameDirsBoxStore.IterNChildren(); i++) + if (_directoryChanged) { - gameDirs.Add((string)_gameDirsBoxStore.GetValue(treeIter, 0)); + List gameDirs = new List(); - _gameDirsBoxStore.IterNext(ref treeIter); + _gameDirsBoxStore.GetIterFirst(out TreeIter treeIter); + + for (int i = 0; i < _gameDirsBoxStore.IterNChildren(); i++) + { + gameDirs.Add((string)_gameDirsBoxStore.GetValue(treeIter, 0)); + + _gameDirsBoxStore.IterNext(ref treeIter); + } + + ConfigurationState.Instance.Ui.GameDirs.Value = gameDirs; + + _directoryChanged = false; } if (!float.TryParse(_resScaleText.Buffer.Text, out float resScaleCustom) || resScaleCustom <= 0.0f) @@ -571,7 +580,6 @@ namespace Ryujinx.Ui.Windows ConfigurationState.Instance.System.SystemTimeOffset.Value = _systemTimeOffset; ConfigurationState.Instance.Ui.CustomThemePath.Value = _custThemePath.Buffer.Text; ConfigurationState.Instance.Graphics.ShadersDumpPath.Value = _graphicsShadersDumpPath.Buffer.Text; - ConfigurationState.Instance.Ui.GameDirs.Value = gameDirs; ConfigurationState.Instance.System.FsGlobalAccessLogMode.Value = (int)_fsLogSpinAdjustment.Value; ConfigurationState.Instance.Graphics.MaxAnisotropy.Value = float.Parse(_anisotropy.ActiveId, CultureInfo.InvariantCulture); ConfigurationState.Instance.Graphics.AspectRatio.Value = Enum.Parse(_aspectRatio.ActiveId); @@ -655,27 +663,27 @@ namespace Ryujinx.Ui.Windows if (fileChooser.Run() == (int)ResponseType.Accept) { + _directoryChanged = false; foreach (string directory in fileChooser.Filenames) { - bool directoryAdded = false; - if (_gameDirsBoxStore.GetIterFirst(out TreeIter treeIter)) { do { if (directory.Equals((string)_gameDirsBoxStore.GetValue(treeIter, 0))) { - directoryAdded = true; break; } } while(_gameDirsBoxStore.IterNext(ref treeIter)); } - if (!directoryAdded) + if (!_directoryChanged) { _gameDirsBoxStore.AppendValues(directory); } } + + _directoryChanged = true; } fileChooser.Dispose(); @@ -693,6 +701,8 @@ namespace Ryujinx.Ui.Windows if (selection.GetSelected(out TreeIter treeIter)) { _gameDirsBoxStore.Remove(ref treeIter); + + _directoryChanged = true; } ((ToggleButton)sender).SetStateFlags(StateFlags.Normal, true);