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.
38 lines
1.3 KiB
GDScript
38 lines
1.3 KiB
GDScript
extends SceneTree
|
|
## Eine Probe: Button-Rects messen UND Beweisbild mit genau diesem Zustand
|
|
## (Spinboxes auf 256 → lange Vorschau, wie Sly).
|
|
|
|
func _initialize() -> void:
|
|
_run.call_deferred()
|
|
|
|
func _rect_chain(n: Node) -> String:
|
|
var parts: Array[String] = []
|
|
var cur: Node = n
|
|
while cur != null:
|
|
if cur is Control:
|
|
parts.append("%s pos=%s size=%s" % [cur.get_class(), cur.get_position(), cur.size])
|
|
elif cur is Window:
|
|
parts.append("%s pos=%s size=%s" % [cur.get_class(), cur.position, cur.size])
|
|
cur = cur.get_parent()
|
|
return " <- ".join(parts)
|
|
|
|
func _run() -> void:
|
|
var scene: PackedScene = load("res://scenes/main.tscn")
|
|
var main: Control = scene.instantiate()
|
|
root.add_child(main)
|
|
await process_frame
|
|
await process_frame
|
|
main._start_with_new_map()
|
|
main._open_resize_dialog()
|
|
main.resize_dialog.size_x_edit.value = 256.0
|
|
main.resize_dialog.size_z_edit.value = 256.0
|
|
await process_frame
|
|
await process_frame
|
|
await RenderingServer.frame_post_draw
|
|
var dlg: ConfirmationDialog = main.resize_dialog
|
|
print("PROBE dlg pos=", dlg.position, " size=", dlg.size)
|
|
print("PROBE OK-chain: ", _rect_chain(dlg.get_ok_button()))
|
|
print("PROBE vbox: ", _rect_chain(dlg.get_child(0)))
|
|
var img := root.get_viewport().get_texture().get_image()
|
|
img.save_png("/opt/data/scopedvr/work/dialog_beweis/resize_256_state.png")
|
|
quit(0)
|