add keychord

This commit is contained in:
Pankaj Bhojwani
2024-09-19 19:40:39 -07:00
parent 8d21f06ae1
commit 11bd5beb7e
8 changed files with 53 additions and 5 deletions

View File

@@ -160,15 +160,27 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
DeleteRequested.raise(*this, *this); DeleteRequested.raise(*this, *this);
} }
void CommandViewModel::AddKeybinding_Click()
{
auto kbdVM{ make_self<KeyChordViewModel>(nullptr) };
kbdVM->IsInEditMode(true);
_RegisterEvents(*kbdVM);
KeyChordViewModelList().Append(*kbdVM);
}
void CommandViewModel::_RegisterEvents(Editor::KeyChordViewModel kcVM) void CommandViewModel::_RegisterEvents(Editor::KeyChordViewModel kcVM)
{ {
if (const auto actionsPageVM{ _actionsPageVM.get() }) 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) { kcVM.ModifyKeyChordRequested([actionsPageVM](const Editor::KeyChordViewModel& sender, const Editor::ModifyKeyChordEventArgs& args) {
actionsPageVM.AttemptModifyKeyChord(sender, args); actionsPageVM.AttemptModifyKeyChord(sender, args);
}); });
kcVM.DeleteKeyChordRequested([actionsPageVM](const Editor::KeyChordViewModel& /*sender*/, const Control::KeyChord& 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); actionsPageVM.AttemptDeleteKeyChord(args);
}); });
} }
@@ -204,7 +216,11 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
void KeyChordViewModel::AttemptAcceptChanges() 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<ModifyKeyChordEventArgs>(_currentKeys, // OldKeys const auto args{ make_self<ModifyKeyChordEventArgs>(_currentKeys, // OldKeys
_ProposedKeys) }; // NewKeys _ProposedKeys) }; // NewKeys
@@ -436,6 +452,12 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
_Settings.ActionMap().DeleteKeyBinding(keys); _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) void ActionsViewModel::_KeyBindingViewModelPropertyChangedHandler(const IInspectable& sender, const Windows::UI::Xaml::Data::PropertyChangedEventArgs& args)
{ {
const auto senderVM{ sender.as<Editor::KeyBindingViewModel>() }; const auto senderVM{ sender.as<Editor::KeyBindingViewModel>() };

View File

@@ -143,6 +143,8 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
void Delete_Click(); void Delete_Click();
til::typed_event<Editor::CommandViewModel, IInspectable> DeleteRequested; til::typed_event<Editor::CommandViewModel, IInspectable> DeleteRequested;
void AddKeybinding_Click();
VIEW_MODEL_OBSERVABLE_PROPERTY(IInspectable, ProposedAction); VIEW_MODEL_OBSERVABLE_PROPERTY(IInspectable, ProposedAction);
VIEW_MODEL_OBSERVABLE_PROPERTY(hstring, CurrentAction); VIEW_MODEL_OBSERVABLE_PROPERTY(hstring, CurrentAction);
WINRT_PROPERTY(Windows::Foundation::Collections::IObservableVector<hstring>, AvailableActions, nullptr); WINRT_PROPERTY(Windows::Foundation::Collections::IObservableVector<hstring>, AvailableActions, nullptr);
@@ -173,6 +175,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
VIEW_MODEL_OBSERVABLE_PROPERTY(Windows::UI::Xaml::Controls::Flyout, AcceptChangesFlyout, nullptr); VIEW_MODEL_OBSERVABLE_PROPERTY(Windows::UI::Xaml::Controls::Flyout, AcceptChangesFlyout, nullptr);
public: public:
til::typed_event<Editor::KeyChordViewModel, Terminal::Control::KeyChord> AddKeyChordRequested;
til::typed_event<Editor::KeyChordViewModel, Editor::ModifyKeyChordEventArgs> ModifyKeyChordRequested; til::typed_event<Editor::KeyChordViewModel, Editor::ModifyKeyChordEventArgs> ModifyKeyChordRequested;
til::typed_event<Editor::KeyChordViewModel, Terminal::Control::KeyChord> DeleteKeyChordRequested; til::typed_event<Editor::KeyChordViewModel, Terminal::Control::KeyChord> DeleteKeyChordRequested;
@@ -194,6 +197,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
void AttemptModifyKeyChord(const Editor::KeyChordViewModel& senderVM, const Editor::ModifyKeyChordEventArgs& args); void AttemptModifyKeyChord(const Editor::KeyChordViewModel& senderVM, const Editor::ModifyKeyChordEventArgs& args);
void AttemptDeleteKeyChord(const Control::KeyChord& keys); void AttemptDeleteKeyChord(const Control::KeyChord& keys);
void AttemptAddKeyChord(const Control::KeyChord& keys, const winrt::hstring& cmdID);
til::typed_event<IInspectable, IInspectable> FocusContainer; til::typed_event<IInspectable, IInspectable> FocusContainer;
til::typed_event<IInspectable, IInspectable> UpdateBackground; til::typed_event<IInspectable, IInspectable> UpdateBackground;

View File

@@ -48,6 +48,7 @@ namespace Microsoft.Terminal.Settings.Editor
void CancelChanges(); void CancelChanges();
void DeleteKeyBinding(); void DeleteKeyBinding();
event Windows.Foundation.TypedEventHandler<KeyBindingViewModel, ModifyKeyBindingEventArgs> ModifyKeyBindingRequested; event Windows.Foundation.TypedEventHandler<KeyBindingViewModel, ModifyKeyBindingEventArgs> ModifyKeyBindingRequested;
event Windows.Foundation.TypedEventHandler<KeyBindingViewModel, Microsoft.Terminal.Control.KeyChord> DeleteKeyBindingRequested; event Windows.Foundation.TypedEventHandler<KeyBindingViewModel, Microsoft.Terminal.Control.KeyChord> DeleteKeyBindingRequested;
} }
@@ -66,6 +67,7 @@ namespace Microsoft.Terminal.Settings.Editor
Object ProposedAction; Object ProposedAction;
void Edit_Click(); void Edit_Click();
void Delete_Click(); void Delete_Click();
void AddKeybinding_Click();
IObservableVector<String> AvailableActions { get; }; IObservableVector<String> AvailableActions { get; };
} }
@@ -82,6 +84,7 @@ namespace Microsoft.Terminal.Settings.Editor
void CancelChanges(); void CancelChanges();
void DeleteKeyChord(); void DeleteKeyChord();
event Windows.Foundation.TypedEventHandler<KeyChordViewModel, Microsoft.Terminal.Control.KeyChord> AddKeyChordRequested;
event Windows.Foundation.TypedEventHandler<KeyChordViewModel, ModifyKeyChordEventArgs> ModifyKeyChordRequested; event Windows.Foundation.TypedEventHandler<KeyChordViewModel, ModifyKeyChordEventArgs> ModifyKeyChordRequested;
event Windows.Foundation.TypedEventHandler<KeyChordViewModel, Microsoft.Terminal.Control.KeyChord> DeleteKeyChordRequested; event Windows.Foundation.TypedEventHandler<KeyChordViewModel, Microsoft.Terminal.Control.KeyChord> DeleteKeyChordRequested;
} }
@@ -107,6 +110,7 @@ namespace Microsoft.Terminal.Settings.Editor
ActionsSubPage CurrentPage; ActionsSubPage CurrentPage;
CommandViewModel CurrentCommand; CommandViewModel CurrentCommand;
void AttemptAddKeyChord(Microsoft.Terminal.Control.KeyChord keys, String cmdID);
void AttemptModifyKeyChord(KeyChordViewModel senderVM, ModifyKeyChordEventArgs args); void AttemptModifyKeyChord(KeyChordViewModel senderVM, ModifyKeyChordEventArgs args);
void AttemptDeleteKeyChord(Microsoft.Terminal.Control.KeyChord keys); void AttemptDeleteKeyChord(Microsoft.Terminal.Control.KeyChord keys);

