Skip to content

Commit 68d16a2

Browse files
yaira20x5bfa
andauthored
Feature: Added a filter header (#17268)
Signed-off-by: Yair <[email protected]> Co-authored-by: 0x5BFA <[email protected]>
1 parent 691ecdc commit 68d16a2

File tree

15 files changed

+288
-9
lines changed

15 files changed

+288
-9
lines changed
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// Copyright (c) Files Community
2+
// Licensed under the MIT License.
3+
4+
using CommunityToolkit.WinUI;
5+
using Microsoft.UI.Xaml;
6+
using Microsoft.UI.Xaml.Controls;
7+
8+
namespace Files.App.Actions
9+
{
10+
internal sealed partial class ToggleFilterHeaderAction : ObservableObject, IToggleAction
11+
{
12+
private readonly IGeneralSettingsService generalSettingsService = Ioc.Default.GetRequiredService<IGeneralSettingsService>();
13+
14+
public string Label
15+
=> Strings.ToggleFilterHeader.GetLocalizedResource();
16+
17+
public string Description
18+
=> Strings.ToggleFilterHeaderDescription.GetLocalizedResource();
19+
20+
public RichGlyph Glyph
21+
=> new(themedIconStyle: "App.ThemedIcons.Filter");
22+
23+
public bool IsOn
24+
=> generalSettingsService.ShowFilterHeader;
25+
26+
public ToggleFilterHeaderAction()
27+
{
28+
generalSettingsService.PropertyChanged += GeneralSettingsService_PropertyChanged;
29+
}
30+
31+
public Task ExecuteAsync(object? parameter = null)
32+
{
33+
generalSettingsService.ShowFilterHeader = !IsOn;
34+
35+
if (IsOn)
36+
{
37+
var filterTextBox = (MainWindow.Instance.Content as Frame)?.FindDescendant("FilterTextBox") as AutoSuggestBox;
38+
filterTextBox?.Focus(FocusState.Programmatic);
39+
}
40+
41+
return Task.CompletedTask;
42+
}
43+
44+
private void GeneralSettingsService_PropertyChanged(object? sender, PropertyChangedEventArgs e)
45+
{
46+
if (e.PropertyName is nameof(GeneralSettingsService.ShowFilterHeader))
47+
OnPropertyChanged(nameof(IsOn));
48+
}
49+
}
50+
}

src/Files.App/Data/Commands/Manager/CommandCodes.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public enum CommandCodes
2727
ToggleInfoPane,
2828
ToggleToolbar,
2929
ToggleShelfPane,
30+
ToggleFilterHeader,
3031

3132
// File System
3233
CopyItem,

src/Files.App/Data/Commands/Manager/CommandManager.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ public IRichCommand this[HotKey hotKey]
5858
public IRichCommand ToggleInfoPane => commands[CommandCodes.ToggleInfoPane];
5959
public IRichCommand ToggleToolbar => commands[CommandCodes.ToggleToolbar];
6060
public IRichCommand ToggleShelfPane => commands[CommandCodes.ToggleShelfPane];
61+
public IRichCommand ToggleFilterHeader => commands[CommandCodes.ToggleFilterHeader];
6162
public IRichCommand SelectAll => commands[CommandCodes.SelectAll];
6263
public IRichCommand InvertSelection => commands[CommandCodes.InvertSelection];
6364
public IRichCommand ClearSelection => commands[CommandCodes.ClearSelection];
@@ -264,6 +265,7 @@ public IEnumerator<IRichCommand> GetEnumerator() =>
264265
[CommandCodes.ToggleInfoPane] = new ToggleInfoPaneAction(),
265266
[CommandCodes.ToggleToolbar] = new ToggleToolbarAction(),
266267
[CommandCodes.ToggleShelfPane] = new ToggleShelfPaneAction(),
268+
[CommandCodes.ToggleFilterHeader] = new ToggleFilterHeaderAction(),
267269
[CommandCodes.SelectAll] = new SelectAllAction(),
268270
[CommandCodes.InvertSelection] = new InvertSelectionAction(),
269271
[CommandCodes.ClearSelection] = new ClearSelectionAction(),

src/Files.App/Data/Commands/Manager/ICommandManager.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public interface ICommandManager : IEnumerable<IRichCommand>
3232
IRichCommand ToggleInfoPane { get; }
3333
IRichCommand ToggleToolbar { get; }
3434
IRichCommand ToggleShelfPane { get; }
35+
IRichCommand ToggleFilterHeader { get; }
3536

3637
IRichCommand CopyItem { get; }
3738
IRichCommand CopyItemPath { get; }

src/Files.App/Data/Contracts/IGeneralSettingsService.cs

Lines changed: 10 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>
@@ -295,6 +300,11 @@ public interface IGeneralSettingsService : IBaseSettingsService, INotifyProperty
295300
/// </summary>
296301
bool ShowShelfPane { get; set; }
297302

303+
/// <summary>
304+
/// Gets or sets a value whether the filter header should be displayed.
305+
/// </summary>
306+
bool ShowFilterHeader { get; set; }
307+
298308
/// <summary>
299309
/// Gets or sets a value indicating whether or not to enable the Omnibar.
300310
/// </summary>

src/Files.App/Services/Settings/GeneralSettingsService.cs

Lines changed: 12 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);
@@ -363,6 +369,12 @@ public bool ShowShelfPane
363369
set => Set(value);
364370
}
365371

