From 11bd5beb7ecaef69dc454bb7aaaaf9f5b2e54275 Mon Sep 17 00:00:00 2001 From: Pankaj Bhojwani Date: Thu, 19 Sep 2024 19:40:39 -0700 Subject: [PATCH] add keychord --- .../ActionsViewModel.cpp | 26 +++++++++++++++++-- .../TerminalSettingsEditor/ActionsViewModel.h | 4 +++ .../ActionsViewModel.idl | 4 +++ .../TerminalSettingsEditor/EditAction.xaml | 10 +++++-- .../Resources/en-US/Resources.resw | 6 ++++- .../TerminalSettingsModel/ActionMap.cpp | 6 +++++ .../TerminalSettingsModel/ActionMap.h | 1 + .../TerminalSettingsModel/ActionMap.idl | 1 + 8 files changed, 53 insertions(+), 5 deletions(-) diff --git a/src/cascadia/TerminalSettingsEditor/ActionsViewModel.cpp b/src/cascadia/TerminalSettingsEditor/ActionsViewModel.cpp index b594b3d7d3..29a0485cf8 100644 --- a/src/cascadia/TerminalSettingsEditor/ActionsViewModel.cpp +++ b/src/cascadia/TerminalSettingsEditor/ActionsViewModel.cpp @@ -160,15 +160,27 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation DeleteRequested.raise(*this, *this); } + void CommandViewModel::AddKeybinding_Click() + { + auto kbdVM{ make_self(nullptr) }; + kbdVM->IsInEditMode(true); + _RegisterEvents(*kbdVM); + KeyChordViewModelList().Append(*kbdVM); + } + void CommandViewModel::_RegisterEvents(Editor::KeyChordViewModel kcVM) { if (const auto actionsPageVM{ _actionsPageVM.get() }) { + const auto id = ID(); + kcVM.AddKeyChordRequested([actionsPageVM, id](const Editor::KeyChordViewModel& /*sender*/, const Control::KeyChord& args) { + actionsPageVM.AttemptAddKeyChord(args, id); + }); kcVM.ModifyKeyChordRequested([actionsPageVM](const Editor::KeyChordViewModel& sender, const Editor::ModifyKeyChordEventArgs& args) { actionsPageVM.AttemptModifyKeyChord(sender, args); }); kcVM.DeleteKeyChordRequested([actionsPageVM](const Editor::KeyChordViewModel& /*sender*/, const Control::KeyChord& args) { - // todo: remove the sender from our list + // todo: remove the sender from our list, remove flyout actionsPageVM.AttemptDeleteKeyChord(args); }); } @@ -204,7 +216,11 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation void KeyChordViewModel::AttemptAcceptChanges() { - if (_currentKeys.Modifiers() != _ProposedKeys.Modifiers() || _currentKeys.Vkey() != _ProposedKeys.Vkey()) + if (!_currentKeys) + { + AddKeyChordRequested.raise(*this, _ProposedKeys); + } + else if (_currentKeys.Modifiers() != _ProposedKeys.Modifiers() || _currentKeys.Vkey() != _ProposedKeys.Vkey()) { const auto args{ make_self(_currentKeys, // OldKeys _ProposedKeys) }; // NewKeys @@ -436,6 +452,12 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation _Settings.ActionMap().DeleteKeyBinding(keys); } + void ActionsViewModel::AttemptAddKeyChord(const Control::KeyChord& keys, const winrt::hstring& cmdID) + { + // Update the settings model + _Settings.ActionMap().AddKeyBinding(keys, cmdID); + } + void ActionsViewModel::_KeyBindingViewModelPropertyChangedHandler(const IInspectable& sender, const Windows::UI::Xaml::Data::PropertyChangedEventArgs& args) { const auto senderVM{ sender.as() }; diff --git a/src/cascadia/TerminalSettingsEditor/ActionsViewModel.h b/src/cascadia/TerminalSettingsEditor/ActionsViewModel.h index 5056e782b2..2c42ecdffe 100644 --- a/src/cascadia/TerminalSettingsEditor/ActionsViewModel.h +++ b/src/cascadia/TerminalSettingsEditor/ActionsViewModel.h @@ -143,6 +143,8 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation void Delete_Click(); til::typed_event DeleteRequested; + void AddKeybinding_Click(); + VIEW_MODEL_OBSERVABLE_PROPERTY(IInspectable, ProposedAction); VIEW_MODEL_OBSERVABLE_PROPERTY(hstring, CurrentAction); WINRT_PROPERTY(Windows::Foundation::Collections::IObservableVector, AvailableActions, nullptr); @@ -173,6 +175,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation VIEW_MODEL_OBSERVABLE_PROPERTY(Windows::UI::Xaml::Controls::Flyout, AcceptChangesFlyout, nullptr); public: + til::typed_event AddKeyChordRequested; til::typed_event ModifyKeyChordRequested; til::typed_event DeleteKeyChordRequested; @@ -194,6 +197,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation void AttemptModifyKeyChord(const Editor::KeyChordViewModel& senderVM, const Editor::ModifyKeyChordEventArgs& args); void AttemptDeleteKeyChord(const Control::KeyChord& keys); + void AttemptAddKeyChord(const Control::KeyChord& keys, const winrt::hstring& cmdID); til::typed_event FocusContainer; til::typed_event UpdateBackground; diff --git a/src/cascadia/TerminalSettingsEditor/ActionsViewModel.idl b/src/cascadia/TerminalSettingsEditor/ActionsViewModel.idl index cca5d171ac..7f0c46c476 100644 --- a/src/cascadia/TerminalSettingsEditor/ActionsViewModel.idl +++ b/src/cascadia/TerminalSettingsEditor/ActionsViewModel.idl @@ -48,6 +48,7 @@ namespace Microsoft.Terminal.Settings.Editor void CancelChanges(); void DeleteKeyBinding(); + event Windows.Foundation.TypedEventHandler ModifyKeyBindingRequested; event Windows.Foundation.TypedEventHandler DeleteKeyBindingRequested; } @@ -66,6 +67,7 @@ namespace Microsoft.Terminal.Settings.Editor Object ProposedAction; void Edit_Click(); void Delete_Click(); + void AddKeybinding_Click(); IObservableVector AvailableActions { get; }; } @@ -82,6 +84,7 @@ namespace Microsoft.Terminal.Settings.Editor void CancelChanges(); void DeleteKeyChord(); + event Windows.Foundation.TypedEventHandler AddKeyChordRequested; event Windows.Foundation.TypedEventHandler ModifyKeyChordRequested; event Windows.Foundation.TypedEventHandler DeleteKeyChordRequested; } @@ -107,6 +110,7 @@ namespace Microsoft.Terminal.Settings.Editor ActionsSubPage CurrentPage; CommandViewModel CurrentCommand; + void AttemptAddKeyChord(Microsoft.Terminal.Control.KeyChord keys, String cmdID); void AttemptModifyKeyChord(KeyChordViewModel senderVM, ModifyKeyChordEventArgs args); void AttemptDeleteKeyChord(Microsoft.Terminal.Control.KeyChord keys); diff --git a/src/cascadia/TerminalSettingsEditor/EditAction.xaml b/src/cascadia/TerminalSettingsEditor/EditAction.xaml index f12bdbbc25..5681eb7ba9 100644 --- a/src/cascadia/TerminalSettingsEditor/EditAction.xaml +++ b/src/cascadia/TerminalSettingsEditor/EditAction.xaml @@ -238,14 +238,20 @@ IsEnabled="{x:Bind ViewModel.IsUserAction}"/> + SelectionMode="None"> + + + +