From aeb343973ea822f080f0f8e72bc164cc011bb232 Mon Sep 17 00:00:00 2001 From: Synthasmagoria Date: Wed, 29 Jul 2026 21:59:59 +0200 Subject: [PATCH] PercentageRemainder --- .gitmodules | 3 +++ example/main.odin | 10 +++++++++- ui.odin | 23 ++++++++++++++++++----- 3 files changed, 30 insertions(+), 6 deletions(-) create mode 100644 .gitmodules diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..a0ba4b0 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "example/back"] + path = example/back + url = https://github.com/laytan/back.git diff --git a/example/main.odin b/example/main.odin index fb4da07..5e78b11 100644 --- a/example/main.odin +++ b/example/main.odin @@ -28,7 +28,7 @@ main :: proc() { for !rl.WindowShouldClose() { ui.start(&ctx, origin = {0, 0}, size = {WINDOW_WIDTH, WINDOW_HEIGHT}) - for i in 0..<10 { + for i in 0..<9 { ui.container_begin(dimensions = {ui.Size_Percentage(1.0), ui.Size_Percentage(0.1)}, config = inner_container_config) for j in 0..<10 { config := button_config @@ -38,6 +38,14 @@ main :: proc() { } ui.container_end() } + ui.container_begin(dimensions = {ui.Size_Percentage(1.0), ui.Size_PercentageRemainder(1.0)}, config = inner_container_config) + for j in 0..<10 { + config := button_config + config.label = fmt.ctprintf("%d", 90 + j) + ui.button(dimensions = {ui.Size_Percentage(0.1), ui.Size_Percentage(1.0)}, config = config) + ui.same_line() + } + ui.container_end() elements := ui.end() rl.BeginDrawing() diff --git a/ui.odin b/ui.odin index 82dda43..7c8ecf0 100644 --- a/ui.odin +++ b/ui.odin @@ -55,11 +55,13 @@ ElementType :: enum { Size_Pixels :: distinct f32 Size_Percentage :: distinct f32 +Size_PercentageRemainder :: distinct f32 Size_Flex :: distinct bool Size :: union { Size_Pixels, Size_Percentage, + Size_PercentageRemainder, Size_Flex, } @@ -174,12 +176,23 @@ _resolve_elemment_outer_size_axis :: proc(size: Size, axis: Axis) -> f32 { case Size_Pixels: return cast(f32)value case Size_Percentage: - if container := _container_current(); container != nil { - inner := get_element_inner_area(container^) - container_size := inner.width if axis == .X else inner.height - return container_size * cast(f32)value + inner := get_element_inner_area(_container_current()^) + container_size := inner.width if axis == .X else inner.height + return container_size * f32(value) + case Size_PercentageRemainder: + if element := _element_container_previous(); element != nil { + container_inner := get_element_inner_area(_container_current()^) + last_element_outer := get_element_outer_area(element^) + remaining_container_size: f32 + switch axis { + case .X: remaining_container_size = container_inner.width - rect_get_tr(last_element_outer).x + case .Y: remaining_container_size = container_inner.height - rect_get_bl(last_element_outer).y + } + return remaining_container_size * f32(value) } else { - panic("Cannot use dimension Size_Percentage without an outer container") + inner := get_element_inner_area(_container_current()^) + container_size := inner.width if axis == .X else inner.height + return container_size * f32(value) } case Size_Flex: return 0.0