diff --git a/addons/mod_loader/api/log.gd b/addons/mod_loader/api/log.gd index f9fedc8f..d02b2495 100644 --- a/addons/mod_loader/api/log.gd +++ b/addons/mod_loader/api/log.gd @@ -43,8 +43,13 @@ static var verbosity: VERBOSITY_LEVEL = VERBOSITY_LEVEL.DEBUG ## Array of mods that should be ignored when logging messages (contains mod IDs as strings) static var ignored_mods: Array[String] = [] -## Highlighting color for hint type log messages -static var hint_color := Color("#70bafa") +# NOTE: default values which get replaced later by `_configure_logger` +static var warning_color := Color("#ffde66") +static var success_color := Color("#5d8c3f") +static var info_color := Color("#70bafa") +static var hint_color := Color("#b293fa") +static var debug_color := Color("#d4d4d4") +static var debug_bold := true ## This Sub-Class represents a log entry in ModLoader. class ModLoaderLogEntry: @@ -99,9 +104,15 @@ class ModLoaderLogEntry: ## Get the prefix string for the log entry, including the log type and mod name.[br] ## [br] + ## [b]Parameters:[/b][br] + ## [param exclude_type] ([bool]): (Optional) If true, the log type (e.g., DEBUG, WARN) will be excluded from the prefix. Default is false.[br] + ## [br] ## [b]Returns:[/b] [String] - func get_prefix() -> String: - return "%s %s: " % [type.to_upper(), mod_name] + func get_prefix(exclude_type: bool = false) -> String: + return "%s%s: " % [ + "" if exclude_type else type.to_upper() + " ", + mod_name + ] ## Generate an MD5 hash of the log entry (prefix + message).[br] @@ -391,6 +402,17 @@ static func get_all_entries_as_string(log_entries: Array) -> Array: # Internal log functions # ============================================================================= +static func _print_rich(prefix: String, message: String, color: Color, bold := true): + if OS.has_feature("editor"): + var prefix_text := "[b]%s[/b]" % prefix if bold else prefix + print_rich("[color=%s]%s[/color]%s" % [ + color.to_html(false), + prefix_text, + message + ]) + else: + print(prefix + message) + static func _log(message: String, mod_name: String, log_type: String = "info", only_once := false) -> void: if _is_mod_name_ignored(mod_name): return @@ -422,25 +444,32 @@ static func _log(message: String, mod_name: String, log_type: String = "info", o _write_to_log_file(JSON.stringify(get_stack(), " ")) assert(false, message) "error": - printerr(log_entry.get_prefix() + message) + if OS.has_feature("editor"): + printerr(log_entry.get_prefix(true) + message) + else: + printerr(log_entry.get_prefix() + message) push_error(message) _write_to_log_file(log_entry.get_entry()) "warning": if verbosity >= VERBOSITY_LEVEL.WARNING: - print(log_entry.get_prefix() + message) + _print_rich(log_entry.get_prefix(), message, warning_color) push_warning(message) _write_to_log_file(log_entry.get_entry()) - "info", "success": + "success": + if verbosity >= VERBOSITY_LEVEL.INFO: + _print_rich(log_entry.get_prefix(), message, success_color) + _write_to_log_file(log_entry.get_entry()) + "info": if verbosity >= VERBOSITY_LEVEL.INFO: - print(log_entry.get_prefix() + message) + _print_rich(log_entry.get_prefix(), message, info_color) _write_to_log_file(log_entry.get_entry()) "debug": if verbosity >= VERBOSITY_LEVEL.DEBUG: - print(log_entry.get_prefix() + message) + _print_rich(log_entry.get_prefix(), message, debug_color, debug_bold) _write_to_log_file(log_entry.get_entry()) "hint": if OS.has_feature("editor") and verbosity >= VERBOSITY_LEVEL.DEBUG: - print_rich("[color=%s]%s[/color]" % [hint_color.to_html(false), log_entry.get_prefix() + message]) + _print_rich(log_entry.get_prefix(), message, hint_color) static func _is_mod_name_ignored(mod_name: String) -> bool: diff --git a/addons/mod_loader/mod_loader_store.gd b/addons/mod_loader/mod_loader_store.gd index 5bc7bebd..fac47969 100644 --- a/addons/mod_loader/mod_loader_store.gd +++ b/addons/mod_loader/mod_loader_store.gd @@ -227,4 +227,9 @@ func _update_ml_options_from_cli_args() -> void: func _configure_logger() -> void: ModLoaderLog.verbosity = ml_options.log_level ModLoaderLog.ignored_mods = ml_options.ignored_mod_names_in_log + ModLoaderLog.warning_color = ml_options.warning_color + ModLoaderLog.success_color = ml_options.success_color + ModLoaderLog.info_color = ml_options.info_color ModLoaderLog.hint_color = ml_options.hint_color + ModLoaderLog.debug_color = ml_options.debug_color + ModLoaderLog.debug_bold = ml_options.debug_bold diff --git a/addons/mod_loader/resources/options_profile.gd b/addons/mod_loader/resources/options_profile.gd index f1982f48..2ae870c7 100644 --- a/addons/mod_loader/resources/options_profile.gd +++ b/addons/mod_loader/resources/options_profile.gd @@ -55,7 +55,18 @@ enum VERSION_VALIDATION { ## [code]ModLoader:Dependency[/code] - ignore the exact name [br] ## [code]ModLoader:*[/code] - ignore all beginning with this name [br] @export var ignored_mod_names_in_log: Array[String] = [] -@export var hint_color := Color("#70bafa") +## Highlighting color for warning type log messages +@export var warning_color := Color("#ffde66") +## Highlighting color for success type log messages +@export var success_color := Color("#5d8c3f") +## Highlighting color for info type log messages +@export var info_color := Color("#70bafa") +## Highlighting color for hint type log messages +@export var hint_color := Color("#b293fa") +## Highlighting color for debug type log messages +@export var debug_color := Color("#d4d4d4") +## Highlight debug log prefixes with bold formatting +@export var debug_bold := true @export_group("Game Data") ## Steam app id, can be found in the steam page url