From f072eaf9d895c7d54f124e0540ca5f14361d68e1 Mon Sep 17 00:00:00 2001 From: Don-Vito Date: Thu, 3 Dec 2020 18:15:31 +0200 Subject: [PATCH] Add launchMode parameter to ToggleCommandPalette action (#8382) ## PR Checklist * [x] Closes https://github.com/microsoft/terminal/issues/8322 * [x] CLA signed. * [x] Tests added/passed * [x] Documentation updated - https://github.com/MicrosoftDocs/terminal/pull/202 * [x] Schema updated. * [x] I've discussed this with core contributors already. ## Detailed Description of the Pull Request / Additional comments Added an optional launchMode parameter to "commandPalette" command. The values of the launchMode are either "action" (default) or "command line". ## Validation Steps Performed * Manual tests --- doc/cascadia/profiles.schema.json | 23 ++++++++ .../KeyBindingsTests.cpp | 54 +++++++++++++++++++ .../TerminalApp/AppActionHandlers.cpp | 15 +++--- src/cascadia/TerminalApp/CommandPalette.cpp | 8 ++- src/cascadia/TerminalApp/CommandPalette.h | 2 +- src/cascadia/TerminalApp/CommandPalette.idl | 2 +- .../TerminalSettingsModel/ActionAndArgs.cpp | 3 +- .../TerminalSettingsModel/ActionArgs.cpp | 10 ++++ .../TerminalSettingsModel/ActionArgs.h | 37 +++++++++++++ .../TerminalSettingsModel/ActionArgs.idl | 11 ++++ .../Resources/en-US/Resources.resw | 3 ++ .../TerminalSettingsSerializationHelpers.h | 8 +++ 12 files changed, 164 insertions(+), 12 deletions(-) diff --git a/doc/cascadia/profiles.schema.json b/doc/cascadia/profiles.schema.json index 7a7e8bcf0..defc44df1 100644 --- a/doc/cascadia/profiles.schema.json +++ b/doc/cascadia/profiles.schema.json @@ -167,6 +167,13 @@ ], "type": "string" }, + "CommandPaletteLaunchMode": { + "enum": [ + "action", + "commandLine" + ], + "type": "string" + }, "NewTerminalArgs": { "properties": { "commandline": { @@ -522,6 +529,22 @@ ], "required": [ "direction" ] }, + "CommandPaletteAction": { + "description": "Arguments for a commandPalette action", + "allOf": [ + { "$ref": "#/definitions/ShortcutAction" }, + { + "properties": { + "action": { "type": "string", "pattern": "commandPalette" }, + "launchMode": { + "$ref": "#/definitions/CommandPaletteLaunchMode", + "default": "action", + "description": "Toggle command palette in either action or command line mode. If no value is provided, the palette will launch in action mode." + } + } + } + ] + }, "Keybinding": { "additionalProperties": false, "properties": { diff --git a/src/cascadia/LocalTests_SettingsModel/KeyBindingsTests.cpp b/src/cascadia/LocalTests_SettingsModel/KeyBindingsTests.cpp index 789a58c16..04c2084bc 100644 --- a/src/cascadia/LocalTests_SettingsModel/KeyBindingsTests.cpp +++ b/src/cascadia/LocalTests_SettingsModel/KeyBindingsTests.cpp @@ -48,6 +48,7 @@ namespace SettingsModelLocalTests TEST_METHOD(TestScrollArgs); + TEST_METHOD(TestToggleCommandPaletteArgs); TEST_METHOD(TestMoveTabArgs); TEST_CLASS_SETUP(ClassSetup) @@ -580,4 +581,57 @@ namespace SettingsModelLocalTests VERIFY_THROWS(invalidKeyMap->LayerJson(bindingsInvalidJson);, std::exception); } } + + void KeyBindingsTests::TestToggleCommandPaletteArgs() + { + const std::string bindings0String{ R"([ + { "keys": ["up"], "command": "commandPalette" }, + { "keys": ["ctrl+up"], "command": { "action": "commandPalette", "launchMode" : "action" } }, + { "keys": ["ctrl+shift+up"], "command": { "action": "commandPalette", "launchMode" : "commandLine" } } + ])" }; + + const auto bindings0Json = VerifyParseSucceeded(bindings0String); + + auto keymap = winrt::make_self(); + VERIFY_IS_NOT_NULL(keymap); + VERIFY_ARE_EQUAL(0u, keymap->_keyShortcuts.size()); + keymap->LayerJson(bindings0Json); + VERIFY_ARE_EQUAL(3u, keymap->_keyShortcuts.size()); + + { + KeyChord kc{ false, false, false, static_cast(VK_UP) }; + auto actionAndArgs = ::TestUtils::GetActionAndArgs(*keymap, kc); + VERIFY_ARE_EQUAL(ShortcutAction::ToggleCommandPalette, actionAndArgs.Action()); + const auto& realArgs = actionAndArgs.Args().try_as(); + VERIFY_IS_NOT_NULL(realArgs); + // Verify the args have the expected value + VERIFY_ARE_EQUAL(realArgs.LaunchMode(), CommandPaletteLaunchMode::Action); + } + { + KeyChord kc{ true, false, false, static_cast(VK_UP) }; + auto actionAndArgs = ::TestUtils::GetActionAndArgs(*keymap, kc); + VERIFY_ARE_EQUAL(ShortcutAction::ToggleCommandPalette, actionAndArgs.Action()); + const auto& realArgs = actionAndArgs.Args().try_as(); + VERIFY_IS_NOT_NULL(realArgs); + // Verify the args have the expected value + VERIFY_ARE_EQUAL(realArgs.LaunchMode(), CommandPaletteLaunchMode::Action); + } + { + KeyChord kc{ true, false, true, static_cast(VK_UP) }; + auto actionAndArgs = ::TestUtils::GetActionAndArgs(*keymap, kc); + VERIFY_ARE_EQUAL(ShortcutAction::ToggleCommandPalette, actionAndArgs.Action()); + const auto& realArgs = actionAndArgs.Args().try_as(); + VERIFY_IS_NOT_NULL(realArgs); + // Verify the args have the expected value + VERIFY_ARE_EQUAL(realArgs.LaunchMode(), CommandPaletteLaunchMode::CommandLine); + } + { + const std::string bindingsInvalidString{ R"([{ "keys": ["up"], "command": { "action": "commandPalette", "launchMode": "bad" } }])" }; + const auto bindingsInvalidJson = VerifyParseSucceeded(bindingsInvalidString); + auto invalidKeyMap = winrt::make_self(); + VERIFY_IS_NOT_NULL(invalidKeyMap); + VERIFY_ARE_EQUAL(0u, invalidKeyMap->_keyShortcuts.size()); + VERIFY_THROWS(invalidKeyMap->LayerJson(bindingsInvalidJson);, std::exception); + } + } } diff --git a/src/cascadia/TerminalApp/AppActionHandlers.cpp b/src/cascadia/TerminalApp/AppActionHandlers.cpp index 3f11d8d5b..df8a55009 100644 --- a/src/cascadia/TerminalApp/AppActionHandlers.cpp +++ b/src/cascadia/TerminalApp/AppActionHandlers.cpp @@ -313,13 +313,14 @@ namespace winrt::TerminalApp::implementation void TerminalPage::_HandleToggleCommandPalette(const IInspectable& /*sender*/, const ActionEventArgs& args) { - // TODO GH#6677: When we add support for commandline mode, first set the - // mode that the command palette should be in, before making it visible. - CommandPalette().EnableCommandPaletteMode(); - CommandPalette().Visibility(CommandPalette().Visibility() == Visibility::Visible ? - Visibility::Collapsed : - Visibility::Visible); - args.Handled(true); + if (const auto& realArgs = args.ActionArgs().try_as()) + { + CommandPalette().EnableCommandPaletteMode(realArgs.LaunchMode()); + CommandPalette().Visibility(CommandPalette().Visibility() == Visibility::Visible ? + Visibility::Collapsed : + Visibility::Visible); + args.Handled(true); + } } void TerminalPage::_HandleSetColorScheme(const IInspectable& /*sender*/, diff --git a/src/cascadia/TerminalApp/CommandPalette.cpp b/src/cascadia/TerminalApp/CommandPalette.cpp index 2dffa6c42..90c1f7f95 100644 --- a/src/cascadia/TerminalApp/CommandPalette.cpp +++ b/src/cascadia/TerminalApp/CommandPalette.cpp @@ -809,9 +809,13 @@ namespace winrt::TerminalApp::implementation } } - void CommandPalette::EnableCommandPaletteMode() + void CommandPalette::EnableCommandPaletteMode(CommandPaletteLaunchMode const launchMode) { - _switchToMode(CommandPaletteMode::ActionMode); + const auto mode = (launchMode == CommandPaletteLaunchMode::CommandLine) ? + CommandPaletteMode::CommandlineMode : + CommandPaletteMode::ActionMode; + + _switchToMode(mode); _updateFilteredActions(); } diff --git a/src/cascadia/TerminalApp/CommandPalette.h b/src/cascadia/TerminalApp/CommandPalette.h index 364443cb5..21c001293 100644 --- a/src/cascadia/TerminalApp/CommandPalette.h +++ b/src/cascadia/TerminalApp/CommandPalette.h @@ -33,7 +33,7 @@ namespace winrt::TerminalApp::implementation void SetTabActions(Windows::Foundation::Collections::IVector const& tabs, const bool clearList); void SetKeyBindings(Microsoft::Terminal::TerminalControl::IKeyBindings bindings); - void EnableCommandPaletteMode(); + void EnableCommandPaletteMode(Microsoft::Terminal::Settings::Model::CommandPaletteLaunchMode const launchMode); void SetDispatch(const winrt::TerminalApp::ShortcutActionDispatch& dispatch); diff --git a/src/cascadia/TerminalApp/CommandPalette.idl b/src/cascadia/TerminalApp/CommandPalette.idl index 02ad748a8..e75209e76 100644 --- a/src/cascadia/TerminalApp/CommandPalette.idl +++ b/src/cascadia/TerminalApp/CommandPalette.idl @@ -23,7 +23,7 @@ namespace TerminalApp void SetCommands(Windows.Foundation.Collections.IVector actions); void SetTabActions(Windows.Foundation.Collections.IVector tabs, Boolean clearList); void SetKeyBindings(Microsoft.Terminal.TerminalControl.IKeyBindings bindings); - void EnableCommandPaletteMode(); + void EnableCommandPaletteMode(Microsoft.Terminal.Settings.Model.CommandPaletteLaunchMode launchMode); void SelectNextItem(Boolean moveDown); diff --git a/src/cascadia/TerminalSettingsModel/ActionAndArgs.cpp b/src/cascadia/TerminalSettingsModel/ActionAndArgs.cpp index 6295115a3..97341ba58 100644 --- a/src/cascadia/TerminalSettingsModel/ActionAndArgs.cpp +++ b/src/cascadia/TerminalSettingsModel/ActionAndArgs.cpp @@ -136,6 +136,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation { ShortcutAction::ScrollUp, ScrollUpArgs::FromJson }, { ShortcutAction::ScrollDown, ScrollDownArgs::FromJson }, { ShortcutAction::MoveTab, MoveTabArgs::FromJson }, + { ShortcutAction::ToggleCommandPalette, ToggleCommandPaletteArgs::FromJson }, { ShortcutAction::Invalid, nullptr }, }; @@ -296,7 +297,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation { ShortcutAction::SwitchToTab, RS_(L"SwitchToTabCommandKey") }, { ShortcutAction::TabSearch, RS_(L"TabSearchCommandKey") }, { ShortcutAction::ToggleAlwaysOnTop, RS_(L"ToggleAlwaysOnTopCommandKey") }, - { ShortcutAction::ToggleCommandPalette, RS_(L"ToggleCommandPaletteCommandKey") }, + { ShortcutAction::ToggleCommandPalette, L"" }, { ShortcutAction::ToggleFocusMode, RS_(L"ToggleFocusModeCommandKey") }, { ShortcutAction::ToggleFullscreen, RS_(L"ToggleFullscreenCommandKey") }, { ShortcutAction::TogglePaneZoom, RS_(L"TogglePaneZoomCommandKey") }, diff --git a/src/cascadia/TerminalSettingsModel/ActionArgs.cpp b/src/cascadia/TerminalSettingsModel/ActionArgs.cpp index 145ad3b28..611e65793 100644 --- a/src/cascadia/TerminalSettingsModel/ActionArgs.cpp +++ b/src/cascadia/TerminalSettingsModel/ActionArgs.cpp @@ -23,6 +23,7 @@ #include "CloseOtherTabsArgs.g.cpp" #include "CloseTabsAfterArgs.g.cpp" #include "MoveTabArgs.g.cpp" +#include "ToggleCommandPaletteArgs.g.cpp" #include @@ -412,4 +413,13 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation directionString) }; } + + winrt::hstring ToggleCommandPaletteArgs::GenerateName() const + { + if (_LaunchMode == CommandPaletteLaunchMode::CommandLine) + { + return RS_(L"ToggleCommandPaletteCommandLineModeCommandKey"); + } + return RS_(L"ToggleCommandPaletteCommandKey"); + } } diff --git a/src/cascadia/TerminalSettingsModel/ActionArgs.h b/src/cascadia/TerminalSettingsModel/ActionArgs.h index 223219dd7..dbe385059 100644 --- a/src/cascadia/TerminalSettingsModel/ActionArgs.h +++ b/src/cascadia/TerminalSettingsModel/ActionArgs.h @@ -25,6 +25,7 @@ #include "ScrollUpArgs.g.h" #include "ScrollDownArgs.g.h" #include "MoveTabArgs.g.h" +#include "ToggleCommandPaletteArgs.g.h" #include "../../cascadia/inc/cppwinrt_utils.h" #include "JsonUtils.h" @@ -786,6 +787,42 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation return *copy; } }; + + struct ToggleCommandPaletteArgs : public ToggleCommandPaletteArgsT + { + ToggleCommandPaletteArgs() = default; + + // To preserve backward compatibility the default is Action. + GETSET_PROPERTY(CommandPaletteLaunchMode, LaunchMode, CommandPaletteLaunchMode::Action); + + static constexpr std::string_view LaunchModeKey{ "launchMode" }; + + public: + hstring GenerateName() const; + + bool Equals(const IActionArgs& other) + { + auto otherAsUs = other.try_as(); + if (otherAsUs) + { + return otherAsUs->_LaunchMode == _LaunchMode; + } + return false; + }; + static FromJsonResult FromJson(const Json::Value& json) + { + // LOAD BEARING: Not using make_self here _will_ break you in the future! + auto args = winrt::make_self(); + JsonUtils::GetValueForKey(json, LaunchModeKey, args->_LaunchMode); + return { *args, {} }; + } + IActionArgs Copy() const + { + auto copy{ winrt::make_self() }; + copy->_LaunchMode = _LaunchMode; + return *copy; + } + }; } namespace winrt::Microsoft::Terminal::Settings::Model::factory_implementation diff --git a/src/cascadia/TerminalSettingsModel/ActionArgs.idl b/src/cascadia/TerminalSettingsModel/ActionArgs.idl index cf987003f..9bb545ece 100644 --- a/src/cascadia/TerminalSettingsModel/ActionArgs.idl +++ b/src/cascadia/TerminalSettingsModel/ActionArgs.idl @@ -53,6 +53,12 @@ namespace Microsoft.Terminal.Settings.Model Backward }; + enum CommandPaletteLaunchMode + { + Action = 0, + CommandLine + }; + [default_interface] runtimeclass NewTerminalArgs { NewTerminalArgs(); NewTerminalArgs(Int32 profileIndex); @@ -179,4 +185,9 @@ namespace Microsoft.Terminal.Settings.Model { Windows.Foundation.IReference RowsToScroll { get; }; }; + + [default_interface] runtimeclass ToggleCommandPaletteArgs : IActionArgs + { + CommandPaletteLaunchMode LaunchMode { get; }; + }; } diff --git a/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw b/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw index 1b2aa5d1f..414eb1b17 100644 --- a/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw +++ b/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw @@ -332,6 +332,9 @@ Toggle command palette + + Toggle command palette in command line mode + Toggle focus mode "Focus mode" is a mode with minimal UI elements, for a distraction-free experience diff --git a/src/cascadia/TerminalSettingsModel/TerminalSettingsSerializationHelpers.h b/src/cascadia/TerminalSettingsModel/TerminalSettingsSerializationHelpers.h index 2b564e5de..a53dabd66 100644 --- a/src/cascadia/TerminalSettingsModel/TerminalSettingsSerializationHelpers.h +++ b/src/cascadia/TerminalSettingsModel/TerminalSettingsSerializationHelpers.h @@ -406,3 +406,11 @@ JSON_ENUM_MAPPER(::winrt::Microsoft::Terminal::Settings::Model::MoveTabDirection pair_type{ "backward", ValueType::Backward }, }; }; + +JSON_ENUM_MAPPER(::winrt::Microsoft::Terminal::Settings::Model::CommandPaletteLaunchMode) +{ + JSON_MAPPINGS(2) = { + pair_type{ "action", ValueType::Action }, + pair_type{ "commandLine", ValueType::CommandLine }, + }; +};