133 lines
4.2 KiB
GDScript
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.")
|