Skip to content

Commit 445fad9

Browse files
committed
Added search suggestions to Omnibar
1 parent 101a91f commit 445fad9

File tree

6 files changed

+86
-3
lines changed

6 files changed

+86
-3
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: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,14 @@ await DialogDisplayHelper.ShowDialogAsync(Strings.InvalidCommand.GetLocalizedRes
316316
// Search mode
317317
else if (mode == OmnibarSearchMode)
318318
{
319-
ContentPageContext.ShellPage?.SubmitSearch(args.Text);
319+
var shellPage = Ioc.Default.GetRequiredService<IContentPageContext>().ShellPage;
320+
if (args.Item is SuggestionModel item && !string.IsNullOrWhiteSpace(item.ItemPath) && shellPage is not null)
321+
await NavigationHelpers.OpenPath(item.ItemPath, shellPage);
322+
else
323+
{
324+
ContentPageContext.ShellPage?.SubmitSearch(args.Text);
325+
ViewModel.SaveSearchQueryToList(args.Text);
326+
}
320327
}
321328
}
322329

@@ -338,6 +345,7 @@ await DispatcherQueue.EnqueueOrInvokeAsync(() =>
338345
}
339346
else if (Omnibar.CurrentSelectedMode == OmnibarSearchMode)
340347
{
348+
await ViewModel.PopulateOmnibarSuggestionsForSearchMode();
341349
}
342350
}
343351

@@ -456,7 +464,7 @@ await DispatcherQueue.EnqueueOrInvokeAsync(() =>
456464
}
457465
else if (e.NewMode == OmnibarSearchMode)
458466
{
459-
467+
await ViewModel.PopulateOmnibarSuggestionsForSearchMode();
460468
}
461469
}
462470

@@ -486,7 +494,7 @@ await DispatcherQueue.EnqueueOrInvokeAsync(() =>
486494
}
487495
else if (Omnibar.CurrentSelectedMode == OmnibarSearchMode)
488496
{
489-
497+
await ViewModel.PopulateOmnibarSuggestionsForSearchMode();
490498
}
491499
}
492500
}

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)