From bbb7e5b0f9c6e66ba5c6903c0ff8d145ffe21e77 Mon Sep 17 00:00:00 2001 From: Jeroen Schweitzer Date: Sun, 3 May 2026 21:03:09 +0200 Subject: [PATCH] =?UTF-8?q?fix(ui):=20regional=20atlas=20=E2=80=94=20wiki?= =?UTF-8?q?=20path=20loading,=20overlay=20bar=20input,=20header=20width?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Heightmap and markers load from wiki filesystem path via FileAccess instead of res:// (wiki is outside the Godot project root). Overlay bar buttons now receive mouse events — viewer skips input processing when cursor is over UI elements. Header gets explicit minimum width to prevent vertical text stacking. Shadow economy overlay removed. Co-Authored-By: Claude Opus 4.6 --- client/ui/implant/apps/atlas/atlas_viewer.gd | 38 ++++++++++++-------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/client/ui/implant/apps/atlas/atlas_viewer.gd b/client/ui/implant/apps/atlas/atlas_viewer.gd index 4654339cc..2d4230172 100644 --- a/client/ui/implant/apps/atlas/atlas_viewer.gd +++ b/client/ui/implant/apps/atlas/atlas_viewer.gd @@ -98,12 +98,6 @@ const OVERLAY_DEFS: Array = [ "group": "toggle", "tooltip": "Production zones (D-181 observable — requires presence)." }, - { - "id": "shadow_economy", - "label": "SHD", - "group": "toggle", - "tooltip": "Shadow economy zones (D-181 observable)." - }, { "id": "corp_presence", "label": "CRP", @@ -269,14 +263,15 @@ func _load_heightmap() -> void: if ref == null or str(ref).is_empty(): return var path: String = str(ref) - if not path.begins_with("res://"): - path = "res://" + path.lstrip("/") - if not ResourceLoader.exists(path): + if not path.begins_with("/"): + var project_root: String = ProjectSettings.globalize_path("res://").get_base_dir().get_base_dir() + path = project_root + "/" + path + if not FileAccess.file_exists(path): push_warning("AtlasViewer: terrain_reference not found at %s" % path) return - var tex: Variant = load(path) - if tex is Texture2D: - _heightmap_texture = tex + var img := Image.load_from_file(path) + if img != null: + _heightmap_texture = ImageTexture.create_from_image(img) _tex_w = float(_heightmap_texture.get_width()) _tex_h = float(_heightmap_texture.get_height()) @@ -292,8 +287,9 @@ func _load_markers() -> void: if ref == null or str(ref).is_empty(): return var hm_path: String = str(ref) - if not hm_path.begins_with("res://"): - hm_path = "res://" + hm_path.lstrip("/") + if not hm_path.begins_with("/"): + var project_root: String = ProjectSettings.globalize_path("res://").get_base_dir().get_base_dir() + hm_path = project_root + "/" + hm_path var dir: String = hm_path.get_base_dir() var markers_path: String = dir + "/markers.json" @@ -386,6 +382,7 @@ func _build_screen_header() -> void: # theme-swap invariant violation. _screen_header = ImplantHeader.new() _screen_header.position = Vector2(PANEL_MARGIN, 16.0) + _screen_header.custom_minimum_size.x = 320.0 _screen_header.mouse_filter = Control.MOUSE_FILTER_IGNORE add_child(_screen_header) if _implant_theme: @@ -418,6 +415,14 @@ static func _dict_str(d: Dictionary, key: String, fallback: String) -> String: # ============================================================================= +func _is_over_ui(pos: Vector2) -> bool: + if _overlay_bar and _overlay_bar.get_global_rect().has_point(pos): + return true + if _city_panel and _city_panel.visible and _city_panel.get_global_rect().has_point(pos): + return true + return false + + func _gui_input(event: InputEvent) -> void: if event is InputEventKey and event.pressed and not event.is_echo(): _handle_key(event as InputEventKey) @@ -426,6 +431,9 @@ func _gui_input(event: InputEvent) -> void: if _heightmap_texture == null: return + if event is InputEventMouseButton and _is_over_ui((event as InputEventMouseButton).global_position): + return + if event is InputEventMouseButton: var mb := event as InputEventMouseButton if mb.button_index == MOUSE_BUTTON_WHEEL_UP and mb.pressed: @@ -441,6 +449,8 @@ func _gui_input(event: InputEvent) -> void: else: _dragging = false elif event is InputEventMouseMotion: + if _is_over_ui((event as InputEventMouseMotion).global_position): + return var mm := event as InputEventMouseMotion if _dragging: _view_offset = _drag_start_offset + (mm.position - _drag_start_mouse)