From d37fb80d196636be6039b17cdaf2a3f8c0cbec7d Mon Sep 17 00:00:00 2001 From: Pankaj Bhojwani Date: Tue, 3 Feb 2026 16:02:21 -0800 Subject: [PATCH] add search for actions box --- .../TerminalSettingsEditor/EditAction.cpp | 79 +++++++++++++++++++ .../TerminalSettingsEditor/EditAction.h | 7 ++ .../TerminalSettingsEditor/EditAction.xaml | 15 ++-- 3 files changed, 95 insertions(+), 6 deletions(-) diff --git a/src/cascadia/TerminalSettingsEditor/EditAction.cpp b/src/cascadia/TerminalSettingsEditor/EditAction.cpp index 9542d39db1..3d5578a24f 100644 --- a/src/cascadia/TerminalSettingsEditor/EditAction.cpp +++ b/src/cascadia/TerminalSettingsEditor/EditAction.cpp @@ -8,7 +8,9 @@ #include "../TerminalSettingsModel/AllShortcutActions.h" using namespace winrt::Windows::UI::Xaml; +using namespace winrt::Windows::UI::Xaml::Controls; using namespace winrt::Windows::UI::Xaml::Navigation; +using namespace winrt::Windows::Foundation::Collections; namespace winrt::Microsoft::Terminal::Settings::Editor::implementation { @@ -49,5 +51,82 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation CommandNameTextBox().Focus(FocusState::Programmatic); }); + + // Initialize AutoSuggestBox with current action and store last valid action + if (_ViewModel.ProposedShortcutActionName()) + { + const auto currentAction = winrt::unbox_value(_ViewModel.ProposedShortcutActionName()); + ShortcutActionBox().Text(currentAction); + _lastValidAction = currentAction; + } + } + + void EditAction::ShortcutActionBox_GotFocus(const IInspectable& sender, const RoutedEventArgs&) + { + // Open the suggestions list with all available actions + std::vector allActions; + for (const auto& action : _ViewModel.AvailableShortcutActions()) + { + allActions.push_back(action); + } + + _filteredActions = winrt::single_threaded_observable_vector(std::move(allActions)); + sender.as().ItemsSource(_filteredActions); + sender.as().IsSuggestionListOpen(true); + } + + void EditAction::ShortcutActionBox_TextChanged(const AutoSuggestBox& sender, const AutoSuggestBoxTextChangedEventArgs& args) + { + if (args.Reason() == AutoSuggestionBoxTextChangeReason::UserInput) + { + const auto searchText = sender.Text(); + std::vector filtered; + + for (const auto& action : _ViewModel.AvailableShortcutActions()) + { + if (til::contains_linguistic_insensitive(action, searchText)) + { + filtered.push_back(action); + } + } + + _filteredActions = winrt::single_threaded_observable_vector(std::move(filtered)); + sender.ItemsSource(_filteredActions); + } + } + + void EditAction::ShortcutActionBox_SuggestionChosen(const AutoSuggestBox& sender, const AutoSuggestBoxSuggestionChosenEventArgs& args) + { + if (const auto selectedAction = args.SelectedItem().try_as()) + { + sender.Text(*selectedAction); + } + } + + void EditAction::ShortcutActionBox_QuerySubmitted(const AutoSuggestBox& sender, const AutoSuggestBoxQuerySubmittedEventArgs& args) + { + const auto submittedText = args.QueryText(); + + // Validate that this is a valid shortcut action + bool isValid = false; + for (const auto& action : _ViewModel.AvailableShortcutActions()) + { + if (action == submittedText) + { + isValid = true; + break; + } + } + + if (isValid) + { + _ViewModel.ProposedShortcutActionName(winrt::box_value(submittedText)); + _lastValidAction = submittedText; + } + else + { + // Revert to the last valid action + sender.Text(_lastValidAction); + } } } diff --git a/src/cascadia/TerminalSettingsEditor/EditAction.h b/src/cascadia/TerminalSettingsEditor/EditAction.h index 767d36c5ad..fb07b6c5ec 100644 --- a/src/cascadia/TerminalSettingsEditor/EditAction.h +++ b/src/cascadia/TerminalSettingsEditor/EditAction.h @@ -20,11 +20,18 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation WINRT_OBSERVABLE_PROPERTY(Editor::CommandViewModel, ViewModel, PropertyChanged.raise, nullptr); + void ShortcutActionBox_GotFocus(const winrt::Windows::Foundation::IInspectable& sender, const winrt::Windows::UI::Xaml::RoutedEventArgs& args); + void ShortcutActionBox_TextChanged(const winrt::Windows::UI::Xaml::Controls::AutoSuggestBox& sender, const winrt::Windows::UI::Xaml::Controls::AutoSuggestBoxTextChangedEventArgs& args); + void ShortcutActionBox_SuggestionChosen(const winrt::Windows::UI::Xaml::Controls::AutoSuggestBox& sender, const winrt::Windows::UI::Xaml::Controls::AutoSuggestBoxSuggestionChosenEventArgs& args); + void ShortcutActionBox_QuerySubmitted(const winrt::Windows::UI::Xaml::Controls::AutoSuggestBox& sender, const winrt::Windows::UI::Xaml::Controls::AutoSuggestBoxQuerySubmittedEventArgs& args); + private: friend struct EditActionT; // for Xaml to bind events winrt::Windows::UI::Xaml::FrameworkElement::LayoutUpdated_revoker _layoutUpdatedRevoker; Editor::CommandViewModel::PropagateWindowRootRequested_revoker _propagateWindowRootRevoker; Editor::CommandViewModel::FocusContainer_revoker _focusContainerRevoker; + winrt::Windows::Foundation::Collections::IObservableVector _filteredActions{ nullptr }; + winrt::hstring _lastValidAction; }; } diff --git a/src/cascadia/TerminalSettingsEditor/EditAction.xaml b/src/cascadia/TerminalSettingsEditor/EditAction.xaml index caa1c9d8cc..f765630997 100644 --- a/src/cascadia/TerminalSettingsEditor/EditAction.xaml +++ b/src/cascadia/TerminalSettingsEditor/EditAction.xaml @@ -678,12 +678,15 @@ Grid.Row="1" Grid.Column="0" VerticalAlignment="Center" /> - +