View File

@@ -238,14 +238,20 @@
IsEnabled="{x:Bind ViewModel.IsUserAction}"/> IsEnabled="{x:Bind ViewModel.IsUserAction}"/>
<ListView ItemTemplate="{StaticResource KeyChordTemplate}" <ListView ItemTemplate="{StaticResource KeyChordTemplate}"
ItemsSource="{x:Bind ViewModel.KeyChordViewModelList, Mode=OneWay}" ItemsSource="{x:Bind ViewModel.KeyChordViewModelList, Mode=OneWay}"
SelectionMode="None" /> SelectionMode="None">
<ListView.Header>
<Button Click="{x:Bind ViewModel.AddKeybinding_Click}">
<TextBlock x:Uid="Actions_AddKeyChord" />
</Button>
</ListView.Header>
</ListView>
<Button Style="{StaticResource DeleteButtonStyle}" <Button Style="{StaticResource DeleteButtonStyle}"
IsEnabled="{x:Bind ViewModel.IsUserAction}"> IsEnabled="{x:Bind ViewModel.IsUserAction}">
<Button.Content> <Button.Content>
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<FontIcon FontSize="{StaticResource StandardIconSize}" <FontIcon FontSize="{StaticResource StandardIconSize}"
Glyph="&#xE74D;" /> Glyph="&#xE74D;" />
<TextBlock x:Uid="Actions_DeleteButton" <TextBlock x:Uid="Actions_DeleteButton2"
Style="{StaticResource IconButtonTextBlockStyle}" /> Style="{StaticResource IconButtonTextBlockStyle}" />
</StackPanel> </StackPanel>
</Button.Content> </Button.Content>

