scopedvr-map-core/editor/shortcut_policy.gd
2026-11-01 19:31:33 +01:00

48 lines
No EOL
2.1 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

extends RefCounted
class_name ShortcutPolicy
## Esc-Verhalten des Map-Editors (Karte t_c46d31c2, Karte 1/3) — bewusst pure
## Funktion: main.gd fragt pro Esc-Taste ab WELCHE Zustandsänderung fällig ist
## und macht nur noch den Text. tests/test_shortcuts.gd prüft alle Kombos.
##
## Priorität (spec „Esc = Auswahl aufheben / Werkzeug abbrechen / Ghost abbrechen"):
## 1. aktives Sonder-Werkzeug verlassen (Terrain/Spawns → Objekt-Werkzeug)
## 2. Ghost-Preview (Platzieren) abbrechen
## 3. Auswahl aufheben
## Rückgabe-Werte:
## "exit_terrain" | "exit_spawns" | "exit_teststart" | "cancel_grab"
## "cancel_placement" | "clear_selection" | "none"
## grabbing (Karte t_55257792): G-Greifen läuft — Esc rollt die Positionen
## zurück (Blender-Semantik). Vorrang NACH Werkzeug-Exit (im Terrain-
## Werkzeug gibt es kein Greifen), VOR Platzieren/Greifen-Auswahlheben.
static func esc_action(tool_mode: String, placing: bool, has_selection: bool,
grabbing := false) -> String:
if tool_mode == "terrain":
return "exit_terrain"
if tool_mode == "spawns":
return "exit_spawns"
if tool_mode == "teststart":
# Karte t_96e3c4ee (Wiederanbindung 20.10.): Esc verlässt das
# Test-Start-Werkzeug — der gesetzte Punkt BLEIBT bestehen.
return "exit_teststart"
if grabbing:
return "cancel_grab"
if placing:
return "cancel_placement"
if has_selection:
return "clear_selection"
return "none"
## Karte 3/3 (t_11b5c25b): Dürfen die globalen Tasten (F1–F5, H) gerade wirken?
## Nein, wenn ein Textfeld/SpinBox fokussiert ist (Tippen geht vor) oder ein
## Dialog/Fenster offen ist (Taste soll nicht HINTER dem Dialog wirken).
## Pure Funktion — main.gd liefert nur die beiden Fakten (testbar, wie esc_action).
static func tool_keys_allowed(text_focused: bool, dialog_open: bool) -> bool:
return not text_focused and not dialog_open
## Karte 3/3: Verlust-Operation (Neue Map / Öffnen) bei ungespeicherten
## Änderungen → erst NACHFRAGEN (deutscher Dialog), sonst direkt ausführen.
## Pure Entscheidung — der Dialog selbst lebt in main.gd.
static func needs_dirty_confirm(dirty: bool) -> bool:
return dirty