diff --git a/Wabbajack/View Models/ManifestVM.cs b/Wabbajack/View Models/ManifestVM.cs index 80935f71..e70d0bd9 100644 --- a/Wabbajack/View Models/ManifestVM.cs +++ b/Wabbajack/View Models/ManifestVM.cs @@ -1,4 +1,9 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reactive.Linq; +using ReactiveUI; +using ReactiveUI.Fody.Helpers; using Wabbajack.Common; using Wabbajack.Lib; @@ -16,9 +21,28 @@ namespace Wabbajack public IEnumerable Archives => Manifest.Archives; + [Reactive] + public string SearchTerm { get; set; } + + private readonly ObservableAsPropertyHelper> _searchResults; + public IEnumerable SearchResults => _searchResults.Value; + public ManifestVM(Manifest manifest) { Manifest = manifest; + + _searchResults = + this.WhenAnyValue(x => x.SearchTerm) + .Throttle(TimeSpan.FromMilliseconds(800)) + .Select(term => term?.Trim()) + .DistinctUntilChanged() + .Select(term => + { + return string.IsNullOrWhiteSpace(term) + ? Archives + : Archives.Where(x => x.Name.StartsWith(term)); + }) + .ToGuiProperty(this, nameof(SearchResults), Archives); } } } diff --git a/Wabbajack/Views/ManifestView.xaml.cs b/Wabbajack/Views/ManifestView.xaml.cs index 68139db5..c96b4de9 100644 --- a/Wabbajack/Views/ManifestView.xaml.cs +++ b/Wabbajack/Views/ManifestView.xaml.cs @@ -36,12 +36,14 @@ namespace Wabbajack .DisposeWith(disposable); this.OneWayBind(ViewModel, x => x.Description, x => x.Description.Text) .DisposeWith(disposable); - this.OneWayBind(ViewModel, x => x.Archives, x => x.ModsList.ItemsSource) + this.OneWayBind(ViewModel, x => x.SearchResults, x => x.ModsList.ItemsSource) .DisposeWith(disposable); this.OneWayBind(ViewModel, x => x.InstallSize, x => x.InstallSize.Text) .DisposeWith(disposable); this.OneWayBind(ViewModel, x => x.DownloadSize, x => x.DownloadSize.Text) .DisposeWith(disposable); + this.Bind(ViewModel, x => x.SearchTerm, x => x.SearchBar.Text) + .DisposeWith(disposable); }); }