View File

@@ -1703,10 +1703,14 @@
<value>Delete the unfocused appearance for this profile.</value> <value>Delete the unfocused appearance for this profile.</value>
<comment>A description for what the delete unfocused appearance button does.</comment> <comment>A description for what the delete unfocused appearance button does.</comment>
</data> </data>
<data name="Actions_DeleteButton.Text" xml:space="preserve"> <data name="Actions_DeleteButton2.Text" xml:space="preserve">
<value>Delete action</value> <value>Delete action</value>
<comment>Button label that deletes the selected action.</comment> <comment>Button label that deletes the selected action.</comment>
</data> </data>
<data name="Actions_AddKeyChord.Text" xml:space="preserve">
<value>Add keybinding</value>
<comment>Button label that adds a keybinding to the current action.</comment>
</data>
<data name="Actions_DeleteConfirmationButton.Content" xml:space="preserve"> <data name="Actions_DeleteConfirmationButton.Content" xml:space="preserve">
<value>Yes, delete key binding</value> <value>Yes, delete key binding</value>
<comment>Button label that confirms deletion of a key binding entry.</comment> <comment>Button label that confirms deletion of a key binding entry.</comment>

View File

@@ -741,6 +741,12 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation
} }
} }
void ActionMap::AddKeyBinding(Control::KeyChord keys, const winrt::hstring& cmdID)
{
_KeyMap.insert_or_assign(keys, cmdID);
_RefreshKeyBindingCaches();
}
// Method Description: // Method Description:
// - Add a new key binding // - Add a new key binding
// - If the key chord is already in use, the conflicting command is overwritten. // - If the key chord is already in use, the conflicting command is overwritten.

View File

@@ -78,6 +78,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation
// modification // modification
bool RebindKeys(const Control::KeyChord& oldKeys, const Control::KeyChord& newKeys); bool RebindKeys(const Control::KeyChord& oldKeys, const Control::KeyChord& newKeys);
void DeleteKeyBinding(const Control::KeyChord& keys); void DeleteKeyBinding(const Control::KeyChord& keys);
void AddKeyBinding(Control::KeyChord keys, const winrt::hstring& cmdID);
void RegisterKeyBinding(Control::KeyChord keys, Model::ActionAndArgs action); void RegisterKeyBinding(Control::KeyChord keys, Model::ActionAndArgs action);
void DeleteUserCommand(const winrt::hstring& cmdID); void DeleteUserCommand(const winrt::hstring& cmdID);
void AddSendInputAction(winrt::hstring name, winrt::hstring input, const Control::KeyChord keys); void AddSendInputAction(winrt::hstring name, winrt::hstring input, const Control::KeyChord keys);

View File

@@ -30,6 +30,7 @@ namespace Microsoft.Terminal.Settings.Model
void RebindKeys(Microsoft.Terminal.Control.KeyChord oldKeys, Microsoft.Terminal.Control.KeyChord newKeys); void RebindKeys(Microsoft.Terminal.Control.KeyChord oldKeys, Microsoft.Terminal.Control.KeyChord newKeys);
void DeleteKeyBinding(Microsoft.Terminal.Control.KeyChord keys); void DeleteKeyBinding(Microsoft.Terminal.Control.KeyChord keys);
void DeleteUserCommand(String cmdID); void DeleteUserCommand(String cmdID);
void AddKeyBinding(Microsoft.Terminal.Control.KeyChord keys, String cmdID);
void RegisterKeyBinding(Microsoft.Terminal.Control.KeyChord keys, ActionAndArgs action); void RegisterKeyBinding(Microsoft.Terminal.Control.KeyChord keys, ActionAndArgs action);
void AddSendInputAction(String name, String input, Microsoft.Terminal.Control.KeyChord keys); void AddSendInputAction(String name, String input, Microsoft.Terminal.Control.KeyChord keys);
} }