Seven nit-level fixes from PR review: - Remove dead signal insert_deactivated from ImplantApp; the hook method on_insert_deactivated() is the actual contract. - Rewrite _on_atlas_economics_link comment in main.gd to reflect the actual flow (AtlasApp closes as a consequence of HudGroups single- active-app, not before emitting anything). - Document the "pop never empties below default" invariant on ImplantNavStack.pop() with a pointer to reset_to_default. - Add _mutating re-entrancy guard on ImplantNavStack mutation methods. push_error + early return if called during a screen_changed emission. - main.gd registry loop now uses typed ImplantAppManifest property access (manifest.app_path, manifest.default_key) instead of dictionary-style .get() calls. Empty app_path triggers push_warning. - Document the economics [/] hotkey exception in main.gd and reference the planned handle_global_key lifecycle hook. Arch doc Follow-up section gains a bullet for the new hook. - Comment the independent-version-read rationale above client_ver and proto_ver in loading_screen.gd. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
85 lines
3.0 KiB
GDScript
85 lines
3.0 KiB
GDScript
extends Control
|
|
## #257: Loading screen overlay — blocks input during save/load round-trip.
|
|
## Shown when LOAD_GAME fires; hidden when save_result arrives (success or failure).
|
|
## Full-screen, dark overlay with centered status text.
|
|
## #724: Shows client version (from project.yaml) and protocol version below the status text.
|
|
|
|
const BG_COLOR := Color(0.0, 0.0, 0.0, 0.75)
|
|
const TEXT_COLOR := Color("#c8d0e0")
|
|
const VERSION_COLOR := Color("#667788")
|
|
const FONT_SIZE := 18
|
|
const VERSION_FONT_SIZE := 11
|
|
|
|
var _label: Label = null
|
|
var _version_label: Label = null
|
|
|
|
|
|
func _ready() -> void:
|
|
visible = false
|
|
mouse_filter = Control.MOUSE_FILTER_STOP
|
|
set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)
|
|
_build_ui()
|
|
|
|
|
|
func _build_ui() -> void:
|
|
var bg := ColorRect.new()
|
|
bg.color = BG_COLOR
|
|
bg.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)
|
|
bg.mouse_filter = Control.MOUSE_FILTER_IGNORE
|
|
add_child(bg)
|
|
|
|
_label = Label.new()
|
|
_label.text = UIStrings.get_text("notifications.loading")
|
|
_label.add_theme_font_size_override("font_size", FONT_SIZE)
|
|
_label.add_theme_color_override("font_color", TEXT_COLOR)
|
|
_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
|
|
_label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER
|
|
_label.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)
|
|
_label.mouse_filter = Control.MOUSE_FILTER_IGNORE
|
|
add_child(_label)
|
|
|
|
# client_ver and proto_ver are independent — project.yaml version is the client release,
|
|
# Protocol.PROTOCOL_VERSION is the wire protocol. Mismatches between builds are visible
|
|
# only to the observer reading the loading-screen label; a future ticket will surface them.
|
|
var client_ver := _read_client_version()
|
|
var proto_ver: int = Protocol.PROTOCOL_VERSION
|
|
_version_label = Label.new()
|
|
_version_label.text = "v%s · protocol %d" % [client_ver, proto_ver]
|
|
_version_label.add_theme_font_size_override("font_size", VERSION_FONT_SIZE)
|
|
_version_label.add_theme_color_override("font_color", VERSION_COLOR)
|
|
_version_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
|
|
_version_label.anchor_left = 0.0
|
|
_version_label.anchor_right = 1.0
|
|
_version_label.anchor_top = 1.0
|
|
_version_label.anchor_bottom = 1.0
|
|
_version_label.offset_top = -32.0
|
|
_version_label.offset_bottom = -8.0
|
|
_version_label.mouse_filter = Control.MOUSE_FILTER_IGNORE
|
|
add_child(_version_label)
|
|
|
|
|
|
func _read_client_version() -> String:
|
|
var yaml_path := ProjectSettings.globalize_path("res://") + "/../project.yaml"
|
|
if not FileAccess.file_exists(yaml_path):
|
|
return "?.?.?"
|
|
var file := FileAccess.open(yaml_path, FileAccess.READ)
|
|
if file == null:
|
|
return "?.?.?"
|
|
var content := file.get_as_text()
|
|
file.close()
|
|
for line: String in content.split("\n"):
|
|
if line.begins_with("version:"):
|
|
var parts := line.split(":", false, 1)
|
|
if parts.size() >= 2:
|
|
return parts[1].strip_edges()
|
|
return "?.?.?"
|
|
|
|
|
|
func show_loading() -> void:
|
|
visible = true
|
|
|
|
|
|
## Hide the loading overlay. success=false is reserved for future failure-state UI.
|
|
func hide_loading(_success: bool = true) -> void:
|
|
visible = false
|