Skip to content

Commit 15c8bd1

Browse files
committed
Added search suggestions to Omnibar
1 parent 101a91f commit 15c8bd1

File tree

6 files changed

+79
-2
lines changed

6 files changed

+79
-2
lines changed

src/Files.App/Data/Contracts/IGeneralSettingsService.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,11 @@ public interface IGeneralSettingsService : IBaseSettingsService, INotifyProperty
5050
/// </summary>
5151
List<string> PathHistoryList { get; set; }
5252

53+
/// <summary>
54+
/// A list containing previous search queries.
55+
/// </summary>
56+
List<string> PreviousSearchQueriesList { get; set; }
57+
5358
/// <summary>
5459
/// Gets or sets a value indicating which date and time format to use.
5560
/// </summary>

src/Files.App/Services/Settings/GeneralSettingsService.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,12 @@ public List<string> PathHistoryList
6565
set => Set(value);
6666
}
6767

68+
public List<string> PreviousSearchQueriesList
69+
{
70+
get => Get<List<string>>(null);
71+
set => Set(value);
72+
}
73+
6874
public DateTimeFormats DateTimeFormat
6975
{
7076
get => Get(DateTimeFormats.Application);

src/Files.App/Services/Settings/UserSettingsService.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ public override object ExportSettings()
7474
export.Remove(nameof(GeneralSettingsService.LastSessionTabList));
7575
export.Remove(nameof(GeneralSettingsService.LastCrashedTabList));
7676
export.Remove(nameof(GeneralSettingsService.PathHistoryList));
77+
export.Remove(nameof(GeneralSettingsService.PreviousSearchQueriesList));
7778

7879
return JsonSettingsSerializer.SerializeToJson(export);
7980
}

src/Files.App/UserControls/NavigationToolbar.xaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@
3030
<converters:NullToVisibilityCollapsedConverter x:Key="NullToVisibilityCollapsedConverter" />
3131
<converters1:BoolNegationConverter x:Key="BoolNegationConverter" />
3232
<converters:VisibilityInvertConverter x:Key="VisibilityInvertConverter" />
33+
<converters1:BoolToObjectConverter
34+
x:Key="SearchSuggestionGlyphConverter"
35+
FalseValue="&#xE7C3;"
36+
TrueValue="&#xE81C;" />
3337

3438
<ResourceDictionary.MergedDictionaries>
3539
<ResourceDictionary Source="ms-appx:///UserControls/KeyboardShortcut/KeyboardShortcut.xaml" />

src/Files.App/UserControls/NavigationToolbar.xaml.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,7 @@ await DialogDisplayHelper.ShowDialogAsync(Strings.InvalidCommand.GetLocalizedRes
317317
else if (mode == OmnibarSearchMode)
318318
{
319319
ContentPageContext.ShellPage?.SubmitSearch(args.Text);
320+
ViewModel.SaveSearchQueryToList(args.Text);
320321
}
321322
}
322323

@@ -338,6 +339,7 @@ await DispatcherQueue.EnqueueOrInvokeAsync(() =>
338339
}
339340
else if (Omnibar.CurrentSelectedMode == OmnibarSearchMode)
340341
{
342+
await ViewModel.PopulateOmnibarSuggestionsForSearchMode();
341343
}
342344
}
343345

@@ -456,7 +458,7 @@ await DispatcherQueue.EnqueueOrInvokeAsync(() =>
456458
}
457459
else if (e.NewMode == OmnibarSearchMode)
458460
{
459-
461+
await ViewModel.PopulateOmnibarSuggestionsForSearchMode();
460462
}
461463
}
462464

@@ -486,7 +488,7 @@ await DispatcherQueue.EnqueueOrInvokeAsync(() =>
486488
}
487489
else if (Omnibar.CurrentSelectedMode == OmnibarSearchMode)
488490
{
489-
491+
await ViewModel.PopulateOmnibarSuggestionsForSearchMode();
490492
}
491493
}
492494
}

src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1035,6 +1035,18 @@ private void SavePathToHistory(string path)
10351035
UserSettingsService.GeneralSettingsService.PathHistoryList = pathHistoryList;
10361036
}
10371037

1038+
public void SaveSearchQueryToList(string searchQuery)
1039+
{
1040+
var previousSearchQueriesList = UserSettingsService.GeneralSettingsService.PreviousSearchQueriesList?.ToList() ?? [];
1041+
previousSearchQueriesList.Remove(searchQuery);
1042+
previousSearchQueriesList.Insert(0, searchQuery);
1043+
1044+
if (previousSearchQueriesList.Count > MaxSuggestionsCount)
1045+
UserSettingsService.GeneralSettingsService.PreviousSearchQueriesList = previousSearchQueriesList.RemoveFrom(MaxSuggestionsCount + 1);
1046+
else
1047+
UserSettingsService.GeneralSettingsService.PreviousSearchQueriesList = previousSearchQueriesList;
1048+
}
1049+
10381050
private static async Task<bool> LaunchApplicationFromPath(string currentInput, string workingDir)
10391051
{
10401052
var args = CommandLineParser.SplitArguments(currentInput);
@@ -1243,6 +1255,53 @@ public void PopulateOmnibarSuggestionsForCommandPaletteMode()
12431255
}
12441256
}
12451257

1258+
public async Task PopulateOmnibarSuggestionsForSearchMode()
1259+
{
1260+
if (ContentPageContext.ShellPage is null)
1261+
return;
1262+
1263+
List<SuggestionModel> newSuggestions = [];
1264+
1265+
if (string.IsNullOrWhiteSpace(OmnibarSearchModeText))
1266+
{
1267+
var previousSearchQueries = UserSettingsService.GeneralSettingsService.PreviousSearchQueriesList;
1268+
if (previousSearchQueries is not null)
1269+
{
1270+
newSuggestions.AddRange(
1271+
previousSearchQueries.Select(query => new SuggestionModel(query, true))
1272+
);
1273+
}
1274+
}
1275+
else
1276+
{
1277+
var search = new FolderSearch
1278+
{
1279+
Query = OmnibarSearchModeText,
1280+
Folder = ContentPageContext.ShellPage.ShellViewModel.WorkingDirectory,
1281+
MaxItemCount = 10,
1282+
};
1283+
1284+
var results = await search.SearchAsync();
1285+
newSuggestions.AddRange(results.Select(result => new SuggestionModel(result)));
1286+
}
1287+
1288+
// Remove outdated suggestions
1289+
var toRemove = OmnibarSearchModeSuggestionItems
1290+
.Where(existing => !newSuggestions.Any(newItem => newItem.ItemPath == existing.ItemPath))
1291+
.ToList();
1292+
1293+
foreach (var item in toRemove)
1294+
OmnibarSearchModeSuggestionItems.Remove(item);
1295+
1296+
// Add new suggestions
1297+
var toAdd = newSuggestions
1298+
.Where(newItem => !OmnibarSearchModeSuggestionItems.Any(existing => existing.ItemPath == newItem.ItemPath));
1299+
1300+
foreach (var item in toAdd)
1301+
OmnibarSearchModeSuggestionItems.Add(item);
1302+
}
1303+
1304+
12461305
[Obsolete("Remove once Omnibar goes out of experimental.")]
12471306
public async Task SetAddressBarSuggestionsAsync(AutoSuggestBox sender, IShellPage shellpage)
12481307
{

0 commit comments

Comments
 (0)