PercentageRemainder

This commit is contained in:
Synthasmagoria 2026-07-29 21:59:59 +02:00
commit aeb343973e
3 changed files with 30 additions and 6 deletions

3
.gitmodules vendored Normal file
View file

@ -0,0 +1,3 @@
[submodule "example/back"]
path = example/back
url = https://github.com/laytan/back.git

View file

@ -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()

23
ui.odin
View file

@ -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