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.
60 lines
2.6 KiB
GDScript
60 lines
2.6 KiB
GDScript
extends SceneTree
|
|
## Diagnose-Probe: Wie groß wird der „Kartengröße ändern“-Dialog wirklich,
|
|
## und welcher Node drückt die Mindesthöhe hoch? (Sly-Befund 20.10.: Dialog
|
|
## viel zu lang, OK/Abbrechen unterhalb des Bildschirms.)
|
|
## Ausführen (mit Bildschirm): xvfb-run -a godot4 --path . --rendering-driver opengl3 -s res://tests/probe_resize_size.gd
|
|
|
|
func _initialize() -> void:
|
|
_run.call_deferred()
|
|
|
|
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()
|
|
|
|
# Auflösung der Probe-Umgebung (xvfb) ausgeben.
|
|
print("PROBE viewport: ", root.size, " screen? ", DisplayServer.screen_get_size(0) if DisplayServer.get_name() != "headless" else "headless")
|
|
|
|
main._open_resize_dialog()
|
|
await process_frame
|
|
await process_frame
|
|
var dlg: ConfirmationDialog = main.resize_dialog
|
|
print("PROBE dialog.visible=", dlg.visible, " size=", dlg.size, " min_size=", dlg.min_size)
|
|
print("PROBE content_min=", dlg.get_contents_minimum_size())
|
|
|
|
var vbox: VBoxContainer = null
|
|
for n in dlg.find_children("*", "VBoxContainer", true, false):
|
|
vbox = n
|
|
print("PROBE vbox.size=", vbox.size, " min=", vbox.get_combined_minimum_size())
|
|
for c in vbox.get_children():
|
|
if c is Control:
|
|
var txt := str(c.get("text"))
|
|
print("PROBE child ", c.get_class(), " '", txt.substr(0, min(txt.length(), 40)), "' size=", c.size, " min=", c.get_combined_minimum_size())
|
|
|
|
# FIX 20.10.b: Fenster muss im sichtbaren Bereich bleiben (Buttons sichtbar).
|
|
var area: Vector2 = main.size
|
|
var ok_btn := dlg.get_ok_button()
|
|
var dlg_bottom := float(dlg.position.y) + float(dlg.size.y)
|
|
print("PROBE fit: area=", area, " dlg.pos=", dlg.position, " dlg.size=", dlg.size,
|
|
" dlg_bottom=", dlg_bottom, " im-Bild=", bool(dlg_bottom <= area.y and dlg.position.y >= 0.0))
|
|
|
|
# Sly-Szenario: Preset 256 klicken → Vorschau wächst NACH dem Öffnen →
|
|
# Fenster muss neu verankert werden (Höhe gedeckelt/positioniert).
|
|
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 process_frame
|
|
print("PROBE nach-256: dlg.pos=", dlg.position, " size=", dlg.size,
|
|
" bottom=", float(dlg.position.y) + float(dlg.size.y),
|
|
" im-Bild=", bool(float(dlg.position.y) + float(dlg.size.y) <= area.y))
|
|
|
|
# Neue-Map-Dialog zum Vergleich.
|
|
main.new_dialog.popup_centered()
|
|
await process_frame
|
|
print("PROBE newmap size=", main.new_dialog.size, " content_min=", main.new_dialog.get_contents_minimum_size())
|
|
|
|
quit(0)
|