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