diff --git a/ui.odin b/ui.odin index 1dc42b2..859bd66 100644 --- a/ui.odin +++ b/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")