89 lines
2.6 KiB
GDScript
89 lines
2.6 KiB
GDScript
class_name LogsRich
|
|
extends RichTextLabel
|
|
|
|
enum LogLevel {
|
|
INFO,
|
|
WARNING,
|
|
ERROR,
|
|
DEBUG
|
|
}
|
|
|
|
var _level_colors: Dictionary = {
|
|
LogLevel.INFO: Color.WHITE,
|
|
LogLevel.WARNING: Color.YELLOW,
|
|
LogLevel.ERROR: Color.RED,
|
|
LogLevel.DEBUG: Color.CYAN
|
|
}
|
|
|
|
var _level_prefixes: Dictionary = {
|
|
LogLevel.INFO: "[INFO]",
|
|
LogLevel.WARNING: "[WARNING]",
|
|
LogLevel.ERROR: "[ERROR]",
|
|
LogLevel.DEBUG: "[DEBUG]"
|
|
}
|
|
|
|
var max_lines: int = 1000
|
|
|
|
func _ready():
|
|
scroll_active = true
|
|
#scroll_following = true
|
|
bbcode_enabled = true
|
|
fit_content = false
|
|
clear_logs()
|
|
|
|
|
|
func add_log(message: String, level: LogLevel = LogLevel.INFO) -> void:
|
|
if not is_inside_tree():
|
|
push_warning("LogsRich не добавлен в дерево сцены!")
|
|
return
|
|
|
|
var timestamp = Time.get_time_string_from_system()
|
|
var prefix = _level_prefixes.get(level, "[INFO]")
|
|
var color = _level_colors.get(level, Color.WHITE)
|
|
|
|
var formatted_message = "[%s] %s %s" % [timestamp, prefix, message]
|
|
var color_hex = color.to_html(false)
|
|
|
|
# Просто добавляем текст (RichTextLabel сам обрабатывает BBcode)
|
|
append_text("[color=#%s]%s[/color]\n" % [color_hex, formatted_message])
|
|
|
|
# Прокручиваем вниз
|
|
if is_inside_tree():
|
|
scroll_to_line(get_line_count())
|
|
|
|
# Ограничиваем количество строк
|
|
limit_line_count_simple()
|
|
|
|
func info(message: String) -> void:
|
|
add_log(message, LogLevel.INFO)
|
|
|
|
func warning(message: String) -> void:
|
|
add_log(message, LogLevel.WARNING)
|
|
|
|
func error(message: String) -> void:
|
|
add_log(message, LogLevel.ERROR)
|
|
|
|
func debug(message: String) -> void:
|
|
add_log(message, LogLevel.DEBUG)
|
|
|
|
func clear_logs() -> void:
|
|
text = ""
|
|
|
|
func limit_line_count_simple() -> void:
|
|
var lines = get_line_count()
|
|
if lines > max_lines:
|
|
# Получаем чистый текст без BBcode
|
|
var raw_text = get_parsed_text()
|
|
var text_lines = raw_text.split("\n")
|
|
|
|
if text_lines.size() > max_lines:
|
|
# Удаляем первые строки
|
|
text_lines = text_lines.slice(text_lines.size() - max_lines)
|
|
|
|
# Очищаем и перезаписываем
|
|
clear_logs()
|
|
for line in text_lines:
|
|
if line.strip_edges().length() > 0:
|
|
# Добавляем как INFO (теряем цвета, но это проще)
|
|
append_text("[color=#ffffff]%s[/color]\n" % line)
|