package tafl import "core:fmt" //import "core:math" import rl "vendor:raylib" tafl_elements : [4096]Tafl tafl_elements_count : int tafl_stack : [4096]int tafl_stack_depth : int child_buffer : [4096]int child_buffer_len : int temp_child_buffer : [4096]int temp_child_buffer_len : int // May be inferred by child count, and not be needed main :: proc() { { tafl(color={.1,.1,.1,1}) { tafl(color={.1,.1,.1,1}) { tafl(color={.1,.1,.1,1}) { tafl(color={.1,.1,.1,1}) } { tafl(color={.1,.1,.1,1}) } { tafl(color={.1,.1,.1,1}) } } { tafl(color={.1,.1,.1,1}) } } { tafl(color={.1,.1,.1,1}) } { tafl(color={.1,.1,.1,1}) { tafl(color={.1,.1,.1,1}) } { tafl(color={.1,.1,.1,1}) } } { tafl(color={.1,.1,.1,1}) } } } @(deferred_out=__tafl_close) tafl :: proc( /*width : int = 0, height : int = 0, x : int = 0, y : int = 0,*/ sizing_width : Sizing_Dimension = {.FIT, 0, 0}, sizing_height : Sizing_Dimension = {.FIT, 0, 0}, layout : Layout = .LEFT_TO_RIGHT, padding : Sides = {0,0,0,0}, child_gap : int = 0, color : Color = {1,1,0,1}, ) -> ^Tafl{ parent_ptr : ^Tafl = nil if tafl_stack_depth > 0 { parent_ptr = &tafl_elements[tafl_stack[tafl_stack_depth-1]] } tafl_elements[tafl_elements_count] = { /*width = width, height = height, x = x, y = y,*/ sizing = {sizing_width, sizing_height}, layout = layout, padding = padding, child_gap = child_gap, parent = parent_ptr, } this_tafl : ^Tafl = &tafl_elements[tafl_elements_count] tafl_stack[tafl_stack_depth] = tafl_elements_count this_tafl.own_index = tafl_elements_count this_tafl.own_depth = tafl_stack_depth this_tafl.children.index = temp_child_buffer_len indent(this_tafl.own_depth) fmt.printfln("+ Opened tafl {}", this_tafl.own_index) tafl_elements_count += 1 tafl_stack_depth += 1 return this_tafl } __tafl_close :: proc(tafl : ^Tafl) { parent := tafl.parent if parent != nil { tafl.width += tafl.padding.left + tafl.padding.right tafl.height += tafl.padding.top + tafl.padding.bottom // Not entirely sure yet, because Nic's video doesn't say you need this // max(), but I have a feeling that childless tafls will cause negative // total_child_gaps, which would be bad. // // ALSO: Wtf? Why are we basing this off of the tafls number of siblings? // I do not understand this. total_child_gap := max(parent.children.len - 1, 0) * parent.child_gap switch parent.layout { case .LEFT_TO_RIGHT: tafl.width += total_child_gap parent.width += tafl.width parent.height = max(tafl.height, parent.height) case .TOP_TO_BOTTOM: tafl.height += total_child_gap parent.height += tafl.height parent.width = max(tafl.width, parent.width) } } for i in 0..