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.
46 lines
1.7 KiB
GDScript
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)
|