Files
Kalulu/sources/menus/settings/developer_settings.gd
T
2025-11-18 10:23:26 +01:00

108 lines
3.5 KiB
GDScript

class_name DeveloperSettings
extends Control
const LOGIN_MENU_PATH: String = "res://sources/menus/login/login.tscn"
const LOG_LEVEL_ELEMENT: PackedScene = preload("res://sources/menus/settings/log_level_element.tscn")
var filters: Dictionary[int, bool] = {}
var line_steps: PackedInt32Array = [10, 50, 100, 200, 500, 1000, -1] # -1 = all
var loglevel_regex: RegEx
@onready var slider: HSlider = $VBoxContainer/Controls/LineCountSlider
@onready var slider_label: Label = $VBoxContainer/Controls/SliderLabel
@onready var log_level_dropdown: OptionButton = $VBoxContainer/LogControls/LogLevelDropdown
@onready var filters_container: HBoxContainer = $VBoxContainer/Filters
@onready var log_text: TextEdit = $VBoxContainer/ColorRect/LogText
func _ready() -> void:
slider.min_value = 0
slider.max_value = line_steps.size() - 1
slider.step = 1
slider.value = 5
var levels: Array[String] = []
log_level_dropdown.clear()
for level_name: String in Log.LogLevel.keys():
var value: int = Log.LogLevel[level_name]
log_level_dropdown.add_item(level_name, value)
if level_name != "NONE":
levels.append(level_name)
var element: LogLevelElement = LOG_LEVEL_ELEMENT.instantiate()
filters_container.add_child(element)
element.log_level.text = level_name
element.check_box.button_pressed = Log.current_level <= value
element.check_box.toggled.connect(_on_filters_changed.bind(value))
_on_filters_changed(Log.current_level <= value, value)
var pattern: String = "\\[(" + "|".join(levels) + ")\\]"
loglevel_regex = RegEx.new()
loglevel_regex.compile(pattern)
log_level_dropdown.select(Log.current_level)
log_level_dropdown.item_selected.connect(_on_level_changed)
slider.value_changed.connect(_on_slider_changed)
_update_log_text()
await OpeningCurtain.open()
func _update_log_text() -> void:
var idx: int = int(slider.value)
var lines_to_show: int = line_steps[idx]
var total: int = Log.all_logs.size()
var subset: PackedStringArray
if lines_to_show == -1:
slider_label.text = "Show: all (%d lines)" % total
subset = Log.all_logs
else:
slider_label.text = "Show: %d last lines" % lines_to_show
var start: int = maxi(total - lines_to_show, 0)
subset = Log.all_logs.slice(start, total)
var filtered: Array[String] = []
for line: String in subset:
var level: int = _extract_log_level(line)
if level == -1:
filtered.append(line)
elif filters.has(level) and filters[level]:
filtered.append(line)
log_text.text = "\n".join(filtered)
log_text.scroll_vertical = log_text.get_line_count() # Scroll down
func _extract_log_level(line: String) -> int:
var result: RegExMatch = loglevel_regex.search(line)
if result:
var log_level_name: String = result.get_string(1) # "DEBUG", "INFO"…
if Log.LogLevel.has(log_level_name):
return Log.LogLevel[log_level_name]
return -1
func _on_level_changed(_index: int) -> void:
var selected_level: Log.LogLevel = log_level_dropdown.get_selected_id() as Log.LogLevel
Log.current_level = selected_level
UserDataManager.get_device_settings().log_level = selected_level
UserDataManager._save_device_settings()
Log.info("DeveloperSettings: Log level changed to %s" % Log.LogLevel.keys()[selected_level])
func _on_filters_changed(checked: bool, index: int) -> void:
filters[index] = checked
Log.trace("DeveloperSettings: Filters changed: %s" % str(filters))
if loglevel_regex != null:
_update_log_text()
func _on_back_button_pressed() -> void:
await OpeningCurtain.close()
get_tree().change_scene_to_file(LOGIN_MENU_PATH)
func _on_slider_changed(_value: float) -> void:
_update_log_text()