Доработка журнала

This commit is contained in:
Tot Maxim
2025-12-18 23:38:13 +03:00
parent e2fbe19d84
commit d5261f4788
4 changed files with 139 additions and 169 deletions

View File

@@ -1,14 +1,6 @@
class_name LogsRich
extends RichTextLabel
var _log_text: String = "":
set(value):
_log_text = value
text = _log_text
scroll_to_line(get_line_count())
get:
return _log_text
enum LogLevel {
INFO,
WARNING,
@@ -34,36 +26,33 @@ var max_lines: int = 1000
func _ready():
scroll_active = true
scroll_following = true
#scroll_following = true
bbcode_enabled = true
# Добавляем моноширинный шрифт для лучшего отображения логов
var font = get_theme_font("normal_font")
if font:
add_theme_font_override("normal_font", font.duplicate())
fit_content = false
clear_logs()
func add_log(message: String, level: LogLevel = LogLevel.INFO) -> void:
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)
# Используем BBcode для цветного текста
# Важно: to_html() возвращает цвет без #, нужно добавить
var color_hex = color.to_html()
# Просто добавляем текст (RichTextLabel сам обрабатывает BBcode)
append_text("[color=#%s]%s[/color]\n" % [color_hex, formatted_message])
# Обновляем приватную переменную
_log_text = text
# Прокручиваем вниз
if is_inside_tree():
scroll_to_line(get_line_count())
# Ограничиваем количество строк
limit_line_count()
# Прокручиваем к последней строке
scroll_to_line(get_line_count())
limit_line_count_simple()
func info(message: String) -> void:
add_log(message, LogLevel.INFO)
@@ -78,114 +67,22 @@ func debug(message: String) -> void:
add_log(message, LogLevel.DEBUG)
func clear_logs() -> void:
clear()
text = ""
_log_text = ""
func limit_line_count() -> void:
var lines = get_parsed_text().split("\n")
if lines.size() > max_lines:
# Удаляем старые строки
var _new_lines = lines.slice(lines.size() - max_lines)
# Очищаем и перестраиваем текст с сохранением форматирования
clear()
text = ""
# Нужно переформатировать все строки снова
# Это сложно сделать правильно без хранения дополнительной информации о цветах
# Поэтому лучше использовать альтернативный подход:
# Просто обрезаем raw текст
var current_text = get_parsed_text()
var all_lines = current_text.split("\n")
if all_lines.size() > max_lines:
var trimmed_lines = all_lines.slice(all_lines.size() - max_lines)
clear()
text = "\n".join(trimmed_lines)
_log_text = text
# Альтернативная, более простая реализация limit_line_count
func limit_line_count_simple() -> void:
# Получаем сырой текст без BBcode тегов
var raw_text = get_parsed_text()
var lines = raw_text.split("\n")
if lines.size() > max_lines:
# Удаляем первые строки сверх лимита
clear()
text = ""
var lines = get_line_count()
if lines > max_lines:
# Получаем чистый текст без BBcode
var raw_text = get_parsed_text()
var text_lines = raw_text.split("\n")
# Начинаем с индекса, где превышен лимит
var start_index = lines.size() - max_lines
for i in range(start_index, lines.size()):
# Здесь нужно определить уровень логирования для каждой строки
# Это сложно без хранения дополнительной информации
# Поэтому просто добавляем как INFO
var line = lines[i].strip_edges()
if line.length() > 0:
append_text("[color=#ffffff]%s[/color]\n" % line)
_log_text = text
# Лучший подход: хранить логи в массиве и перерисовывать при необходимости
var _log_entries: Array = [] # Каждая запись: {message: String, level: LogLevel, timestamp: String}
func add_log_advanced(message: String, level: LogLevel = LogLevel.INFO) -> void:
var timestamp = Time.get_time_string_from_system()
var entry = {
"message": message,
"level": level,
"timestamp": timestamp
}
_log_entries.append(entry)
# Ограничиваем количество записей
if _log_entries.size() > max_lines:
_log_entries.pop_front()
# Перерисовываем все логи
redraw_logs()
func redraw_logs() -> void:
clear()
text = ""
for entry in _log_entries:
var prefix = _level_prefixes.get(entry.level, "[INFO]")
var color = _level_colors.get(entry.level, Color.WHITE)
var formatted_message = "[%s] %s %s" % [entry.timestamp, prefix, entry.message]
var color_hex = color.to_html()
append_text("[color=#%s]%s[/color]\n" % [color_hex, formatted_message])
_log_text = text
scroll_to_line(get_line_count())
# Метод для сохранения логов в файл
func save_logs_to_file(path: String = "user://logs.txt") -> void:
var file = FileAccess.open(path, FileAccess.WRITE)
if file:
file.store_string(get_parsed_text())
file.close()
info("Logs saved to: %s" % path)
else:
error("Failed to save logs to: %s" % path)
# Метод для фильтрации логов по уровню
func filter_logs_by_level(min_level: LogLevel) -> void:
if _log_entries.is_empty():
return
clear()
text = ""
for entry in _log_entries:
if entry.level >= min_level:
var prefix = _level_prefixes.get(entry.level, "[INFO]")
var color = _level_colors.get(entry.level, Color.WHITE)
var formatted_message = "[%s] %s %s" % [entry.timestamp, prefix, entry.message]
var color_hex = color.to_html()
append_text("[color=#%s]%s[/color]\n" % [color_hex, formatted_message])
_log_text = text
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)