TowerDefense/addons/signal_lens/editor/logger/logger.gd
2025-08-25 23:23:03 +02:00

92 lines
3 KiB
GDScript

@tool
class_name Logger
extends Control
const MAX_LOGS := 1000
enum Options {
DATETIME,
TIMESTAMP,
PROCESS_FRAME,
PHYSICS_FRAME
}
@export var log_container: Control
@export var copy_button: Button
@export var clear_button: Button
@export var v_split_container: VSplitContainer
@export var h_split_container: HSplitContainer
@export var log_scroll: ScrollContainer
@export var counter_label: Label
var _logs: Array[String]
var _starting_v_split_margin_end: int
var _starting_h_split_offset: int
var _options_popup: PopupMenu
func _ready() -> void:
copy_button.icon = EditorInterface.get_base_control().get_theme_icon("ActionCopy", "EditorIcons")
clear_button.icon = EditorInterface.get_base_control().get_theme_icon("Clear", "EditorIcons")
_starting_v_split_margin_end = v_split_container.drag_area_margin_end
_starting_h_split_offset = h_split_container.split_offset
counter_label.text = ""
func clear():
_logs.clear()
for child in log_container.get_children():
child.queue_free()
counter_label.text = ""
func create_log(datetime: String, timestamp: String, node_name: String, signal_name: String, signal_arguments: Array, process_frames: int, physics_frames: int):
if _logs.size() >= MAX_LOGS:
_logs.pop_front()
log_container.get_child(0).queue_free()
var raw_log = "%s | %s\n%s | %s\n%s%s" % [datetime, timestamp, process_frames, physics_frames, node_name, signal_name]
if not signal_arguments.is_empty(): raw_log += "\n" + str(signal_arguments)
_logs.append(raw_log)
var pretty_log: String = ""
pretty_log += "[font_size=12]"
pretty_log += "[color=WEB_GRAY]%s | %s\nProcess: %s | Physics: %s[/color]\n" % [datetime, timestamp, process_frames, physics_frames]
pretty_log += "[font_size=13][color=WHITE][b]%s%s[/b]\n" % [node_name, signal_name]
if not signal_arguments.is_empty(): pretty_log += "[color=WHITE]" + str(signal_arguments)
var log_label: RichTextLabel = RichTextLabel.new()
log_label.bbcode_enabled = true
log_label.fit_content = true
log_label.selection_enabled = true
log_label.add_theme_constant_override("line_separation", 5)
log_label.context_menu_enabled = true
log_label.text = pretty_log
log_label.add_theme_stylebox_override("background", StyleBoxEmpty.new())
log_label.add_theme_stylebox_override("normal", StyleBoxEmpty.new())
log_container.add_child(log_label)
await get_tree().process_frame
log_scroll.scroll_vertical = log_scroll.get_v_scroll_bar().max_value
counter_label.text = "(%s)" % [str(_logs.size())]
func _on_clear_button_pressed() -> void:
clear()
func _on_copy_button_pressed() -> void:
var result: String
var index = 0
for pretty_log: String in _logs:
result += pretty_log
index += 1
if index < _logs.size():
result += "\n\n"
DisplayServer.clipboard_set(result)
func _on_h_split_container_dragged(offset: int) -> void:
var h_split_offset_progress = inverse_lerp(_starting_h_split_offset, 0, offset)
var new_v_split_drag_area = lerp(_starting_v_split_margin_end, 0, h_split_offset_progress)
v_split_container.drag_area_margin_end = new_v_split_drag_area