Files
imitator-case-y5/журнал.gd
2025-12-18 23:38:13 +03:00

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)