Skip to content

Code Quality: Implemented Search mode in Omnibar #17256

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

namespace Files.App.Data.EventArguments
{
[Obsolete("Superseded by Omnibar.")]
public sealed class SearchBoxTextChangedEventArgs
{
public SearchBoxTextChangeReason Reason { get; }
Expand Down
59 changes: 34 additions & 25 deletions src/Files.App/UserControls/NavigationToolbar.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -259,18 +259,13 @@ private void ClickablePath_GettingFocus(UIElement sender, GettingFocusEventArgs

private async void Omnibar_QuerySubmitted(Omnibar sender, OmnibarQuerySubmittedEventArgs args)
{
var mode = Omnibar.CurrentSelectedMode;

// Path mode
if (mode == OmnibarPathMode)
if (Omnibar.CurrentSelectedMode == OmnibarPathMode)
{
await ViewModel.HandleItemNavigationAsync(args.Text);
(MainPageViewModel.SelectedTabItem?.TabItemContent as Control)?.Focus(FocusState.Programmatic);
return;
}

// Command palette mode
else if (mode == OmnibarCommandPaletteMode)
else if (Omnibar.CurrentSelectedMode == OmnibarCommandPaletteMode)
{
var item = args.Item as NavigationBarSuggestionItem;

Expand Down Expand Up @@ -312,14 +307,15 @@ await DialogDisplayHelper.ShowDialogAsync(Strings.InvalidCommand.GetLocalizedRes
(MainPageViewModel.SelectedTabItem?.TabItemContent as Control)?.Focus(FocusState.Programmatic);
return;
}

// Search mode
else if (mode == OmnibarSearchMode)
else if (Omnibar.CurrentSelectedMode == OmnibarSearchMode)
{
var shellPage = ContentPageContext.ShellPage;
if (ContentPageContext.ShellPage is not { } shellPage)
return;

if (args.Item is SuggestionModel item && !string.IsNullOrWhiteSpace(item.ItemPath) && shellPage is not null)
if (args.Item is SuggestionModel item && !string.IsNullOrWhiteSpace(item.ItemPath))
{
await NavigationHelpers.OpenPath(item.ItemPath, shellPage);
}
else
{
var searchQuery = args.Item is SuggestionModel x && !string.IsNullOrWhiteSpace(x.Name)
Expand All @@ -331,6 +327,7 @@ await DialogDisplayHelper.ShowDialogAsync(Strings.InvalidCommand.GetLocalizedRes
}

(MainPageViewModel.SelectedTabItem?.TabItemContent as Control)?.Focus(FocusState.Programmatic);

return;
}
}
Expand All @@ -340,20 +337,26 @@ private async void Omnibar_TextChanged(Omnibar sender, OmnibarTextChangedEventAr
if (args.Reason is not OmnibarTextChangeReason.UserInput)
return;

if (Omnibar.CurrentSelectedMode == OmnibarPathMode)
if (args.Mode == OmnibarPathMode)
{
await ViewModel.PopulateOmnibarSuggestionsForPathMode();
await DispatcherQueue.EnqueueOrInvokeAsync(async () =>
{
await ViewModel.PopulateOmnibarSuggestionsForPathMode();
});
}
else if (Omnibar.CurrentSelectedMode == OmnibarCommandPaletteMode)
else if (args.Mode == OmnibarCommandPaletteMode)
{
await DispatcherQueue.EnqueueOrInvokeAsync(() =>
await DispatcherQueue.EnqueueOrInvokeAsync(async () =>
{
ViewModel.PopulateOmnibarSuggestionsForCommandPaletteMode();
await ViewModel.PopulateOmnibarSuggestionsForCommandPaletteMode();
});
}
else if (Omnibar.CurrentSelectedMode == OmnibarSearchMode)
else if (args.Mode == OmnibarSearchMode)
{
await ViewModel.PopulateOmnibarSuggestionsForSearchMode();
await DispatcherQueue.EnqueueOrInvokeAsync(async () =>
{
await ViewModel.PopulateOmnibarSuggestionsForSearchMode();
});
}
}

Expand Down Expand Up @@ -465,9 +468,9 @@ await DispatcherQueue.EnqueueOrInvokeAsync(async () =>
{
ViewModel.OmnibarCommandPaletteModeText = string.Empty;

await DispatcherQueue.EnqueueOrInvokeAsync(() =>
await DispatcherQueue.EnqueueOrInvokeAsync(async () =>
{
ViewModel.PopulateOmnibarSuggestionsForCommandPaletteMode();
await ViewModel.PopulateOmnibarSuggestionsForCommandPaletteMode();
});
}
else if (e.NewMode == OmnibarSearchMode)
Expand All @@ -477,7 +480,10 @@ await DispatcherQueue.EnqueueOrInvokeAsync(() =>
else
ViewModel.OmnibarSearchModeText = ViewModel.InstanceViewModel.CurrentSearchQuery;

await ViewModel.PopulateOmnibarSuggestionsForSearchMode();
await DispatcherQueue.EnqueueOrInvokeAsync(async () =>
{
await ViewModel.PopulateOmnibarSuggestionsForSearchMode();
});
}
}

Expand All @@ -500,14 +506,17 @@ await DispatcherQueue.EnqueueOrInvokeAsync(async () =>
{
ViewModel.OmnibarCommandPaletteModeText = string.Empty;

await DispatcherQueue.EnqueueOrInvokeAsync(() =>
await DispatcherQueue.EnqueueOrInvokeAsync(async () =>
{
ViewModel.PopulateOmnibarSuggestionsForCommandPaletteMode();
await ViewModel.PopulateOmnibarSuggestionsForCommandPaletteMode();
});
}
else if (Omnibar.CurrentSelectedMode == OmnibarSearchMode)
{
await ViewModel.PopulateOmnibarSuggestionsForSearchMode();
await DispatcherQueue.EnqueueOrInvokeAsync(async () =>
{
await ViewModel.PopulateOmnibarSuggestionsForSearchMode();
});
}
}
}
Expand Down
1 change: 1 addition & 0 deletions src/Files.App/UserControls/SearchBox.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

namespace Files.App.UserControls
{
[Obsolete("Superseded by Omnibar.")]
public sealed partial class SearchBox : UserControl
{
public static readonly DependencyProperty SearchBoxViewModelProperty =
Expand Down
68 changes: 45 additions & 23 deletions src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
using Microsoft.UI.Xaml.Input;
using Microsoft.UI.Xaml.Media.Imaging;
using System.IO;
using System.Threading.Tasks;
using System.Windows.Input;
using Windows.AI.Actions;
using Windows.ApplicationModel.DataTransfer;
Expand Down Expand Up @@ -82,6 +83,7 @@ public sealed partial class NavigationToolbarViewModel : ObservableObject, IAddr

public bool IsSingleItemOverride { get; set; }

[Obsolete("Superseded by Omnibar.")]
public bool SearchHasFocus { get; private set; }

public bool EnableOmnibar => GeneralSettingsService.EnableOmnibar;
Expand All @@ -93,6 +95,7 @@ public sealed partial class NavigationToolbarViewModel : ObservableObject, IAddr

private NavigationToolbar? AddressToolbar => (MainWindow.Instance.Content as Frame)?.FindDescendant<NavigationToolbar>();

[Obsolete("Superseded by Omnibar.")]
public SearchBoxViewModel SearchBoxViewModel => (SearchBoxViewModel)SearchBox;

public bool HasAdditionalAction =>
Expand Down Expand Up @@ -186,15 +189,19 @@ public sealed partial class NavigationToolbarViewModel : ObservableObject, IAddr
public bool CanRefresh { get => _CanRefresh; set => SetProperty(ref _CanRefresh, value); }

private string _SearchButtonGlyph = "\uE721";
[Obsolete("Superseded by Omnibar.")]
public string SearchButtonGlyph { get => _SearchButtonGlyph; set => SetProperty(ref _SearchButtonGlyph, value); }

private bool _ManualEntryBoxLoaded;
[Obsolete("Superseded by Omnibar.")]
public bool ManualEntryBoxLoaded { get => _ManualEntryBoxLoaded; set => SetProperty(ref _ManualEntryBoxLoaded, value); }

private bool _ClickablePathLoaded = true;
[Obsolete("Superseded by Omnibar.")]
public bool ClickablePathLoaded { get => _ClickablePathLoaded; set => SetProperty(ref _ClickablePathLoaded, value); }

private string _PathControlDisplayText;
[Obsolete("Superseded by Omnibar.")]
public string PathControlDisplayText { get => _PathControlDisplayText; set => SetProperty(ref _PathControlDisplayText, value); }

private bool _HasItem = false;
Expand All @@ -204,9 +211,11 @@ public sealed partial class NavigationToolbarViewModel : ObservableObject, IAddr
public Style LayoutThemedIcon { get => _LayoutThemedIcon; set => SetProperty(ref _LayoutThemedIcon, value); }

private ISearchBoxViewModel _SearchBox = new SearchBoxViewModel();
[Obsolete("Superseded by Omnibar.")]
public ISearchBoxViewModel SearchBox { get => _SearchBox; set => SetProperty(ref _SearchBox, value); }

private bool _IsSearchBoxVisible;
[Obsolete("Superseded by Omnibar.")]
public bool IsSearchBoxVisible
{
get => _IsSearchBoxVisible;
Expand Down Expand Up @@ -236,11 +245,7 @@ public string? PathText
public string? OmnibarSearchModeText { get => _OmnibarSearchModeText; set => SetProperty(ref _OmnibarSearchModeText, value); }

private string _OmnibarCurrentSelectedModeName = OmnibarPathModeName;
public string OmnibarCurrentSelectedModeName
{
get => _OmnibarCurrentSelectedModeName;
set => SetProperty(ref _OmnibarCurrentSelectedModeName, value);
}
public string OmnibarCurrentSelectedModeName { get => _OmnibarCurrentSelectedModeName; set => SetProperty(ref _OmnibarCurrentSelectedModeName, value); }

private CurrentInstanceViewModel _InstanceViewModel;
public CurrentInstanceViewModel InstanceViewModel
Expand Down Expand Up @@ -540,6 +545,7 @@ x.Item is ZipStorageFile ||
deferral.Complete();
}

[Obsolete("Superseded by Omnibar.")]
public void PathItemSeparator_DataContextChanged(FrameworkElement sender, DataContextChangedEventArgs args)
{
var pathSeparatorIcon = sender as FontIcon;
Expand All @@ -553,35 +559,41 @@ public void PathItemSeparator_DataContextChanged(FrameworkElement sender, DataCo
});
}

[Obsolete("Superseded by Omnibar.")]
public void PathboxItemFlyout_Opening(object sender, object e)
{
ToolbarFlyoutOpening?.Invoke(this, new ToolbarFlyoutOpeningEventArgs((MenuFlyout)sender));
}

[Obsolete("Superseded by Omnibar.")]
public void PathBoxItemFlyout_Closed(object sender, object e)
{
((MenuFlyout)sender).Items.Clear();
}

[Obsolete("Superseded by Omnibar.")]
public void CurrentPathSetTextBox_TextChanged(object sender, TextChangedEventArgs args)
{
if (sender is TextBox textBox)
PathBoxQuerySubmitted?.Invoke(this, new ToolbarQuerySubmittedEventArgs() { QueryText = textBox.Text });
}

[Obsolete("Superseded by Omnibar.")]
public void VisiblePath_TextChanged(AutoSuggestBox sender, AutoSuggestBoxTextChangedEventArgs args)
{
if (args.Reason == AutoSuggestionBoxTextChangeReason.UserInput)
AddressBarTextEntered?.Invoke(this, new AddressBarTextEnteredEventArgs() { AddressBarTextField = sender });
}

[Obsolete("Superseded by Omnibar.")]
public void VisiblePath_QuerySubmitted(AutoSuggestBox sender, AutoSuggestBoxQuerySubmittedEventArgs args)
{
PathBoxQuerySubmitted?.Invoke(this, new ToolbarQuerySubmittedEventArgs() { QueryText = args.QueryText });

(this as IAddressToolbarViewModel).IsEditModeEnabled = false;
}

[Obsolete("Superseded by Omnibar.")]
public void PathBoxItem_PointerPressed(object sender, PointerRoutedEventArgs e)
{
if (e.Pointer.PointerDeviceType != Microsoft.UI.Input.PointerDeviceType.Mouse)
Expand Down Expand Up @@ -710,6 +722,7 @@ await DialogDisplayHelper.ShowDialogAsync(Strings.InvalidItemDialogTitle.GetLoca
PathControlDisplayText = ContentPageContext.ShellPage.ShellViewModel.WorkingDirectory;
}

[Obsolete("Superseded by Omnibar.")]
public void PathBoxItem_PreviewKeyDown(object sender, KeyRoutedEventArgs e)
{
switch (e.Key)
Expand Down Expand Up @@ -794,6 +807,7 @@ public void UpdateAdditionalActions()
OnPropertyChanged(nameof(HasAdditionalAction));
}

[Obsolete("Superseded by Omnibar.")]
private void CloseSearchBox(bool doFocus = false)
{
if (_SearchBox.WasQuerySubmitted)
Expand All @@ -818,11 +832,13 @@ private void CloseSearchBox(bool doFocus = false)
}
}

[Obsolete("Superseded by Omnibar.")]
public void SearchRegion_GotFocus(object sender, RoutedEventArgs e)
{
SearchHasFocus = true;
}

[Obsolete("Superseded by Omnibar.")]
public void SearchRegion_LostFocus(object sender, RoutedEventArgs e)
{
var element = Microsoft.UI.Xaml.Input.FocusManager.GetFocusedElement();
Expand All @@ -833,6 +849,7 @@ public void SearchRegion_LostFocus(object sender, RoutedEventArgs e)
CloseSearchBox();
}

[Obsolete("Superseded by Omnibar.")]
private void SearchRegion_Escaped(object? sender, ISearchBoxViewModel _SearchBox)
=> CloseSearchBox(true);

Expand Down Expand Up @@ -1153,7 +1170,7 @@ void AddNoResultsItem()
}
}

public void PopulateOmnibarSuggestionsForCommandPaletteMode()
public async Task PopulateOmnibarSuggestionsForCommandPaletteMode()
{
var newSuggestions = new List<NavigationBarSuggestionItem>();

Expand Down Expand Up @@ -1194,22 +1211,27 @@ public void PopulateOmnibarSuggestionsForCommandPaletteMode()
}
}

var suggestionItems = Commands
.Where(command => command.IsExecutable
&& command.IsAccessibleGlobally
&& (command.Description.Contains(OmnibarCommandPaletteModeText, StringComparison.OrdinalIgnoreCase)
|| command.Code.ToString().Contains(OmnibarCommandPaletteModeText, StringComparison.OrdinalIgnoreCase)))
.Select(command => new NavigationBarSuggestionItem
{
ThemedIconStyle = command.Glyph.ToThemedIconStyle(),
Glyph = command.Glyph.BaseGlyph,
Text = command.Description,
PrimaryDisplay = command.Description,
HotKeys = command.HotKeys,
SearchText = OmnibarCommandPaletteModeText,
})
.Where(item => item.Text != Commands.OpenCommandPalette.Description.ToString()
&& item.Text != Commands.EditPath.Description.ToString());
IEnumerable<NavigationBarSuggestionItem> suggestionItems = null!;

await Task.Run(() =>
{
suggestionItems = Commands
.Where(command => command.IsExecutable
&& command.IsAccessibleGlobally
&& (command.Description.Contains(OmnibarCommandPaletteModeText, StringComparison.OrdinalIgnoreCase)
|| command.Code.ToString().Contains(OmnibarCommandPaletteModeText, StringComparison.OrdinalIgnoreCase)))
.Select(command => new NavigationBarSuggestionItem
{
ThemedIconStyle = command.Glyph.ToThemedIconStyle(),
Glyph = command.Glyph.BaseGlyph,
Text = command.Description,
PrimaryDisplay = command.Description,
HotKeys = command.HotKeys,
SearchText = OmnibarCommandPaletteModeText,
})
.Where(item => item.Text != Commands.OpenCommandPalette.Description.ToString()
&& item.Text != Commands.EditPath.Description.ToString());
});

newSuggestions.AddRange(suggestionItems);

Expand Down Expand Up @@ -1298,7 +1320,7 @@ public async Task PopulateOmnibarSuggestionsForSearchMode()
}


[Obsolete("Remove once Omnibar goes out of experimental.")]
[Obsolete("Superseded by Omnibar.")]
public async Task SetAddressBarSuggestionsAsync(AutoSuggestBox sender, IShellPage shellpage)
{
if (sender.Text is not null && shellpage.ShellViewModel is not null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

namespace Files.App.ViewModels.UserControls
{
[Obsolete("Superseded by Omnibar.")]
public sealed partial class SearchBoxViewModel : ObservableObject, ISearchBoxViewModel
{
private string query;
Expand Down
2 changes: 2 additions & 0 deletions src/Files.App/Views/Shells/BaseShellPage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -345,6 +345,7 @@ protected void ShellPage_PreviewKeyDown(object sender, KeyRoutedEventArgs args)
}
}

[Obsolete("Superseded by Omnibar.")]
protected async void ShellPage_QuerySubmitted(ISearchBoxViewModel sender, SearchBoxQuerySubmittedEventArgs e)
{
if (e.ChosenSuggestion is SuggestionModel item && !string.IsNullOrWhiteSpace(item.ItemPath))
Expand All @@ -353,6 +354,7 @@ protected async void ShellPage_QuerySubmitted(ISearchBoxViewModel sender, Search
SubmitSearch(sender.Query);
}

[Obsolete("Superseded by Omnibar.")]
protected async void ShellPage_TextChanged(ISearchBoxViewModel sender, SearchBoxTextChangedEventArgs e)
{
if (e.Reason != SearchBoxTextChangeReason.UserInput)
Expand Down
Loading