From abc121f093972986b6a674fb1f545e417188d389 Mon Sep 17 00:00:00 2001 From: 0x5BFA <62196528+0x5bfa@users.noreply.github.com> Date: Wed, 7 May 2025 23:41:26 +0900 Subject: [PATCH 1/4] Init --- .../Data/Items/NavigationBarSuggestionItem.cs | 15 ++++- .../UserControls/NavigationToolbar.xaml | 58 +++++++++---------- .../UserControls/NavigationToolbar.xaml.cs | 38 ++++++++++-- .../NavigationToolbarViewModel.cs | 31 ++++++++++ 4 files changed, 107 insertions(+), 35 deletions(-) diff --git a/src/Files.App/Data/Items/NavigationBarSuggestionItem.cs b/src/Files.App/Data/Items/NavigationBarSuggestionItem.cs index 35970397d594..c8952f573719 100644 --- a/src/Files.App/Data/Items/NavigationBarSuggestionItem.cs +++ b/src/Files.App/Data/Items/NavigationBarSuggestionItem.cs @@ -1,10 +1,12 @@ // Copyright (c) Files Community // Licensed under the MIT License. +using Files.App.Controls; + namespace Files.App.Data.Items { [Obsolete("Remove once Omnibar goes out of experimental.")] - public sealed partial class NavigationBarSuggestionItem : ObservableObject + public sealed partial class NavigationBarSuggestionItem : ObservableObject, IOmnibarTextMemberPathProvider { private string? _Text; public string? Text @@ -88,5 +90,16 @@ private void UpdatePrimaryDisplay() } } } + + public string GetTextMemberPath(string textMemberPath) + { + return textMemberPath switch + { + nameof(Text) => Text, + nameof(PrimaryDisplay) => PrimaryDisplay, + nameof(SearchText) => SearchText, + _ => string.Empty + }; + } } } diff --git a/src/Files.App/UserControls/NavigationToolbar.xaml b/src/Files.App/UserControls/NavigationToolbar.xaml index abb235b9c725..53a51b46494c 100644 --- a/src/Files.App/UserControls/NavigationToolbar.xaml +++ b/src/Files.App/UserControls/NavigationToolbar.xaml @@ -383,42 +383,42 @@ IconOnActive="{controls:ThemedIconMarkup Style={StaticResource App.ThemedIcons.Omnibar.Commands}, IsFilled=True}" IconOnInactive="{controls:ThemedIconMarkup Style={StaticResource App.ThemedIcons.Omnibar.Commands}, IconType=Outline}" ModeName="{helpers:ResourceString Name=CommandPalette}" - PlaceholderText="{helpers:ResourceString Name=OmnibarCommandPaletteModeTextPlaceholder}"> - + + + + + + - --> + PathModeSuggestionItems { get; } = []; + internal ObservableCollection OmnibarCommandPaletteModeSuggestionItems { get; } = []; + public bool IsSingleItemOverride { get; set; } public bool SearchHasFocus { get; private set; } @@ -218,6 +220,8 @@ public string? PathText } } + private string? _OmnibarCommandPaletteModeText; + public string? OmnibarCommandPaletteModeText { get => _OmnibarCommandPaletteModeText; set => SetProperty(ref _OmnibarCommandPaletteModeText, value); } private bool _IsOmnibarFocused; public bool IsOmnibarFocused @@ -239,6 +243,7 @@ public bool IsOmnibarFocused _ = PopulateOmnibarSuggestionsForPathMode(); break; case OmnibarPaletteModeName: + _ = PopulateOmnibarSuggestionsForCommandPaletteMode(); break; case OmnibarSearchModeName: break; @@ -1126,6 +1131,32 @@ void AddNoResultsItem() } } + public async Task PopulateOmnibarSuggestionsForCommandPaletteMode() + { + if (string.IsNullOrEmpty(OmnibarCommandPaletteModeText)) + return; + + OmnibarCommandPaletteModeSuggestionItems.Clear(); + + IList? suggestions = null; + + suggestions = [.. Commands.Where(command => + command.IsExecutable && + command.IsAccessibleGlobally && + (command.Description.Contains(OmnibarCommandPaletteModeText, StringComparison.OrdinalIgnoreCase) || + command.Code.ToString().Contains(OmnibarCommandPaletteModeText, StringComparison.OrdinalIgnoreCase))) + .Select(command => new NavigationBarSuggestionItem() + { + Text = command.Code.ToString(), + PrimaryDisplay = command.Description, + HotKeys = command.HotKeys, + SearchText = OmnibarCommandPaletteModeText, + })]; + + foreach (var suggestionItem in suggestions) + OmnibarCommandPaletteModeSuggestionItems.Add(suggestionItem); + } + [Obsolete("Remove once Omnibar goes out of experimental.")] public async Task SetAddressBarSuggestionsAsync(AutoSuggestBox sender, IShellPage shellpage) { From f454f1fa9f3595aa869d89c26937af0ba7e74a06 Mon Sep 17 00:00:00 2001 From: 0x5BFA <62196528+0x5bfa@users.noreply.github.com> Date: Thu, 8 May 2025 00:54:02 +0900 Subject: [PATCH 2/4] Update --- src/Files.App/UserControls/NavigationToolbar.xaml.cs | 2 +- .../ViewModels/UserControls/NavigationToolbarViewModel.cs | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/Files.App/UserControls/NavigationToolbar.xaml.cs b/src/Files.App/UserControls/NavigationToolbar.xaml.cs index 407bf79bb666..2c5bbbf14c7b 100644 --- a/src/Files.App/UserControls/NavigationToolbar.xaml.cs +++ b/src/Files.App/UserControls/NavigationToolbar.xaml.cs @@ -292,7 +292,7 @@ private async void Omnibar_TextChanged(Omnibar sender, OmnibarTextChangedEventAr } else if (Omnibar.CurrentSelectedMode == OmnibarCommandPaletteMode) { - await ViewModel.PopulateOmnibarSuggestionsForCommandPaletteMode(); + ViewModel.PopulateOmnibarSuggestionsForCommandPaletteMode(); } else if (Omnibar.CurrentSelectedMode == OmnibarSearchMode) { diff --git a/src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs b/src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs index 0a535c7267c2..b030ca5c652d 100644 --- a/src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs +++ b/src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs @@ -243,7 +243,7 @@ public bool IsOmnibarFocused _ = PopulateOmnibarSuggestionsForPathMode(); break; case OmnibarPaletteModeName: - _ = PopulateOmnibarSuggestionsForCommandPaletteMode(); + PopulateOmnibarSuggestionsForCommandPaletteMode(); break; case OmnibarSearchModeName: break; @@ -1131,10 +1131,9 @@ void AddNoResultsItem() } } - public async Task PopulateOmnibarSuggestionsForCommandPaletteMode() + public void PopulateOmnibarSuggestionsForCommandPaletteMode() { - if (string.IsNullOrEmpty(OmnibarCommandPaletteModeText)) - return; + OmnibarCommandPaletteModeText ??= string.Empty; OmnibarCommandPaletteModeSuggestionItems.Clear(); From a3c54ed6cfb25c5dfd83c68fa94f7eaab9fedfc4 Mon Sep 17 00:00:00 2001 From: 0x5BFA <62196528+0x5bfa@users.noreply.github.com> Date: Fri, 9 May 2025 14:33:45 +0900 Subject: [PATCH 3/4] Improved perf when focusing on Palette mode for the first time --- .../ViewModels/UserControls/NavigationToolbarViewModel.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs b/src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs index b030ca5c652d..f191a9314a15 100644 --- a/src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs +++ b/src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs @@ -243,7 +243,8 @@ public bool IsOmnibarFocused _ = PopulateOmnibarSuggestionsForPathMode(); break; case OmnibarPaletteModeName: - PopulateOmnibarSuggestionsForCommandPaletteMode(); + if (OmnibarCommandPaletteModeSuggestionItems.Count is 0) + PopulateOmnibarSuggestionsForCommandPaletteMode(); break; case OmnibarSearchModeName: break; From 288ba5998f9f6e2a1b536aed6ebdd4904306bb30 Mon Sep 17 00:00:00 2001 From: 0x5BFA <62196528+0x5bfa@users.noreply.github.com> Date: Wed, 14 May 2025 00:41:01 +0900 Subject: [PATCH 4/4] Added an icon to a suggestion item --- .../Data/Items/NavigationBarSuggestionItem.cs | 7 +++++++ src/Files.App/UserControls/NavigationToolbar.xaml | 11 ++++++++--- .../UserControls/NavigationToolbarViewModel.cs | 1 + 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/Files.App/Data/Items/NavigationBarSuggestionItem.cs b/src/Files.App/Data/Items/NavigationBarSuggestionItem.cs index c8952f573719..044291902261 100644 --- a/src/Files.App/Data/Items/NavigationBarSuggestionItem.cs +++ b/src/Files.App/Data/Items/NavigationBarSuggestionItem.cs @@ -8,6 +8,13 @@ namespace Files.App.Data.Items [Obsolete("Remove once Omnibar goes out of experimental.")] public sealed partial class NavigationBarSuggestionItem : ObservableObject, IOmnibarTextMemberPathProvider { + private object? _Icon; + public object? Icon + { + get => _Icon; + set => SetProperty(ref _Icon, value); + } + private string? _Text; public string? Text { diff --git a/src/Files.App/UserControls/NavigationToolbar.xaml b/src/Files.App/UserControls/NavigationToolbar.xaml index 53a51b46494c..02adc64e731a 100644 --- a/src/Files.App/UserControls/NavigationToolbar.xaml +++ b/src/Files.App/UserControls/NavigationToolbar.xaml @@ -396,14 +396,18 @@ - - - + + + diff --git a/src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs b/src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs index f191a9314a15..1aae75d648e0 100644 --- a/src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs +++ b/src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs @@ -1147,6 +1147,7 @@ public void PopulateOmnibarSuggestionsForCommandPaletteMode() command.Code.ToString().Contains(OmnibarCommandPaletteModeText, StringComparison.OrdinalIgnoreCase))) .Select(command => new NavigationBarSuggestionItem() { + Icon = command.Icon, Text = command.Code.ToString(), PrimaryDisplay = command.Description, HotKeys = command.HotKeys,