diff --git a/source/blender/blenkernel/BKE_node_enum.hh b/source/blender/blenkernel/BKE_node_enum.hh index a1c3a5df97e..36729c80e94 100644 --- a/source/blender/blenkernel/BKE_node_enum.hh +++ b/source/blender/blenkernel/BKE_node_enum.hh @@ -38,6 +38,8 @@ struct RuntimeNodeEnumItem { struct RuntimeNodeEnumItems : ImplicitSharingMixin { Vector items; + const RuntimeNodeEnumItem *find_item_by_identifier(int identifier) const; + void delete_self() override { delete this; diff --git a/source/blender/blenkernel/intern/node_enum_definition.cc b/source/blender/blenkernel/intern/node_enum_definition.cc index 8246384432f..c57e85ec0e4 100644 --- a/source/blender/blenkernel/intern/node_enum_definition.cc +++ b/source/blender/blenkernel/intern/node_enum_definition.cc @@ -26,3 +26,18 @@ blender::MutableSpan NodeEnumDefinition::items() { return {this->items_array, this->items_num}; } + +namespace blender::bke { + +const RuntimeNodeEnumItem *RuntimeNodeEnumItems::find_item_by_identifier( + const int identifier) const +{ + for (const RuntimeNodeEnumItem &item : this->items) { + if (item.identifier == identifier) { + return &item; + } + } + return nullptr; +} + +} // namespace blender::bke diff --git a/source/blender/editors/space_node/node_draw.cc b/source/blender/editors/space_node/node_draw.cc index 386754d0a35..66286e0894f 100644 --- a/source/blender/editors/space_node/node_draw.cc +++ b/source/blender/editors/space_node/node_draw.cc @@ -42,6 +42,7 @@ #include "BKE_lib_id.hh" #include "BKE_main.hh" #include "BKE_node.hh" +#include "BKE_node_enum.hh" #include "BKE_node_runtime.hh" #include "BKE_node_tree_update.hh" #include "BKE_node_tree_zones.hh" @@ -1335,6 +1336,28 @@ static void create_inspection_string_for_generic_value(const bNodeSocket &socket } const CPPType &socket_type = *socket.typeinfo->base_cpp_type; + + if (socket.type == SOCK_MENU) { + if (!value_type.is()) { + return; + } + const int item_identifier = *static_cast(buffer); + const auto *socket_storage = socket.default_value_typed(); + if (!socket_storage->enum_items) { + return; + } + if (socket_storage->has_conflict()) { + return; + } + const bke::RuntimeNodeEnumItem *enum_item = + socket_storage->enum_items->find_item_by_identifier(item_identifier); + if (!enum_item) { + return; + } + ss << fmt::format(TIP_("{} (Menu)"), enum_item->name); + return; + } + const bke::DataTypeConversions &convert = bke::get_implicit_type_conversions(); if (value_type != socket_type) { if (!convert.is_convertible(value_type, socket_type)) { diff --git a/source/blender/nodes/intern/geometry_nodes_log.cc b/source/blender/nodes/intern/geometry_nodes_log.cc index 6d4d0ed808f..74335410407 100644 --- a/source/blender/nodes/intern/geometry_nodes_log.cc +++ b/source/blender/nodes/intern/geometry_nodes_log.cc @@ -7,7 +7,6 @@ #include "BKE_compute_contexts.hh" #include "BKE_curves.hh" -#include "BKE_node_enum.hh" #include "BKE_node_runtime.hh" #include "BKE_node_socket_value.hh" @@ -178,16 +177,6 @@ void GeoTreeLogger::log_value(const bNode &node, const bNodeSocket &socket, cons store_logged_value(this->allocator->construct(GMutablePointer{type, buffer})); }; - auto log_menu_value = [&](Span enum_items, const int identifier) { - for (const bke::RuntimeNodeEnumItem &item : enum_items) { - if (item.identifier == identifier) { - log_generic_value(CPPType::get(), &item.name); - return; - } - } - log_generic_value(CPPType::get(), &identifier); - }; - if (type.is()) { const bke::GeometrySet &geometry = *value.get(); store_logged_value(this->allocator->construct(geometry)); @@ -201,20 +190,7 @@ void GeoTreeLogger::log_value(const bNode &node, const bNodeSocket &socket, cons else { value_variant.convert_to_single(); const GPointer value = value_variant.get_single_ptr(); - if (socket.type == SOCK_MENU) { - const bNodeSocketValueMenu &default_value = - *socket.default_value_typed(); - if (default_value.enum_items) { - const int identifier = *value.get(); - log_menu_value(default_value.enum_items->items, identifier); - } - else { - log_generic_value(*value.type(), value.get()); - } - } - else { - log_generic_value(*value.type(), value.get()); - } + log_generic_value(*value.type(), value.get()); } } else {