// Copyright (c) Microsoft Corporation. // Licensed under the MIT license. #pragma once #include "FilteredCommand.h" #include "CommandPalette.g.h" #include "../../cascadia/inc/cppwinrt_utils.h" // fwdecl unittest classes namespace TerminalAppLocalTests { class TabTests; }; namespace winrt::TerminalApp::implementation { enum class CommandPaletteMode { ActionMode = 0, TabSearchMode, TabSwitchMode, CommandlineMode }; struct CommandPalette : CommandPaletteT { CommandPalette(); Windows::Foundation::Collections::IObservableVector FilteredActions(); void SetCommands(Windows::Foundation::Collections::IVector const& actions); void SetTabActions(Windows::Foundation::Collections::IVector const& tabs, const bool clearList); void SetKeyBindings(Microsoft::Terminal::TerminalControl::IKeyBindings bindings); void EnableCommandPaletteMode(); void SetDispatch(const winrt::TerminalApp::ShortcutActionDispatch& dispatch); bool OnDirectKeyEvent(const uint32_t vkey, const uint8_t scanCode, const bool down); void SelectNextItem(const bool moveDown); void ScrollDown(const bool pageDown); void GoEnd(const bool end); // Tab Switcher void EnableTabSwitcherMode(const bool searchMode, const uint32_t startIdx); void SetTabSwitchOrder(const Microsoft::Terminal::Settings::Model::TabSwitcherMode order); WINRT_CALLBACK(PropertyChanged, Windows::UI::Xaml::Data::PropertyChangedEventHandler); OBSERVABLE_GETSET_PROPERTY(winrt::hstring, NoMatchesText, _PropertyChangedHandlers); OBSERVABLE_GETSET_PROPERTY(winrt::hstring, SearchBoxPlaceholderText, _PropertyChangedHandlers); OBSERVABLE_GETSET_PROPERTY(winrt::hstring, PrefixCharacter, _PropertyChangedHandlers); OBSERVABLE_GETSET_PROPERTY(winrt::hstring, ControlName, _PropertyChangedHandlers); OBSERVABLE_GETSET_PROPERTY(winrt::hstring, ParentCommandName, _PropertyChangedHandlers); private: friend struct CommandPaletteT; // for Xaml to bind events Windows::Foundation::Collections::IVector _allCommands{ nullptr }; Windows::Foundation::Collections::IVector _currentNestedCommands{ nullptr }; Windows::Foundation::Collections::IObservableVector _filteredActions{ nullptr }; Windows::Foundation::Collections::IVector _nestedActionStack{ nullptr }; winrt::TerminalApp::ShortcutActionDispatch _dispatch; Windows::Foundation::Collections::IVector _commandsToFilter(); bool _lastFilterTextWasEmpty{ true }; void _filterTextChanged(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::RoutedEventArgs const& args); void _previewKeyDownHandler(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::Input::KeyRoutedEventArgs const& e); void _keyDownHandler(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::Input::KeyRoutedEventArgs const& e); void _keyUpHandler(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::Input::KeyRoutedEventArgs const& e); void _selectedCommandChanged(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::RoutedEventArgs const& args); void _updateUIForStackChange(); void _rootPointerPressed(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs const& e); void _backdropPointerPressed(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs const& e); void _listItemClicked(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::Controls::ItemClickEventArgs const& e); void _moveBackButtonClicked(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::RoutedEventArgs const&); void _updateFilteredActions(); void _populateFilteredActions(Windows::Foundation::Collections::IVector const& vectorToPopulate, Windows::Foundation::Collections::IVector const& actions); std::vector _collectFilteredActions(); static int _getWeight(const winrt::hstring& searchText, const winrt::hstring& name); void _close(); CommandPaletteMode _currentMode; void _switchToMode(CommandPaletteMode mode); std::wstring _getTrimmedInput(); void _evaluatePrefix(); Microsoft::Terminal::TerminalControl::IKeyBindings _bindings; // Tab Switcher Windows::Foundation::Collections::IVector _tabActions{ nullptr }; uint32_t _switcherStartIdx; void _anchorKeyUpHandler(); winrt::Windows::UI::Xaml::Controls::ListView::SizeChanged_revoker _sizeChangedRevoker; void _dispatchCommand(winrt::TerminalApp::FilteredCommand const& command); void _dispatchCommandline(); void _dismissPalette(); friend class TerminalAppLocalTests::TabTests; }; } namespace winrt::TerminalApp::factory_implementation { BASIC_FACTORY(CommandPalette); }