From 26289f420693dd2f1c58daba0c0a498125fabfef Mon Sep 17 00:00:00 2001 From: Pankaj Bhojwani Date: Wed, 2 Oct 2024 16:11:33 -0700 Subject: [PATCH] setting args works --- .../ActionsTemplateSelectors.cpp | 2 +- .../ActionsViewModel.cpp | 64 ++++++++++++++----- .../TerminalSettingsEditor/ActionsViewModel.h | 20 ++++-- .../ActionsViewModel.idl | 2 +- .../TerminalSettingsModel/ActionArgs.idl | 4 +- 5 files changed, 66 insertions(+), 26 deletions(-) diff --git a/src/cascadia/TerminalSettingsEditor/ActionsTemplateSelectors.cpp b/src/cascadia/TerminalSettingsEditor/ActionsTemplateSelectors.cpp index 61ff9ffab8..3ac7b151b5 100644 --- a/src/cascadia/TerminalSettingsEditor/ActionsTemplateSelectors.cpp +++ b/src/cascadia/TerminalSettingsEditor/ActionsTemplateSelectors.cpp @@ -26,7 +26,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation { if (const auto actionArgsVM{ item.try_as() }) { - const auto shortcutAction = actionArgsVM.SelectedShortcutAction(); + const auto shortcutAction = actionArgsVM.ShortcutActionType(); switch (shortcutAction) { case Microsoft::Terminal::Settings::Model::ShortcutAction::SendInput: diff --git a/src/cascadia/TerminalSettingsEditor/ActionsViewModel.cpp b/src/cascadia/TerminalSettingsEditor/ActionsViewModel.cpp index 70a1613c7a..e6cda4b625 100644 --- a/src/cascadia/TerminalSettingsEditor/ActionsViewModel.cpp +++ b/src/cascadia/TerminalSettingsEditor/ActionsViewModel.cpp @@ -117,7 +117,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation for (const auto keys : keyChordList) { auto kcVM{ make(keys) }; - _RegisterEvents(kcVM); + _RegisterKeyChordVMEvents(kcVM); keyChordVMs.push_back(kcVM); } _KeyChordViewModelList = single_threaded_observable_vector(std::move(keyChordVMs)); @@ -127,6 +127,10 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation shortcutActions.emplace_back(L"Send Input"); shortcutActions.emplace_back(L"Close Tab"); _AvailableShortcutActions = single_threaded_observable_vector(std::move(shortcutActions)); + + ActionArgsVM(make(cmd.ActionAndArgs())); + _RegisterActionArgsVMEvents(_ActionArgsVM); + const auto shortcutAction = cmd.ActionAndArgs().Action(); switch (shortcutAction) { @@ -141,18 +145,16 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation default: break; } - ActionArgsVM(make(cmd)); + ActionArgsVM(make(cmd.ActionAndArgs())); // Add a property changed handler to our own property changed event. - // This allows us to propagate changes down to our ActionArgsVM + // This allows us to create a new ActionArgsVM when the shortcut action changes PropertyChanged([this](auto&&, const PropertyChangedEventArgs& args) { const auto viewModelProperty{ args.PropertyName() }; if (viewModelProperty == L"ProposedShortcutAction") { - // todo: this thing doesn't work, ProposedShortcutAction is a boxed string - // need a translator between string and enum - // todo: need a way to make an "empty" command? - Model::Command newCmd{}; + // todo: maybe just put this logic in the ProposedShortcutAction setter? + // todo: need a translator between string and enum Model::ActionAndArgs newActionAndArgs{}; const auto actionString = unbox_value(ProposedShortcutAction()); if (actionString == L"Send Input") @@ -166,8 +168,8 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation newActionAndArgs.Action(Model::ShortcutAction::CloseTab); newActionAndArgs.Args(Model::CloseTabArgs{ index }); } - newCmd.ActionAndArgs(newActionAndArgs); - ActionArgsVM(make(newCmd)); + _command.ActionAndArgs(newActionAndArgs); + ActionArgsVM(make(newActionAndArgs)); } }); } @@ -212,11 +214,11 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation { auto kbdVM{ make_self(nullptr) }; kbdVM->IsInEditMode(true); - _RegisterEvents(*kbdVM); + _RegisterKeyChordVMEvents(*kbdVM); KeyChordViewModelList().Append(*kbdVM); } - void CommandViewModel::_RegisterEvents(Editor::KeyChordViewModel kcVM) + void CommandViewModel::_RegisterKeyChordVMEvents(Editor::KeyChordViewModel kcVM) { if (const auto actionsPageVM{ _actionsPageVM.get() }) { @@ -234,24 +236,36 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation } } - ActionArgsViewModel::ActionArgsViewModel(const Model::Command& cmd) + void CommandViewModel::_RegisterActionArgsVMEvents(Editor::ActionArgsViewModel actionArgsVM) { - const auto shortcutAction = cmd.ActionAndArgs().Action(); - SelectedShortcutAction(shortcutAction); - const auto shortcutArgs = cmd.ActionAndArgs().Args(); + actionArgsVM.PropertyChanged([this](auto&&, const PropertyChangedEventArgs& args) { + const auto viewModelProperty{ args.PropertyName() }; + if (viewModelProperty == L"ProposedShortcutAction") + { + //todo: this is a placeholder, don't know if there's any events we need to listen to + } + }); + } + + ActionArgsViewModel::ActionArgsViewModel(const Model::ActionAndArgs actionAndArgs) : + _actionAndArgs{ actionAndArgs } + { + const auto shortcutAction = actionAndArgs.Action(); + ShortcutActionType(shortcutAction); + const auto shortcutArgs = actionAndArgs.Args(); switch (shortcutAction) { case ShortcutAction::SendInput: { const auto sendInputArgs = shortcutArgs.as(); - StringArg1(sendInputArgs.Input()); + _StringArg1 = sendInputArgs.Input(); break; } case ShortcutAction::CloseTab: { const auto closeTabArgs = shortcutArgs.as(); const auto closeTabIndex = closeTabArgs.Index() ? closeTabArgs.Index().Value() : 0; - UInt32Arg1(closeTabIndex); + _UInt32Arg1 = closeTabIndex; break; } default: @@ -259,6 +273,22 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation } } + void ActionArgsViewModel::StringArg1(const winrt::hstring& newStringArg1) + { + _StringArg1 = newStringArg1; + // todo: translate between "StringArg1" and whatever the actual arg is for this action + _actionAndArgs.Args().as().Input(_StringArg1); + _NotifyChanges(L"StringArg1"); + } + + void ActionArgsViewModel::UInt32Arg1(const uint32_t newUInt32Arg1) + { + _UInt32Arg1 = newUInt32Arg1; + // todo: translate between "UInt32Arg1" and whatever the actual arg is for this action + _actionAndArgs.Args().as().Index(_UInt32Arg1); + _NotifyChanges(L"UInt32Arg1"); + } + KeyChordViewModel::KeyChordViewModel(Control::KeyChord currentKeys) { CurrentKeys(currentKeys); diff --git a/src/cascadia/TerminalSettingsEditor/ActionsViewModel.h b/src/cascadia/TerminalSettingsEditor/ActionsViewModel.h index 4d2814f07a..b3a54aaf4b 100644 --- a/src/cascadia/TerminalSettingsEditor/ActionsViewModel.h +++ b/src/cascadia/TerminalSettingsEditor/ActionsViewModel.h @@ -157,17 +157,27 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation private: winrt::Microsoft::Terminal::Settings::Model::Command _command; weak_ref _actionsPageVM{ nullptr }; - void _RegisterEvents(Editor::KeyChordViewModel kcVM); + void _RegisterKeyChordVMEvents(Editor::KeyChordViewModel kcVM); + void _RegisterActionArgsVMEvents(Editor::ActionArgsViewModel actionArgsVM); }; struct ActionArgsViewModel : ActionArgsViewModelT, ViewModelHelper { public: - ActionArgsViewModel(const Microsoft::Terminal::Settings::Model::Command& cmd); + ActionArgsViewModel(const Microsoft::Terminal::Settings::Model::ActionAndArgs actionAndArgs); - VIEW_MODEL_OBSERVABLE_PROPERTY(Microsoft::Terminal::Settings::Model::ShortcutAction, SelectedShortcutAction, Microsoft::Terminal::Settings::Model::ShortcutAction::AddMark); - VIEW_MODEL_OBSERVABLE_PROPERTY(hstring, StringArg1); - VIEW_MODEL_OBSERVABLE_PROPERTY(uint32_t, UInt32Arg1); + winrt::hstring StringArg1() { return _StringArg1; } + void StringArg1(const winrt::hstring& newStringArg1); + + uint32_t UInt32Arg1() { return _UInt32Arg1; } + void UInt32Arg1(const uint32_t newUInt32Arg1); + + VIEW_MODEL_OBSERVABLE_PROPERTY(Microsoft::Terminal::Settings::Model::ShortcutAction, ShortcutActionType, Microsoft::Terminal::Settings::Model::ShortcutAction::AddMark); + + private: + Model::ActionAndArgs _actionAndArgs{ nullptr }; + winrt::hstring _StringArg1; + uint32_t _UInt32Arg1; }; struct KeyChordViewModel : KeyChordViewModelT, ViewModelHelper diff --git a/src/cascadia/TerminalSettingsEditor/ActionsViewModel.idl b/src/cascadia/TerminalSettingsEditor/ActionsViewModel.idl index 5cd9b383fe..3f6c892527 100644 --- a/src/cascadia/TerminalSettingsEditor/ActionsViewModel.idl +++ b/src/cascadia/TerminalSettingsEditor/ActionsViewModel.idl @@ -76,7 +76,7 @@ namespace Microsoft.Terminal.Settings.Editor runtimeclass ActionArgsViewModel : Windows.UI.Xaml.Data.INotifyPropertyChanged { - Microsoft.Terminal.Settings.Model.ShortcutAction SelectedShortcutAction; + Microsoft.Terminal.Settings.Model.ShortcutAction ShortcutActionType; // Args String StringArg1; UInt32 UInt32Arg1; diff --git a/src/cascadia/TerminalSettingsModel/ActionArgs.idl b/src/cascadia/TerminalSettingsModel/ActionArgs.idl index 02f0c4d041..5688f2a4e5 100644 --- a/src/cascadia/TerminalSettingsModel/ActionArgs.idl +++ b/src/cascadia/TerminalSettingsModel/ActionArgs.idl @@ -228,7 +228,7 @@ namespace Microsoft.Terminal.Settings.Model { SendInputArgs(String input); - String Input { get; }; + String Input; }; [default_interface] runtimeclass SplitPaneArgs : IActionArgs @@ -307,7 +307,7 @@ namespace Microsoft.Terminal.Settings.Model [default_interface] runtimeclass CloseTabArgs : IActionArgs { CloseTabArgs(UInt32 tabIndex); - Windows.Foundation.IReference Index { get; }; + Windows.Foundation.IReference Index; }; [default_interface] runtimeclass MoveTabArgs : IActionArgs