add plugin settings, per-tile refresh, settings menu, touch-friendly UI

- Plugin settings infrastructure in PluginManager with config/plugin_settings.cfg
  storage, manifest [settings] sections, CRUD API, plugin_setting_changed signal
- Per-tile refresh intervals: 100ms base tick, per-tile update_interval_ms
  metadata, dynamic tween durations clamped to refresh window
- Settings menu (PopupPanel) with General/Plugins/About tabs, plugin
  activation toggles, per-plugin settings cog buttons
- Plugin settings popup (PopupPanel) with dynamic UI from setting definitions
  (SpinBox/CheckBox/LineEdit), auto-save on change
- Modal behavior: exclusive = true on settings windows
- Touch-friendly sizing: enlarged close buttons, cog buttons, controls, spacing
- Red corner close button redesign with rounded corners, hover/pressed states
- Split system_monitor into local_system_monitor (CPU, Memory) and test plugins
- Plugin activation/deactivation with layout preservation
This commit is contained in:
Eric Smith 2026-05-21 12:47:25 -04:00
parent 12b45b2685
commit 57b36798b9
24 changed files with 1065 additions and 183 deletions

View file

@ -18,6 +18,10 @@ var current_layout_name: String = "Main"
## The active layout data: tile_id -> {col, row, w, h}
var _layout: Dictionary = {}
## Grid dimensions for this layout.
var grid_columns: int = 4
var grid_rows: int = 3
func _ready() -> void:
if not DirAccess.dir_exists_absolute(LAYOUT_DIR):
@ -64,6 +68,17 @@ func remove_tile(tile_id: String) -> void:
_layout.erase(tile_id)
## Set grid dimensions stored in this layout.
func set_grid_size(cols: int, rows: int) -> void:
grid_columns = cols
grid_rows = rows
## Get grid dimensions for the current layout.
func get_grid_size() -> Dictionary:
return { columns = grid_columns, rows = grid_rows }
## Save the current layout to config/layouts/{name}.cfg
func save_layout(layout_name: String = "") -> void:
if layout_name.is_empty():
@ -72,6 +87,8 @@ func save_layout(layout_name: String = "") -> void:
var cfg := ConfigFile.new()
cfg.set_value("layout", "name", layout_name)
cfg.set_value("layout", "saved_at", Time.get_datetime_string_from_system())
cfg.set_value("layout", "grid_columns", grid_columns)
cfg.set_value("layout", "grid_rows", grid_rows)
var tile_ids: Array = _layout.keys()
cfg.set_value("tiles", "count", tile_ids.size())
@ -106,6 +123,9 @@ func load_layout(name: String) -> bool:
_layout.clear()
current_layout_name = name
grid_columns = cfg.get_value("layout", "grid_columns", 4)
grid_rows = cfg.get_value("layout", "grid_rows", 3)
var tile_count: int = cfg.get_value("tiles", "count", 0)
for i in range(tile_count):
var section := "tile_%d" % i