diff --git a/core/extension/gdextension.cpp b/core/extension/gdextension.cpp index 7cba5cb161ef..c402b732a10c 100644 --- a/core/extension/gdextension.cpp +++ b/core/extension/gdextension.cpp @@ -614,6 +614,15 @@ void GDExtension::_register_extension_class_signal(GDExtensionClassLibraryPtr p_ ClassDB::add_signal(class_name, s); } +void GDExtension::_set_extension_class_icon(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringPtr p_icon_path) { + GDExtension *self = reinterpret_cast(p_library); + + StringName class_name = *reinterpret_cast(p_class_name); + String icon_path = *reinterpret_cast(p_icon_path); + + self->class_icon_paths[class_name] = icon_path; +} + void GDExtension::_unregister_extension_class(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name) { GDExtension *self = reinterpret_cast(p_library); @@ -779,6 +788,7 @@ void GDExtension::initialize_gdextensions() { register_interface_function("classdb_register_extension_class_property_group", (GDExtensionInterfaceFunctionPtr)&GDExtension::_register_extension_class_property_group); register_interface_function("classdb_register_extension_class_property_subgroup", (GDExtensionInterfaceFunctionPtr)&GDExtension::_register_extension_class_property_subgroup); register_interface_function("classdb_register_extension_class_signal", (GDExtensionInterfaceFunctionPtr)&GDExtension::_register_extension_class_signal); + register_interface_function("classdb_set_extension_class_icon", (GDExtensionInterfaceFunctionPtr)&GDExtension::_set_extension_class_icon); register_interface_function("classdb_unregister_extension_class", (GDExtensionInterfaceFunctionPtr)&GDExtension::_unregister_extension_class); register_interface_function("get_library_path", (GDExtensionInterfaceFunctionPtr)&GDExtension::_get_library_path); } diff --git a/core/extension/gdextension.h b/core/extension/gdextension.h index 706bc7e18961..cf516eb013ba 100644 --- a/core/extension/gdextension.h +++ b/core/extension/gdextension.h @@ -90,6 +90,7 @@ class GDExtension : public Resource { static void _register_extension_class_property_group(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_group_name, GDExtensionConstStringNamePtr p_prefix); static void _register_extension_class_property_subgroup(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_subgroup_name, GDExtensionConstStringNamePtr p_prefix); static void _register_extension_class_signal(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_signal_name, const GDExtensionPropertyInfo *p_argument_info, GDExtensionInt p_argument_count); + static void _set_extension_class_icon(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringPtr p_icon_path); static void _unregister_extension_class(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name); static void _get_library_path(GDExtensionClassLibraryPtr p_library, GDExtensionStringPtr r_path); diff --git a/core/extension/gdextension_interface.h b/core/extension/gdextension_interface.h index 374dbfd07115..b5b22ac5adf2 100644 --- a/core/extension/gdextension_interface.h +++ b/core/extension/gdextension_interface.h @@ -2988,6 +2988,18 @@ typedef void (*GDExtensionInterfaceClassdbRegisterExtensionClassPropertySubgroup */ typedef void (*GDExtensionInterfaceClassdbRegisterExtensionClassSignal)(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_signal_name, const GDExtensionPropertyInfo *p_argument_info, GDExtensionInt p_argument_count); +/** + * @name classdb_set_extension_class_icon + * @since 4.4 + * + * Sets the icon of an extension class in the ClassDB. + * + * @param p_library A pointer the library received by the GDExtension's entry point function. + * @param p_class_name A pointer to a StringName with the class name. + * @param p_icon_path A pointer to a String with the path to the icon image. + */ +typedef void (*GDExtensionInterfaceClassdbSetExtensionClassIcon)(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringPtr p_icon_path); + /** * @name classdb_unregister_extension_class * @since 4.1 diff --git a/core/extension/gdextension_manager.cpp b/core/extension/gdextension_manager.cpp index fff938858fd3..0f02882c9120 100644 --- a/core/extension/gdextension_manager.cpp +++ b/core/extension/gdextension_manager.cpp @@ -210,6 +210,10 @@ void GDExtensionManager::initialize_extensions(GDExtension::InitializationLevel ERR_FAIL_COND(int32_t(p_level) - 1 != level); for (KeyValue> &E : gdextension_map) { E.value->initialize_library(p_level); + + for (const KeyValue &kv : E.value->class_icon_paths) { + gdextension_class_icon_paths[kv.key] = kv.value; + } } level = p_level; }