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)