Merge branch 'dev/pabhoj/settings_model_reflection' into dev/pabhoj/settings_actions_editor

This commit is contained in:
Pankaj Bhojwani 2025-08-14 13:39:03 -07:00
commit b3f9c89595
3 changed files with 126 additions and 106 deletions

View File

@ -394,8 +394,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation
public: public:
NewTerminalArgs(int32_t& profileIndex) : NewTerminalArgs(int32_t& profileIndex) :
_ProfileIndex{ profileIndex }, _ProfileIndex{ profileIndex } {};
_argDescriptors(INIT_ARG_DESCRIPTORS(NEW_TERMINAL_ARGS)) {};
hstring GenerateName() const { return GenerateName(GetLibraryResourceLoader().ResourceContext()); } hstring GenerateName() const { return GenerateName(GetLibraryResourceLoader().ResourceContext()); }
hstring GenerateName(const winrt::Windows::ApplicationModel::Resources::Core::ResourceContext&) const; hstring GenerateName(const winrt::Windows::ApplicationModel::Resources::Core::ResourceContext&) const;
hstring ToCommandline() const; hstring ToCommandline() const;
@ -637,7 +636,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation
h.write(ContentArgs()); h.write(ContentArgs());
return h.finalize(); return h.finalize();
} }
uint32_t GetArgCount() const uint32_t GetArgCount()
{ {
if (_ContentArgs) if (_ContentArgs)
{ {
@ -648,42 +647,57 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation
} }
return 0; return 0;
} }
Model::ArgDescriptor GetArgDescriptorAt(uint32_t index) const winrt::Windows::Foundation::Collections::IVectorView<ArgDescriptor> GetArgDescriptors()
{ {
return _ContentArgs.as<NewTerminalArgs>()->GetArgDescriptorAt(index); if (_ContentArgs)
{
if (const auto newTermArgs = _ContentArgs.try_as<NewTerminalArgs>())
{
return newTermArgs->GetArgDescriptors();
}
}
return {};
} }
IInspectable GetArgAt(uint32_t index) const IInspectable GetArgAt(uint32_t index) const
{ {
return _ContentArgs.as<NewTerminalArgs>()->GetArgAt(index); if (_ContentArgs)
{
if (const auto newTermArgs = _ContentArgs.try_as<NewTerminalArgs>())
{
return newTermArgs->GetArgAt(index);
}
}
return nullptr;
} }
void SetArgAt(uint32_t index, IInspectable value) void SetArgAt(uint32_t index, IInspectable value)
{ {
_ContentArgs.as<NewTerminalArgs>()->SetArgAt(index, value); if (_ContentArgs)
{
if (const auto newTermArgs = _ContentArgs.try_as<NewTerminalArgs>())
{
newTermArgs->SetArgAt(index, value);
}
}
} }
}; };
struct SplitPaneArgs : public SplitPaneArgsT<SplitPaneArgs> struct SplitPaneArgs : public SplitPaneArgsT<SplitPaneArgs>
{ {
SplitPaneArgs() : SplitPaneArgs() = default;
_argDescriptors(INIT_ARG_DESCRIPTORS(SPLIT_PANE_ARGS)) {};
SplitPaneArgs(SplitType splitMode, SplitDirection direction, float size, const Model::INewContentArgs& terminalArgs) : SplitPaneArgs(SplitType splitMode, SplitDirection direction, float size, const Model::INewContentArgs& terminalArgs) :
_SplitMode{ splitMode }, _SplitMode{ splitMode },
_SplitDirection{ direction }, _SplitDirection{ direction },
_SplitSize{ size }, _SplitSize{ size },
_ContentArgs{ terminalArgs }, _ContentArgs{ terminalArgs } {};
_argDescriptors(INIT_ARG_DESCRIPTORS(SPLIT_PANE_ARGS)) {};
SplitPaneArgs(SplitDirection direction, float size, const Model::INewContentArgs& terminalArgs) : SplitPaneArgs(SplitDirection direction, float size, const Model::INewContentArgs& terminalArgs) :
_SplitDirection{ direction }, _SplitDirection{ direction },
_SplitSize{ size }, _SplitSize{ size },
_ContentArgs{ terminalArgs }, _ContentArgs{ terminalArgs } {};
_argDescriptors(INIT_ARG_DESCRIPTORS(SPLIT_PANE_ARGS)) {};
SplitPaneArgs(SplitDirection direction, const Model::INewContentArgs& terminalArgs) : SplitPaneArgs(SplitDirection direction, const Model::INewContentArgs& terminalArgs) :
_SplitDirection{ direction }, _SplitDirection{ direction },
_ContentArgs{ terminalArgs }, _ContentArgs{ terminalArgs } {};
_argDescriptors(INIT_ARG_DESCRIPTORS(SPLIT_PANE_ARGS)) {};
SplitPaneArgs(SplitType splitMode) : SplitPaneArgs(SplitType splitMode) :
_SplitMode{ splitMode }, _SplitMode{ splitMode } {};
_argDescriptors(INIT_ARG_DESCRIPTORS(SPLIT_PANE_ARGS)) {};
SPLIT_PANE_ARGS(DECLARE_ARGS); SPLIT_PANE_ARGS(DECLARE_ARGS);
WINRT_PROPERTY(Model::INewContentArgs, ContentArgs, Model::NewTerminalArgs{}); WINRT_PROPERTY(Model::INewContentArgs, ContentArgs, Model::NewTerminalArgs{});
@ -752,35 +766,43 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation
h.write(SplitSize()); h.write(SplitSize());
return h.finalize(); return h.finalize();
} }
uint32_t GetArgCount() const uint32_t GetArgCount()
{ {
if (_ContentArgs) if (_ContentArgs)
{ {
if (const auto newTermArgs = _ContentArgs.try_as<NewTerminalArgs>()) if (const auto newTermArgs = _ContentArgs.try_as<NewTerminalArgs>())
{ {
return newTermArgs->GetArgCount() + gsl::narrow<uint32_t>(_argDescriptors.size()); return newTermArgs->GetArgCount() + gsl::narrow<uint32_t>(GetArgDescriptors().Size());
} }
} }
return gsl::narrow<uint32_t>(_argDescriptors.size()); return gsl::narrow<uint32_t>(GetArgDescriptors().Size());
} }
Model::ArgDescriptor GetArgDescriptorAt(uint32_t index) const winrt::Windows::Foundation::Collections::IVectorView<Model::ArgDescriptor> GetArgDescriptors()
{ {
const auto additionalArgCount = gsl::narrow<uint32_t>(_argDescriptors.size()); static const auto thisArgs = INIT_ARG_DESCRIPTORS(SPLIT_PANE_ARGS);
auto contentArgs = _ContentArgs.as<NewTerminalArgs>()->GetArgDescriptors();
// Merge into a new vector
std::vector<Model::ArgDescriptor> merged;
merged.reserve(thisArgs.Size() + contentArgs.Size());
for (const auto desc : thisArgs)
{
merged.push_back(desc);
}
for (const auto desc : contentArgs)
{
merged.push_back(desc);
}
return winrt::single_threaded_vector(std::move(merged)).GetView();
}
IInspectable GetArgAt(uint32_t index)
{
const auto additionalArgCount = gsl::narrow<uint32_t>(GetArgDescriptors().Size());
if (index < additionalArgCount) if (index < additionalArgCount)
{ {
return _argDescriptors.at(index); X_MACRO_INDEX_BASE();
}
else
{
return _ContentArgs.as<NewTerminalArgs>()->GetArgDescriptorAt(index - additionalArgCount);
}
}
IInspectable GetArgAt(uint32_t index) const
{
const auto additionalArgCount = gsl::narrow<uint32_t>(_argDescriptors.size());
if (index < additionalArgCount)
{
uint32_t curIndex{ 0 };
SPLIT_PANE_ARGS(GET_ARG_BY_INDEX); SPLIT_PANE_ARGS(GET_ARG_BY_INDEX);
} }
else else
@ -791,10 +813,10 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation
} }
void SetArgAt(uint32_t index, IInspectable value) void SetArgAt(uint32_t index, IInspectable value)
{ {
const auto additionalArgCount = gsl::narrow<uint32_t>(_argDescriptors.size()); const auto additionalArgCount = gsl::narrow<uint32_t>(GetArgDescriptors().Size());
if (index < additionalArgCount) if (index < additionalArgCount)
{ {
uint32_t curIndex{ 0 }; X_MACRO_INDEX_BASE();
SPLIT_PANE_ARGS(SET_ARG_BY_INDEX); SPLIT_PANE_ARGS(SET_ARG_BY_INDEX);
} }
else else
@ -802,9 +824,6 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation
_ContentArgs.as<NewTerminalArgs>()->SetArgAt(index - additionalArgCount, value); _ContentArgs.as<NewTerminalArgs>()->SetArgAt(index - additionalArgCount, value);
} }
} }
private:
const std::vector<ArgDescriptor> _argDescriptors;
}; };
struct NewWindowArgs : public NewWindowArgsT<NewWindowArgs> struct NewWindowArgs : public NewWindowArgsT<NewWindowArgs>
@ -856,7 +875,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation
h.write(ContentArgs()); h.write(ContentArgs());
return h.finalize(); return h.finalize();
} }
uint32_t GetArgCount() const uint32_t GetArgCount()
{ {
if (_ContentArgs) if (_ContentArgs)
{ {
@ -867,9 +886,9 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation
} }
return 0; return 0;
} }
Model::ArgDescriptor GetArgDescriptorAt(uint32_t index) const winrt::Windows::Foundation::Collections::IVectorView<Model::ArgDescriptor> GetArgDescriptors()
{ {
return _ContentArgs.as<NewTerminalArgs>()->GetArgDescriptorAt(index); return _ContentArgs.as<NewTerminalArgs>()->GetArgDescriptors();
} }
IInspectable GetArgAt(uint32_t index) const IInspectable GetArgAt(uint32_t index) const
{ {
@ -1019,11 +1038,11 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation
h.write(winrt::get_abi(_Actions)); h.write(winrt::get_abi(_Actions));
return h.finalize(); return h.finalize();
} }
uint32_t GetArgCount() const uint32_t GetArgCount()
{ {
return _Actions.Size(); return _Actions.Size();
} }
Model::ArgDescriptor GetArgDescriptorAt(uint32_t /*index*/) const winrt::Windows::Foundation::Collections::IVectorView<Model::ArgDescriptor> GetArgDescriptors()
{ {
return {}; return {};
} }

