Ok so I did something like this for now :
extends Container
export (int, 2, 200) var columns = 4
export (float) var spacing = 2
func _draw():
var child_width = (rect_size.x - (spacing * (columns - 1)))/columns
var i = 0
for child in get_children():
child.set_size(Vector2(child_width, child_width))
child.set_position(Vector2(
(i%columns) * (child_width + spacing),
(i/columns) * (child_width + spacing)
))
i += 1
emit_signal("sort_children")
As for the node hierarchy it's this one :

It works great but I am unsure if it's good practice as draw()
can be call often and I was wondering if there is a signal or another method called specifically when children inside container must be resorted.