From 7caf1a859ca27bf4ad59087dd9cf53c065cc6da9 Mon Sep 17 00:00:00 2001 From: 0x5BFA <62196528+0x5bfa@users.noreply.github.com> Date: Mon, 26 May 2025 11:26:33 +0900 Subject: [PATCH 01/34] Added a workaround to keep Omnibar's focus on a mode button being clicked --- src/Files.App.Controls/Omnibar/Omnibar.Events.cs | 10 ++++++++++ src/Files.App.Controls/Omnibar/Omnibar.cs | 4 ++++ src/Files.App.Controls/Omnibar/OmnibarMode.Events.cs | 2 ++ 3 files changed, 16 insertions(+) diff --git a/src/Files.App.Controls/Omnibar/Omnibar.Events.cs b/src/Files.App.Controls/Omnibar/Omnibar.Events.cs index 9f33112c8ee0..13cc2eaa7814 100644 --- a/src/Files.App.Controls/Omnibar/Omnibar.Events.cs +++ b/src/Files.App.Controls/Omnibar/Omnibar.Events.cs @@ -22,6 +22,16 @@ private void AutoSuggestBox_GettingFocus(UIElement sender, GettingFocusEventArgs _previouslyFocusedElement = new(args.OldFocusedElement as UIElement); } + private void AutoSuggestBox_LosingFocus(UIElement sender, LosingFocusEventArgs args) + { + if (IsModeButtonPressed) + { + IsModeButtonPressed = false; + args.TryCancel(); + return; + } + } + private void AutoSuggestBox_GotFocus(object sender, RoutedEventArgs e) { IsFocused = true; diff --git a/src/Files.App.Controls/Omnibar/Omnibar.cs b/src/Files.App.Controls/Omnibar/Omnibar.cs index f4d29468e1ff..ea1435cd8276 100644 --- a/src/Files.App.Controls/Omnibar/Omnibar.cs +++ b/src/Files.App.Controls/Omnibar/Omnibar.cs @@ -33,6 +33,9 @@ public partial class Omnibar : Control private WeakReference _previouslyFocusedElement = new(null); + // NOTE: This is a workaround to keep Omnibar's focus on a mode button being clicked + internal bool IsModeButtonPressed { get; set; } + // Events public event TypedEventHandler? QuerySubmitted; @@ -71,6 +74,7 @@ protected override void OnApplyTemplate() SizeChanged += Omnibar_SizeChanged; _textBox.GettingFocus += AutoSuggestBox_GettingFocus; _textBox.GotFocus += AutoSuggestBox_GotFocus; + _textBox.LosingFocus += AutoSuggestBox_LosingFocus; _textBox.LostFocus += AutoSuggestBox_LostFocus; _textBox.KeyDown += AutoSuggestBox_KeyDown; _textBox.TextChanged += AutoSuggestBox_TextChanged; diff --git a/src/Files.App.Controls/Omnibar/OmnibarMode.Events.cs b/src/Files.App.Controls/Omnibar/OmnibarMode.Events.cs index e7f73fd5262c..fdc6fa6b3c7f 100644 --- a/src/Files.App.Controls/Omnibar/OmnibarMode.Events.cs +++ b/src/Files.App.Controls/Omnibar/OmnibarMode.Events.cs @@ -30,6 +30,8 @@ private void ModeButton_PointerReleased(object sender, PointerRoutedEventArgs e) VisualStateManager.GoToState(this, "PointerOver", true); + owner.IsModeButtonPressed = true; + // Change the current mode owner.CurrentSelectedMode = this; } From e3826fe509f2fad5fa2159d66c14e75a4d92feac Mon Sep 17 00:00:00 2001 From: 0x5BFA <62196528+0x5bfa@users.noreply.github.com> Date: Mon, 26 May 2025 15:08:25 +0900 Subject: [PATCH 02/34] Added auto scroll when the arrow keys are pressed --- src/Files.App.Controls/Omnibar/Omnibar.Events.cs | 5 +++++ src/Files.App.Controls/Omnibar/Omnibar.cs | 1 + 2 files changed, 6 insertions(+) diff --git a/src/Files.App.Controls/Omnibar/Omnibar.Events.cs b/src/Files.App.Controls/Omnibar/Omnibar.Events.cs index 13cc2eaa7814..54e3df31bfe2 100644 --- a/src/Files.App.Controls/Omnibar/Omnibar.Events.cs +++ b/src/Files.App.Controls/Omnibar/Omnibar.Events.cs @@ -137,5 +137,10 @@ private void AutoSuggestBoxSuggestionsListView_ItemClick(object sender, ItemClic ChooseSuggestionItem(e.ClickedItem); SubmitQuery(e.ClickedItem); } + + private void AutoSuggestBoxSuggestionsListView_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + _textBoxSuggestionsListView.ScrollIntoView(_textBoxSuggestionsListView.SelectedItem); + } } } diff --git a/src/Files.App.Controls/Omnibar/Omnibar.cs b/src/Files.App.Controls/Omnibar/Omnibar.cs index ea1435cd8276..08c19e64139c 100644 --- a/src/Files.App.Controls/Omnibar/Omnibar.cs +++ b/src/Files.App.Controls/Omnibar/Omnibar.cs @@ -80,6 +80,7 @@ protected override void OnApplyTemplate() _textBox.TextChanged += AutoSuggestBox_TextChanged; _textBoxSuggestionsPopup.GettingFocus += AutoSuggestBoxSuggestionsPopup_GettingFocus; _textBoxSuggestionsListView.ItemClick += AutoSuggestBoxSuggestionsListView_ItemClick; + _textBoxSuggestionsListView.SelectionChanged += AutoSuggestBoxSuggestionsListView_SelectionChanged; // Set the default width _textBoxSuggestionsContainerBorder.Width = ActualWidth; From 58b0a4cbbeb9843441bcc8f55ad4989babfb2014 Mon Sep 17 00:00:00 2001 From: 0x5BFA <62196528+0x5bfa@users.noreply.github.com> Date: Mon, 26 May 2025 23:43:54 +0900 Subject: [PATCH 03/34] Update test on arrow keys while UpdateTextOnSelect is false via a new prop UpdateTextOnArrowKeys --- src/Files.App.Controls/Omnibar/Omnibar.Events.cs | 2 +- src/Files.App.Controls/Omnibar/Omnibar.cs | 5 +++-- src/Files.App.Controls/Omnibar/OmnibarMode.Properties.cs | 3 +++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Files.App.Controls/Omnibar/Omnibar.Events.cs b/src/Files.App.Controls/Omnibar/Omnibar.Events.cs index 54e3df31bfe2..4499c41ab5d4 100644 --- a/src/Files.App.Controls/Omnibar/Omnibar.Events.cs +++ b/src/Files.App.Controls/Omnibar/Omnibar.Events.cs @@ -80,7 +80,7 @@ private void AutoSuggestBox_KeyDown(object sender, KeyRoutedEventArgs e) { _textBoxSuggestionsListView.SelectedIndex = nextIndex; - ChooseSuggestionItem(_textBoxSuggestionsListView.SelectedItem); + ChooseSuggestionItem(_textBoxSuggestionsListView.SelectedItem, true); } } else if (e.Key == VirtualKey.Escape) diff --git a/src/Files.App.Controls/Omnibar/Omnibar.cs b/src/Files.App.Controls/Omnibar/Omnibar.cs index 08c19e64139c..08a3e46313a3 100644 --- a/src/Files.App.Controls/Omnibar/Omnibar.cs +++ b/src/Files.App.Controls/Omnibar/Omnibar.cs @@ -201,12 +201,13 @@ public bool TryToggleIsSuggestionsPopupOpen(bool wantToOpen) return false; } - public void ChooseSuggestionItem(object obj) + public void ChooseSuggestionItem(object obj, bool isOriginatedFromArrowKey = false) { if (CurrentSelectedMode is null) return; - if (CurrentSelectedMode.UpdateTextOnSelect) + if (CurrentSelectedMode.UpdateTextOnSelect || + (isOriginatedFromArrowKey && CurrentSelectedMode.UpdateTextOnArrowKeys)) { _textChangeReason = OmnibarTextChangeReason.SuggestionChosen; ChangeTextBoxText(GetObjectText(obj)); diff --git a/src/Files.App.Controls/Omnibar/OmnibarMode.Properties.cs b/src/Files.App.Controls/Omnibar/OmnibarMode.Properties.cs index dbac55f6ca1f..6245ebbca02f 100644 --- a/src/Files.App.Controls/Omnibar/OmnibarMode.Properties.cs +++ b/src/Files.App.Controls/Omnibar/OmnibarMode.Properties.cs @@ -43,6 +43,9 @@ public partial class OmnibarMode [GeneratedDependencyProperty(DefaultValue = true)] public partial bool UpdateTextOnSelect { get; set; } + [GeneratedDependencyProperty(DefaultValue = true)] + public partial bool UpdateTextOnArrowKeys { get; set; } + [GeneratedDependencyProperty] public partial bool IsAutoFocusEnabled { get; set; } From 56149c3dc8883b9a73ac9e73c23d90cac2892788 Mon Sep 17 00:00:00 2001 From: 0x5BFA <62196528+0x5bfa@users.noreply.github.com> Date: Tue, 27 May 2025 00:04:54 +0900 Subject: [PATCH 04/34] Added EllipsisButtonToolTip --- .../BreadcrumbBar/BreadcrumbBar.Properties.cs | 3 +++ src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml | 1 + src/Files.App/UserControls/NavigationToolbar.xaml | 1 + 3 files changed, 5 insertions(+) diff --git a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.Properties.cs b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.Properties.cs index 36dca955a6c1..04f620e029ea 100644 --- a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.Properties.cs +++ b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.Properties.cs @@ -15,5 +15,8 @@ public partial class BreadcrumbBar : Control [GeneratedDependencyProperty] public partial object? ItemTemplate { get; set; } + + [GeneratedDependencyProperty] + public partial string? EllipsisButtonToolTip { get; set; } } } diff --git a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml index 213ab4cd8340..554770785620 100644 --- a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml +++ b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml @@ -66,6 +66,7 @@ Margin="{StaticResource BreadcrumbBarItemMargin}" AutomationProperties.AccessibilityView="Content" IsEllipsis="True" + ToolTipService.ToolTip="{TemplateBinding EllipsisButtonToolTip}" Visibility="Collapsed"> diff --git a/src/Files.App/UserControls/NavigationToolbar.xaml b/src/Files.App/UserControls/NavigationToolbar.xaml index 30f1f6f82475..99a0f80b3ac5 100644 --- a/src/Files.App/UserControls/NavigationToolbar.xaml +++ b/src/Files.App/UserControls/NavigationToolbar.xaml @@ -340,6 +340,7 @@ Date: Tue, 27 May 2025 16:09:13 +0900 Subject: [PATCH 05/34] Removed unclickable backplate on BreadcrumbBar when the ellipsis is shown --- .../BreadcrumbBar/BreadcrumbBarLayout.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarLayout.cs b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarLayout.cs index da0313988121..21a6864becef 100644 --- a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarLayout.cs +++ b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarLayout.cs @@ -33,13 +33,15 @@ protected override Size MeasureOverride(NonVirtualizingLayoutContext context, Si var accumulatedSize = new Size(0, 0); _availableSize = availableSize; + var indexAfterEllipsis = GetFirstIndexToRender(context); + // Go through all items and measure them - foreach (var item in context.Children) + for (int index = 0; index < context.Children.Count; index++) { - if (item is BreadcrumbBarItem breadcrumbItem) + if (context.Children[index] is BreadcrumbBarItem breadcrumbItem) { breadcrumbItem.Measure(availableSize); - accumulatedSize.Width += breadcrumbItem.DesiredSize.Width; + accumulatedSize.Width += index < indexAfterEllipsis ? 0: breadcrumbItem.DesiredSize.Width; accumulatedSize.Height = Math.Max(accumulatedSize.Height, breadcrumbItem.DesiredSize.Height); } } From 674ad665e8dfb3f2318dbf93154c964ab707c06c Mon Sep 17 00:00:00 2001 From: 0x5BFA <62196528+0x5bfa@users.noreply.github.com> Date: Tue, 27 May 2025 23:20:38 +0900 Subject: [PATCH 06/34] [WIP] Added UnfocusedStateBehaviors --- .../Omnibar/OmnibarMode.Properties.cs | 3 +++ .../Omnibar/OmnibarModeUnfocusedStateBehaviors.cs | 12 ++++++++++++ src/Files.App/UserControls/NavigationToolbar.xaml | 1 + 3 files changed, 16 insertions(+) create mode 100644 src/Files.App.Controls/Omnibar/OmnibarModeUnfocusedStateBehaviors.cs diff --git a/src/Files.App.Controls/Omnibar/OmnibarMode.Properties.cs b/src/Files.App.Controls/Omnibar/OmnibarMode.Properties.cs index 6245ebbca02f..fc1033dc8db9 100644 --- a/src/Files.App.Controls/Omnibar/OmnibarMode.Properties.cs +++ b/src/Files.App.Controls/Omnibar/OmnibarMode.Properties.cs @@ -49,6 +49,9 @@ public partial class OmnibarMode [GeneratedDependencyProperty] public partial bool IsAutoFocusEnabled { get; set; } + [GeneratedDependencyProperty] + public partial OmnibarModeUnfocusedStateBehaviors UnfocusedStateBehaviors { get; set; } + partial void OnTextChanged(string? newValue) { if (_ownerRef is null || _ownerRef.TryGetTarget(out var owner) is false) diff --git a/src/Files.App.Controls/Omnibar/OmnibarModeUnfocusedStateBehaviors.cs b/src/Files.App.Controls/Omnibar/OmnibarModeUnfocusedStateBehaviors.cs new file mode 100644 index 000000000000..9ec8a0e88d62 --- /dev/null +++ b/src/Files.App.Controls/Omnibar/OmnibarModeUnfocusedStateBehaviors.cs @@ -0,0 +1,12 @@ +// Copyright (c) Files Community +// Licensed under the MIT License. + +namespace Files.App.Controls +{ + public enum OmnibarModeUnfocusedStateBehaviors + { + ReturnToDefaultMode, + RetainCurrentMode, + RetainCurrentModeWhenEmpty, + } +} diff --git a/src/Files.App/UserControls/NavigationToolbar.xaml b/src/Files.App/UserControls/NavigationToolbar.xaml index 99a0f80b3ac5..99cbd664f1f4 100644 --- a/src/Files.App/UserControls/NavigationToolbar.xaml +++ b/src/Files.App/UserControls/NavigationToolbar.xaml @@ -375,6 +375,7 @@ SuggestionItemsSource="{x:Bind ViewModel.OmnibarCommandPaletteModeSuggestionItems, Mode=OneWay}" Text="{x:Bind ViewModel.OmnibarCommandPaletteModeText, Mode=TwoWay}" TextMemberPath="Text" + UnfocusedStateBehaviors="ReturnToDefaultMode" UpdateTextOnSelect="False"> From 275af9d862d3ba564106e9e43a4f805e1c4513a9 Mon Sep 17 00:00:00 2001 From: 0x5BFA <62196528+0x5bfa@users.noreply.github.com> Date: Wed, 28 May 2025 00:51:15 +0900 Subject: [PATCH 07/34] Updated the a11y props --- src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml | 6 +++--- .../BreadcrumbBar/BreadcrumbBarItemAutomationPeer.cs | 2 +- src/Files.App/UserControls/NavigationToolbar.xaml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml index 554770785620..e3ef8057439d 100644 --- a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml +++ b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml @@ -55,7 +55,6 @@ x:Name="PART_RootBreadcrumbBarItem" Grid.Column="0" Padding="{StaticResource BreadcrumbBarRootItemPadding}" - AutomationProperties.AccessibilityView="Content" CornerRadius="{StaticResource BreadcrumbBarRootItemCornerRadius}"> @@ -64,7 +63,6 @@ x:Name="PART_EllipsisBreadcrumbBarItem" Grid.Column="1" Margin="{StaticResource BreadcrumbBarItemMargin}" - AutomationProperties.AccessibilityView="Content" IsEllipsis="True" ToolTipService.ToolTip="{TemplateBinding EllipsisButtonToolTip}" Visibility="Collapsed"> @@ -125,7 +123,8 @@ x:Name="PART_ItemContentButton" Padding="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" - AutomationProperties.AccessibilityView="Raw" + AutomationProperties.AccessibilityView="Content" + AutomationProperties.Name="{TemplateBinding Content}" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" @@ -179,6 +178,7 @@ Padding="{StaticResource BreadcrumbBarChevronPadding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" AutomationProperties.AccessibilityView="Content" + AutomationProperties.Name="Chevron" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" diff --git a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarItemAutomationPeer.cs b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarItemAutomationPeer.cs index 42d81617f28c..54513beb82d9 100644 --- a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarItemAutomationPeer.cs +++ b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarItemAutomationPeer.cs @@ -37,7 +37,7 @@ protected override string GetClassNameCore() protected override AutomationControlType GetAutomationControlTypeCore() { - return AutomationControlType.Button; + return AutomationControlType.ListItem; } /// diff --git a/src/Files.App/UserControls/NavigationToolbar.xaml b/src/Files.App/UserControls/NavigationToolbar.xaml index 99cbd664f1f4..40acfa336a0e 100644 --- a/src/Files.App/UserControls/NavigationToolbar.xaml +++ b/src/Files.App/UserControls/NavigationToolbar.xaml @@ -353,7 +353,7 @@ - + From 43747cc8939c2041262b70a612d4d1ba4e73fafd Mon Sep 17 00:00:00 2001 From: 0x5BFA <62196528+0x5bfa@users.noreply.github.com> Date: Fri, 30 May 2025 01:07:58 +0900 Subject: [PATCH 08/34] [WIP] Adjusting automation props --- .../BreadcrumbBar/BreadcrumbBar.xaml | 4 ++-- .../BreadcrumbBarItemAutomationPeer.cs | 13 ++++++++----- src/Files.App/UserControls/NavigationToolbar.xaml | 5 ++++- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml index e3ef8057439d..536abd9c584d 100644 --- a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml +++ b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml @@ -123,7 +123,7 @@ x:Name="PART_ItemContentButton" Padding="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" - AutomationProperties.AccessibilityView="Content" + AutomationProperties.AccessibilityView="Raw" AutomationProperties.Name="{TemplateBinding Content}" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" @@ -177,7 +177,7 @@ Margin="{StaticResource BreadcrumbBarItemMargin}" Padding="{StaticResource BreadcrumbBarChevronPadding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" - AutomationProperties.AccessibilityView="Content" + AutomationProperties.AccessibilityView="Raw" AutomationProperties.Name="Chevron" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" diff --git a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarItemAutomationPeer.cs b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarItemAutomationPeer.cs index 54513beb82d9..bddb74a7bf8f 100644 --- a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarItemAutomationPeer.cs +++ b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarItemAutomationPeer.cs @@ -24,7 +24,7 @@ protected override string GetLocalizedControlTypeCore() protected override object GetPatternCore(PatternInterface patternInterface) { - if (patternInterface is PatternInterface.Invoke) + if (patternInterface is PatternInterface.ExpandCollapse or PatternInterface.Invoke) return this; return base.GetPatternCore(patternInterface); @@ -37,12 +37,15 @@ protected override string GetClassNameCore() protected override AutomationControlType GetAutomationControlTypeCore() { - return AutomationControlType.ListItem; + return AutomationControlType.SplitButton; } - /// - /// Sends a request to invoke the item associated with the automation peer. - /// + protected override bool IsControlElementCore() + { + return true; + } + + /// public void Invoke() { if (Owner is not BreadcrumbBarItem item) diff --git a/src/Files.App/UserControls/NavigationToolbar.xaml b/src/Files.App/UserControls/NavigationToolbar.xaml index 40acfa336a0e..b423ce8b3945 100644 --- a/src/Files.App/UserControls/NavigationToolbar.xaml +++ b/src/Files.App/UserControls/NavigationToolbar.xaml @@ -353,7 +353,10 @@ - + From fd12dbbdc3dbc0d3258024e5b0aa98ef984195d7 Mon Sep 17 00:00:00 2001 From: 0x5BFA <62196528+0x5bfa@users.noreply.github.com> Date: Fri, 30 May 2025 14:44:05 +0900 Subject: [PATCH 09/34] Fixed EllipsisIsRendered check --- src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarLayout.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarLayout.cs b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarLayout.cs index 21a6864becef..f1a0d2efcc25 100644 --- a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarLayout.cs +++ b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarLayout.cs @@ -51,7 +51,7 @@ protected override Size MeasureOverride(NonVirtualizingLayoutContext context, Si _ellipsisButton ??= context.Children[0] as BreadcrumbBarItem; // Sets the ellipsis item's visibility based on whether the items are overflowing - EllipsisIsRendered = accumulatedSize.Width > availableSize.Width; + EllipsisIsRendered = indexAfterEllipsis is not 0; return accumulatedSize; } From 02b980b802b6383c9e1b0bd631374a5ea9783e98 Mon Sep 17 00:00:00 2001 From: 0x5BFA <62196528+0x5bfa@users.noreply.github.com> Date: Fri, 30 May 2025 23:24:46 +0900 Subject: [PATCH 10/34] Aot safe mode change in XAML --- src/Files.App.Controls/Omnibar/Omnibar.cs | 5 +++++ src/Files.App.Controls/Omnibar/Omnibar.xaml | 7 +------ .../UserControls/NavigationToolbar.xaml.cs | 14 +++++++++++--- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/Files.App.Controls/Omnibar/Omnibar.cs b/src/Files.App.Controls/Omnibar/Omnibar.cs index 08a3e46313a3..50c4eecacd43 100644 --- a/src/Files.App.Controls/Omnibar/Omnibar.cs +++ b/src/Files.App.Controls/Omnibar/Omnibar.cs @@ -153,6 +153,11 @@ protected void ChangeMode(OmnibarMode? oldMode, OmnibarMode newMode) VisualStateManager.GoToState(newMode, "Focused", true); newMode.IsTabStop = false; + + _textBox.PlaceholderText = newMode.PlaceholderText ?? string.Empty; + _textBoxSuggestionsListView.ItemTemplate = newMode.SuggestionItemTemplate; + _textBoxSuggestionsListView.ItemsSource = newMode.SuggestionItemsSource; + if (newMode.IsAutoFocusEnabled) { _textBox.Focus(FocusState.Pointer); diff --git a/src/Files.App.Controls/Omnibar/Omnibar.xaml b/src/Files.App.Controls/Omnibar/Omnibar.xaml index 64eabed99947..f546a3932d15 100644 --- a/src/Files.App.Controls/Omnibar/Omnibar.xaml +++ b/src/Files.App.Controls/Omnibar/Omnibar.xaml @@ -67,7 +67,6 @@ FontStretch="{TemplateBinding FontStretch}" FontWeight="{TemplateBinding FontWeight}" Foreground="{TemplateBinding Foreground}" - PlaceholderText="{Binding CurrentSelectedMode.PlaceholderText, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}" ScrollViewer.BringIntoViewOnFocusChange="False" Style="{StaticResource DefaultOmnibarTextBoxStyle}" UseSystemFocusVisuals="{TemplateBinding UseSystemFocusVisuals}" /> @@ -96,11 +95,7 @@ MaxHeight="{ThemeResource AutoSuggestListMaxHeight}" Margin="{ThemeResource AutoSuggestListPadding}" IsItemClickEnabled="True" - ItemTemplate="{Binding CurrentSelectedMode.SuggestionItemTemplate, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}" - ItemsSource="{Binding CurrentSelectedMode.SuggestionItemsSource, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}" - SelectionMode="Single"> - - + SelectionMode="Single" /> diff --git a/src/Files.App/UserControls/NavigationToolbar.xaml.cs b/src/Files.App/UserControls/NavigationToolbar.xaml.cs index 9d7751f1b88e..b61f86a17f4d 100644 --- a/src/Files.App/UserControls/NavigationToolbar.xaml.cs +++ b/src/Files.App/UserControls/NavigationToolbar.xaml.cs @@ -266,8 +266,14 @@ private async void Omnibar_QuerySubmitted(Omnibar sender, OmnibarQuerySubmittedE if (args.Item is not NavigationBarSuggestionItem item) return; + string commandText = { Text: string itemText } + ? itemText + : args.Text is string text + ? text + : string.Empty; + // Try invoking built-in command - if (item.Text is { } commandText) + if (!string.IsNullOrEmpty(commandText)) { var command = Commands[commandText]; if (command == Commands.None) @@ -280,6 +286,7 @@ await DialogDisplayHelper.ShowDialogAsync(Strings.CommandNotExecutable.GetLocali await command.ExecuteAsync(); ViewModel.OmnibarCurrentSelectedMode = OmnibarPathMode; + ViewModel.OmnibarCommandPaletteModeText = string.Empty; return; } @@ -295,9 +302,10 @@ await DialogDisplayHelper.ShowDialogAsync(Strings.CommandNotExecutable.GetLocali var overload = action.GetOverloads().FirstOrDefault(); await overload?.InvokeAsync(actionInstance.Context); } - - ViewModel.OmnibarCurrentSelectedMode = OmnibarPathMode; } + + ViewModel.OmnibarCurrentSelectedMode = OmnibarPathMode; + ViewModel.OmnibarCommandPaletteModeText = string.Empty; } else if (Omnibar.CurrentSelectedMode == OmnibarSearchMode) { From 062f2266276a210c7fbbf017c31aed47b48eb93a Mon Sep 17 00:00:00 2001 From: 0x5BFA <62196528+0x5bfa@users.noreply.github.com> Date: Sat, 31 May 2025 00:07:04 +0900 Subject: [PATCH 11/34] Revert "[WIP] Added UnfocusedStateBehaviors" This reverts commit a4f47996a2bddcb496b1fb6c14154755425dfe61. --- .../Omnibar/OmnibarMode.Properties.cs | 3 --- .../Omnibar/OmnibarModeUnfocusedStateBehaviors.cs | 12 ------------ src/Files.App/UserControls/NavigationToolbar.xaml | 1 - 3 files changed, 16 deletions(-) delete mode 100644 src/Files.App.Controls/Omnibar/OmnibarModeUnfocusedStateBehaviors.cs diff --git a/src/Files.App.Controls/Omnibar/OmnibarMode.Properties.cs b/src/Files.App.Controls/Omnibar/OmnibarMode.Properties.cs index fc1033dc8db9..6245ebbca02f 100644 --- a/src/Files.App.Controls/Omnibar/OmnibarMode.Properties.cs +++ b/src/Files.App.Controls/Omnibar/OmnibarMode.Properties.cs @@ -49,9 +49,6 @@ public partial class OmnibarMode [GeneratedDependencyProperty] public partial bool IsAutoFocusEnabled { get; set; } - [GeneratedDependencyProperty] - public partial OmnibarModeUnfocusedStateBehaviors UnfocusedStateBehaviors { get; set; } - partial void OnTextChanged(string? newValue) { if (_ownerRef is null || _ownerRef.TryGetTarget(out var owner) is false) diff --git a/src/Files.App.Controls/Omnibar/OmnibarModeUnfocusedStateBehaviors.cs b/src/Files.App.Controls/Omnibar/OmnibarModeUnfocusedStateBehaviors.cs deleted file mode 100644 index 9ec8a0e88d62..000000000000 --- a/src/Files.App.Controls/Omnibar/OmnibarModeUnfocusedStateBehaviors.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) Files Community -// Licensed under the MIT License. - -namespace Files.App.Controls -{ - public enum OmnibarModeUnfocusedStateBehaviors - { - ReturnToDefaultMode, - RetainCurrentMode, - RetainCurrentModeWhenEmpty, - } -} diff --git a/src/Files.App/UserControls/NavigationToolbar.xaml b/src/Files.App/UserControls/NavigationToolbar.xaml index b423ce8b3945..966d304b6472 100644 --- a/src/Files.App/UserControls/NavigationToolbar.xaml +++ b/src/Files.App/UserControls/NavigationToolbar.xaml @@ -378,7 +378,6 @@ SuggestionItemsSource="{x:Bind ViewModel.OmnibarCommandPaletteModeSuggestionItems, Mode=OneWay}" Text="{x:Bind ViewModel.OmnibarCommandPaletteModeText, Mode=TwoWay}" TextMemberPath="Text" - UnfocusedStateBehaviors="ReturnToDefaultMode" UpdateTextOnSelect="False"> From 97b946b48ff383e549aebe88cbb4ec8676463899 Mon Sep 17 00:00:00 2001 From: 0x5BFA <62196528+0x5bfa@users.noreply.github.com> Date: Sat, 31 May 2025 01:05:00 +0900 Subject: [PATCH 12/34] Added tooltips to BreadcrumbBarItems --- .../BreadcrumbBar/BreadcrumbBar.Properties.cs | 3 +++ src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml | 5 ++++- .../BreadcrumbBar/BreadcrumbBarItem.Properties.cs | 6 ++++++ src/Files.App/Strings/en-US/Resources.resw | 6 ++++++ src/Files.App/UserControls/NavigationToolbar.xaml | 9 ++++++--- 5 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.Properties.cs b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.Properties.cs index 04f620e029ea..a02306d2a95c 100644 --- a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.Properties.cs +++ b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.Properties.cs @@ -18,5 +18,8 @@ public partial class BreadcrumbBar : Control [GeneratedDependencyProperty] public partial string? EllipsisButtonToolTip { get; set; } + + [GeneratedDependencyProperty] + public partial string? RootItemToolTip { get; set; } } } diff --git a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml index 536abd9c584d..516d37d72a25 100644 --- a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml +++ b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml @@ -55,7 +55,8 @@ x:Name="PART_RootBreadcrumbBarItem" Grid.Column="0" Padding="{StaticResource BreadcrumbBarRootItemPadding}" - CornerRadius="{StaticResource BreadcrumbBarRootItemCornerRadius}"> + CornerRadius="{StaticResource BreadcrumbBarRootItemCornerRadius}" + ItemToolTip="{TemplateBinding RootItemToolTip}"> @@ -130,6 +131,7 @@ BorderThickness="{TemplateBinding BorderThickness}" Control.IsTemplateFocusTarget="True" CornerRadius="{TemplateBinding CornerRadius}" + ToolTipService.ToolTip="{TemplateBinding ItemToolTip}" UseSystemFocusVisuals="True"> @@ -184,6 +186,7 @@ BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="{StaticResource BreadcrumbBarChevronCornerRaduis}" Style="{StaticResource BreadcrumbBarItemChevronButtonStyle}" + ToolTipService.ToolTip="{TemplateBinding ChevronToolTip}" UseSystemFocusVisuals="True"> diff --git a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarItem.Properties.cs b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarItem.Properties.cs index 7b1709d84b26..47cae0a537a4 100644 --- a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarItem.Properties.cs +++ b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarItem.Properties.cs @@ -13,6 +13,12 @@ public partial class BreadcrumbBarItem [GeneratedDependencyProperty] public partial bool IsLastItem { get; set; } + [GeneratedDependencyProperty] + public partial string ItemToolTip { get; set; } + + [GeneratedDependencyProperty] + public partial string ChevronToolTip { get; set; } + partial void OnIsEllipsisChanged(bool newValue) { VisualStateManager.GoToState(this, newValue ? "ChevronCollapsed" : "ChevronVisible", true); diff --git a/src/Files.App/Strings/en-US/Resources.resw b/src/Files.App/Strings/en-US/Resources.resw index 8a5b39ff452e..5484f1582940 100644 --- a/src/Files.App/Strings/en-US/Resources.resw +++ b/src/Files.App/Strings/en-US/Resources.resw @@ -4240,4 +4240,10 @@ Icon files This is the friendly name for a variety of different icon files. + + Show collapesed path breadcrumbs + + + Show child folders + diff --git a/src/Files.App/UserControls/NavigationToolbar.xaml b/src/Files.App/UserControls/NavigationToolbar.xaml index 966d304b6472..e9cdca16a1c7 100644 --- a/src/Files.App/UserControls/NavigationToolbar.xaml +++ b/src/Files.App/UserControls/NavigationToolbar.xaml @@ -340,11 +340,12 @@ + ItemsSource="{x:Bind ViewModel.PathComponents, Mode=OneWay}" + RootItemToolTip="{helpers:ResourceString Name=Home}"> + ChevronToolTip="{helpers:ResourceString Name=BreadcrumbBarChevronButtonToolTip}" + Content="{x:Bind Title, Mode=OneWay}" + ItemToolTip="{x:Bind Title, Mode=OneWay}" /> From 9fdfca6371287dbe86664715e93af7c2e6b7a2e1 Mon Sep 17 00:00:00 2001 From: Yair <39923744+yaira2@users.noreply.github.com> Date: Mon, 9 Jun 2025 16:57:46 -0400 Subject: [PATCH 13/34] Added custom brushes for breadcrumb items --- .../BreadcrumbBar/BreadcrumbBar.xaml | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml index 516d37d72a25..7357e6b4cf5a 100644 --- a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml +++ b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml @@ -5,6 +5,21 @@ xmlns:animatedvisuals="using:Microsoft.UI.Xaml.Controls.AnimatedVisuals" xmlns:local="using:Files.App.Controls"> + + + #12000000 + #0F000000 + + + #0FFFFFFF + #0AFFFFFF + + + #0FFFFFFF + #0AFFFFFF + + + 34 120 16 @@ -134,10 +149,8 @@ ToolTipService.ToolTip="{TemplateBinding ItemToolTip}" UseSystemFocusVisuals="True"> - - - - + + @@ -189,10 +202,8 @@ ToolTipService.ToolTip="{TemplateBinding ChevronToolTip}" UseSystemFocusVisuals="True"> - - - - + + From c5a29d063c8dddd5d6101b99619511d98065fb19 Mon Sep 17 00:00:00 2001 From: Yair <39923744+yaira2@users.noreply.github.com> Date: Mon, 9 Jun 2025 18:21:13 -0400 Subject: [PATCH 14/34] Reverted to previous brushes --- .../BreadcrumbBar/BreadcrumbBar.xaml | 26 +++++-------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml index 7357e6b4cf5a..0e0af56a51bd 100644 --- a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml +++ b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml @@ -5,21 +5,6 @@ xmlns:animatedvisuals="using:Microsoft.UI.Xaml.Controls.AnimatedVisuals" xmlns:local="using:Files.App.Controls"> - - - #12000000 - #0F000000 - - - #0FFFFFFF - #0AFFFFFF - - - #0FFFFFFF - #0AFFFFFF - - - 34 120 16 @@ -28,6 +13,7 @@ 8,0 16,0,8,0 2,0,0,0 + 32 2,2,2,2 2,2,2,2 @@ -111,7 +97,7 @@ - + @@ -149,8 +135,8 @@ ToolTipService.ToolTip="{TemplateBinding ItemToolTip}" UseSystemFocusVisuals="True"> - - + + @@ -202,8 +188,8 @@ ToolTipService.ToolTip="{TemplateBinding ChevronToolTip}" UseSystemFocusVisuals="True"> - - + + From 5f82d34e48f7857dfbf6abfbcfa4129a351a7804 Mon Sep 17 00:00:00 2001 From: Yair <39923744+yaira2@users.noreply.github.com> Date: Mon, 9 Jun 2025 18:29:51 -0400 Subject: [PATCH 15/34] Fix heights of mode buttons --- src/Files.App.Controls/Omnibar/Omnibar.xaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Files.App.Controls/Omnibar/Omnibar.xaml b/src/Files.App.Controls/Omnibar/Omnibar.xaml index f546a3932d15..26c90b65eb0f 100644 --- a/src/Files.App.Controls/Omnibar/Omnibar.xaml +++ b/src/Files.App.Controls/Omnibar/Omnibar.xaml @@ -133,7 +133,7 @@ - + - + From 5b51de217a37ab05cc3d7c1b3367ca3d4788e238 Mon Sep 17 00:00:00 2001 From: Yair <39923744+yaira2@users.noreply.github.com> Date: Mon, 9 Jun 2025 19:03:53 -0400 Subject: [PATCH 16/34] Fixed typo --- src/Files.App/Strings/en-US/Resources.resw | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Files.App/Strings/en-US/Resources.resw b/src/Files.App/Strings/en-US/Resources.resw index 5484f1582940..7040ba60c3f2 100644 --- a/src/Files.App/Strings/en-US/Resources.resw +++ b/src/Files.App/Strings/en-US/Resources.resw @@ -4241,7 +4241,7 @@ This is the friendly name for a variety of different icon files. - Show collapesed path breadcrumbs + Show collapsed path breadcrumbs Show child folders From d7e2430c59ccd85e6d064eb1db6f6e3dc373032d Mon Sep 17 00:00:00 2001 From: Yair <39923744+yaira2@users.noreply.github.com> Date: Mon, 9 Jun 2025 19:12:43 -0400 Subject: [PATCH 17/34] Removed extra tooltip --- src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml index 0e0af56a51bd..8e8bebae8110 100644 --- a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml +++ b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml @@ -132,7 +132,6 @@ BorderThickness="{TemplateBinding BorderThickness}" Control.IsTemplateFocusTarget="True" CornerRadius="{TemplateBinding CornerRadius}" - ToolTipService.ToolTip="{TemplateBinding ItemToolTip}" UseSystemFocusVisuals="True"> From 2e79619ab52ada47c3c928ae58f58028be46c113 Mon Sep 17 00:00:00 2001 From: Yair <39923744+yaira2@users.noreply.github.com> Date: Mon, 9 Jun 2025 19:23:44 -0400 Subject: [PATCH 18/34] Fixed a11y issue --- .../BreadcrumbBar/BreadcrumbBar.xaml | 214 +++++++++--------- 1 file changed, 105 insertions(+), 109 deletions(-) diff --git a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml index 8e8bebae8110..7a3d03f191a1 100644 --- a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml +++ b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml @@ -115,119 +115,115 @@ x:Name="PART_LayoutRoot" TabFocusNavigation="Once" XYFocusKeyboardNavigation="Enabled"> - - - - - - - - - - + + + + AutomationProperties.Name="Chevron" + Background="{TemplateBinding Background}" + BorderBrush="{TemplateBinding BorderBrush}" + BorderThickness="{TemplateBinding BorderThickness}" + CornerRadius="{StaticResource BreadcrumbBarChevronCornerRaduis}" + Style="{StaticResource BreadcrumbBarItemChevronButtonStyle}" + ToolTipService.ToolTip="{TemplateBinding ChevronToolTip}" + UseSystemFocusVisuals="True"> + + + + + + + + + + + + + + + + + + + + + + From a391cc0801462020f8d80ecf2c7c690b5f08b291 Mon Sep 17 00:00:00 2001 From: Yair <39923744+yaira2@users.noreply.github.com> Date: Mon, 9 Jun 2025 19:24:53 -0400 Subject: [PATCH 19/34] Update BreadcrumbBar.xaml --- src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml index 7a3d03f191a1..071c43d19e5a 100644 --- a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml +++ b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.xaml @@ -128,6 +128,7 @@ BorderThickness="{TemplateBinding BorderThickness}" Control.IsTemplateFocusTarget="True" CornerRadius="{TemplateBinding CornerRadius}" + ToolTipService.ToolTip="{TemplateBinding ItemToolTip}" UseSystemFocusVisuals="True"> From 640fb76f1d1bc3f0f07aebd5e57ccf9dbbcd932f Mon Sep 17 00:00:00 2001 From: Yair <39923744+yaira2@users.noreply.github.com> Date: Mon, 9 Jun 2025 19:31:26 -0400 Subject: [PATCH 20/34] Fixed tooltip --- src/Files.App/UserControls/NavigationToolbar.xaml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Files.App/UserControls/NavigationToolbar.xaml b/src/Files.App/UserControls/NavigationToolbar.xaml index e9cdca16a1c7..6d3acccb71c6 100644 --- a/src/Files.App/UserControls/NavigationToolbar.xaml +++ b/src/Files.App/UserControls/NavigationToolbar.xaml @@ -356,10 +356,9 @@ + Content="{x:Bind Title, Mode=OneWay}"/> From 11e2f0be148ac6d323061fd4771eb994676f6718 Mon Sep 17 00:00:00 2001 From: Yair <39923744+yaira2@users.noreply.github.com> Date: Tue, 10 Jun 2025 11:32:54 -0400 Subject: [PATCH 21/34] Revert to path mode on lost focus --- src/Files.App/UserControls/NavigationToolbar.xaml | 3 ++- src/Files.App/UserControls/NavigationToolbar.xaml.cs | 9 +++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/Files.App/UserControls/NavigationToolbar.xaml b/src/Files.App/UserControls/NavigationToolbar.xaml index 6d3acccb71c6..0fe25be91bf9 100644 --- a/src/Files.App/UserControls/NavigationToolbar.xaml +++ b/src/Files.App/UserControls/NavigationToolbar.xaml @@ -324,6 +324,7 @@ CurrentSelectedMode="{x:Bind ViewModel.OmnibarCurrentSelectedMode, Mode=TwoWay}" CurrentSelectedModeName="{x:Bind ViewModel.OmnibarCurrentSelectedModeName, Mode=TwoWay}" IsFocused="{x:Bind ViewModel.IsOmnibarFocused, Mode=TwoWay}" + LostFocus="Omnibar_LostFocus" QuerySubmitted="Omnibar_QuerySubmitted" TextChanged="Omnibar_TextChanged"> @@ -358,7 +359,7 @@ AutomationProperties.AccessibilityView="Content" AutomationProperties.Name="{x:Bind Title, Mode=OneWay}" ChevronToolTip="{helpers:ResourceString Name=BreadcrumbBarChevronButtonToolTip}" - Content="{x:Bind Title, Mode=OneWay}"/> + Content="{x:Bind Title, Mode=OneWay}" /> diff --git a/src/Files.App/UserControls/NavigationToolbar.xaml.cs b/src/Files.App/UserControls/NavigationToolbar.xaml.cs index b61f86a17f4d..b78a65a0d7a4 100644 --- a/src/Files.App/UserControls/NavigationToolbar.xaml.cs +++ b/src/Files.App/UserControls/NavigationToolbar.xaml.cs @@ -420,5 +420,14 @@ private void BreadcrumbBar_ItemDropDownFlyoutClosed(object sender, BreadcrumbBar // Clear the flyout items to save memory e.Flyout.Items.Clear(); } + + private void Omnibar_LostFocus(object sender, RoutedEventArgs e) + { + if (ViewModel.OmnibarCurrentSelectedMode == OmnibarCommandPaletteMode) + { + ViewModel.OmnibarCurrentSelectedMode = OmnibarPathMode; + ViewModel.OmnibarCommandPaletteModeText = string.Empty; + } + } } } From d57ebac942aba4db985bfdba7ab4dd5af23031fb Mon Sep 17 00:00:00 2001 From: Yair <39923744+yaira2@users.noreply.github.com> Date: Tue, 10 Jun 2025 11:48:40 -0400 Subject: [PATCH 22/34] Remove focus when pressing esc --- src/Files.App/UserControls/NavigationToolbar.xaml | 1 + src/Files.App/UserControls/NavigationToolbar.xaml.cs | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/src/Files.App/UserControls/NavigationToolbar.xaml b/src/Files.App/UserControls/NavigationToolbar.xaml index 0fe25be91bf9..e1056c2544ed 100644 --- a/src/Files.App/UserControls/NavigationToolbar.xaml +++ b/src/Files.App/UserControls/NavigationToolbar.xaml @@ -325,6 +325,7 @@ CurrentSelectedModeName="{x:Bind ViewModel.OmnibarCurrentSelectedModeName, Mode=TwoWay}" IsFocused="{x:Bind ViewModel.IsOmnibarFocused, Mode=TwoWay}" LostFocus="Omnibar_LostFocus" + PreviewKeyDown="Omnibar_PreviewKeyDown" QuerySubmitted="Omnibar_QuerySubmitted" TextChanged="Omnibar_TextChanged"> diff --git a/src/Files.App/UserControls/NavigationToolbar.xaml.cs b/src/Files.App/UserControls/NavigationToolbar.xaml.cs index b78a65a0d7a4..5c1f51fd2a40 100644 --- a/src/Files.App/UserControls/NavigationToolbar.xaml.cs +++ b/src/Files.App/UserControls/NavigationToolbar.xaml.cs @@ -429,5 +429,11 @@ private void Omnibar_LostFocus(object sender, RoutedEventArgs e) ViewModel.OmnibarCommandPaletteModeText = string.Empty; } } + + private void Omnibar_PreviewKeyDown(object sender, KeyRoutedEventArgs e) + { + if (e.Key is VirtualKey.Escape) + Omnibar.IsFocused = false; + } } } From 887021bc21a187bfff9c82fe1950287a5eb59d50 Mon Sep 17 00:00:00 2001 From: Yair <39923744+yaira2@users.noreply.github.com> Date: Tue, 10 Jun 2025 17:54:15 -0400 Subject: [PATCH 23/34] Fixed rebase --- src/Files.App/UserControls/NavigationToolbar.xaml.cs | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/Files.App/UserControls/NavigationToolbar.xaml.cs b/src/Files.App/UserControls/NavigationToolbar.xaml.cs index 5c1f51fd2a40..de5b37ff58ef 100644 --- a/src/Files.App/UserControls/NavigationToolbar.xaml.cs +++ b/src/Files.App/UserControls/NavigationToolbar.xaml.cs @@ -266,14 +266,8 @@ private async void Omnibar_QuerySubmitted(Omnibar sender, OmnibarQuerySubmittedE if (args.Item is not NavigationBarSuggestionItem item) return; - string commandText = { Text: string itemText } - ? itemText - : args.Text is string text - ? text - : string.Empty; - // Try invoking built-in command - if (!string.IsNullOrEmpty(commandText)) + if (item.Text is { } commandText) { var command = Commands[commandText]; if (command == Commands.None) From 9578162df774ddc250eb9b967d0d2fad5e6dff28 Mon Sep 17 00:00:00 2001 From: Yair <39923744+yaira2@users.noreply.github.com> Date: Tue, 10 Jun 2025 18:17:47 -0400 Subject: [PATCH 24/34] Simplify code --- src/Files.App/UserControls/NavigationToolbar.xaml.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/Files.App/UserControls/NavigationToolbar.xaml.cs b/src/Files.App/UserControls/NavigationToolbar.xaml.cs index de5b37ff58ef..ced1f4e544b9 100644 --- a/src/Files.App/UserControls/NavigationToolbar.xaml.cs +++ b/src/Files.App/UserControls/NavigationToolbar.xaml.cs @@ -278,14 +278,10 @@ await DialogDisplayHelper.ShowDialogAsync(Strings.CommandNotExecutable.GetLocali string.Format(Strings.CommandNotExecutableContent.GetLocalizedResource(), command.Code)); else await command.ExecuteAsync(); - - ViewModel.OmnibarCurrentSelectedMode = OmnibarPathMode; - ViewModel.OmnibarCommandPaletteModeText = string.Empty; - return; } // Try invoking Windows app action - if (ActionManager.Instance.ActionRuntime is not null && item.ActionInstance is ActionInstance actionInstance) + else if (ActionManager.Instance.ActionRuntime is not null && item.ActionInstance is ActionInstance actionInstance) { // Workaround for https://github.com/microsoft/App-Actions-On-Windows-Samples/issues/7 var action = ActionManager.Instance.ActionRuntime.ActionCatalog.GetAllActions() From adb6e793ca4eb145c5cca79768e0be226b98e294 Mon Sep 17 00:00:00 2001 From: Yair <39923744+yaira2@users.noreply.github.com> Date: Tue, 10 Jun 2025 18:26:46 -0400 Subject: [PATCH 25/34] More focus improvements --- src/Files.App/UserControls/NavigationToolbar.xaml.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Files.App/UserControls/NavigationToolbar.xaml.cs b/src/Files.App/UserControls/NavigationToolbar.xaml.cs index ced1f4e544b9..e2b093d36d22 100644 --- a/src/Files.App/UserControls/NavigationToolbar.xaml.cs +++ b/src/Files.App/UserControls/NavigationToolbar.xaml.cs @@ -260,6 +260,7 @@ private async void Omnibar_QuerySubmitted(Omnibar sender, OmnibarQuerySubmittedE if (Omnibar.CurrentSelectedMode == OmnibarPathMode) { await ViewModel.HandleItemNavigationAsync(args.Text); + (MainPageViewModel.SelectedTabItem?.TabItemContent as Control)?.Focus(FocusState.Programmatic); } else if (Omnibar.CurrentSelectedMode == OmnibarCommandPaletteMode) { @@ -294,8 +295,7 @@ await DialogDisplayHelper.ShowDialogAsync(Strings.CommandNotExecutable.GetLocali } } - ViewModel.OmnibarCurrentSelectedMode = OmnibarPathMode; - ViewModel.OmnibarCommandPaletteModeText = string.Empty; + (MainPageViewModel.SelectedTabItem?.TabItemContent as Control)?.Focus(FocusState.Programmatic); } else if (Omnibar.CurrentSelectedMode == OmnibarSearchMode) { @@ -423,7 +423,10 @@ private void Omnibar_LostFocus(object sender, RoutedEventArgs e) private void Omnibar_PreviewKeyDown(object sender, KeyRoutedEventArgs e) { if (e.Key is VirtualKey.Escape) + { Omnibar.IsFocused = false; + (MainPageViewModel.SelectedTabItem?.TabItemContent as Control)?.Focus(FocusState.Programmatic); + } } } } From 82af7110d50e6c22c18011f0b13339b230f44121 Mon Sep 17 00:00:00 2001 From: Yair <39923744+yaira2@users.noreply.github.com> Date: Wed, 11 Jun 2025 11:42:53 -0400 Subject: [PATCH 26/34] Added 'no results' to the Command Palette --- .../UserControls/NavigationToolbarViewModel.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs b/src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs index f1f9c67aae72..011eb499e3c9 100644 --- a/src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs +++ b/src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs @@ -1231,6 +1231,15 @@ public void PopulateOmnibarSuggestionsForCommandPaletteMode() { OmnibarCommandPaletteModeSuggestionItems.Add(item); } + + if (OmnibarCommandPaletteModeSuggestionItems.Count is 0) + { + OmnibarCommandPaletteModeSuggestionItems.Add(new NavigationBarSuggestionItem() + { + PrimaryDisplay = Strings.NavigationToolbarVisiblePathNoResults.GetLocalizedResource(), + SearchText = OmnibarCommandPaletteModeText, + }); + } } [Obsolete("Remove once Omnibar goes out of experimental.")] From ee54ec0b446a1814980897804d4e2ad4f2eb696d Mon Sep 17 00:00:00 2001 From: Yair <39923744+yaira2@users.noreply.github.com> Date: Wed, 11 Jun 2025 15:02:45 -0400 Subject: [PATCH 27/34] Updated the no results message --- src/Files.App/Strings/en-US/Resources.resw | 3 +++ .../ViewModels/UserControls/NavigationToolbarViewModel.cs | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Files.App/Strings/en-US/Resources.resw b/src/Files.App/Strings/en-US/Resources.resw index 7040ba60c3f2..96109bb31ab5 100644 --- a/src/Files.App/Strings/en-US/Resources.resw +++ b/src/Files.App/Strings/en-US/Resources.resw @@ -4245,5 +4245,8 @@ Show child folders + + + There are no commands containing {0} diff --git a/src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs b/src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs index 011eb499e3c9..43150cc42d12 100644 --- a/src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs +++ b/src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs @@ -1236,7 +1236,7 @@ public void PopulateOmnibarSuggestionsForCommandPaletteMode() { OmnibarCommandPaletteModeSuggestionItems.Add(new NavigationBarSuggestionItem() { - PrimaryDisplay = Strings.NavigationToolbarVisiblePathNoResults.GetLocalizedResource(), + PrimaryDisplay = string.Format(Strings.NoCommandsFound.GetLocalizedResource(), OmnibarCommandPaletteModeText), SearchText = OmnibarCommandPaletteModeText, }); } From a3786335a537cbca5daecd54e7330fe745216b44 Mon Sep 17 00:00:00 2001 From: Yair <39923744+yaira2@users.noreply.github.com> Date: Wed, 11 Jun 2025 15:32:39 -0400 Subject: [PATCH 28/34] Focus path bar when using Edit Path action --- .../UserControls/NavigationToolbarViewModel.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs b/src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs index 43150cc42d12..089c8ca0ed4a 100644 --- a/src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs +++ b/src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs @@ -9,14 +9,12 @@ using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Controls.Primitives; using Microsoft.UI.Xaml.Input; +using Microsoft.UI.Xaml.Media.Imaging; using System.IO; using System.Windows.Input; using Windows.AI.Actions; -using Windows.AI.Actions.Hosting; using Windows.ApplicationModel.DataTransfer; -using Microsoft.Windows.ApplicationModel.Resources; using Windows.UI.Text; -using Microsoft.UI.Xaml.Media.Imaging; namespace Files.App.ViewModels.UserControls { @@ -254,7 +252,7 @@ public bool IsOmnibarFocused _ = PopulateOmnibarSuggestionsForPathMode(); break; case OmnibarPaletteModeName: - PopulateOmnibarSuggestionsForCommandPaletteMode(); + PopulateOmnibarSuggestionsForCommandPaletteMode(); break; case OmnibarSearchModeName: break; @@ -816,6 +814,10 @@ public void SwitchToSearchMode() public void SwitchToPathMode() { OmnibarCurrentSelectedModeName = OmnibarPathModeName; + + var omnibar = AddressToolbar?.FindDescendant("Omnibar") as Omnibar; + omnibar?.Focus(FocusState.Programmatic); + omnibar.IsFocused = true; } public void UpdateAdditionalActions() From 2f353838d133e1333a580b83ffe619ba75d0402c Mon Sep 17 00:00:00 2001 From: Yair <39923744+yaira2@users.noreply.github.com> Date: Wed, 11 Jun 2025 15:52:15 -0400 Subject: [PATCH 29/34] Expand flyout when pressing down key --- .../BreadcrumbBar/BreadcrumbBarItem.Events.cs | 15 +++++++++++++++ .../BreadcrumbBar/BreadcrumbBarItem.cs | 2 ++ 2 files changed, 17 insertions(+) diff --git a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarItem.Events.cs b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarItem.Events.cs index b0f60ecaf587..3e067946cf4f 100644 --- a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarItem.Events.cs +++ b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarItem.Events.cs @@ -1,6 +1,9 @@ // Copyright (c) Files Community // Licensed under the MIT License. +using Microsoft.UI.Xaml.Input; +using Windows.System; + namespace Files.App.Controls { public partial class BreadcrumbBarItem @@ -15,6 +18,18 @@ private void ItemChevronButton_Click(object sender, RoutedEventArgs e) FlyoutBase.ShowAttachedFlyout(_itemChevronButton); } + private void ItemChevronButton_PreviewKeyDown(object sender, KeyRoutedEventArgs e) + { + if (e.Key == VirtualKey.Down) + FlyoutBase.ShowAttachedFlyout(_itemChevronButton); + } + + private void ItemContentButton_PreviewKeyDown(object sender, KeyRoutedEventArgs e) + { + if (e.Key == VirtualKey.Down) + FlyoutBase.ShowAttachedFlyout(_itemChevronButton); + } + private void ChevronDropDownMenuFlyout_Opening(object? sender, object e) { if (_ownerRef is null || diff --git a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarItem.cs b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarItem.cs index f68d369105db..e7ba940b0153 100644 --- a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarItem.cs +++ b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarItem.cs @@ -47,7 +47,9 @@ protected override void OnApplyTemplate() VisualStateManager.GoToState(this, "ChevronCollapsed", true); _itemContentButton.Click += ItemContentButton_Click; + _itemContentButton.PreviewKeyDown += ItemContentButton_PreviewKeyDown; _itemChevronButton.Click += ItemChevronButton_Click; + _itemChevronButton.PreviewKeyDown += ItemChevronButton_PreviewKeyDown; _itemChevronDropDownMenuFlyout.Opening += ChevronDropDownMenuFlyout_Opening; _itemChevronDropDownMenuFlyout.Opened += ChevronDropDownMenuFlyout_Opened; _itemChevronDropDownMenuFlyout.Closed += ChevronDropDownMenuFlyout_Closed; From 3dc40203c6b9719f010f0f46d8853eb641244b16 Mon Sep 17 00:00:00 2001 From: Yair <39923744+yaira2@users.noreply.github.com> Date: Wed, 11 Jun 2025 16:06:51 -0400 Subject: [PATCH 30/34] Disable search mode --- src/Files.App/UserControls/NavigationToolbar.xaml | 1 + .../ViewModels/UserControls/NavigationToolbarViewModel.cs | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Files.App/UserControls/NavigationToolbar.xaml b/src/Files.App/UserControls/NavigationToolbar.xaml index e1056c2544ed..ef9e511e009c 100644 --- a/src/Files.App/UserControls/NavigationToolbar.xaml +++ b/src/Files.App/UserControls/NavigationToolbar.xaml @@ -430,6 +430,7 @@ IconOnActive="{controls:ThemedIconMarkup Style={StaticResource App.ThemedIcons.Omnibar.Search}, IsFilled=True}" IconOnInactive="{controls:ThemedIconMarkup Style={StaticResource App.ThemedIcons.Omnibar.Search}, IconType=Outline}" IsAutoFocusEnabled="True" + IsEnabled="False" ModeName="{x:Bind Commands.Search.LabelWithHotKey, Mode=OneWay}" PlaceholderText="{helpers:ResourceString Name=OmnibarSearchModeTextPlaceholder}" /> diff --git a/src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs b/src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs index 089c8ca0ed4a..7b2db64ecf6f 100644 --- a/src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs +++ b/src/Files.App/ViewModels/UserControls/NavigationToolbarViewModel.cs @@ -792,7 +792,8 @@ public void SwitchToSearchMode() { if (EnableOmnibar) { - OmnibarCurrentSelectedModeName = OmnibarSearchModeName; + // TODO enable when implemented + // OmnibarCurrentSelectedModeName = OmnibarSearchModeName; } else { From 28dd8cdcf8b061b65191f95baa1bf31d084ca40e Mon Sep 17 00:00:00 2001 From: Yair <39923744+yaira2@users.noreply.github.com> Date: Wed, 11 Jun 2025 18:14:08 -0400 Subject: [PATCH 31/34] Added icon to edit path action --- src/Files.App/Actions/Global/EditPathAction.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Files.App/Actions/Global/EditPathAction.cs b/src/Files.App/Actions/Global/EditPathAction.cs index 1f4ce2013182..61e90f7070ca 100644 --- a/src/Files.App/Actions/Global/EditPathAction.cs +++ b/src/Files.App/Actions/Global/EditPathAction.cs @@ -20,6 +20,9 @@ public HotKey HotKey public HotKey SecondHotKey => new(Keys.D, KeyModifiers.Alt); + public RichGlyph Glyph + => new(themedIconStyle: "App.ThemedIcons.Omnibar.Path"); + public EditPathAction() { From 3cf3da9785f4aba727c45839a27d43a9d8cb0ceb Mon Sep 17 00:00:00 2001 From: Yair <39923744+yaira2@users.noreply.github.com> Date: Wed, 11 Jun 2025 18:24:06 -0400 Subject: [PATCH 32/34] Added icon to search action --- src/Files.App/Actions/Global/SearchAction.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Files.App/Actions/Global/SearchAction.cs b/src/Files.App/Actions/Global/SearchAction.cs index 77ad67222e59..6e4b63a3cdcc 100644 --- a/src/Files.App/Actions/Global/SearchAction.cs +++ b/src/Files.App/Actions/Global/SearchAction.cs @@ -20,7 +20,7 @@ public HotKey SecondHotKey => new(Keys.F3); public RichGlyph Glyph - => new(); + => new(themedIconStyle: "App.ThemedIcons.Omnibar.Search"); public bool IsExecutable => !context.IsSearchBoxVisible; From 1a5a65a02ebb763a60f71787396df26b412bba06 Mon Sep 17 00:00:00 2001 From: Yair <39923744+yaira2@users.noreply.github.com> Date: Wed, 11 Jun 2025 18:28:56 -0400 Subject: [PATCH 33/34] Added icon to settings action --- src/Files.App/Actions/Open/OpenSettingsAction.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Files.App/Actions/Open/OpenSettingsAction.cs b/src/Files.App/Actions/Open/OpenSettingsAction.cs index 80f1d03531f4..6c1712b887fb 100644 --- a/src/Files.App/Actions/Open/OpenSettingsAction.cs +++ b/src/Files.App/Actions/Open/OpenSettingsAction.cs @@ -19,6 +19,9 @@ public string Description public HotKey HotKey => new(Keys.OemComma, KeyModifiers.Ctrl); + + public RichGlyph Glyph + => new(themedIconStyle: "App.ThemedIcons.Settings"); public Task ExecuteAsync(object? parameter = null) { From c28dfa4044d2b7ce02785e7d76f1287952455751 Mon Sep 17 00:00:00 2001 From: Yair <39923744+yaira2@users.noreply.github.com> Date: Wed, 11 Jun 2025 18:37:11 -0400 Subject: [PATCH 34/34] Added icon to compress action --- .../Content/Archives/Compress/BaseCompressArchiveAction.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Files.App/Actions/Content/Archives/Compress/BaseCompressArchiveAction.cs b/src/Files.App/Actions/Content/Archives/Compress/BaseCompressArchiveAction.cs index 51cb8befbf02..8add21c1d0b0 100644 --- a/src/Files.App/Actions/Content/Archives/Compress/BaseCompressArchiveAction.cs +++ b/src/Files.App/Actions/Content/Archives/Compress/BaseCompressArchiveAction.cs @@ -12,6 +12,9 @@ internal abstract class BaseCompressArchiveAction : BaseUIAction, IAction public abstract string Description { get; } + public RichGlyph Glyph + => new(themedIconStyle: "App.ThemedIcons.Zip"); + public override bool IsExecutable => IsContextPageTypeAdaptedToCommand() && StorageArchiveService.CanCompress(context.SelectedItems) &&