diff --git a/src/cascadia/TerminalSettingsEditor/Actions.cpp b/src/cascadia/TerminalSettingsEditor/Actions.cpp index 49260547a32..b4ba6fcf3a9 100644 --- a/src/cascadia/TerminalSettingsEditor/Actions.cpp +++ b/src/cascadia/TerminalSettingsEditor/Actions.cpp @@ -103,6 +103,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation Automation::Peers::AutomationPeer Actions::OnCreateAutomationPeer() { + _AutomationPeerAttached = true; for (const auto& kbdVM : _KeyBindingList) { // To create a more accessible experience, we want the "edit" buttons to _always_ @@ -135,7 +136,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation _KeyBindingList = single_threaded_observable_vector(std::move(keyBindingList)); } - void Actions::KeyChordEditor_PreviewKeyDown(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::Input::KeyRoutedEventArgs const& e) + void Actions::KeyChordEditor_KeyDown(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::Input::KeyRoutedEventArgs const& e) { const auto& senderTB{ sender.as() }; const auto& kbdVM{ senderTB.DataContext().as() }; @@ -192,7 +193,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation } } - const auto& containerBackground{ Resources().Lookup(box_value(L"EditModeContainerBackground")).as() }; + const auto& containerBackground{ Resources().Lookup(box_value(L"ActionContainerBackgroundEditing")).as() }; get_self(senderVM)->ContainerBackground(containerBackground); } else @@ -200,27 +201,28 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation // Focus on the list view item KeyBindingsListView().ContainerFromItem(senderVM).as().Focus(FocusState::Programmatic); - const auto& containerBackground{ Resources().Lookup(box_value(L"NonEditModeContainerBackground")).as() }; + const auto& containerBackground{ Resources().Lookup(box_value(L"ActionContainerBackground")).as() }; get_self(senderVM)->ContainerBackground(containerBackground); } } } - void Actions::_ViewModelDeleteKeyBindingHandler(const Editor::KeyBindingViewModel& /*senderVM*/, const Control::KeyChord& keys) + void Actions::_ViewModelDeleteKeyBindingHandler(const Editor::KeyBindingViewModel& senderVM, const Control::KeyChord& keys) { // Update the settings model _State.Settings().ActionMap().DeleteKeyBinding(keys); // Find the current container in our list and remove it. // This is much faster than rebuilding the entire ActionMap. - if (const auto index{ _GetContainerIndexByKeyChord(keys) }) + uint32_t index; + if (_KeyBindingList.IndexOf(senderVM, index)) { - _KeyBindingList.RemoveAt(*index); + _KeyBindingList.RemoveAt(index); // Focus the new item at this index if (_KeyBindingList.Size() != 0) { - const auto newFocusedIndex{ std::clamp(*index, 0u, _KeyBindingList.Size() - 1) }; + const auto newFocusedIndex{ std::clamp(index, 0u, _KeyBindingList.Size() - 1) }; KeyBindingsListView().ContainerFromIndex(newFocusedIndex).as().Focus(FocusState::Programmatic); } } diff --git a/src/cascadia/TerminalSettingsEditor/Actions.h b/src/cascadia/TerminalSettingsEditor/Actions.h index 0fe5898ec4f..e6d6238f73a 100644 --- a/src/cascadia/TerminalSettingsEditor/Actions.h +++ b/src/cascadia/TerminalSettingsEditor/Actions.h @@ -48,10 +48,10 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation void EnterHoverMode() { IsHovered(true); }; void ExitHoverMode() { IsHovered(false); }; - void FocusContainer() { IsContainerFocused(true); }; - void UnfocusContainer() { IsContainerFocused(false); }; - void FocusEditButton() { IsEditButtonFocused(true); }; - void UnfocusEditButton() { IsEditButtonFocused(false); }; + void ActionGotFocus() { IsContainerFocused(true); }; + void ActionLostFocus() { IsContainerFocused(false); }; + void EditButtonGettingFocus() { IsEditButtonFocused(true); }; + void EditButtonLosingFocus() { IsEditButtonFocused(false); }; bool ShowEditButton() const noexcept; void ToggleEditMode(); void DisableEditMode() { IsInEditMode(false); } @@ -92,7 +92,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation void OnNavigatedTo(const winrt::Windows::UI::Xaml::Navigation::NavigationEventArgs& e); Windows::UI::Xaml::Automation::Peers::AutomationPeer OnCreateAutomationPeer(); - void KeyChordEditor_PreviewKeyDown(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::Input::KeyRoutedEventArgs const& e); + void KeyChordEditor_KeyDown(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::Input::KeyRoutedEventArgs const& e); WINRT_CALLBACK(PropertyChanged, Windows::UI::Xaml::Data::PropertyChangedEventHandler); WINRT_PROPERTY(Editor::ActionsPageNavigationState, State, nullptr); diff --git a/src/cascadia/TerminalSettingsEditor/Actions.idl b/src/cascadia/TerminalSettingsEditor/Actions.idl index 950ce7dbbb8..a26ce5866c1 100644 --- a/src/cascadia/TerminalSettingsEditor/Actions.idl +++ b/src/cascadia/TerminalSettingsEditor/Actions.idl @@ -30,10 +30,10 @@ namespace Microsoft.Terminal.Settings.Editor void EnterHoverMode(); void ExitHoverMode(); - void FocusContainer(); - void UnfocusContainer(); - void FocusEditButton(); - void UnfocusEditButton(); + void ActionGotFocus(); + void ActionLostFocus(); + void EditButtonGettingFocus(); + void EditButtonLosingFocus(); void ToggleEditMode(); void AttemptAcceptChanges(); void DeleteKeyBinding(); diff --git a/src/cascadia/TerminalSettingsEditor/Actions.xaml b/src/cascadia/TerminalSettingsEditor/Actions.xaml index 70f13deb7ad..66e1c0847ec 100644 --- a/src/cascadia/TerminalSettingsEditor/Actions.xaml +++ b/src/cascadia/TerminalSettingsEditor/Actions.xaml @@ -9,7 +9,6 @@ xmlns:local="using:Microsoft.Terminal.Settings.Editor" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:model="using:Microsoft.Terminal.Settings.Model" - xmlns:muxc="using:Microsoft.UI.Xaml.Controls" mc:Ignorable="d"> @@ -164,9 +163,9 @@ - - @@ -175,8 +174,8 @@ @@ -218,7 +217,7 @@ @@ -229,8 +228,8 @@ AutomationProperties.Name="{x:Bind EditButtonName}" Background="Transparent" Click="{x:Bind ToggleEditMode}" - GettingFocus="{x:Bind FocusEditButton}" - LosingFocus="{x:Bind UnfocusEditButton}" + GettingFocus="{x:Bind EditButtonGettingFocus}" + LosingFocus="{x:Bind EditButtonLosingFocus}" Style="{StaticResource EditButtonStyle}" Visibility="{x:Bind ShowEditButton, Mode=OneWay}"> diff --git a/src/cascadia/TerminalSettingsEditor/CommonResources.xaml b/src/cascadia/TerminalSettingsEditor/CommonResources.xaml index 39eabb0b65c..c51856255d0 100644 --- a/src/cascadia/TerminalSettingsEditor/CommonResources.xaml +++ b/src/cascadia/TerminalSettingsEditor/CommonResources.xaml @@ -49,7 +49,7 @@ diff --git a/src/cascadia/TerminalSettingsEditor/Resources/en-US/Resources.resw b/src/cascadia/TerminalSettingsEditor/Resources/en-US/Resources.resw index 611491389c5..a426295963f 100644 --- a/src/cascadia/TerminalSettingsEditor/Resources/en-US/Resources.resw +++ b/src/cascadia/TerminalSettingsEditor/Resources/en-US/Resources.resw @@ -1119,8 +1119,8 @@ Error message displayed when a key chord that is already in use is input by the user. The name of the conflicting key chord is displayed after this message. - Would you like to overwrite that key binding? - Confirmation message displayed when a key chord that is already in use is input by the user. This is intended to ask the user if they wish to delete the conflicting key binding, and assign the current key chord (or binding) instead. + Would you like to overwrite it? + Confirmation message displayed when a key chord that is already in use is input by the user. This is intended to ask the user if they wish to delete the conflicting key binding, and assign the current key chord (or binding) instead. This is presented in the context of Actions_RenameConflictConfirmationMessage. The subject of this sentence is the object of that one. <unnamed command> diff --git a/src/cascadia/TerminalSettingsEditor/ViewModelHelpers.h b/src/cascadia/TerminalSettingsEditor/ViewModelHelpers.h index 8994e368ec2..73b141b944a 100644 --- a/src/cascadia/TerminalSettingsEditor/ViewModelHelpers.h +++ b/src/cascadia/TerminalSettingsEditor/ViewModelHelpers.h @@ -74,7 +74,8 @@ public: \ _BASE_OBSERVABLE_PROJECTED_SETTING(target, name) // Defines a basic observable property that uses the _NotifyChanges -// system from ViewModelHelper. +// system from ViewModelHelper. This is very similar to WINRT_OBSERVABLE_PROPERTY +// except it leverages _NotifyChanges. #define VIEW_MODEL_OBSERVABLE_PROPERTY(type, name, ...) \ public: \ type name() const noexcept { return _##name; }; \ diff --git a/src/cascadia/TerminalSettingsModel/ActionMap.cpp b/src/cascadia/TerminalSettingsModel/ActionMap.cpp index 63fffa7011a..15a238ca4c4 100644 --- a/src/cascadia/TerminalSettingsModel/ActionMap.cpp +++ b/src/cascadia/TerminalSettingsModel/ActionMap.cpp @@ -234,6 +234,11 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation // Update KeyBindingsMap with our current layer for (const auto& [keys, actionID] : _KeyMap) { + // Get the action our KeyMap maps to. + // This _cannot_ be nullopt because KeyMap can only map to + // actions in this layer. + // This _can_ be nullptr because nullptr means it was + // explicitly unbound ( "command": "unbound", "keys": "ctrl+c" ). const auto cmd{ _GetActionByID(actionID).value() }; if (cmd) { @@ -258,7 +263,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation } } - // Update KeyBindingsMap and visitedKeyChords with our parents + // Update keyBindingsMap and unboundKeys with our parents FAIL_FAST_IF(_parents.size() > 1); for (const auto& parent : _parents) {