Skip to content

Commit 20e6c6c

Browse files
authored
Code Quality: Use UI thread when populating suggestions (#17274)
1 parent 160775f commit 20e6c6c

File tree

4 files changed

+68
-51
lines changed

4 files changed

+68
-51
lines changed

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

Lines changed: 18 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ private void NavToolbar_Loading(FrameworkElement _, object e)
5959
OngoingTasksViewModel.NewItemAdded += OngoingTasksActions_ProgressBannerPosted;
6060
}
6161

62+
[Obsolete("Superseded by Omnibar.")]
6263
private void VisiblePath_Loaded(object _, RoutedEventArgs e)
6364
{
6465
// AutoSuggestBox won't receive focus unless it's fully loaded
@@ -73,6 +74,7 @@ private void VisiblePath_Loaded(object _, RoutedEventArgs e)
7374
}
7475
}
7576

77+
[Obsolete("Superseded by Omnibar.")]
7678
private void ManualPathEntryItem_Click(object _, PointerRoutedEventArgs e)
7779
{
7880
if (e.Pointer.PointerDeviceType is PointerDeviceType.Mouse)
@@ -84,6 +86,7 @@ private void ManualPathEntryItem_Click(object _, PointerRoutedEventArgs e)
8486
ViewModel.IsEditModeEnabled = true;
8587
}
8688

89+
[Obsolete("Superseded by Omnibar.")]
8790
private async void VisiblePath_KeyDown(object _, KeyRoutedEventArgs e)
8891
{
8992
if (e.Key is VirtualKey.Escape)
@@ -97,6 +100,7 @@ private async void VisiblePath_KeyDown(object _, KeyRoutedEventArgs e)
97100
ClickablePath.Focus(FocusState.Keyboard);
98101
}
99102
}
103+
[Obsolete("Superseded by Omnibar.")]
100104
private void VisiblePath_LostFocus(object _, RoutedEventArgs e)
101105
{
102106
if (App.AppModel.IsMainWindowClosed)
@@ -119,8 +123,11 @@ private void VisiblePath_LostFocus(object _, RoutedEventArgs e)
119123
VisiblePath.Focus(FocusState.Programmatic);
120124
}
121125

126+
[Obsolete("Superseded by Omnibar.")]
122127
private void SearchRegion_OnGotFocus(object sender, RoutedEventArgs e) => ViewModel.SearchRegion_GotFocus(sender, e);
128+
[Obsolete("Superseded by Omnibar.")]
123129
private void SearchRegion_LostFocus(object sender, RoutedEventArgs e) => ViewModel.SearchRegion_LostFocus(sender, e);
130+
[Obsolete("Superseded by Omnibar.")]
124131
private void SearchRegion_AccessKeyInvoked(UIElement sender, AccessKeyInvokedEventArgs args)
125132
{
126133
// Suppress access key invocation if any dialog is open
@@ -129,7 +136,7 @@ private void SearchRegion_AccessKeyInvoked(UIElement sender, AccessKeyInvokedEve
129136
else
130137
sender.Focus(FocusState.Keyboard);
131138
}
132-
139+
[Obsolete("Superseded by Omnibar.")]
133140
private void VisiblePath_QuerySubmitted(AutoSuggestBox sender, AutoSuggestBoxQuerySubmittedEventArgs args)
134141
=> ViewModel.VisiblePath_QuerySubmitted(sender, args);
135142

@@ -247,6 +254,7 @@ void HistoryItemClicked(ToolbarHistoryItemModel? itemModel)
247254
}
248255
}
249256

