diff --git a/src/cascadia/TerminalSettingsEditor/ActionsViewModel.cpp b/src/cascadia/TerminalSettingsEditor/ActionsViewModel.cpp index 45f17fcf78..4fee21a521 100644 --- a/src/cascadia/TerminalSettingsEditor/ActionsViewModel.cpp +++ b/src/cascadia/TerminalSettingsEditor/ActionsViewModel.cpp @@ -5,6 +5,7 @@ #include "ActionsViewModel.h" #include "ActionsViewModel.g.cpp" #include "KeyBindingViewModel.g.cpp" +#include "CommandViewModel.g.cpp" #include "LibraryResources.h" #include "../TerminalSettingsModel/AllShortcutActions.h" @@ -106,6 +107,21 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation } } + CommandViewModel::CommandViewModel(Command cmd) : + _command{ cmd } + { + } + + winrt::hstring CommandViewModel::Name() const + { + return _command.Name(); + } + + winrt::hstring CommandViewModel::ID() const + { + return _command.ID(); + } + ActionsViewModel::ActionsViewModel(Model::CascadiaSettings settings) : _Settings{ settings } { @@ -124,16 +140,23 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation const auto& keyBindingMap{ _Settings.ActionMap().KeyBindings() }; std::vector keyBindingList; keyBindingList.reserve(keyBindingMap.Size()); + std::vector commandList; + commandList.reserve(keyBindingMap.Size()); for (const auto& [keys, cmd] : keyBindingMap) { // convert the cmd into a KeyBindingViewModel auto container{ make_self(keys, cmd.Name(), _AvailableActionAndArgs) }; _RegisterEvents(container); keyBindingList.push_back(*container); + + auto cmdVM{ make_self(cmd) }; + commandList.push_back(*cmdVM); } std::sort(begin(keyBindingList), end(keyBindingList), KeyBindingViewModelComparator{}); _KeyBindingList = single_threaded_observable_vector(std::move(keyBindingList)); + std::sort(begin(commandList), end(commandList), CommandViewModelComparator{}); + _CommandList = single_threaded_observable_vector(std::move(commandList)); } void ActionsViewModel::OnAutomationPeerAttached() diff --git a/src/cascadia/TerminalSettingsEditor/ActionsViewModel.h b/src/cascadia/TerminalSettingsEditor/ActionsViewModel.h index 73e029d892..f7e1d0106c 100644 --- a/src/cascadia/TerminalSettingsEditor/ActionsViewModel.h +++ b/src/cascadia/TerminalSettingsEditor/ActionsViewModel.h @@ -5,6 +5,7 @@ #include "ActionsViewModel.g.h" #include "KeyBindingViewModel.g.h" +#include "CommandViewModel.g.h" #include "ModifyKeyBindingEventArgs.g.h" #include "Utils.h" #include "ViewModelHelpers.h" @@ -19,6 +20,14 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation } }; + struct CommandViewModelComparator + { + bool operator()(const Editor::CommandViewModel& lhs, const Editor::CommandViewModel& rhs) const + { + return lhs.Name() < rhs.Name(); + } + }; + struct ModifyKeyBindingEventArgs : ModifyKeyBindingEventArgsT { public: @@ -99,6 +108,17 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation hstring _KeyChordText{}; }; + struct CommandViewModel : CommandViewModelT, ViewModelHelper + { + public: + CommandViewModel(winrt::Microsoft::Terminal::Settings::Model::Command cmd); + winrt::hstring Name() const; + winrt::hstring ID() const; + + private: + winrt::Microsoft::Terminal::Settings::Model::Command _command; + }; + struct ActionsViewModel : ActionsViewModelT, ViewModelHelper { public: @@ -112,6 +132,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation WINRT_PROPERTY(Windows::Foundation::Collections::IObservableVector, KeyBindingList); VIEW_MODEL_OBSERVABLE_PROPERTY(ActionsSubPage, CurrentPage); + WINRT_PROPERTY(Windows::Foundation::Collections::IObservableVector, CommandList); private: bool _AutomationPeerAttached{ false }; diff --git a/src/cascadia/TerminalSettingsEditor/ActionsViewModel.idl b/src/cascadia/TerminalSettingsEditor/ActionsViewModel.idl index 47db46322f..6c6b1660f9 100644 --- a/src/cascadia/TerminalSettingsEditor/ActionsViewModel.idl +++ b/src/cascadia/TerminalSettingsEditor/ActionsViewModel.idl @@ -46,6 +46,17 @@ namespace Microsoft.Terminal.Settings.Editor event Windows.Foundation.TypedEventHandler DeleteKeyBindingRequested; } + runtimeclass CommandViewModel : Windows.UI.Xaml.Data.INotifyPropertyChanged + { + // Settings Model side + String Name { get; }; + String ID { get; }; + // icon + // list of keybindings + + // UI side + } + enum ActionsSubPage { Base = 0, @@ -64,5 +75,7 @@ namespace Microsoft.Terminal.Settings.Editor event Windows.Foundation.TypedEventHandler UpdateBackground; ActionsSubPage CurrentPage; + + IObservableVector CommandList { get; }; } } diff --git a/src/cascadia/TerminalSettingsEditor/NewActions.cpp b/src/cascadia/TerminalSettingsEditor/NewActions.cpp index 76943da37c..52a14f9369 100644 --- a/src/cascadia/TerminalSettingsEditor/NewActions.cpp +++ b/src/cascadia/TerminalSettingsEditor/NewActions.cpp @@ -28,44 +28,6 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation void NewActions::OnNavigatedTo(const NavigationEventArgs& e) { _ViewModel = e.Parameter().as(); - - // Subscribe to the view model's FocusContainer event. - // Use the KeyBindingViewModel or index provided in the event to focus the corresponding container - _ViewModel.FocusContainer([this](const auto& /*sender*/, const auto& args) { - if (auto kbdVM{ args.try_as() }) - { - if (const auto& container = KeyBindingsListView().ContainerFromItem(*kbdVM)) - { - container.as().Focus(FocusState::Programmatic); - } - } - else if (const auto& index = args.try_as()) - { - if (const auto& container = KeyBindingsListView().ContainerFromIndex(*index)) - { - container.as().Focus(FocusState::Programmatic); - } - } - }); - - // Subscribe to the view model's UpdateBackground event. - // The view model does not have access to the page resources, so it asks us - // to update the key binding's container background - _ViewModel.UpdateBackground([this](const auto& /*sender*/, const auto& args) { - if (auto kbdVM{ args.try_as() }) - { - if (kbdVM->IsInEditMode()) - { - const auto& containerBackground{ Resources().Lookup(box_value(L"ActionContainerBackgroundEditing")).as() }; - kbdVM->ContainerBackground(containerBackground); - } - else - { - const auto& containerBackground{ Resources().Lookup(box_value(L"ActionContainerBackground")).as() }; - kbdVM->ContainerBackground(containerBackground); - } - } - }); } void NewActions::AddNew_Click(const IInspectable& /*sender*/, const RoutedEventArgs& /*eventArgs*/) diff --git a/src/cascadia/TerminalSettingsEditor/NewActions.xaml b/src/cascadia/TerminalSettingsEditor/NewActions.xaml index a3d0fc421b..093612af8a 100644 --- a/src/cascadia/TerminalSettingsEditor/NewActions.xaml +++ b/src/cascadia/TerminalSettingsEditor/NewActions.xaml @@ -163,15 +163,9 @@ Color="Transparent" /> - - + @@ -192,47 +186,13 @@ - - - - - - - - - - - - + Text="{x:Bind Name, Mode=OneWay}" /> - - - - - - - - - - - - - - @@ -344,9 +255,9 @@ -