diff --git a/example/main.odin b/example/main.odin index e917e47..3699dde 100644 --- a/example/main.odin +++ b/example/main.odin @@ -20,7 +20,7 @@ main :: proc() { for !rl.WindowShouldClose() { ui.start(&ctx, {0, 0}, {WINDOW_WIDTH, WINDOW_HEIGHT}) - ui.container_begin( + outer_container := ui.container_begin( dimensions = {ui.Size_Pixels(WINDOW_WIDTH), ui.Size_Pixels(WINDOW_HEIGHT)}, config = { margin = {4.0, 8.0}, @@ -29,23 +29,15 @@ main :: proc() { label = "", }, ) - ui.container_begin( - dimensions = {ui.Size_Percentage(1.0), ui.Size_Percentage(0.1)}, - config = { - color = cast([4]u8)rl.GREEN, - label = "", - }, - ) - ui.container_end() - ui.container_begin( - dimensions = {ui.Size_Percentage(1.0), ui.Size_Percentage(0.1)}, - config = { - color = cast([4]u8)rl.GREEN, - label = "", - margin = {0.0, 4.0}, - }, - ) - ui.container_end() + inner_container_config := ui.ElementConfiguration {color = cast([4]u8)rl.GREEN, label = "", margin = {16.0, 8.0}} + inner_container_dimensions := ui.Dimensions {ui.Size_Percentage(1.0), ui.Size_Percentage(0.1)} + for i in 0..<10 { + ui.container_begin(dimensions = inner_container_dimensions, config = inner_container_config) + ui.container_end() + } + // inner_container_dimensions := ui.Dimensions {ui.Size_Percentage(1.0), ui.Size_Percentage(1.0)} + // ui.container_begin(dimensions = inner_container_dimensions, config = inner_container_config) + // ui.container_end() ui.container_end() elements := ui.end() @@ -53,6 +45,8 @@ main :: proc() { defer rl.EndDrawing() rl.ClearBackground(rl.BLACK) + rl.DrawRectangleRec(rl.Rectangle(ui.get_element_inner_area(outer_container^)), rl.GRAY) + for element in elements { switch element.type { case .Container: diff --git a/ui.odin b/ui.odin index 028e957..af4ddba 100644 --- a/ui.odin +++ b/ui.odin @@ -92,51 +92,51 @@ same_line :: proc() { ctx.same_line = true } -container_begin :: proc(dimensions: Dimensions, config: ElementConfiguration) { +container_begin :: proc(dimensions: Dimensions, config: ElementConfiguration) -> ^Element { area := _resolve_element_area(dimensions, config.margin) - element := Element{area = area, config = config, type = .Container} - _append_element(element) + element := _append_element(Element{area = area, config = config, type = .Container}) container_index := len(ctx.elements) - 1 append(&ctx.containers, container_index) append(&ctx.container_last_element, -1) + return element } container_end :: proc() { container := ctx.elements[pop(&ctx.containers)] pop(&ctx.container_last_element) // TODO: Set flex - outer := _get_element_outer_area(container) + outer := get_element_outer_area(container) } -button :: proc(dimensions: Dimensions) { - +button :: proc(dimensions: Dimensions) -> ^Element { + return nil } -_append_element :: proc(element: Element) { +_append_element :: proc(element: Element) -> ^Element { append(&ctx.elements, element) ctx.container_last_element[len(ctx.containers) - 1] = len(ctx.elements) - 1 + return &ctx.elements[len(ctx.elements) - 1] } -_get_element_outer_area :: proc(element: Element) -> rect2 { +get_element_outer_area :: proc(element: Element) -> rect2 { return rect_grow(element.area, element.margin * 2.0) } -_get_element_inner_area :: proc(element: Element) -> rect2 { +get_element_inner_area :: proc(element: Element) -> rect2 { return rect_grow(element.area, -element.padding * 2.0) } _resolve_element_area :: proc(dimensions: Dimensions, margin: v2) -> rect2 { outer_position := _resolve_element_outer_position() outer_size := _resolve_element_outer_size(dimensions) - outer_area := rect2{**outer_position, **outer_size} - return rect_grow(outer_area, -margin * 2.0) + return rect_grow(rect2{**outer_position, **outer_size}, -margin * 2.0) } _resolve_element_outer_position :: proc() -> v2 { if alignment_element := _element_container_previous(); alignment_element != nil { - return rect_get_bl(_get_element_inner_area(alignment_element^)) + return rect_get_bl(get_element_outer_area(alignment_element^)) } - return rect_get_tl(_get_element_inner_area(_element_previous()^)) + return rect_get_tl(get_element_inner_area(_element_previous()^)) } _resolve_element_outer_size :: proc(dimensions: Dimensions) -> v2 { @@ -149,7 +149,7 @@ _resolve_elemment_outer_size_axis :: proc(size: Size, axis: Axis) -> f32 { return cast(f32)value case Size_Percentage: if container := _container_current(); container != nil { - inner := _get_element_inner_area(container^) + inner := get_element_inner_area(container^) container_size := inner.width if axis == .X else inner.height return container_size * cast(f32)value } else {