372+
public bool ShowFilterHeader
373+
{
374+
get => Get(false);
375+
set => Set(value);
376+
}
377+
366378
public bool EnableOmnibar
367379
{
368380
get => Get(false);

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/Strings/en-US/Resources.resw

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1097,6 +1097,12 @@
10971097
<data name="ToggleToolbarDescription" xml:space="preserve">
10981098
<value>Toggle visibility of the toolbar</value>
10991099
</data>
1100+
<data name="ToggleFilterHeader" xml:space="preserve">
1101+
<value>Toggle filter header</value>
1102+
</data>
1103+
<data name="ToggleFilterHeaderDescription" xml:space="preserve">
1104+
<value>Toggle visibility of the filter header</value>
1105+
</data>
11001106
<data name="DetailsPanePreviewNotAvaliableText" xml:space="preserve">
11011107
<value>No preview available</value>
11021108
</data>
@@ -4261,4 +4267,10 @@
42614267
<data name="SeeMore" xml:space="preserve">
42624268
<value>See more</value>
42634269
</data>
4270+
<data name="FilteringFor" xml:space="preserve">
4271+
<value>Filtering for</value>
4272+
</data>
4273+
<data name="Filename" xml:space="preserve">
4274+
<value>Filename</value>
4275+
</data>
42644276
</root>

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: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,22 @@ await DialogDisplayHelper.ShowDialogAsync(Strings.InvalidCommand.GetLocalizedRes
316316
// Search mode
317317
else if (mode == OmnibarSearchMode)
318318
{
319-
ContentPageContext.ShellPage?.SubmitSearch(args.Text);
319+
var shellPage = ContentPageContext.ShellPage;
320+
321+
if (args.Item is SuggestionModel item && !string.IsNullOrWhiteSpace(item.ItemPath) && shellPage is not null)
322+
await NavigationHelpers.OpenPath(item.ItemPath, shellPage);
323+
else
324+
{
325+
var searchQuery = args.Item is SuggestionModel x && !string.IsNullOrWhiteSpace(x.Name)
326+
? x.Name
327+
: args.Text;
328+
329+
shellPage?.SubmitSearch(searchQuery); // use the resolved shellPage for consistency
330+
ViewModel.SaveSearchQueryToList(searchQuery);
331+
}
332+
333+
(MainPageViewModel.SelectedTabItem?.TabItemContent as Control)?.Focus(FocusState.Programmatic);
334+
return;
320335
}
321336
}
322337

@@ -338,6 +353,7 @@ await DispatcherQueue.EnqueueOrInvokeAsync(() =>
338353
}
339354
else if (Omnibar.CurrentSelectedMode == OmnibarSearchMode)
340355
{
356+
await ViewModel.PopulateOmnibarSuggestionsForSearchMode();
341357
}
342358
}
343359

@@ -456,7 +472,12 @@ await DispatcherQueue.EnqueueOrInvokeAsync(() =>
456472
}
457473
else if (e.NewMode == OmnibarSearchMode)
458474
{
475+
if (!ViewModel.InstanceViewModel.IsPageTypeSearchResults)
476+
ViewModel.OmnibarSearchModeText = string.Empty;
477+
else
478+
ViewModel.OmnibarSearchModeText = ViewModel.InstanceViewModel.CurrentSearchQuery;
459479

480+
await ViewModel.PopulateOmnibarSuggestionsForSearchMode();
460481
}
461482
}
462483

@@ -486,7 +507,7 @@ await DispatcherQueue.EnqueueOrInvokeAsync(() =>
486507
}
487508
else if (Omnibar.CurrentSelectedMode == OmnibarSearchMode)
488509
{
489-
510+
await ViewModel.PopulateOmnibarSuggestionsForSearchMode();
490511
}
491512
}
492513
}

0 commit comments

Comments
 (0)