View File

@ -24,7 +24,7 @@ namespace Microsoft.Terminal.Settings.Model
interface IActionArgsDescriptorAccess interface IActionArgsDescriptorAccess
{ {
UInt32 GetArgCount(); UInt32 GetArgCount();
ArgDescriptor GetArgDescriptorAt(UInt32 index); Windows.Foundation.Collections.IVectorView<ArgDescriptor> GetArgDescriptors();
IInspectable GetArgAt(UInt32 index); IInspectable GetArgAt(UInt32 index);
void SetArgAt(UInt32 index, Object value); void SetArgAt(UInt32 index, Object value);
}; };

View File

@ -76,10 +76,10 @@ struct InitListPlaceholder
#define APPEND_ARG_DESCRIPTION(type, name, jsonKey, required, typeHint, ...) \ #define APPEND_ARG_DESCRIPTION(type, name, jsonKey, required, typeHint, ...) \
temp.push_back({ RS_(LOCALIZED_NAME(name)), L## #type, std::wstring_view(L## #required) != L"false", typeHint }); temp.push_back({ RS_(LOCALIZED_NAME(name)), L## #type, std::wstring_view(L## #required) != L"false", typeHint });
#define INIT_ARG_DESCRIPTORS(argsMacro) \ #define INIT_ARG_DESCRIPTORS(argsMacro) \
([&]() { \ ([]() -> winrt::Windows::Foundation::Collections::IVectorView<ArgDescriptor> { \
std::vector<ArgDescriptor> temp; \ std::vector<ArgDescriptor> temp; \
argsMacro(APPEND_ARG_DESCRIPTION) return temp; \ argsMacro(APPEND_ARG_DESCRIPTION) return winrt::single_threaded_vector(std::move(temp)).GetView(); \
}()) }())
// check each property in the Equals() method. You'll note there's a stray // check each property in the Equals() method. You'll note there's a stray
@ -88,22 +88,28 @@ struct InitListPlaceholder
#define EQUALS_ARGS(type, name, jsonKey, required, typeHint, ...) \ #define EQUALS_ARGS(type, name, jsonKey, required, typeHint, ...) \
&&(otherAsUs->_##name == _##name) &&(otherAsUs->_##name == _##name)
#define X_MACRO_INDEX_BASE() \
constexpr auto X_MACRO_INDEXED_BASE__ = __COUNTER__ - 1
#define X_MACRO_INDEX() \
(__COUNTER__ - X_MACRO_INDEXED_BASE__)
// getter and setter for each property by index // getter and setter for each property by index
#define GET_ARG_BY_INDEX(type, name, jsonKey, required, typeHint, ...) \ #define GET_ARG_BY_INDEX(type, name, jsonKey, required, typeHint, ...) \
if (index == curIndex++) \ if (index == X_MACRO_INDEX()) \
{ \ { \
if (_##name.has_value()) \ if (_##name.has_value()) \
{ \ { \
return winrt::box_value(_##name.value()); \ return winrt::box_value(_##name.value()); \
} \ } \
else \ else \
{ \ { \
return winrt::box_value(static_cast<type>(__VA_ARGS__)); \ return winrt::box_value(static_cast<type>(__VA_ARGS__)); \
} \ } \
} }
#define SET_ARG_BY_INDEX(type, name, jsonKey, required, typeHint, ...) \ #define SET_ARG_BY_INDEX(type, name, jsonKey, required, typeHint, ...) \
if (index == curIndex++) \ if (index == X_MACRO_INDEX()) \
{ \ { \
if (value) \ if (value) \
{ \ { \
@ -155,18 +161,15 @@ struct InitListPlaceholder
// * GlobalSummonArgs has the QuakeModeFromJson helper // * GlobalSummonArgs has the QuakeModeFromJson helper
#define ACTION_ARG_BODY(className, argsMacro) \ #define ACTION_ARG_BODY(className, argsMacro) \
className() : _argDescriptors(INIT_ARG_DESCRIPTORS(argsMacro)) {}; \ className() = default; \
\
className( \ className( \
argsMacro(CTOR_PARAMS) InitListPlaceholder = {}) : \ argsMacro(CTOR_PARAMS) InitListPlaceholder = {}) : \
argsMacro(CTOR_INIT) \ argsMacro(CTOR_INIT) \
_placeholder{}, \ _placeholder{} {}; \
_argDescriptors(INIT_ARG_DESCRIPTORS(argsMacro)) {}; \
argsMacro(DECLARE_ARGS); \ argsMacro(DECLARE_ARGS); \
\ \
private: \ private: \
InitListPlaceholder _placeholder; \ InitListPlaceholder _placeholder; \
const std::vector<ArgDescriptor> _argDescriptors; \
\ \
public: \ public: \
hstring GenerateName() const \ hstring GenerateName() const \
@ -214,56 +217,54 @@ public:
argsMacro(HASH_ARGS); \ argsMacro(HASH_ARGS); \
return h.finalize(); \ return h.finalize(); \
} \ } \
uint32_t GetArgCount() const \ uint32_t GetArgCount() \
{ \ { \
return gsl::narrow<uint32_t>(_argDescriptors.size()); \ return gsl::narrow<uint32_t>(GetArgDescriptors().Size()); \
} \ } \
ArgDescriptor GetArgDescriptorAt(uint32_t index) const \ winrt::Windows::Foundation::Collections::IVectorView<ArgDescriptor> GetArgDescriptors() \
{ \ { \
return _argDescriptors.at(index); \ static const auto descriptors = INIT_ARG_DESCRIPTORS(argsMacro); \
return descriptors; \
} \ } \
IInspectable GetArgAt(uint32_t index) const \ IInspectable GetArgAt(uint32_t index) const \
{ \ { \
uint32_t curIndex{ 0 }; \ X_MACRO_INDEX_BASE(); \
argsMacro(GET_ARG_BY_INDEX) return nullptr; \ argsMacro(GET_ARG_BY_INDEX) return nullptr; \
} \ } \
void SetArgAt(uint32_t index, IInspectable value) \ void SetArgAt(uint32_t index, IInspectable value) \
{ \ { \
uint32_t curIndex{ 0 }; \ X_MACRO_INDEX_BASE(); \
argsMacro(SET_ARG_BY_INDEX) \ argsMacro(SET_ARG_BY_INDEX) \
} }
#define PARTIAL_ACTION_ARG_BODY(className, argsMacro) \ #define PARTIAL_ACTION_ARG_BODY(className, argsMacro) \
className() : \ className() = default; \
_argDescriptors(INIT_ARG_DESCRIPTORS(argsMacro)) {}; \ className( \
\ argsMacro(CTOR_PARAMS) InitListPlaceholder = {}) : \
className( \ argsMacro(CTOR_INIT) \
argsMacro(CTOR_PARAMS) InitListPlaceholder = {}) : \ _placeholder{} {}; \
argsMacro(CTOR_INIT) \ argsMacro(DECLARE_ARGS); \
_placeholder{}, \ \
_argDescriptors(INIT_ARG_DESCRIPTORS(argsMacro)) {}; \ private: \
argsMacro(DECLARE_ARGS); \ InitListPlaceholder _placeholder; \
\ \
private: \ public: \
InitListPlaceholder _placeholder; \ uint32_t GetArgCount() \
const std::vector<ArgDescriptor> _argDescriptors; \ { \
\ return gsl::narrow<uint32_t>(GetArgDescriptors().Size()); \
public: \ } \
uint32_t GetArgCount() const \ winrt::Windows::Foundation::Collections::IVectorView<ArgDescriptor> GetArgDescriptors() \
{ \ { \
return gsl::narrow<uint32_t>(_argDescriptors.size()); \ static const auto descriptors = INIT_ARG_DESCRIPTORS(argsMacro); \
} \ return descriptors; \
ArgDescriptor GetArgDescriptorAt(uint32_t index) const \ } \
{ \ IInspectable GetArgAt(uint32_t index) const \
return _argDescriptors.at(index); \ { \
} \ X_MACRO_INDEX_BASE(); \
IInspectable GetArgAt(uint32_t index) const \ argsMacro(GET_ARG_BY_INDEX) return nullptr; \
{ \ } \
uint32_t curIndex{ 0 }; \ void SetArgAt(uint32_t index, IInspectable value) \
argsMacro(GET_ARG_BY_INDEX) return nullptr; \ { \
} \ X_MACRO_INDEX_BASE(); \
void SetArgAt(uint32_t index, IInspectable value) \ argsMacro(SET_ARG_BY_INDEX) \
{ \
uint32_t curIndex{ 0 }; \
argsMacro(SET_ARG_BY_INDEX) \
} }