fix grid: build minimum 1x1 during initial _ready before layout resolves

This commit is contained in:
Eric Smith 2026-05-20 14:08:43 -04:00
parent dd467d8fbb
commit cf933dec6c

View file

@ -33,8 +33,7 @@ func _ready() -> void:
mouse_filter = Control.MOUSE_FILTER_STOP mouse_filter = Control.MOUSE_FILTER_STOP
resized.connect(_rebuild_grid) resized.connect(_rebuild_grid)
gui_input.connect(_on_gui_input) gui_input.connect(_on_gui_input)
# Defer initial build so layout is resolved and size is valid _rebuild_grid()
call_deferred("_rebuild_grid")
func _on_gui_input(event: InputEvent) -> void: func _on_gui_input(event: InputEvent) -> void:
@ -292,8 +291,25 @@ func _rebuild_grid() -> void:
_cancel_drag() _cancel_drag()
var avail := size - Vector2(margin * 2.0, margin * 2.0) var avail := size - Vector2(margin * 2.0, margin * 2.0)
# If layout hasn't resolved yet (size too small), build a minimum 1x1 grid
# so modules can be placed. The resized signal will recalculate later.
if avail.x < cell_min_size.x or avail.y < cell_min_size.y: if avail.x < cell_min_size.x or avail.y < cell_min_size.y:
if _cells.size() > 0:
_layout_cells()
return
var new_cols := 1
var new_rows := 1
if new_cols == columns and new_rows == rows and _cells.size() > 0:
_layout_cells()
return
columns = new_cols
rows = new_rows
_save_modules()
_teardown_cells() _teardown_cells()
_build_cells()
_restore_modules()
_layout_cells()
return return
var new_cols := maxi(1, int(avail.x / (cell_min_size.x + cell_spacing))) var new_cols := maxi(1, int(avail.x / (cell_min_size.x + cell_spacing)))
@ -373,12 +389,12 @@ func _layout_cells() -> void:
if rows == 0 or columns == 0: if rows == 0 or columns == 0:
return return
var inner_w := size.x - margin * 2.0 - cell_spacing var inner_w := maxf(0.0, size.x - margin * 2.0 - cell_spacing)
var inner_h := size.y - margin * 2.0 - cell_spacing var inner_h := maxf(0.0, size.y - margin * 2.0 - cell_spacing)
var gap_x := cell_spacing * (columns - 1) var gap_x := cell_spacing * (columns - 1)
var gap_y := cell_spacing * (rows - 1) var gap_y := cell_spacing * (rows - 1)
var cell_w := (inner_w - gap_x) / columns var cell_w := maxf(1.0, (inner_w - gap_x) / columns)
var cell_h := (inner_h - gap_y) / rows var cell_h := maxf(1.0, (inner_h - gap_y) / rows)
for row in range(rows): for row in range(rows):
for col in range(columns): for col in range(columns):