diff --git a/src/Files.App/Data/Items/NavigationBarSuggestionItem.cs b/src/Files.App/Data/Items/NavigationBarSuggestionItem.cs index 35970397d594..044291902261 100644 --- a/src/Files.App/Data/Items/NavigationBarSuggestionItem.cs +++ b/src/Files.App/Data/Items/NavigationBarSuggestionItem.cs @@ -1,11 +1,20 @@ // 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 object? _Icon; + public object? Icon + { + get => _Icon; + set => SetProperty(ref _Icon, value); + } + private string? _Text; public string? Text { @@ -88,5 +97,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..02adc64e731a 100644 --- a/src/Files.App/UserControls/NavigationToolbar.xaml +++ b/src/Files.App/UserControls/NavigationToolbar.xaml @@ -383,42 +383,47 @@ 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}"> - + - - - - - - - + Foreground="{ThemeResource TextFillColorPrimaryBrush}" + MaxLines="1" + TextTrimming="CharacterEllipsis" + TextWrapping="NoWrap"> + + + + + - --> + 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,8 @@ public bool IsOmnibarFocused _ = PopulateOmnibarSuggestionsForPathMode(); break; case OmnibarPaletteModeName: + if (OmnibarCommandPaletteModeSuggestionItems.Count is 0) + PopulateOmnibarSuggestionsForCommandPaletteMode(); break; case OmnibarSearchModeName: break; @@ -1126,6 +1132,32 @@ void AddNoResultsItem() } } + public void PopulateOmnibarSuggestionsForCommandPaletteMode() + { + OmnibarCommandPaletteModeText ??= string.Empty; + + 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() + { + Icon = command.Icon, + 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) {