diff --git a/source/blender/editors/space_node/node_draw.cc b/source/blender/editors/space_node/node_draw.cc index e101f0f986c..4cab0f221b3 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" @@ -1298,6 +1299,16 @@ void node_socket_color_get(const bContext &C, sock.typeinfo->draw_color((bContext *)&C, &ptr, &node_ptr, r_color); } +static StringRef find_menu_item_name(const bke::RuntimeNodeEnumItems &menu, const int identifier) +{ + const bke::RuntimeNodeEnumItem *item = std::find_if( + menu.items.begin(), menu.items.end(), [&](const bke::RuntimeNodeEnumItem &item) -> bool { + return item.identifier == identifier; + }); + BLI_assert(item != menu.items.end()); + return item->name; +} + static void create_inspection_string_for_generic_value(const bNodeSocket &socket, const GPointer value, std::stringstream &ss) @@ -1335,12 +1346,30 @@ 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) { + /* Currently there is no implicit conversion from any scalar type to menu item index. */ + if (value_type != socket_type) { + return; + } + const bke::RuntimeNodeEnumItems *menu_items = + socket.default_value_typed()->enum_items; + if (menu_items == nullptr) { + ss << fmt::format(TIP_("\"\" (Menu)")); + return; + } + const int identifier = *value.get(); + const StringRef item_name = find_menu_item_name(*menu_items, identifier); + ss << fmt::format(TIP_("{} (Menu)"), 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)) { return; } } + BUFFER_FOR_CPP_TYPE_VALUE(socket_type, socket_value); /* This will just copy the value if the types are equal. */ convert.convert_to_uninitialized(value_type, socket_type, buffer, socket_value); diff --git a/source/blender/nodes/intern/geometry_nodes_log.cc b/source/blender/nodes/intern/geometry_nodes_log.cc index 659728cffcd..34943fbf862 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 {