/ src / settings-ui / Settings.UI / ViewModels / SearchResultsViewModel.cs
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  }