diff --git a/src/cascadia/TerminalSettingsEditor/ActionsViewModel.cpp b/src/cascadia/TerminalSettingsEditor/ActionsViewModel.cpp index c0cad9b90a..33f0844472 100644 --- a/src/cascadia/TerminalSettingsEditor/ActionsViewModel.cpp +++ b/src/cascadia/TerminalSettingsEditor/ActionsViewModel.cpp @@ -36,61 +36,72 @@ inline const std::set enumList; \ - const auto mappings = winrt::Microsoft::Terminal::Settings::Model::EnumMappings::enumMappingsName(); \ - enumType unboxedValue; \ - if (_Value) \ - { \ - unboxedValue = unbox_value(_Value); \ - } \ - for (const auto [enumKey, enumValue] : mappings) \ - { \ - const auto enumName = LocalizedNameForEnumName(resourceSectionAndType, enumKey, resourceProperty); \ - auto entry = winrt::make(enumName, winrt::box_value(enumValue)); \ - enumList.emplace_back(entry); \ - if (_Value && unboxedValue == enumValue) \ - { \ - _EnumValue = entry; \ - } \ - } \ - std::sort(enumList.begin(), enumList.end(), EnumEntryReverseComparator()); \ - _EnumList = winrt::single_threaded_observable_vector(std::move(enumList)); \ - if (!_EnumValue) \ - { \ - _EnumValue = _EnumList.GetAt(0); \ +#define INITIALIZE_ENUM_LIST_AND_VALUE(enumMappingsName, enumType, resourceSectionAndType, resourceProperty) \ + std::vector enumList; \ + const auto mappings = winrt::Microsoft::Terminal::Settings::Model::EnumMappings::enumMappingsName(); \ + std::unordered_set addedEnums; \ + enumType unboxedValue; \ + if (_Value) \ + { \ + unboxedValue = unbox_value(_Value); \ + } \ + for (const auto [enumKey, enumValue] : mappings) \ + { \ + if (!addedEnums.contains(enumValue)) \ + { \ + const auto enumName = LocalizedNameForEnumName(resourceSectionAndType, enumKey, resourceProperty); \ + auto entry = winrt::make(enumName, winrt::box_value(enumValue)); \ + enumList.emplace_back(entry); \ + if (_Value && unboxedValue == enumValue) \ + { \ + _EnumValue = entry; \ + } \ + addedEnums.emplace(enumValue); \ + } \ + } \ + std::sort(enumList.begin(), enumList.end(), EnumEntryReverseComparator()); \ + _EnumList = winrt::single_threaded_observable_vector(std::move(enumList)); \ + if (!_EnumValue) \ + { \ + _EnumValue = _EnumList.GetAt(0); \ } -#define INITIALIZE_NULLABLE_ENUM_LIST_AND_VALUE(enumMappingsName, enumType, resourceSectionAndType, resourceProperty) \ - std::vector enumList; \ - const auto mappings = winrt::Microsoft::Terminal::Settings::Model::EnumMappings::enumMappingsName(); \ - enumType unboxedValue; \ - auto nullEntry = winrt::make(RS_(L"Actions_NullEnumValue"), nullptr); \ - if (_Value) \ - { \ - unboxedValue = unbox_value(_Value); \ - } \ - else \ - { \ - _EnumValue = nullEntry; \ - } \ - for (const auto [enumKey, enumValue] : mappings) \ - { \ - const auto enumName = LocalizedNameForEnumName(resourceSectionAndType, enumKey, resourceProperty); \ - auto entry = winrt::make(enumName, winrt::box_value(enumValue)); \ - enumList.emplace_back(entry); \ - if (_Value && unboxedValue == enumValue) \ - { \ - _EnumValue = entry; \ - } \ - } \ - std::sort(enumList.begin(), enumList.end(), EnumEntryReverseComparator()); \ - enumList.emplace_back(nullEntry); \ +#define INITIALIZE_NULLABLE_ENUM_LIST_AND_VALUE(enumMappingsName, enumType, resourceSectionAndType, resourceProperty) \ + std::vector enumList; \ + const auto mappings = winrt::Microsoft::Terminal::Settings::Model::EnumMappings::enumMappingsName(); \ + std::unordered_set addedEnums; \ + enumType unboxedValue; \ + auto nullEntry = winrt::make(RS_(L"Actions_NullEnumValue"), nullptr); \ + if (_Value) \ + { \ + unboxedValue = unbox_value(_Value); \ + } \ + else \ + { \ + _EnumValue = nullEntry; \ + } \ + for (const auto [enumKey, enumValue] : mappings) \ + { \ + if (!addedEnums.contains(enumValue)) \ + { \ + const auto enumName = LocalizedNameForEnumName(resourceSectionAndType, enumKey, resourceProperty); \ + auto entry = winrt::make(enumName, winrt::box_value(enumValue)); \ + enumList.emplace_back(entry); \ + if (_Value && unboxedValue == enumValue) \ + { \ + _EnumValue = entry; \ + } \ + addedEnums.emplace(enumValue); \ + } \ + } \ + std::sort(enumList.begin(), enumList.end(), EnumEntryReverseComparator()); \ + enumList.emplace_back(nullEntry); \ _EnumList = winrt::single_threaded_observable_vector(std::move(enumList)); #define INITIALIZE_FLAG_LIST_AND_VALUE(enumMappingsName, enumType, resourceSectionAndType, resourceProperty) \ std::vector flagList; \ const auto mappings = winrt::Microsoft::Terminal::Settings::Model::EnumMappings::enumMappingsName(); \ + std::unordered_set addedEnums; \ enumType unboxedValue{ 0 }; \ if (_Value) \ { \ @@ -98,7 +109,7 @@ inline const std::set()); \ @@ -122,6 +134,7 @@ inline const std::set flagList; \ const auto mappings = winrt::Microsoft::Terminal::Settings::Model::EnumMappings::enumMappingsName(); \ + std::unordered_set addedEnums; \ enumType unboxedValue{ 0 }; \ auto nullEntry = winrt::make(RS_(L"Actions_NullEnumValue"), nullptr, true); \ if (_Value) \ @@ -134,7 +147,7 @@ inline const std::set()); \