Skip to content

Commit

Permalink
GDExtension: Add method to set the class icon
Browse files Browse the repository at this point in the history
Allows GDExtensions to set the icon of a class programatically, which is useful for extensions that don't use a `.gdextension` file.
  • Loading branch information
raulsntos committed Oct 12, 2024
1 parent 92e51fc commit a8a3145
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 0 deletions.
10 changes: 10 additions & 0 deletions core/extension/gdextension.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<GDExtension *>(p_library);

StringName class_name = *reinterpret_cast<const StringName *>(p_class_name);
String icon_path = *reinterpret_cast<const String *>(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<GDExtension *>(p_library);

Expand Down Expand Up @@ -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);
}
Expand Down
1 change: 1 addition & 0 deletions core/extension/gdextension.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
12 changes: 12 additions & 0 deletions core/extension/gdextension_interface.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 4 additions & 0 deletions core/extension/gdextension_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,10 @@ void GDExtensionManager::initialize_extensions(GDExtension::InitializationLevel
ERR_FAIL_COND(int32_t(p_level) - 1 != level);
for (KeyValue<String, Ref<GDExtension>> &E : gdextension_map) {
E.value->initialize_library(p_level);

for (const KeyValue<String, String> &kv : E.value->class_icon_paths) {
gdextension_class_icon_paths[kv.key] = kv.value;
}
}
level = p_level;
}
Expand Down

0 comments on commit a8a3145

Please sign in to comment.