257+
[Obsolete("Superseded by Omnibar.")]
250258
private void ClickablePath_GettingFocus(UIElement sender, GettingFocusEventArgs args)
251259
{
252260
if (args.InputDevice != FocusInputDeviceKind.Keyboard)
@@ -342,18 +350,15 @@ private async void Omnibar_TextChanged(Omnibar sender, OmnibarTextChangedEventAr
342350

343351
if (Omnibar.CurrentSelectedMode == OmnibarPathMode)
344352
{
345-
await ViewModel.PopulateOmnibarSuggestionsForPathMode();
353+
await DispatcherQueue.EnqueueOrInvokeAsync(ViewModel.PopulateOmnibarSuggestionsForPathMode);
346354
}
347355
else if (Omnibar.CurrentSelectedMode == OmnibarCommandPaletteMode)
348356
{
349-
await DispatcherQueue.EnqueueOrInvokeAsync(() =>
350-
{
351-
ViewModel.PopulateOmnibarSuggestionsForCommandPaletteMode();
352-
});
357+
await DispatcherQueue.EnqueueOrInvokeAsync(ViewModel.PopulateOmnibarSuggestionsForCommandPaletteMode);
353358
}
354359
else if (Omnibar.CurrentSelectedMode == OmnibarSearchMode)
355360
{
356-
await ViewModel.PopulateOmnibarSuggestionsForSearchMode();
361+
await DispatcherQueue.EnqueueOrInvokeAsync(ViewModel.PopulateOmnibarSuggestionsForSearchMode);
357362
}
358363
}
359364

@@ -456,19 +461,13 @@ private async void Omnibar_ModeChanged(object sender, OmnibarModeChangedEventArg
456461
? Constants.UserEnvironmentPaths.HomePath
457462
: ContentPageContext.ShellPage.ShellViewModel.WorkingDirectory;
458463

459-
await DispatcherQueue.EnqueueOrInvokeAsync(async () =>
460-
{
461-
await ViewModel.PopulateOmnibarSuggestionsForPathMode();
462-
});
464+
await DispatcherQueue.EnqueueOrInvokeAsync(ViewModel.PopulateOmnibarSuggestionsForPathMode);
463465
}
464466
else if (e.NewMode == OmnibarCommandPaletteMode)
465467
{
466468
ViewModel.OmnibarCommandPaletteModeText = string.Empty;
467469

468-
await DispatcherQueue.EnqueueOrInvokeAsync(() =>
469-
{
470-
ViewModel.PopulateOmnibarSuggestionsForCommandPaletteMode();
471-
});
470+
await DispatcherQueue.EnqueueOrInvokeAsync(ViewModel.PopulateOmnibarSuggestionsForCommandPaletteMode);
472471
}
473472
else if (e.NewMode == OmnibarSearchMode)
474473
{
@@ -477,7 +476,7 @@ await DispatcherQueue.EnqueueOrInvokeAsync(() =>
477476
else
478477
ViewModel.OmnibarSearchModeText = ViewModel.InstanceViewModel.CurrentSearchQuery;
479478

480-
await ViewModel.PopulateOmnibarSuggestionsForSearchMode();
479+
await DispatcherQueue.EnqueueOrInvokeAsync(ViewModel.PopulateOmnibarSuggestionsForSearchMode);
481480
}
482481
}
483482

@@ -491,23 +490,17 @@ private async void Omnibar_IsFocusedChanged(Omnibar sender, OmnibarIsFocusedChan
491490
? Constants.UserEnvironmentPaths.HomePath
492491
: ContentPageContext.ShellPage.ShellViewModel.WorkingDirectory;
493492

494-
await DispatcherQueue.EnqueueOrInvokeAsync(async () =>
495-
{
496-
await ViewModel.PopulateOmnibarSuggestionsForPathMode();
497-
});
493+
await DispatcherQueue.EnqueueOrInvokeAsync(ViewModel.PopulateOmnibarSuggestionsForPathMode);
498494
}
499495
else if (Omnibar.CurrentSelectedMode == OmnibarCommandPaletteMode)
500496
{
501497
ViewModel.OmnibarCommandPaletteModeText = string.Empty;
502498

503-
await DispatcherQueue.EnqueueOrInvokeAsync(() =>
504-
{
505-
ViewModel.PopulateOmnibarSuggestionsForCommandPaletteMode();
506-
});
499+
await DispatcherQueue.EnqueueOrInvokeAsync(ViewModel.PopulateOmnibarSuggestionsForCommandPaletteMode);
507500
}
508501
else if (Omnibar.CurrentSelectedMode == OmnibarSearchMode)
509502
{
510-
await ViewModel.PopulateOmnibarSuggestionsForSearchMode();
503+
await DispatcherQueue.EnqueueOrInvokeAsync(ViewModel.PopulateOmnibarSuggestionsForSearchMode);
511504
}
512505
}
513506
else

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
namespace Files.App.UserControls
1010
{
11+
[Obsolete("Superseded by Omnibar.")]
1112
public sealed partial class SearchBox : UserControl
1213
{
1314
public static readonly DependencyProperty SearchBoxViewModelProperty =

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

Lines changed: 48 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ public sealed partial class NavigationToolbarViewModel : ObservableObject, IAddr
8282

8383
public bool IsSingleItemOverride { get; set; }
8484

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

8788
public bool EnableOmnibar => GeneralSettingsService.EnableOmnibar;
@@ -93,6 +94,7 @@ public sealed partial class NavigationToolbarViewModel : ObservableObject, IAddr
9394

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

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

98100
public bool HasAdditionalAction =>
@@ -186,15 +188,19 @@ public sealed partial class NavigationToolbarViewModel : ObservableObject, IAddr
186188
public bool CanRefresh { get => _CanRefresh; set => SetProperty(ref _CanRefresh, value); }
187189

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

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

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

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

200206
private bool _HasItem = false;
@@ -207,6 +213,7 @@ public sealed partial class NavigationToolbarViewModel : ObservableObject, IAddr
207213
public ISearchBoxViewModel SearchBox { get => _SearchBox; set => SetProperty(ref _SearchBox, value); }
208214

209215
private bool _IsSearchBoxVisible;
216+
[Obsolete("Superseded by Omnibar.")]
210217
public bool IsSearchBoxVisible
211218
{
212219
get => _IsSearchBoxVisible;
@@ -236,11 +243,7 @@ public string? PathText
236243
public string? OmnibarSearchModeText { get => _OmnibarSearchModeText; set => SetProperty(ref _OmnibarSearchModeText, value); }
237244

238245
private string _OmnibarCurrentSelectedModeName = OmnibarPathModeName;
239-
public string OmnibarCurrentSelectedModeName
240-
{
241-
get => _OmnibarCurrentSelectedModeName;
242-
set => SetProperty(ref _OmnibarCurrentSelectedModeName, value);
243-
}
246+
public string OmnibarCurrentSelectedModeName { get => _OmnibarCurrentSelectedModeName; set => SetProperty(ref _OmnibarCurrentSelectedModeName, value); }
244247

245248
private CurrentInstanceViewModel _InstanceViewModel;
246249
public CurrentInstanceViewModel InstanceViewModel
@@ -259,7 +262,7 @@ public CurrentInstanceViewModel InstanceViewModel
259262
}
260263
}
261264

262-
[Obsolete("Remove once Omnibar goes out of experimental.")]
265+
[Obsolete("Superseded by Omnibar.")]
263266
public bool IsEditModeEnabled
264267
{
265268
get => ManualEntryBoxLoaded;
@@ -411,6 +414,7 @@ private void UserSettingsService_OnSettingChangedEvent(object? sender, SettingCh
411414
}
412415
}
413416

417+
[Obsolete("Superseded by Omnibar.")]
414418
public void PathBoxItem_DragLeave(object sender, DragEventArgs e)
415419
{
416420
if (((FrameworkElement)sender).DataContext is not PathBoxItem pathBoxItem ||
@@ -426,6 +430,7 @@ public void PathBoxItem_DragLeave(object sender, DragEventArgs e)
426430
_dragOverPath = null;
427431
}
428432

433+
[Obsolete("Superseded by Omnibar.")]
429434
public async Task PathBoxItem_Drop(object sender, DragEventArgs e)
430435
{
431436
if (_lockFlag)
@@ -464,6 +469,7 @@ public async Task PathBoxItem_Drop(object sender, DragEventArgs e)
464469
_lockFlag = false;
465470
}
466471

472+
[Obsolete("Superseded by Omnibar.")]
467473
public async Task PathBoxItem_DragOver(object sender, DragEventArgs e)
468474
{
469475
if (IsSingleItemOverride ||
@@ -540,6 +546,7 @@ x.Item is ZipStorageFile ||
540546
deferral.Complete();
541547
}
542548

549+
[Obsolete("Superseded by Omnibar.")]
543550
public void PathItemSeparator_DataContextChanged(FrameworkElement sender, DataContextChangedEventArgs args)
544551
{
545552
var pathSeparatorIcon = sender as FontIcon;
@@ -553,35 +560,41 @@ public void PathItemSeparator_DataContextChanged(FrameworkElement sender, DataCo
553560
});
554561
}
555562

563+
[Obsolete("Superseded by Omnibar.")]
556564
public void PathboxItemFlyout_Opening(object sender, object e)
557565
{
558566
ToolbarFlyoutOpening?.Invoke(this, new ToolbarFlyoutOpeningEventArgs((MenuFlyout)sender));
559567
}
560568

569+
[Obsolete("Superseded by Omnibar.")]
561570
public void PathBoxItemFlyout_Closed(object sender, object e)
562571
{
563572
((MenuFlyout)sender).Items.Clear();
564573
}
565574

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

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

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

582594
(this as IAddressToolbarViewModel).IsEditModeEnabled = false;
583595
}
584596

597+
[Obsolete("Superseded by Omnibar.")]
585598
public void PathBoxItem_PointerPressed(object sender, PointerRoutedEventArgs e)
586599
{
587600
if (e.Pointer.PointerDeviceType != Microsoft.UI.Input.PointerDeviceType.Mouse)
@@ -710,6 +723,7 @@ await DialogDisplayHelper.ShowDialogAsync(Strings.InvalidItemDialogTitle.GetLoca
710723
PathControlDisplayText = ContentPageContext.ShellPage.ShellViewModel.WorkingDirectory;
711724
}
712725

726+
[Obsolete("Superseded by Omnibar.")]
713727
public void PathBoxItem_PreviewKeyDown(object sender, KeyRoutedEventArgs e)
714728
{
715729
switch (e.Key)
@@ -794,6 +808,7 @@ public void UpdateAdditionalActions()
794808
OnPropertyChanged(nameof(HasAdditionalAction));
795809
}
796810

811+
[Obsolete("Superseded by Omnibar.")]
797812
private void CloseSearchBox(bool doFocus = false)
798813
{
799814
if (_SearchBox.WasQuerySubmitted)
@@ -818,11 +833,13 @@ private void CloseSearchBox(bool doFocus = false)
818833
}
819834
}
820835

836+
[Obsolete("Superseded by Omnibar.")]
821837
public void SearchRegion_GotFocus(object sender, RoutedEventArgs e)
822838
{
823839
SearchHasFocus = true;
824840
}
825841

842+
[Obsolete("Superseded by Omnibar.")]
826843
public void SearchRegion_LostFocus(object sender, RoutedEventArgs e)
827844
{
828845
var element = Microsoft.UI.Xaml.Input.FocusManager.GetFocusedElement();
@@ -833,6 +850,7 @@ public void SearchRegion_LostFocus(object sender, RoutedEventArgs e)
833850
CloseSearchBox();
834851
}
835852

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

@@ -912,7 +930,7 @@ private static string NormalizePathInput(string currentInput, bool isFtp)
912930
return currentInput;
913931
}
914932

