74 lines
2.0 KiB
GDScript
74 lines
2.0 KiB
GDScript
@tool
|
|
extends Container
|
|
|
|
var visible_column_minsizes : Array = []:
|
|
set(v):
|
|
visible_column_minsizes = v
|
|
queue_sort()
|
|
var visible_column_positions : Array[float] = []
|
|
var _cached_minimum_size := Vector2.ZERO
|
|
|
|
|
|
func _notification(what : int) -> void:
|
|
if what == NOTIFICATION_SORT_CHILDREN:
|
|
var visible_children : Array[Control] = []
|
|
for x in get_children():
|
|
if x is Control and x.visible:
|
|
visible_children.append(x)
|
|
|
|
sort_children(visible_children)
|
|
|
|
|
|
func _get_minimum_size() -> Vector2:
|
|
return _cached_minimum_size
|
|
|
|
|
|
func get_visible_column_position(index : int):
|
|
pass
|
|
|
|
|
|
func sort_children(children : Array[Control]) -> void:
|
|
var column_count := visible_column_minsizes.size()
|
|
if column_count == 0:
|
|
return
|
|
|
|
var column_minsizes : Array[float] = []
|
|
var row_minsizes : Array[float] = []
|
|
column_minsizes.resize(column_count)
|
|
row_minsizes.resize(children.size() / column_count + 1)
|
|
|
|
for i in visible_column_minsizes.size():
|
|
column_minsizes[i] = visible_column_minsizes[i]
|
|
|
|
var current_cell := Vector2i.ZERO
|
|
for x in children:
|
|
var minsize := x.get_combined_minimum_size()
|
|
column_minsizes[current_cell.x] = maxf(column_minsizes[current_cell.x], minsize.x)
|
|
row_minsizes[current_cell.y] = maxf(row_minsizes[current_cell.y], minsize.y)
|
|
current_cell.x += 1
|
|
if current_cell.x == column_count:
|
|
current_cell.x = 0
|
|
current_cell.y += 1
|
|
|
|
var current_pos := Vector2.ZERO
|
|
current_cell = Vector2i.ZERO
|
|
for x in children:
|
|
var cur_size := Vector2(column_minsizes[current_cell.x], row_minsizes[current_cell.y])
|
|
fit_child_in_rect(x, Rect2(current_pos, cur_size))
|
|
current_pos.x += cur_size.x
|
|
current_cell.x += 1
|
|
if current_cell.x == column_count:
|
|
current_cell.x = 0
|
|
current_cell.y += 1
|
|
current_pos.x = 0.0
|
|
current_pos.y += cur_size.y
|
|
|
|
_cached_minimum_size = Vector2.ZERO
|
|
visible_column_positions.resize(column_minsizes.size() + 1)
|
|
for i in column_minsizes.size():
|
|
_cached_minimum_size.x += column_minsizes[i]
|
|
visible_column_positions[i + 1] = _cached_minimum_size.x
|
|
|
|
for x in row_minsizes:
|
|
_cached_minimum_size.y += x
|