Container part 2.21

This commit is contained in:
Synthasmagoria 2026-07-27 13:48:44 +02:00
commit 69baea52b8

29
ui.odin
View file

@ -3,8 +3,13 @@ package synthas_ui
v2 :: [2]f32
rect2 :: struct {x, y, width, height: f32}
@private rect_get_bl :: proc(rect: rect2) -> v2 {
return {rect.x, rect.y + rect.height}
@private rect_get_tl :: #force_inline proc(rect: rect2) -> v2 {return {rect.x, rect.y}}
@private rect_get_tr :: #force_inline proc(rect: rect2) -> v2 {return {rect.x + rect.width, rect.y}}
@private rect_get_br :: #force_inline proc(rect: rect2) -> v2 {return {rect.x + rect.width, rect.y + rect.height}}
@private rect_get_bl :: #force_inline proc(rect: rect2) -> v2 {return {rect.x, rect.y + rect.height}}
@private rect_grow :: proc(rect: rect2, amount: v2) -> rect2 {
return {rect.x - amount.x / 2.0, rect.y - amount.y / 2.0, rect.width + amount.x, rect.height + amount.y}
}
@private ctx: ^Context
@ -26,6 +31,7 @@ Element :: struct {
label: cstring,
color: [4]u8,
data: ElementData,
margin, padding: v2,
}
ElementData :: union {
@ -67,16 +73,26 @@ same_line :: proc() {
ctx.same_line = true
}
element_get_outer_area :: proc(element: Element) -> rect2 {
return rect_grow(element.area, element.margin * 2.0)
}
element_get_inner_area :: proc(element: Element) -> rect2 {
return rect_grow(element.area, -element.padding * 2.0)
}
ElementData_Container :: struct {
margin, padding: v2,
}
container_begin :: proc(dimensions: Dimensions, margin: v2, padding: v2, label: cstring, color: [4]u8) {
ctx.container_position += margin
area := rect2{**ctx.container_position, **_resolve_dimensions(dimensions)}
ctx.element_position = ctx.container_position + padding
size := _resolve_dimensions(dimensions) - margin * 2.0
area := rect2{**ctx.container_position, **size}
ctx.container_position += padding
ctx.element_position = ctx.container_position
data := ElementData_Container {margin = margin, padding = padding}
element := Element{area = area, color = color, label = label, data = data}
element := Element{area = area, color = color, label = label, data = data, margin = margin, padding = padding}
append(&ctx.elements, element)
container := _element_last()
append(&ctx.container_stack, container)
@ -111,7 +127,8 @@ _resolve_size :: proc(size: Size, axis: Axis) -> f32 {
return cast(f32)value
case Size_Percentage:
if container := _container_last(); container != nil {
container_size := container.area.width if axis == .X else container.area.height
inner := element_get_inner_area(container^)
container_size := inner.width if axis == .X else inner.height
return container_size * cast(f32)value
} else {
panic("Cannot use dimension Size_Percentage without an outer container")