915-
[Obsolete("Remove once Omnibar goes out of experimental.")]
933+
[Obsolete("Superseded by Omnibar.")]
916934
public async Task CheckPathInputAsync(string currentInput, string currentSelectedPath, IShellPage shellPage)
917935
{
918936
if (currentInput.StartsWith('>'))
@@ -1153,7 +1171,7 @@ void AddNoResultsItem()
11531171
}
11541172
}
11551173

1156-
public void PopulateOmnibarSuggestionsForCommandPaletteMode()
1174+
public async Task PopulateOmnibarSuggestionsForCommandPaletteMode()
11571175
{
11581176
var newSuggestions = new List<NavigationBarSuggestionItem>();
11591177

@@ -1194,22 +1212,27 @@ public void PopulateOmnibarSuggestionsForCommandPaletteMode()
11941212
}
11951213
}
11961214

1197-
var suggestionItems = Commands
1198-
.Where(command => command.IsExecutable
1199-
&& command.IsAccessibleGlobally
1200-
&& (command.Description.Contains(OmnibarCommandPaletteModeText, StringComparison.OrdinalIgnoreCase)
1201-
|| command.Code.ToString().Contains(OmnibarCommandPaletteModeText, StringComparison.OrdinalIgnoreCase)))
1202-
.Select(command => new NavigationBarSuggestionItem
1203-
{
1204-
ThemedIconStyle = command.Glyph.ToThemedIconStyle(),
1205-
Glyph = command.Glyph.BaseGlyph,
1206-
Text = command.Description,
1207-
PrimaryDisplay = command.Description,
1208-
HotKeys = command.HotKeys,
1209-
SearchText = OmnibarCommandPaletteModeText,
1210-
})
1211-
.Where(item => item.Text != Commands.OpenCommandPalette.Description.ToString()
1212-
&& item.Text != Commands.EditPath.Description.ToString());
1215+
IEnumerable<NavigationBarSuggestionItem> suggestionItems = null!;
1216+
1217+
await Task.Run(() =>
1218+
{
1219+
suggestionItems = Commands
1220+
.Where(command => command.IsExecutable
1221+
&& command.IsAccessibleGlobally
1222+
&& (command.Description.Contains(OmnibarCommandPaletteModeText, StringComparison.OrdinalIgnoreCase)
1223+
|| command.Code.ToString().Contains(OmnibarCommandPaletteModeText, StringComparison.OrdinalIgnoreCase)))
1224+
.Select(command => new NavigationBarSuggestionItem
1225+
{
1226+
ThemedIconStyle = command.Glyph.ToThemedIconStyle(),
1227+
Glyph = command.Glyph.BaseGlyph,
1228+
Text = command.Description,
1229+
PrimaryDisplay = command.Description,
1230+
HotKeys = command.HotKeys,
1231+
SearchText = OmnibarCommandPaletteModeText,
1232+
})
1233+
.Where(item => item.Text != Commands.OpenCommandPalette.Description.ToString()
1234+
&& item.Text != Commands.EditPath.Description.ToString());
1235+
});
12131236

12141237
newSuggestions.AddRange(suggestionItems);
12151238

@@ -1297,8 +1320,7 @@ public async Task PopulateOmnibarSuggestionsForSearchMode()
12971320
OmnibarSearchModeSuggestionItems.Add(item);
12981321
}
12991322

1300-
1301-
[Obsolete("Remove once Omnibar goes out of experimental.")]
1323+
[Obsolete("Superseded by Omnibar.")]
13021324
public async Task SetAddressBarSuggestionsAsync(AutoSuggestBox sender, IShellPage shellpage)
13031325
{
13041326
if (sender.Text is not null && shellpage.ShellViewModel is not null)

0 commit comments

Comments
 (0)