SearchResultsViewModel.cs
1 // Copyright (c) Microsoft Corporation 2 // The Microsoft Corporation licenses this file to you under the MIT license. 3 // See the LICENSE file in the project root for more information. 4 5 using System.Collections.Generic; 6 using System.Collections.ObjectModel; 7 using System.ComponentModel; 8 using System.Linq; 9 using System.Runtime.CompilerServices; 10 using Microsoft.PowerToys.Settings.UI.Services; 11 using Settings.UI.Library; 12 13 namespace Microsoft.PowerToys.Settings.UI.ViewModels 14 { 15 public class SearchResultsViewModel : INotifyPropertyChanged 16 { 17 private ObservableCollection<SettingEntry> _moduleResults = new(); 18 private ObservableCollection<SettingsGroup> _groupedSettingsResults = new(); 19 private bool _hasNoResults; 20 21 public ObservableCollection<SettingEntry> ModuleResults 22 { 23 get => _moduleResults; 24 set 25 { 26 _moduleResults = value; 27 OnPropertyChanged(); 28 } 29 } 30 31 public ObservableCollection<SettingsGroup> GroupedSettingsResults 32 { 33 get => _groupedSettingsResults; 34 set 35 { 36 _groupedSettingsResults = value; 37 OnPropertyChanged(); 38 } 39 } 40 41 public bool HasNoResults 42 { 43 get => _hasNoResults; 44 set 45 { 46 _hasNoResults = value; 47 OnPropertyChanged(); 48 } 49 } 50 51 public void SetSearchResults(string query, List<SettingEntry> results) 52 { 53 if (results == null || results.Count == 0) 54 { 55 HasNoResults = true; 56 ModuleResults.Clear(); 57 GroupedSettingsResults.Clear(); 58 return; 59 } 60 61 HasNoResults = false; 62 63 // Separate modules and settings 64 var modules = results.Where(r => r.Type == EntryType.SettingsPage).ToList(); 65 var settings = results.Where(r => r.Type == EntryType.SettingsCard).ToList(); 66 67 // Update module results 68 ModuleResults.Clear(); 69 foreach (var module in modules) 70 { 71 ModuleResults.Add(module); 72 } 73 74 // Group settings by their page/module 75 var groupedSettings = settings 76 .GroupBy(s => SearchIndexService.GetLocalizedPageName(s.PageTypeName)) 77 .Select(g => new SettingsGroup 78 { 79 GroupName = g.Key, 80 Settings = new ObservableCollection<SettingEntry>(g), 81 }) 82 .ToList(); 83 84 GroupedSettingsResults.Clear(); 85 foreach (var group in groupedSettings) 86 { 87 GroupedSettingsResults.Add(group); 88 } 89 } 90 91 public event PropertyChangedEventHandler PropertyChanged; 92 93 protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 94 { 95 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 96 } 97 } 98 99 #pragma warning disable SA1402 // File may only contain a single type 100 public class SettingsGroup : INotifyPropertyChanged 101 #pragma warning restore SA1402 // File may only contain a single type 102 { 103 private string _groupName; 104 private ObservableCollection<SettingEntry> _settings; 105 106 public string GroupName 107 { 108 get => _groupName; 109 set 110 { 111 _groupName = value; 112 OnPropertyChanged(); 113 } 114 } 115 116 public ObservableCollection<SettingEntry> Settings 117 { 118 get => _settings; 119 set 120 { 121 _settings = value; 122 OnPropertyChanged(); 123 } 124 } 125 126 public event PropertyChangedEventHandler PropertyChanged; 127 128 protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 129 { 130 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 131 } 132 } 133 }