scopedvr-map-editor/tests/probe_dialog_min.gd
Hermes (scopedvr-dev) ae551f387a Fix: Resize-Dialog 5930 px hoch + OK/Abbrechen unterhalb des Bildschirms (Sly-Befund 20.10. „viel zu lang, kann nichts bestätigen").
Ursache (Proben im Container, xvfb): autowrap-Labels OHNE Mindestbreite
melden VOR dem ersten Layout eine explosionsartige Mindesthöhe (Wrap bei
~1 px → jedes Wort eine Zeile). popup_centered() übernimmt genau diesen
Wert als Fensterhöhe: Resize-Dialog 5930 px statt ~470, Neue-Map-Dialog
4781 px statt ~390 — beide waren betroffen. Nach dem Layout fällt der
Mindestwert zurück, die Fenstergröße bleibt aber.
Zusatz-Befund: wächst die Live-Vorschau NACH dem Öffnen (Preset 256 →
Warnband), bleibt das Fenster oben hängen → Buttons bei y≈940 in einem
900-px-Sichtbereich = unerreichbar.

Fix:
- resize_map_dialog + new_map_dialog: autowrap-Labels bekommen
  Mindestbreite ~ Dialogbreite → Umbruch rechnet mit echter Breite,
  Fenster normal hoch (Probe: 481 px).
- resize_map_dialog: Inhalt in ScrollContainer (horizontal aus), Höhe
  dynamisch = min(Inhalt, sichtbarer Platz); nach jeder Vorschau-Änderung
  wird das Fenster gedeckelt und neu zentriert (_fit_dialog/
  _fit_after_layout) → OK/Abbrechen IMMER erreichbar. unresizable.
- tests: test_resize_dialog prüft jetzt Mindesthöhe VOR dem Popup
  (absolut, < 1500 px) für beide Dialoge + echten Menü-Klick;
  Preset-Button-Suche robust über find_children.
Proben (xvfb): Dialog 662×481, nach Preset 256 → 662×631, unten 765 < 900,
Buttons sichtbar (Beweisbild work/dialog_beweis/resize_dialog_fix.png).
Suiten: test_resize_dialog 44 OK, test_theme 35 OK, test_gui_smoke 92 OK,
test_ux 137 OK, test_ui_layout 79 OK.
2026-10-20 18:33:07 +00:00

46 lines
1.7 KiB
GDScript

extends SceneTree
## Gegenprobe: Explosion verhindern? (E) autowrap-Label mit custom_minimum_size.x,
## (F) vbox.custom_minimum_size.x, (G)echter Fix-Kandidat für die Dialoge.
func _initialize() -> void:
_run.call_deferred()
func _label(t: String, wrap: bool, min_w := 0.0) -> Label:
var l := Label.new()
l.text = t
if wrap:
l.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
if min_w > 0.0:
l.custom_minimum_size = Vector2(min_w, 0)
return l
func _run() -> void:
await process_frame
# E: Labels mit Mindestbreite 480
var e := ConfirmationDialog.new()
e.title = "E_minwidth_labels"
var ev := VBoxContainer.new()
ev.set_anchors_preset(Control.PRESET_FULL_RECT)
for i in 5:
ev.add_child(_label("Zeile %d — etwas längerer Text, der im Editor-Dialog steht und umgebrochen werden muss, damit er passt." % i, true, 480.0))
e.add_child(ev)
root.add_child(e)
print("PROBE E content_min VOR popup=", e.get_contents_minimum_size())
e.popup_centered()
# F: vbox Mindestbreite 520, Labels autowrap ohne eigene Mindestbreite
var f := ConfirmationDialog.new()
f.title = "F_minwidth_vbox"
var fv := VBoxContainer.new()
fv.custom_minimum_size = Vector2(520, 0)
fv.set_anchors_preset(Control.PRESET_FULL_RECT)
for i in 5:
fv.add_child(_label("Zeile %d — etwas längerer Text, der im Editor-Dialog steht und umgebrochen werden muss, damit er passt." % i, true))
f.add_child(fv)
root.add_child(f)
print("PROBE F content_min VOR popup=", f.get_contents_minimum_size())
f.popup_centered()
await process_frame
await process_frame
print("PROBE E window=", e.size, " content_min_nach=", e.get_contents_minimum_size())
print("PROBE F window=", f.size, " content_min_nach=", f.get_contents_minimum_size())
quit(0)