From 55adb638553ad98abada5511b3ccde51f4b29c81 Mon Sep 17 00:00:00 2001 From: Aaron Murgatroyd Date: Sun, 18 May 2025 02:38:17 +1000 Subject: [PATCH 1/6] Defaulted language if any errors occur when loading locale so that Avalonia Preview works. Added Status to Sort and Search for XCI File trimmer. --- assets/locales.json | 27 ++++++++++++++++++- src/Ryujinx/Common/LocaleManager.cs | 16 ++++++++--- .../XCITrimmerFileStatusConverter.cs | 17 +++++++----- .../UI/ViewModels/XciTrimmerViewModel.cs | 21 ++++++++++++--- .../UI/Views/Dialog/XciTrimmerView.axaml | 16 +++++++---- .../UI/Views/Dialog/XciTrimmerView.axaml.cs | 18 +++++++++++-- 6 files changed, 94 insertions(+), 21 deletions(-) diff --git a/assets/locales.json b/assets/locales.json index d7d42dded..e8ede7844 100644 --- a/assets/locales.json +++ b/assets/locales.json @@ -21272,6 +21272,31 @@ "zh_TW": "節省的儲存空間" } }, + { + "ID": "XCITrimmerSortStatus", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Status", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, { "ID": "XCITrimmerTrim", "Translations": { @@ -24748,4 +24773,4 @@ } } ] -} \ No newline at end of file +} diff --git a/src/Ryujinx/Common/LocaleManager.cs b/src/Ryujinx/Common/LocaleManager.cs index e6648fd7e..68e9961c2 100644 --- a/src/Ryujinx/Common/LocaleManager.cs +++ b/src/Ryujinx/Common/LocaleManager.cs @@ -47,10 +47,18 @@ namespace Ryujinx.Ava.Common.Locale private void Load() { - string localeLanguageCode = !string.IsNullOrEmpty(ConfigurationState.Instance.UI.LanguageCode.Value) ? - ConfigurationState.Instance.UI.LanguageCode.Value : CultureInfo.CurrentCulture.Name.Replace('-', '_'); - - LoadLanguage(localeLanguageCode); + try + { + string localeLanguageCode = !string.IsNullOrEmpty(ConfigurationState.Instance.UI.LanguageCode.Value) + ? ConfigurationState.Instance.UI.LanguageCode.Value + : CultureInfo.CurrentCulture.Name.Replace('-', '_'); + + LoadLanguage(localeLanguageCode); + } + catch + { + LoadLanguage(DefaultLanguageCode); + } // Save whatever we ended up with. if (Program.PreviewerDetached) diff --git a/src/Ryujinx/UI/Helpers/Converters/XCITrimmerFileStatusConverter.cs b/src/Ryujinx/UI/Helpers/Converters/XCITrimmerFileStatusConverter.cs index c3fb1fe95..a485a1a2d 100644 --- a/src/Ryujinx/UI/Helpers/Converters/XCITrimmerFileStatusConverter.cs +++ b/src/Ryujinx/UI/Helpers/Converters/XCITrimmerFileStatusConverter.cs @@ -25,19 +25,24 @@ namespace Ryujinx.Ava.UI.Helpers return null; } - if (value is not XCITrimmerFileModel app) + if (value is not XCITrimmerFileModel model) { return null; } - return app.PercentageProgress != null ? String.Empty : - app.ProcessingOutcome != OperationOutcome.Successful && app.ProcessingOutcome != OperationOutcome.Undetermined ? LocaleManager.Instance[LocaleKeys.TitleXCIStatusFailedLabel] : - app.Trimmable & app.Untrimmable ? LocaleManager.Instance[LocaleKeys.TitleXCIStatusPartialLabel] : - app.Trimmable ? LocaleManager.Instance[LocaleKeys.TitleXCIStatusTrimmableLabel] : - app.Untrimmable ? LocaleManager.Instance[LocaleKeys.TitleXCIStatusUntrimmableLabel] : + return model.PercentageProgress != null ? String.Empty : + model.ProcessingOutcome != OperationOutcome.Successful && model.ProcessingOutcome != OperationOutcome.Undetermined ? LocaleManager.Instance[LocaleKeys.TitleXCIStatusFailedLabel] : + model.Trimmable & model.Untrimmable ? LocaleManager.Instance[LocaleKeys.TitleXCIStatusPartialLabel] : + model.Trimmable ? LocaleManager.Instance[LocaleKeys.TitleXCIStatusTrimmableLabel] : + model.Untrimmable ? LocaleManager.Instance[LocaleKeys.TitleXCIStatusUntrimmableLabel] : String.Empty; } + public static string From(XCITrimmerFileModel model) + { + return (string)Instance.Convert(model, typeof(string), null, CultureInfo.CurrentUICulture) ?? String.Empty; + } + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotSupportedException(); diff --git a/src/Ryujinx/UI/ViewModels/XciTrimmerViewModel.cs b/src/Ryujinx/UI/ViewModels/XciTrimmerViewModel.cs index 2085ffe26..ec9561896 100644 --- a/src/Ryujinx/UI/ViewModels/XciTrimmerViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/XciTrimmerViewModel.cs @@ -10,6 +10,7 @@ using Ryujinx.Ava.Systems.AppLibrary; using Ryujinx.Common.Utilities; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Globalization; using System.Linq; using System.Threading; using static Ryujinx.Common.Utilities.XCIFileTrimmer; @@ -28,6 +29,7 @@ namespace Ryujinx.Ava.UI.ViewModels public enum SortField { Name, + Status, Saved } @@ -246,6 +248,7 @@ namespace Ryujinx.Ava.UI.ViewModels { return string.IsNullOrWhiteSpace(_search) || content.Name.ToLower().Contains(_search.ToLower()) + || XCITrimmerFileStatusConverter.From(content).ToLower().Contains(_search.ToLower()) || content.Path.ToLower().Contains(_search.ToLower()); } @@ -270,17 +273,23 @@ namespace Ryujinx.Ava.UI.ViewModels case SortField.Name: result = x.Name.CompareTo(y.Name); break; + case SortField.Status: + result = XCITrimmerFileStatusConverter.From(x).CompareTo(XCITrimmerFileStatusConverter.From(y)); + break; case SortField.Saved: result = x.PotentialSavingsB.CompareTo(y.PotentialSavingsB); break; } - if (!_viewModel.SortingAscending) - result = -result; - if (result == 0) result = x.Path.CompareTo(y.Path); + if (result == 0) + result = x.Name.CompareTo(y.Name); + + if (!_viewModel.SortingAscending) + result = -result; + return result; } } @@ -467,6 +476,7 @@ namespace Ryujinx.Ava.UI.ViewModels return SortingField switch { SortField.Name => LocaleManager.Instance[LocaleKeys.XCITrimmerSortName], + SortField.Status => LocaleManager.Instance[LocaleKeys.XCITrimmerSortStatus], SortField.Saved => LocaleManager.Instance[LocaleKeys.XCITrimmerSortSaved], _ => string.Empty, }; @@ -487,6 +497,11 @@ namespace Ryujinx.Ava.UI.ViewModels get => _sortField == SortField.Name; } + public bool IsSortedByStatus + { + get => _sortField == SortField.Status; + } + public bool IsSortedBySaved { get => _sortField == SortField.Saved; diff --git a/src/Ryujinx/UI/Views/Dialog/XciTrimmerView.axaml b/src/Ryujinx/UI/Views/Dialog/XciTrimmerView.axaml index d149d246c..aff6098fd 100644 --- a/src/Ryujinx/UI/Views/Dialog/XciTrimmerView.axaml +++ b/src/Ryujinx/UI/Views/Dialog/XciTrimmerView.axaml @@ -45,13 +45,19 @@ Orientation="Vertical"> + diff --git a/src/Ryujinx/UI/Views/Dialog/XciTrimmerView.axaml.cs b/src/Ryujinx/UI/Views/Dialog/XciTrimmerView.axaml.cs index 8fb8c151c..a9dec1c46 100644 --- a/src/Ryujinx/UI/Views/Dialog/XciTrimmerView.axaml.cs +++ b/src/Ryujinx/UI/Views/Dialog/XciTrimmerView.axaml.cs @@ -62,14 +62,28 @@ namespace Ryujinx.Ava.UI.Views.Dialog public void Sort_Checked(object sender, RoutedEventArgs args) { - if (sender is RadioButton { Tag: string sortField }) + if (sender is not RadioButton { Tag: string sortField, IsChecked: { } isChecked }) + { + return; + } + + if (isChecked) + { ViewModel.SortingField = Enum.Parse(sortField); + } } public void Order_Checked(object sender, RoutedEventArgs args) { - if (sender is RadioButton { Tag: string sortOrder }) + if (sender is not RadioButton { Tag: string sortOrder, IsChecked: { } isChecked }) + { + return; + } + + if (isChecked) + { ViewModel.SortingAscending = sortOrder is "Ascending"; + } } private void OnSelectionChanged(object sender, SelectionChangedEventArgs e) From d587b148894eba72e6dd9bcbdec72d6e0af25f7f Mon Sep 17 00:00:00 2001 From: Aaron Murgatroyd Date: Sun, 18 May 2025 22:18:06 +1000 Subject: [PATCH 2/6] Added progress for scanning XCI files which can take a few seconds when there are lots of XCI files. --- assets/locales.json | 25 +++++++++++++++ .../UI/ViewModels/MainWindowViewModel.cs | 2 +- .../UI/ViewModels/XciTrimmerViewModel.cs | 32 ++++++++++++++++--- 3 files changed, 53 insertions(+), 6 deletions(-) diff --git a/assets/locales.json b/assets/locales.json index e8ede7844..e76ea9e9f 100644 --- a/assets/locales.json +++ b/assets/locales.json @@ -3197,6 +3197,31 @@ "zh_TW": "正在修剪 XCI 檔案 '{0}'" } }, + { + "ID": "StatusBarXCIFileScanning", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Scanning XCI Files...", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, { "ID": "LinuxVmMaxMapCountDialogTitle", "Translations": { diff --git a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs index b0cd6a556..3f1393b47 100644 --- a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs @@ -1845,7 +1845,7 @@ namespace Ryujinx.Ava.UI.ViewModels } } - public async void ProcessTrimResult(String filename, XCIFileTrimmer.OperationOutcome operationOutcome) + public async Task ProcessTrimResult(String filename, XCIFileTrimmer.OperationOutcome operationOutcome) { string notifyUser = operationOutcome.ToLocalisedText(); diff --git a/src/Ryujinx/UI/ViewModels/XciTrimmerViewModel.cs b/src/Ryujinx/UI/ViewModels/XciTrimmerViewModel.cs index ec9561896..f2a1bcc65 100644 --- a/src/Ryujinx/UI/ViewModels/XciTrimmerViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/XciTrimmerViewModel.cs @@ -10,7 +10,6 @@ using Ryujinx.Ava.Systems.AppLibrary; using Ryujinx.Common.Utilities; using System.Collections.Generic; using System.Collections.ObjectModel; -using System.Globalization; using System.Linq; using System.Threading; using static Ryujinx.Common.Utilities.XCIFileTrimmer; @@ -57,11 +56,34 @@ namespace Ryujinx.Ava.UI.ViewModels private void LoadXCIApplications() { - IEnumerable apps = ApplicationLibrary.Applications.Items - .Where(app => app.FileExtension == _FileExtXCI); + try + { + _mainWindowViewModel.StatusBarProgressStatusText = LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.StatusBarXCIFileScanning); + _mainWindowViewModel.StatusBarProgressStatusVisible = true; + _mainWindowViewModel.StatusBarProgressMaximum = 1; + _mainWindowViewModel.StatusBarProgressValue = 0; + _mainWindowViewModel.StatusBarVisible = true; - foreach (ApplicationData xciApp in apps) - AddOrUpdateXCITrimmerFile(CreateXCITrimmerFile(xciApp.Path)); + IEnumerable apps = ApplicationLibrary.Applications.Items + .Where(app => app.FileExtension == _FileExtXCI).ToArray(); + + _mainWindowViewModel.StatusBarProgressMaximum = apps.Count(); + _mainWindowViewModel.StatusBarProgressValue = 0; + + int appsProcessed = 0; + foreach (ApplicationData xciApp in apps) + { + AddOrUpdateXCITrimmerFile(CreateXCITrimmerFile(xciApp.Path)); + _mainWindowViewModel.StatusBarProgressValue = ++appsProcessed; + Dispatcher.UIThread.InvokeAsync(() => { }, DispatcherPriority.Render).Wait(); + } + } + finally + { + _mainWindowViewModel.StatusBarProgressStatusVisible = false; + _mainWindowViewModel.StatusBarProgressStatusText = string.Empty; + _mainWindowViewModel.StatusBarVisible = false; + } ApplicationsChanged(); } From 38f22bf47449ba6a297536efe26483c0c6f2adc0 Mon Sep 17 00:00:00 2001 From: Aaron Murgatroyd Date: Mon, 19 May 2025 01:15:18 +1000 Subject: [PATCH 3/6] Changed Full Screen command to show as ctrl command F instead of F11 under MacOS --- src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml index 3e9086a79..d4561a63a 100644 --- a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml +++ b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml @@ -86,7 +86,7 @@ Classes="withCheckbox" Padding="0" Icon="{ext:Icon fa-solid fa-expand}" - InputGesture="F11"> + InputGesture="{OnPlatform Default='F11', macOS='ctrl+cmd+F'}"> Date: Mon, 19 May 2025 01:31:41 +1000 Subject: [PATCH 4/6] Use compare ordinal ignore case and ContainsIgnoreCase for filtering and sorting in XCI File Trimmer --- .../Converters/XCITrimmerFileStatusConverter.cs | 2 ++ src/Ryujinx/UI/ViewModels/XciTrimmerViewModel.cs | 15 ++++++++------- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/Ryujinx/UI/Helpers/Converters/XCITrimmerFileStatusConverter.cs b/src/Ryujinx/UI/Helpers/Converters/XCITrimmerFileStatusConverter.cs index a485a1a2d..9d99edd8b 100644 --- a/src/Ryujinx/UI/Helpers/Converters/XCITrimmerFileStatusConverter.cs +++ b/src/Ryujinx/UI/Helpers/Converters/XCITrimmerFileStatusConverter.cs @@ -40,6 +40,8 @@ namespace Ryujinx.Ava.UI.Helpers public static string From(XCITrimmerFileModel model) { + if (model == null) return String.Empty; + return (string)Instance.Convert(model, typeof(string), null, CultureInfo.CurrentUICulture) ?? String.Empty; } diff --git a/src/Ryujinx/UI/ViewModels/XciTrimmerViewModel.cs b/src/Ryujinx/UI/ViewModels/XciTrimmerViewModel.cs index f2a1bcc65..ad6b70136 100644 --- a/src/Ryujinx/UI/ViewModels/XciTrimmerViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/XciTrimmerViewModel.cs @@ -8,6 +8,7 @@ using Ryujinx.Ava.Common.Models; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.Systems.AppLibrary; using Ryujinx.Common.Utilities; +using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; @@ -269,9 +270,9 @@ namespace Ryujinx.Ava.UI.ViewModels if (arg is XCITrimmerFileModel content) { return string.IsNullOrWhiteSpace(_search) - || content.Name.ToLower().Contains(_search.ToLower()) - || XCITrimmerFileStatusConverter.From(content).ToLower().Contains(_search.ToLower()) - || content.Path.ToLower().Contains(_search.ToLower()); + || content.Name.ContainsIgnoreCase(_search) + || XCITrimmerFileStatusConverter.From(content).ContainsIgnoreCase(_search) + || content.Path.ContainsIgnoreCase(_search); } return false; @@ -293,10 +294,10 @@ namespace Ryujinx.Ava.UI.ViewModels switch (_viewModel.SortingField) { case SortField.Name: - result = x.Name.CompareTo(y.Name); + result = String.Compare(x?.Name ?? String.Empty, y?.Name ?? String.Empty, StringComparison.OrdinalIgnoreCase); break; case SortField.Status: - result = XCITrimmerFileStatusConverter.From(x).CompareTo(XCITrimmerFileStatusConverter.From(y)); + result = String.Compare(XCITrimmerFileStatusConverter.From(x), XCITrimmerFileStatusConverter.From(y), StringComparison.OrdinalIgnoreCase); break; case SortField.Saved: result = x.PotentialSavingsB.CompareTo(y.PotentialSavingsB); @@ -304,10 +305,10 @@ namespace Ryujinx.Ava.UI.ViewModels } if (result == 0) - result = x.Path.CompareTo(y.Path); + result = String.Compare(x?.Path ?? String.Empty, y?.Path ?? String.Empty, StringComparison.OrdinalIgnoreCase); if (result == 0) - result = x.Name.CompareTo(y.Name); + result = String.Compare(x?.Name ?? String.Empty, y?.Name ?? String.Empty, StringComparison.OrdinalIgnoreCase); if (!_viewModel.SortingAscending) result = -result; From 4d16b2b4e49ee6202a1b9b99b6d8920dc1f2e34f Mon Sep 17 00:00:00 2001 From: Aaron Murgatroyd Date: Mon, 19 May 2025 21:01:59 +1000 Subject: [PATCH 5/6] Added delayed search update timer to XCI File Trimmer dialog and Games Compatibility window to stop phantom duplicate keystrokes from occurring. --- .../UI/ViewModels/CompatibilityViewModel.cs | 24 ++++++++++++++++++- .../UI/ViewModels/XciTrimmerViewModel.cs | 9 ++++++- .../UI/Windows/CompatibilityListWindow.axaml | 4 ++-- .../Windows/CompatibilityListWindow.axaml.cs | 13 ---------- 4 files changed, 33 insertions(+), 17 deletions(-) diff --git a/src/Ryujinx/UI/ViewModels/CompatibilityViewModel.cs b/src/Ryujinx/UI/ViewModels/CompatibilityViewModel.cs index 1965fee69..404c77f34 100644 --- a/src/Ryujinx/UI/ViewModels/CompatibilityViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/CompatibilityViewModel.cs @@ -4,12 +4,15 @@ using Ryujinx.Ava.Systems.AppLibrary; using System; using System.Collections.Generic; using System.Linq; +using System.Threading; namespace Ryujinx.Ava.UI.ViewModels { public class CompatibilityViewModel : BaseModel, IDisposable { private readonly ApplicationLibrary _appLibrary; + private string _search; + private Timer _searchTimer; private IEnumerable _currentEntries = CompatibilityDatabase.Entries; private string[] _ownedGameTitleIds = []; @@ -54,7 +57,7 @@ namespace Ryujinx.Ava.UI.ViewModels } } - public void Search(string searchTerm) + private void UpdateSearch(string searchTerm) { if (string.IsNullOrEmpty(searchTerm)) { @@ -64,6 +67,9 @@ namespace Ryujinx.Ava.UI.ViewModels SetEntries(CompatibilityDatabase.Entries.Where(x => x.GameName.ContainsIgnoreCase(searchTerm) + || x.FormattedIssueLabels.ContainsIgnoreCase(searchTerm) + || x.LocalizedStatus.ContainsIgnoreCase(searchTerm) + || x.LocalizedStatusDescription.ContainsIgnoreCase(searchTerm) || x.TitleId.Check(tid => tid.ContainsIgnoreCase(searchTerm)))); } @@ -74,5 +80,21 @@ namespace Ryujinx.Ava.UI.ViewModels #pragma warning restore MVVMTK0034 OnPropertyChanged(nameof(CurrentEntries)); } + + public string Search + { + get => _search; + set + { + _search = value; + _searchTimer?.Dispose(); + _searchTimer = new Timer(_ => + { + UpdateSearch(_search); + _searchTimer.Dispose(); + _searchTimer = null; + }, null, 250, 0); + } + } } } diff --git a/src/Ryujinx/UI/ViewModels/XciTrimmerViewModel.cs b/src/Ryujinx/UI/ViewModels/XciTrimmerViewModel.cs index ad6b70136..b0ef3683c 100644 --- a/src/Ryujinx/UI/ViewModels/XciTrimmerViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/XciTrimmerViewModel.cs @@ -44,6 +44,7 @@ namespace Ryujinx.Ava.UI.ViewModels private MainWindowViewModel _mainWindowViewModel; private CancellationTokenSource _cancellationTokenSource; private string _search; + private Timer _searchTimer; private ProcessingMode _processingMode; private SortField _sortField = SortField.Name; private bool _sortAscending = true; @@ -478,7 +479,13 @@ namespace Ryujinx.Ava.UI.ViewModels set { _search = value; - FilteringChanged(); + _searchTimer?.Dispose(); + _searchTimer = new Timer(_ => + { + FilteringChanged(); + _searchTimer.Dispose(); + _searchTimer = null; + }, null, 250, 0); } } diff --git a/src/Ryujinx/UI/Windows/CompatibilityListWindow.axaml b/src/Ryujinx/UI/Windows/CompatibilityListWindow.axaml index af9e4a08f..a954ebd3a 100644 --- a/src/Ryujinx/UI/Windows/CompatibilityListWindow.axaml +++ b/src/Ryujinx/UI/Windows/CompatibilityListWindow.axaml @@ -23,12 +23,12 @@ Grid.Column="0" Margin="15, 0, 7, 0" ToolTip.Tip="{ext:WindowTitle CompatibilityListTitle, False}"/> - + - + diff --git a/src/Ryujinx/UI/Windows/CompatibilityListWindow.axaml.cs b/src/Ryujinx/UI/Windows/CompatibilityListWindow.axaml.cs index a2b98f8f8..f4e78fb09 100644 --- a/src/Ryujinx/UI/Windows/CompatibilityListWindow.axaml.cs +++ b/src/Ryujinx/UI/Windows/CompatibilityListWindow.axaml.cs @@ -29,18 +29,5 @@ namespace Ryujinx.Ava.UI.Windows FlushControls.IsVisible = !ConfigurationState.Instance.ShowOldUI; NormalControls.IsVisible = ConfigurationState.Instance.ShowOldUI; } - - // ReSharper disable once UnusedMember.Local - // its referenced in the axaml but rider keeps yelling at me that its unused so - private void TextBox_OnTextChanged(object sender, TextChangedEventArgs e) - { - if (DataContext is not CompatibilityViewModel cvm) - return; - - if (sender is not TextBox searchBox) - return; - - cvm.Search(searchBox.Text); - } } } From 449333c4510e13a8f41bfba562b4035a36bc85e7 Mon Sep 17 00:00:00 2001 From: Aaron Murgatroyd Date: Mon, 19 May 2025 22:32:39 +1000 Subject: [PATCH 6/6] Improved speed of XCI Trimmer read headers by removing garbage collect and superfluous read --- src/Ryujinx.Common/Utilities/XCIFileTrimmer.cs | 2 -- src/Ryujinx/UI/ViewModels/XciTrimmerViewModel.cs | 9 +++++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/Ryujinx.Common/Utilities/XCIFileTrimmer.cs b/src/Ryujinx.Common/Utilities/XCIFileTrimmer.cs index 5b233d1e0..536415263 100644 --- a/src/Ryujinx.Common/Utilities/XCIFileTrimmer.cs +++ b/src/Ryujinx.Common/Utilities/XCIFileTrimmer.cs @@ -142,7 +142,6 @@ namespace Ryujinx.Common.Utilities { Log = log; Filename = path; - ReadHeader(); } public void CheckFreeSpace(CancellationToken? cancelToken = null) @@ -435,7 +434,6 @@ namespace Ryujinx.Common.Utilities _binaryReader.Close(); _binaryReader = null; _fileStream = null; - GC.Collect(); } private void ReadHeader() diff --git a/src/Ryujinx/UI/ViewModels/XciTrimmerViewModel.cs b/src/Ryujinx/UI/ViewModels/XciTrimmerViewModel.cs index b0ef3683c..99c4e0bfd 100644 --- a/src/Ryujinx/UI/ViewModels/XciTrimmerViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/XciTrimmerViewModel.cs @@ -76,8 +76,13 @@ namespace Ryujinx.Ava.UI.ViewModels foreach (ApplicationData xciApp in apps) { AddOrUpdateXCITrimmerFile(CreateXCITrimmerFile(xciApp.Path)); - _mainWindowViewModel.StatusBarProgressValue = ++appsProcessed; - Dispatcher.UIThread.InvokeAsync(() => { }, DispatcherPriority.Render).Wait(); + + if (appsProcessed % 50 == 0) + { + _mainWindowViewModel.StatusBarProgressValue = appsProcessed; + Dispatcher.UIThread.InvokeAsync(() => { }, DispatcherPriority.Render).Wait(); + } + appsProcessed++; } } finally