# Copyright (c) 2020-2023 Mansur Isaev and contributors - MIT License # See `LICENSE.md` included in the source distribution for details. @tool ## Класс вывода журнала событий. class_name LoggerOutput extends RichTextLabel ## Выдаётся при ошибке сигнала - [signal Logger.logged]. signal handled() @export var format_text : String = "[{year}-{month}-{day} {hour}:{minute}:{second}][{level}]{text}" @export var colors : Dictionary = { Logger.INFO: Color.WHITE, Logger.DEBUG: Color.GRAY, Logger.WARNING: Color.YELLOW, Logger.ERROR: Color.RED, Logger.FATAL: Color.RED, } @export var max_lines_count: int = 512 var _logger : Logger func _enter_tree() -> void: var logger := get_node_or_null("/root/log") as Logger if is_instance_valid(logger): set_logger(logger) func _exit_tree() -> void: if is_instance_valid(_logger) and _logger.logged.is_connected(handle_message): _logger.logged.disconnect(handle_message) ## Вернуть цвет уровня или [member Color.WHITE]. func get_color(level: int) -> Color: return colors.get(level, Color.WHITE) ## Установить журнал событий. func set_logger(logger: Logger) -> void: tools.allways(is_instance_valid(logger), 'Invalid Logger.') if not is_instance_valid(logger) or is_same(_logger, logger): return if is_instance_valid(_logger) and _logger.logged.is_connected(handle_message): _logger.logged.disconnect(handle_message) if not logger.logged.is_connected(handle_message): logger.logged.connect(handle_message) _logger = logger ## Вернуть журнал событий. func get_logger() -> Logger: return _logger ## Вернуть строку после форматирования из сообщения. func format(message: Dictionary) -> String: return format_text.format( { 'year': '%04d' % message['year'], 'month': '%02d' % message['month'], 'day': '%02d' % message['day'], 'hour': '%02d' % message['hour'], 'minute': '%02d' % message['minute'], 'second': '%02d' % message['second'], 'level': message['level_name'], 'text': message['text'], } ) ## Обработать сообщение. func handle_message(message: Dictionary) -> void: push_color(get_color(message['level'])) append_text(format(message) + '\n') pop() handled.emit() var pc: = get_paragraph_count() if pc < max_lines_count: return for i in pc - max_lines_count: remove_paragraph(i)