scopedvr-map-core/ui/panels/selection_panel.gd
2026-11-01 19:31:33 +01:00

67 lines
No EOL
3.2 KiB
GDScript

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])