MagicNStuff/source/addons/panku_console/plugin.gd
2025-02-25 22:07:11 +01:00

133 lines
4.2 KiB
GDScript

@tool
class_name PankuConsolePlugin
extends EditorPlugin
const SINGLETON_NAME = "Panku"
const SINGLETON_PATH = "res://addons/panku_console/console.tscn"
const SINGLETON_OPTION = "autoload/" + SINGLETON_NAME
const INITIAL_DEFAULT_CONFIG_FILE_PATH = "res://addons/panku_console/default_panku_config.cfg"
const CONFIG_SECTION = "panku"
const OPTIONS = {
# See https://github.com/Ark2000/PankuConsole/issues/170
DISABLE_ON_RELEASE = 'disable_on_release',
# See https://github.com/Ark2000/PankuConsole/issues/173
CUSTOM_DEFAULT_CONFIG = 'custom_default_config',
}
var exporter: PankuExporter
# Custom export plugin to automatically disable console in release builds
class PankuExporter extends EditorExportPlugin:
const NAME = "Panku"
var owner: EditorPlugin
var need_restore_singleton: bool
func _get_name() -> String:
# Have no clue where this name will be used
# It just should be implemented according the docs
return NAME
func _export_begin(_features: PackedStringArray, is_debug: bool, _path: String, _flags: int) -> void:
need_restore_singleton = false
var disable_activated: bool = ProjectSettings.get_setting(owner.panku_option(OPTIONS.DISABLE_ON_RELEASE))
if not is_debug and disable_activated:
need_restore_singleton = ProjectSettings.has_setting(SINGLETON_OPTION)
owner.safe_remove_singleton()
func _export_end() -> void:
if need_restore_singleton:
owner.safe_add_singleton()
# A helper function to add custom project settings
# See https://dfaction.net/handling-custom-project-settings-using-gdscript/
static func add_custom_project_setting(name: String, default_value, type: int, hint: int = PROPERTY_HINT_NONE, hint_string: String = "") -> void:
if ProjectSettings.has_setting(name): return
var setting_info: Dictionary = {
"name": name,
"type": type,
"hint": hint,
"hint_string": hint_string
}
ProjectSettings.set_setting(name, default_value)
ProjectSettings.add_property_info(setting_info)
ProjectSettings.set_initial_value(name, default_value)
ProjectSettings.set_as_basic(name, true)
# Full option name in project settings.
static func panku_option(option: String) -> String:
return CONFIG_SECTION + "/" + option
static func get_custom_default_config_path() -> String:
return ProjectSettings.get_setting(panku_option(OPTIONS.CUSTOM_DEFAULT_CONFIG), INITIAL_DEFAULT_CONFIG_FILE_PATH)
static func is_custom_default_config_exists() -> bool:
return FileAccess.file_exists(get_custom_default_config_path())
# Adding singleton with preliminary check to avoid any conflicts.
func safe_add_singleton() -> void:
if not ProjectSettings.has_setting(SINGLETON_OPTION):
add_autoload_singleton(SINGLETON_NAME, SINGLETON_PATH)
# Removing singleton with preliminary check to avoid any conflicts.
func safe_remove_singleton() -> void:
if ProjectSettings.has_setting(SINGLETON_OPTION):
remove_autoload_singleton(SINGLETON_NAME)
func create_setting() -> void:
# Seems we can't add descriptions to custom settings now.
# Disable Panku Console in release builds
add_custom_project_setting(
panku_option(OPTIONS.DISABLE_ON_RELEASE),
false,
TYPE_BOOL
)
# Path to the custom `res://` path default config file, useful if you are going to keep panku console in release builds.
add_custom_project_setting(
panku_option(OPTIONS.CUSTOM_DEFAULT_CONFIG),
INITIAL_DEFAULT_CONFIG_FILE_PATH,
TYPE_STRING,
PROPERTY_HINT_FILE,
"*.cfg"
)
var error:int = ProjectSettings.save()
if error != OK:
push_error("Encountered error %d when saving project settings." % error)
func _enter_tree() -> void:
# See https://github.com/godotengine/godot/issues/73525
exporter = (PankuExporter as Variant).new()
exporter.owner = self
add_export_plugin(exporter)
create_setting()
safe_add_singleton()
print("[Panku Console] initialized! Project page: https://github.com/Ark2000/PankuConsole")
if not is_custom_default_config_exists():
push_warning("[Panku Console] Default config file not found. Using code-level default config.")
func _exit_tree() -> void:
remove_export_plugin(exporter)
func _disable_plugin() -> void:
safe_remove_singleton()
for option in OPTIONS.values():
var opt: String = panku_option(option)
if ProjectSettings.has_setting(opt):
ProjectSettings.clear(opt)
ProjectSettings.save()
print("[Panku Console] disabled.")