Merge pull request #61820 from pfertyk/issue-61604-is-plugin-enabled-by-name

This commit is contained in:
Rémi Verschelde 2022-06-16 09:59:07 +02:00 committed by GitHub
commit ac9cfd0c2d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 25 additions and 15 deletions

View File

@ -3299,33 +3299,39 @@ void EditorNode::_update_addon_config() {
} }
void EditorNode::set_addon_plugin_enabled(const String &p_addon, bool p_enabled, bool p_config_changed) { void EditorNode::set_addon_plugin_enabled(const String &p_addon, bool p_enabled, bool p_config_changed) {
ERR_FAIL_COND(p_enabled && addon_name_to_plugin.has(p_addon)); String addon_path = p_addon;
ERR_FAIL_COND(!p_enabled && !addon_name_to_plugin.has(p_addon));
if (!addon_path.begins_with("res://")) {
addon_path = "res://addons/" + addon_path + "/plugin.cfg";
}
ERR_FAIL_COND(p_enabled && addon_name_to_plugin.has(addon_path));
ERR_FAIL_COND(!p_enabled && !addon_name_to_plugin.has(addon_path));
if (!p_enabled) { if (!p_enabled) {
EditorPlugin *addon = addon_name_to_plugin[p_addon]; EditorPlugin *addon = addon_name_to_plugin[addon_path];
remove_editor_plugin(addon, p_config_changed); remove_editor_plugin(addon, p_config_changed);
memdelete(addon); memdelete(addon);
addon_name_to_plugin.erase(p_addon); addon_name_to_plugin.erase(addon_path);
_update_addon_config(); _update_addon_config();
return; return;
} }
Ref<ConfigFile> cf; Ref<ConfigFile> cf;
cf.instantiate(); cf.instantiate();
if (!DirAccess::exists(p_addon.get_base_dir())) { if (!DirAccess::exists(addon_path.get_base_dir())) {
_remove_plugin_from_enabled(p_addon); _remove_plugin_from_enabled(addon_path);
WARN_PRINT("Addon '" + p_addon + "' failed to load. No directory found. Removing from enabled plugins."); WARN_PRINT("Addon '" + addon_path + "' failed to load. No directory found. Removing from enabled plugins.");
return; return;
} }
Error err = cf->load(p_addon); Error err = cf->load(addon_path);
if (err != OK) { if (err != OK) {
show_warning(vformat(TTR("Unable to enable addon plugin at: '%s' parsing of config failed."), p_addon)); show_warning(vformat(TTR("Unable to enable addon plugin at: '%s' parsing of config failed."), addon_path));
return; return;
} }
if (!cf->has_section_key("plugin", "script")) { if (!cf->has_section_key("plugin", "script")) {
show_warning(vformat(TTR("Unable to find script field for addon plugin at: '%s'."), p_addon)); show_warning(vformat(TTR("Unable to find script field for addon plugin at: '%s'."), addon_path));
return; return;
} }
@ -3334,7 +3340,7 @@ void EditorNode::set_addon_plugin_enabled(const String &p_addon, bool p_enabled,
// Only try to load the script if it has a name. Else, the plugin has no init script. // Only try to load the script if it has a name. Else, the plugin has no init script.
if (script_path.length() > 0) { if (script_path.length() > 0) {
script_path = p_addon.get_base_dir().plus_file(script_path); script_path = addon_path.get_base_dir().plus_file(script_path);
script = ResourceLoader::load(script_path); script = ResourceLoader::load(script_path);
if (script.is_null()) { if (script.is_null()) {
@ -3344,8 +3350,8 @@ void EditorNode::set_addon_plugin_enabled(const String &p_addon, bool p_enabled,
// Errors in the script cause the base_type to be an empty StringName. // Errors in the script cause the base_type to be an empty StringName.
if (script->get_instance_base_type() == StringName()) { if (script->get_instance_base_type() == StringName()) {
show_warning(vformat(TTR("Unable to load addon script from path: '%s'. This might be due to a code error in that script.\nDisabling the addon at '%s' to prevent further errors."), script_path, p_addon)); show_warning(vformat(TTR("Unable to load addon script from path: '%s'. This might be due to a code error in that script.\nDisabling the addon at '%s' to prevent further errors."), script_path, addon_path));
_remove_plugin_from_enabled(p_addon); _remove_plugin_from_enabled(addon_path);
return; return;
} }
@ -3363,14 +3369,18 @@ void EditorNode::set_addon_plugin_enabled(const String &p_addon, bool p_enabled,
EditorPlugin *ep = memnew(EditorPlugin); EditorPlugin *ep = memnew(EditorPlugin);
ep->set_script(script); ep->set_script(script);
addon_name_to_plugin[p_addon] = ep; addon_name_to_plugin[addon_path] = ep;
add_editor_plugin(ep, p_config_changed); add_editor_plugin(ep, p_config_changed);
_update_addon_config(); _update_addon_config();
} }
bool EditorNode::is_addon_plugin_enabled(const String &p_addon) const { bool EditorNode::is_addon_plugin_enabled(const String &p_addon) const {
return addon_name_to_plugin.has(p_addon); if (p_addon.begins_with("res://")) {
return addon_name_to_plugin.has(p_addon);
}
return addon_name_to_plugin.has("res://addons/" + p_addon + "/plugin.cfg");
} }
void EditorNode::_remove_edited_scene(bool p_change_tab) { void EditorNode::_remove_edited_scene(bool p_change_tab) {