Container part 2.21
This commit is contained in:
parent
fdb53f933a
commit
69baea52b8
1 changed files with 23 additions and 6 deletions
29
ui.odin
29
ui.odin
|
|
@ -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")
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue