From 59c932dc35c9ed3dc9ec83c5a9e68c81e085536c Mon Sep 17 00:00:00 2001 From: slyphax Date: Sun, 25 Oct 2026 10:32:01 +0100 Subject: [PATCH] UI: Info-Zeile kompakt, kurze Viewport-Hinweise --- src/ui/main.gd | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/src/ui/main.gd b/src/ui/main.gd index 8aa925b..4cfa379 100644 --- a/src/ui/main.gd +++ b/src/ui/main.gd @@ -631,7 +631,7 @@ func _build_center_viewport() -> SubViewportContainer: # Bedien-Hinweis im Viewport (Overlay) help_label = Label.new() - help_label.text = "Linksklick: auswählen & ziehen · Umschalt+Klick: Auswahl erweitern · Rahmen aufziehen: mehrere wählen · Strg+G: gruppieren\nR / Mausrad: drehen · Strg+D: duplizieren · Bild↑/↓: anheben/absenken · Spiegeln rechts · Entf: löschen · Strg+Z: zurück" + help_label.text = "Linksklick: auswählen · Rahmen: mehrere · R: drehen · Entf: löschen · H: Hilfe" help_label.set_anchors_preset(Control.PRESET_BOTTOM_WIDE) help_label.offset_left = UIScale.px(12) help_label.offset_bottom = UIScale.px(-8) @@ -1343,7 +1343,7 @@ func _update_tool_label() -> void: "bauen": "Bauen (F3)", "spawns": "Spawn-Zonen (F4)", } - tool_label.text = "Werkzeug: %s · Umschalt+F = Flugmodus" % str(names.get(tool_mode, tool_mode)) + tool_label.text = "Werkzeug: %s" % str(names.get(tool_mode, tool_mode)) ## Symmetrie-Schalter (Karte t_f5935023, M1): Modus aus dem Toolbar-Menü übernehmen. @@ -1829,7 +1829,7 @@ func _enter_terrain_mode() -> void: _sync_terrain_button() return tool_mode = "terrain" - help_label.text = "Linksklick-Ziehen: Boden formen oder malen · Strg+Linksklick: Gegenteil / Steppe zurück ·\n1/2/3/4: Heben/Senken/Glätten/Malen · [ / ]: Pinselgröße Klein/Mittel/Groß ·\nPinselgröße & Material rechts · Rechte Maustaste: Flug · Strg+Z: letzter Strich weg" + help_label.text = "Linksklick-Ziehen: formen bzw. malen · Strg+Klick: Gegenteil · [ ]: Pinselgröße · H: Hilfe" terrain_tool.call("set_brush_mode", terrain_mod._selected_terrain_mode()) terrain_mod.refresh_panels() _set_status("Terrain-Modus an: LINKSKLICK-Ziehen formt den Boden, im Malen-Modus färbt er das Gelände (Steppe/Sand/Fels …). Regler rechts stellen Pinsel und Stärke ein.") @@ -1849,7 +1849,7 @@ func _enter_spawn_mode() -> void: interaction.call("clear_selection", true) tool_mode = "spawns" check_mod.spawn_panel.visible = true - help_label.text = "Linksklick: Zone setzen · Klick+Ziehen: Zone verschieben · Entf: löschen ·\nTeam/Radius rechts · Mittlere Maustaste: Kamera · Strg+Z: zurück" + help_label.text = "Linksklick: Zone setzen · Ziehen: verschieben · Entf: löschen · H: Hilfe" check_mod.spawn_edit_btn.button_pressed = true spawn_tool.call("activate") spawn_tool.call("set_team", check_mod._selected_spawn_team()) @@ -1868,7 +1868,7 @@ func _leave_spawn_mode() -> void: func _enter_objects_mode() -> void: tool_mode = "objects" - help_label.text = "Linksklick: auswählen & ziehen · Umschalt+Klick: Auswahl erweitern · Rahmen aufziehen: mehrere wählen · Strg+G: gruppieren\nR: 90° drehen (Mausrad: 15° fein) · Pfeiltasten: 2-m-Raster · G: greifen (Esc: zurück) · Strg+D: duplizieren · Bild↑/↓: anheben/absenken\nStrg+Bild↑: auf Boden setzen · Strg halten: Snap-Zwang · Spiegeln rechts · Entf: löschen · Strg+Z: zurück" + help_label.text = "Linksklick: auswählen · Rahmen: mehrere · R: drehen · Entf: löschen · H: Hilfe" _base_tool_status() @@ -1901,7 +1901,7 @@ func _enter_build_mode() -> void: interaction.call("clear_selection", true) tool_mode = "bauen" build_panel.visible = true - help_label.text = "Linksklick: Bauteil setzen (auch auf andere Teile = stapeln) · Umschalt+Klick: Bauteil auswählen ·\nR: drehen (90°) · Pfeiltasten: im 2-m-Raster verschieben · Bild↑/↓: anheben/absenken · Strg+Bild↑: auf Boden · Entf: löschen · Mittlere Maustaste: Kamera · Strg+Z: zurück" + help_label.text = "Linksklick: Bauteil setzen · R: drehen · Entf: löschen · H: Hilfe" build_edit_btn.button_pressed = true if ui_right_panel is TabContainer and bauen_mod != null: (ui_right_panel as TabContainer).current_tab = bauen_mod.get_index() @@ -1982,7 +1982,7 @@ func _recheck_terrain_mode() -> void: # Karte t_89c0ec95: Dezenter Terrain-Rückschalter = ebenfalls ein # Werkzeugwechsel — Linien wieder ausblenden (sofern nicht fixiert). _sync_contours_to_builder() - help_label.text = "Linksklick: auswählen & ziehen · Umschalt+Klick: Auswahl erweitern · Rahmen aufziehen: mehrere wählen · Strg+G: gruppieren\nR: 90° drehen (Mausrad: 15° fein) · Pfeiltasten: 2-m-Raster · G: greifen (Esc: zurück) · Strg+D: duplizieren · Bild↑/↓: anheben/absenken\nStrg+Bild↑: auf Boden setzen · Strg halten: Snap-Zwang · Spiegeln rechts · Entf: löschen · Strg+Z: zurück" + help_label.text = "Linksklick: auswählen · Rahmen: mehrere · R: drehen · Entf: löschen · H: Hilfe" _set_status("Terrain-Modus aus: Diese Map passt nicht ins Editor-MVP (Terrain-Auflösung über %d) — die Objekte bleiben normal bearbeitbar." % TerrainField.EDITOR_MAX_RESOLUTION, true) @@ -2179,9 +2179,13 @@ func _refresh_stats() -> void: var count := SvmapDocument.object_count(doc) var poly := SvmapDocument.poly_usage(doc, manifest) var budget := int(SvmapIO.MAX_TOTAL_POLY) - stats_objects.text = "Objekte: %d / 5000 · Poly-Budget: %s / %s (%.0f %%) · Bauteile: %d" % [ - count, _fmt_int(int(poly)), _fmt_int(budget), 100.0 * poly / budget, - BuildOps.piece_count(doc)] + var poly_pct := 100.0 * poly / budget + stats_objects.text = "%d Objekte · Poly %.0f %%" % [count, poly_pct] + stats_objects.tooltip_text = "Objekte: %d / 5000\nPoly-Budget: %s / %s (%.0f %%)\nBauteile: %d" % [ + count, _fmt_int(int(poly)), _fmt_int(budget), poly_pct, BuildOps.piece_count(doc)] + # Nur bei knappem Budget auffällig färben (sonst ruhiger Nebentext). + stats_objects.add_theme_color_override("font_color", get_theme_color( + "warning" if poly_pct >= 90.0 or count >= 4500 else "field", "Editor")) # GLB-Fehlende Objekte (Karte t_9b50b231): Platzhalter laufen, aber Sly soll # sehen, WELCHE echten Modelle im Mesh-Lager nachgelegt werden müssen. if view_builder != null and not (view_builder.get("fehlende_glbs") as Array).is_empty(): @@ -2189,7 +2193,7 @@ func _refresh_stats() -> void: var nennung := ", ".join(fehlend.slice(0, 3)) if fehlend.size() > 3: nennung += " … (+%d weitere)" % (fehlend.size() - 3) - stats_objects.text += " · ⚠ GLB fehlt: %s" % nennung + stats_objects.text += " · ⚠ GLB fehlt: %s" % nennung # Terrain-Anteil am Quest-3-Budget (res 513 = 524.288 Dreiecke, map_format.md §4) var tris := 0 var res := 0 @@ -2199,8 +2203,9 @@ func _refresh_stats() -> void: var quest_budget := 524288 var pct := 100.0 * float(tris) / float(quest_budget) var fps := Engine.get_frames_per_second() - stats_terrain.text = " · Terrain: %s² Grid, %s Dreiecke (%.0f %% Quest-Budget) · %d FPS" % [ - str(res) if res > 0 else "—", _fmt_int(tris), pct, fps] + stats_terrain.text = "Terrain %s² · %d FPS" % [str(res) if res > 0 else "—", fps] + stats_terrain.tooltip_text = "Terrain: %s² Grid, %s Dreiecke (%.0f %% Quest-Budget)" % [ + str(res) if res > 0 else "—", _fmt_int(tris), pct] func _refresh_file_label() -> void: