diff --git a/src/modules/cmdpal/Core/Microsoft.CmdPal.Core.ViewModels/Messages/DismissMessage.cs b/src/modules/cmdpal/Core/Microsoft.CmdPal.Core.ViewModels/Messages/DismissMessage.cs index 98a5b34562..8150ee6584 100644 --- a/src/modules/cmdpal/Core/Microsoft.CmdPal.Core.ViewModels/Messages/DismissMessage.cs +++ b/src/modules/cmdpal/Core/Microsoft.CmdPal.Core.ViewModels/Messages/DismissMessage.cs @@ -4,6 +4,4 @@ namespace Microsoft.CmdPal.Core.ViewModels.Messages; -public record DismissMessage() -{ -} +public record DismissMessage(bool ForceGoHome = false); diff --git a/src/modules/cmdpal/Core/Microsoft.CmdPal.Core.ViewModels/Messages/NavigateBackMessage.cs b/src/modules/cmdpal/Core/Microsoft.CmdPal.Core.ViewModels/Messages/NavigateBackMessage.cs index 3e085184ed..e6152b75d5 100644 --- a/src/modules/cmdpal/Core/Microsoft.CmdPal.Core.ViewModels/Messages/NavigateBackMessage.cs +++ b/src/modules/cmdpal/Core/Microsoft.CmdPal.Core.ViewModels/Messages/NavigateBackMessage.cs @@ -4,6 +4,4 @@ namespace Microsoft.CmdPal.Core.ViewModels.Messages; -public record NavigateBackMessage(bool FromBackspace = false) -{ -} +public record NavigateBackMessage(bool FromBackspace = false); diff --git a/src/modules/cmdpal/Core/Microsoft.CmdPal.Core.ViewModels/ShellViewModel.cs b/src/modules/cmdpal/Core/Microsoft.CmdPal.Core.ViewModels/ShellViewModel.cs index 046d7ea336..2abbd83d3e 100644 --- a/src/modules/cmdpal/Core/Microsoft.CmdPal.Core.ViewModels/ShellViewModel.cs +++ b/src/modules/cmdpal/Core/Microsoft.CmdPal.Core.ViewModels/ShellViewModel.cs @@ -378,7 +378,7 @@ public partial class ShellViewModel : ObservableObject, { // Reset the palette to the main page and dismiss GoHome(withAnimation: false, focusSearch: false); - WeakReferenceMessenger.Default.Send(); + WeakReferenceMessenger.Default.Send(new DismissMessage()); break; } @@ -398,7 +398,7 @@ public partial class ShellViewModel : ObservableObject, case CommandResultKind.Hide: { // Keep this page open, but hide the palette. - WeakReferenceMessenger.Default.Send(); + WeakReferenceMessenger.Default.Send(new DismissMessage()); break; } diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/SettingsModel.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/SettingsModel.cs index aee23ef0ca..dae50b3f3e 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/SettingsModel.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/SettingsModel.cs @@ -60,6 +60,8 @@ public partial class SettingsModel : ObservableObject public TimeSpan AutoGoHomeInterval { get; set; } = Timeout.InfiniteTimeSpan; + public EscapeKeyBehavior EscapeKeyBehaviorSetting { get; set; } = EscapeKeyBehavior.ClearSearchFirstThenGoBack; + // END SETTINGS /////////////////////////////////////////////////////////////////////////// @@ -282,3 +284,11 @@ public enum MonitorBehavior InPlace = 3, ToLast = 4, } + +public enum EscapeKeyBehavior +{ + ClearSearchFirstThenGoBack = 0, + AlwaysGoBack = 1, + AlwaysDismiss = 2, + AlwaysHide = 3, +} diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/SettingsViewModel.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/SettingsViewModel.cs index 4d44db7d8a..586670bff7 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/SettingsViewModel.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/SettingsViewModel.cs @@ -160,6 +160,16 @@ public partial class SettingsViewModel : INotifyPropertyChanged } } + public int EscapeKeyBehaviorIndex + { + get => (int)_settings.EscapeKeyBehaviorSetting; + set + { + _settings.EscapeKeyBehaviorSetting = (EscapeKeyBehavior)value; + Save(); + } + } + public ObservableCollection CommandProviders { get; } = []; public SettingsExtensionsViewModel Extensions { get; } diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/SearchBar.xaml.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/SearchBar.xaml.cs index f5bac4a286..169b34a8b0 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/SearchBar.xaml.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/SearchBar.xaml.cs @@ -7,8 +7,10 @@ using CommunityToolkit.WinUI; using Microsoft.CmdPal.Core.ViewModels; using Microsoft.CmdPal.Core.ViewModels.Commands; using Microsoft.CmdPal.Core.ViewModels.Messages; -using Microsoft.CmdPal.UI.Messages; +using Microsoft.CmdPal.Ext.ClipboardHistory.Messages; +using Microsoft.CmdPal.UI.ViewModels; using Microsoft.CmdPal.UI.Views; +using Microsoft.Extensions.DependencyInjection; using Microsoft.UI.Dispatching; using Microsoft.UI.Input; using Microsoft.UI.Xaml; @@ -49,6 +51,8 @@ public sealed partial class SearchBar : UserControl, // 0.6+ suggestions private string? _textToSuggest; + private SettingsModel Settings => App.Current.Services.GetRequiredService(); + public PageViewModel? CurrentPageViewModel { get => (PageViewModel?)GetValue(CurrentPageViewModelProperty); @@ -131,20 +135,39 @@ public sealed partial class SearchBar : UserControl, } else if (e.Key == VirtualKey.Escape) { - if (string.IsNullOrEmpty(FilterBox.Text)) + switch (Settings.EscapeKeyBehaviorSetting) { - WeakReferenceMessenger.Default.Send(new()); - } - else - { - // Clear the search box - FilterBox.Text = string.Empty; + case EscapeKeyBehavior.AlwaysGoBack: + WeakReferenceMessenger.Default.Send(new()); + break; - // hack TODO GH #245 - if (CurrentPageViewModel is not null) - { - CurrentPageViewModel.SearchTextBox = FilterBox.Text; - } + case EscapeKeyBehavior.AlwaysDismiss: + WeakReferenceMessenger.Default.Send(new(ForceGoHome: true)); + break; + + case EscapeKeyBehavior.AlwaysHide: + WeakReferenceMessenger.Default.Send(new()); + break; + + case EscapeKeyBehavior.ClearSearchFirstThenGoBack: + default: + if (string.IsNullOrEmpty(FilterBox.Text)) + { + WeakReferenceMessenger.Default.Send(new()); + } + else + { + // Clear the search box + FilterBox.Text = string.Empty; + + // hack TODO GH #245 + if (CurrentPageViewModel is not null) + { + CurrentPageViewModel.SearchTextBox = FilterBox.Text; + } + } + + break; } e.Handled = true; diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/MainWindow.xaml.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI/MainWindow.xaml.cs index 2936f8447e..1655626714 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/MainWindow.xaml.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/MainWindow.xaml.cs @@ -530,6 +530,11 @@ public sealed partial class MainWindow : WindowEx, public void Receive(DismissMessage message) { + if (message.ForceGoHome) + { + WeakReferenceMessenger.Default.Send(new GoHomeMessage(false, false)); + } + // This might come in off the UI thread. Make sure to hop back. DispatcherQueue.TryEnqueue(() => { diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Pages/ShellPage.xaml.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI/Pages/ShellPage.xaml.cs index dc12cf142b..7e8dc9eebd 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Pages/ShellPage.xaml.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Pages/ShellPage.xaml.cs @@ -133,7 +133,7 @@ public sealed partial class ShellPage : Microsoft.UI.Xaml.Controls.Page, if (!message.FromBackspace) { // If we can't go back then we must be at the top and thus escape again should quit. - WeakReferenceMessenger.Default.Send(); + WeakReferenceMessenger.Default.Send(new DismissMessage()); PowerToysTelemetry.Log.WriteEvent(new CmdPalDismissedOnEsc()); } diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Settings/GeneralPage.xaml b/src/modules/cmdpal/Microsoft.CmdPal.UI/Settings/GeneralPage.xaml index 5f3ea2a55e..eb0264a683 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Settings/GeneralPage.xaml +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Settings/GeneralPage.xaml @@ -89,6 +89,15 @@ + + + + + + + + + diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Strings/en-us/Resources.resw b/src/modules/cmdpal/Microsoft.CmdPal.UI/Strings/en-us/Resources.resw index ef4458d803..6ed0a3bfaa 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Strings/en-us/Resources.resw +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Strings/en-us/Resources.resw @@ -556,4 +556,22 @@ Right-click to remove the key combination, thereby deactivating the shortcut. Extensions + + Clear search first, then go back + + + Go back + + + Hide window and go home + + + Hide window + + + Escape key behavior + + + Choose how Escape key behaves + \ No newline at end of file