diff --git a/src/libslic3r/Config.cpp b/src/libslic3r/Config.cpp index cac46d7108..7428c10fe7 100644 --- a/src/libslic3r/Config.cpp +++ b/src/libslic3r/Config.cpp @@ -326,17 +326,13 @@ ConfigOption* ConfigOptionDef::create_default_option() const return new ConfigOptionEnumGeneric(this->enum_keys_map, this->default_value->getInt()); if (type == coEnums) { - auto dft = this->default_value->clone(); - if (dft->nullable()) { - ConfigOptionEnumsGenericNullable *opt = dynamic_cast(this->default_value->clone()); - opt->keys_map = this->enum_keys_map; - return opt; - } else { - ConfigOptionEnumsGeneric *opt = dynamic_cast(this->default_value->clone()); - opt->keys_map = this->enum_keys_map; - return opt; - } - delete dft; + // Enum list defaults are built without a keys map, which the copy needs to deserialize and serialize names. + ConfigOption *opt = this->default_value->clone(); + if (auto *nullable_enums = dynamic_cast(opt)) + nullable_enums->keys_map = this->enum_keys_map; + else if (auto *enums = dynamic_cast(opt)) + enums->keys_map = this->enum_keys_map; + return opt; } return this->default_value->clone(); diff --git a/tests/libslic3r/test_config.cpp b/tests/libslic3r/test_config.cpp index 1b48c9551e..da8c7195fb 100644 --- a/tests/libslic3r/test_config.cpp +++ b/tests/libslic3r/test_config.cpp @@ -1477,3 +1477,21 @@ TEST_CASE("A static config applied onto a config of another type falls back to a dynamic.apply(region); CHECK(dynamic.opt_serialize("sparse_infill_pattern") == "gyroid"); } + +TEST_CASE("Default options of enum lists get their definition's keys map", "[Config]") +{ + size_t enum_lists = 0; + for (const auto &[key, def] : print_config_def.options) { + if (def.type != coEnums || !def.default_value) + continue; + INFO(key); + const std::unique_ptr opt(def.create_default_option()); + CHECK(*opt == *def.default_value); + const auto *nullable_enums = dynamic_cast(opt.get()); + const auto *enums = dynamic_cast(opt.get()); + REQUIRE((nullable_enums != nullptr) != (enums != nullptr)); + CHECK((nullable_enums != nullptr ? nullable_enums->keys_map : enums->keys_map) == def.enum_keys_map); + ++enum_lists; + } + CHECK(enum_lists > 0); +}