extends Node ## Auswahl-Logik (U1, Karte t_eaccbfed — aus main.gd ausgezogen). Seit 25.10. ## KEIN Tab mehr (Test-Befund): Drehen/Anheben/Duplizieren/Löschen laufen in der ## 3D-Ansicht (Werkzeugleiste, Gizmo, Tasten), Gruppen im Map-Inhalt links, die ## Gizmo-Schrittweite im Einstellungen-Fenster. Übrig bleibt die Synchronisation: ## Inspektor nachziehen, Gizmo-Schrittweite-Feld folgen, Statuszeile zur frischen ## Auswahl (Klartext + Poly-Budget-Warnung). ## ## Verdrahtung: main.gd ruft sync_selection() an allen Auswahl-Wegen ## (vorher: _sync_selection_panel) und selection_status(idx) bei frischer ## Auswahl (vorher: _selection_status). Alle Objekt-Operationen laufen über ## main.interaction — der Vertrag zu interaction.gd bleibt identisch. var main # core/ui/main.gd (script-erweitert → untypisiert) func setup(p_main) -> void: main = p_main ## Objekt-Inspektor + Auswahl-Panel synchron halten (vorher ## main.gd/_sync_selection_panel — Logik unverändert). func sync_selection() -> void: # Objekt-Inspektor mit allen Auswahl-Wege synchron halten (Karte t_bb0d11c9). if main.inspector != null: main.inspector.call("refresh") # Gizmo-Schrittweite-Feld mitziehen (Karte t_e0120dc2): Das Mausrad # WÄHREND eines Zugs kann sie im Gizmo ändern (cycle_step) — das Panel- # Feld folgt ohne eigene value_changed-Rückkopplung (set_value_no_signal). var step_box: SpinBox = main.gizmo_step_box if step_box != null and is_instance_valid(step_box) and not step_box.has_focus(): step_box.set_value_no_signal(main.gizmo_step_m) ## Hilfs-Meldung zur frischen Auswahl (Klartext + Budget-Warnung + nächster ## Schritt) — vorher main.gd/_selection_status, Logik unverändert. func selection_status(idx: int) -> void: # Objekt-Inspektor füllen (Karte t_bb0d11c9) — dieser Weg läuft bei # 3D-Klick, Rahmen-Ausziehen und Map-Inhalt-Baum. if main.inspector != null: main.inspector.call("refresh") # sync_selection ändert bewusst KEINEN Statuszeilen-Text (Stummsync). sync_selection() var doc: Dictionary = main.doc var objects: Array = doc.get("objects", []) var sel: Array = main.interaction.selected_indices if (idx < 0 or idx >= objects.size()) and sel.is_empty(): main._base_tool_status() return var used := int(SvmapDocument.poly_usage(doc, main.manifest)) var budget := int(SvmapIO.MAX_TOTAL_POLY) var budget_warning := "" if used > budget * 80 / 100: budget_warning = " ⚠ Poly-Budget zu %.0f %% voll — bald passt kein Objekt mehr rein." % (100.0 * used / budget) if sel.size() > 1: main._set_status("%d Objekte ausgewählt — ziehen bewegt ALLE gemeinsam, R/Mausrad dreht sie um die Mitte, Entf löscht alle, Strg+G gruppiert.%s" % [sel.size(), budget_warning]) return if idx < 0 or idx >= objects.size(): main._base_tool_status() return var obj: Dictionary = objects[idx] var gid := GroupOps.group_id(obj) var group_hint := "" if gid != GroupOps.UNGROUPED: group_hint = " (Gruppe %d — die zieht GEMEINSAM)" % (gid + 1) main._set_status("%s%s ausgewählt — ziehen zum Verschieben, R oder Mausrad zum Drehen, Bild↑/↓ anheben/absenken, Strg+D duplizieren, Entf zum Löschen.%s" % [ main.object_label(str(obj.get("id", ""))), group_hint, budget_warning])