83 lines
2.6 KiB
GDScript
83 lines
2.6 KiB
GDScript
# 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)
|