initial commit

This commit is contained in:
2026-07-04 18:22:23 -06:00
commit 55522fc6fc
272 changed files with 12391 additions and 0 deletions
@@ -0,0 +1,96 @@
class_name ConsoleSettingsManager extends RefCounted
## Manages persistent storage of LoggieConsole settings
##
## Provides robust save/load functionality with automatic backup creation and
## comprehensive error handling. Settings are saved immediately when requested
## (no debouncing) and loaded with fallback to backup file or defaults.
const LoggieConsoleSettings = preload("res://addons/loggie-console/resources/loggie_console_settings.gd")
# File paths and configuration
const SETTINGS_PATH = "user://loggie_console_settings.tres"
const BACKUP_PATH = "user://loggie_console_settings_backup.tres"
const SETTINGS_RESOURCE_TYPE = "LoggieConsoleSettings"
## Loads console settings with comprehensive error handling and fallback chain
##
## Load order: primary file → backup file → create defaults
## All loaded settings are validated and sanitized before returning.
## Returns: A valid LoggieConsoleSettings instance (never null)
func load_settings() -> LoggieConsoleSettings:
var settings: LoggieConsoleSettings = null
# Attempt to load primary settings file
settings = _try_load_file(SETTINGS_PATH, "main settings")
# Fall back to backup file if primary failed
if settings == null:
settings = _try_load_file(BACKUP_PATH, "backup settings")
# Create default settings if both files failed
if settings == null:
Loggie.msg("Creating default console settings").domain(LoggieConsoleConstants.DOMAIN).info()
settings = LoggieConsoleSettings.new()
# Always validate to ensure data integrity
settings.validate()
Loggie.msg("Console settings loaded successfully").domain(LoggieConsoleConstants.DOMAIN).debug()
return settings
## Saves console settings to disk immediately with backup creation
##
## Creates a backup of the existing file before saving, then validates
## the settings and writes them using Godot's ResourceSaver.
## Param settings: The settings to save (must not be null)
## Returns: true if save succeeded, false if it failed
func save_settings(settings: LoggieConsoleSettings) -> bool:
return _save_with_backup(settings)
## Attempts to load a settings file with error handling
## Param path: File path to load from
## Param description: Human-readable description for logging
## Returns: Loaded settings or null if loading failed
func _try_load_file(path: String, description: String) -> LoggieConsoleSettings:
if not FileAccess.file_exists(path):
Loggie.msg("Settings file not found: %s" % path).domain(LoggieConsoleConstants.DOMAIN).debug()
return null
var resource: Resource = ResourceLoader.load(path, SETTINGS_RESOURCE_TYPE)
if resource == null:
Loggie.msg("Failed to load %s from: %s" % [description, path]).domain(LoggieConsoleConstants.DOMAIN).warn()
return null
if not resource is LoggieConsoleSettings:
Loggie.msg("Invalid resource type in %s: %s" % [description, path]).domain(LoggieConsoleConstants.DOMAIN).error()
return null
Loggie.msg("Loaded %s from: %s" % [description, path]).domain(LoggieConsoleConstants.DOMAIN).debug()
return resource as LoggieConsoleSettings
## Saves settings with automatic backup creation
## Param settings: The settings to save
## Returns: true if save succeeded, false otherwise
func _save_with_backup(settings: LoggieConsoleSettings) -> bool:
if not settings:
Loggie.msg("Cannot save null settings").domain(LoggieConsoleConstants.DOMAIN).error()
return false
# Validate settings before saving
settings.validate()
# Create backup of existing file before overwriting
if FileAccess.file_exists(SETTINGS_PATH):
var dir: DirAccess = DirAccess.open("user://")
if dir:
dir.copy(SETTINGS_PATH, BACKUP_PATH)
# Save the validated settings
var error: Error = ResourceSaver.save(settings, SETTINGS_PATH)
if error != OK:
Loggie.msg("Failed to save console settings: %s" % error_string(error)).domain(LoggieConsoleConstants.DOMAIN).error()
return false
Loggie.msg("Console settings saved successfully").domain(LoggieConsoleConstants.DOMAIN).debug()
return true
@@ -0,0 +1 @@
uid://bntgmwyauc4h6