// Copyright (c) Microsoft Corporation. // Licensed under the MIT license. #pragma once #include "FilteredCommand.h" #include "CommandPalette.g.h" #include "AppCommandlineArgs.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 SetTabs(Windows::Foundation::Collections::IObservableVector const& tabs, Windows::Foundation::Collections::IObservableVector const& mruTabs); void SetActionMap(const Microsoft::Terminal::Settings::Model::IActionMapView& actionMap); bool OnDirectKeyEvent(const uint32_t vkey, const uint8_t scanCode, const bool down); void SelectNextItem(const bool moveDown); void ScrollPageUp(); void ScrollPageDown(); void ScrollToTop(); void ScrollToBottom(); void EnableCommandPaletteMode(Microsoft::Terminal::Settings::Model::CommandPaletteLaunchMode const launchMode); void EnableTabSwitcherMode(const uint32_t startIdx, Microsoft::Terminal::Settings::Model::TabSwitcherMode tabSwitcherMode); void EnableTabSearchMode(); WINRT_CALLBACK(PropertyChanged, Windows::UI::Xaml::Data::PropertyChangedEventHandler); WINRT_OBSERVABLE_PROPERTY(winrt::hstring, NoMatchesText, _PropertyChangedHandlers); WINRT_OBSERVABLE_PROPERTY(winrt::hstring, SearchBoxPlaceholderText, _PropertyChangedHandlers); WINRT_OBSERVABLE_PROPERTY(winrt::hstring, PrefixCharacter, _PropertyChangedHandlers); WINRT_OBSERVABLE_PROPERTY(winrt::hstring, ControlName, _PropertyChangedHandlers); WINRT_OBSERVABLE_PROPERTY(winrt::hstring, ParentCommandName, _PropertyChangedHandlers); WINRT_OBSERVABLE_PROPERTY(winrt::hstring, ParsedCommandLineText, _PropertyChangedHandlers); TYPED_EVENT(SwitchToTabRequested, winrt::TerminalApp::CommandPalette, winrt::TerminalApp::TabBase); TYPED_EVENT(CommandLineExecutionRequested, winrt::TerminalApp::CommandPalette, winrt::hstring); TYPED_EVENT(DispatchCommandRequested, winrt::TerminalApp::CommandPalette, Microsoft::Terminal::Settings::Model::Command); TYPED_EVENT(PreviewAction, Windows::Foundation::IInspectable, Microsoft::Terminal::Settings::Model::Command); 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 }; 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 _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 _lostFocusHandler(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::RoutedEventArgs const& args); 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(); std::vector _collectFilteredActions(); void _close(); CommandPaletteMode _currentMode; void _switchToMode(CommandPaletteMode mode); std::wstring _getTrimmedInput(); void _evaluatePrefix(); Microsoft::Terminal::Settings::Model::IActionMapView _actionMap{ nullptr }; // Tab Switcher Windows::Foundation::Collections::IVector _tabActions{ nullptr }; Windows::Foundation::Collections::IVector _mruTabActions{ nullptr }; Microsoft::Terminal::Settings::Model::TabSwitcherMode _tabSwitcherMode; uint32_t _switcherStartIdx; void _bindTabs(Windows::Foundation::Collections::IObservableVector const& source, Windows::Foundation::Collections::IVector const& target); void _anchorKeyUpHandler(); winrt::Windows::UI::Xaml::Controls::ListView::SizeChanged_revoker _sizeChangedRevoker; void _dispatchCommand(winrt::TerminalApp::FilteredCommand const& command); void _dispatchCommandline(winrt::TerminalApp::FilteredCommand const& command); void _switchToTab(winrt::TerminalApp::FilteredCommand const& command); static std::optional _buildCommandLineCommand(const winrt::hstring& commandLine); void _dismissPalette(); void _scrollToIndex(uint32_t index); uint32_t _getNumVisibleItems(); static constexpr uint32_t CommandLineHistoryLength = 20; static Windows::Foundation::Collections::IVector _loadRecentCommands(); static void _updateRecentCommands(const winrt::hstring& command); ::TerminalApp::AppCommandlineArgs _appArgs; void _choosingItemContainer(Windows::UI::Xaml::Controls::ListViewBase const& sender, Windows::UI::Xaml::Controls::ChoosingItemContainerEventArgs const& args); void _containerContentChanging(Windows::UI::Xaml::Controls::ListViewBase const& sender, Windows::UI::Xaml::Controls::ContainerContentChangingEventArgs const& args); winrt::TerminalApp::PaletteItemTemplateSelector _itemTemplateSelector{ nullptr }; std::unordered_map> _listViewItemsCache; Windows::UI::Xaml::DataTemplate _listItemTemplate; friend class TerminalAppLocalTests::TabTests; }; } namespace winrt::TerminalApp::factory_implementation { BASIC_FACTORY(CommandPalette); }