Label element

This commit is contained in:
Synthasmagoria 2026-08-02 12:44:34 +02:00
commit f647602220
2 changed files with 32 additions and 18 deletions

24
ui.odin
View file

@ -16,7 +16,7 @@ rect_grow :: #force_inline proc(rect: rect2, amount: v2) -> rect2 {return {rect.
ctx: ^Context
MeasureTextProc :: proc(cstring) -> v2
MeasureTextProc :: proc(text: cstring, data: rawptr) -> v2
Context :: struct {
origin: v2,
@ -25,7 +25,8 @@ Context :: struct {
container_last_element: [dynamic]int,
elements: [dynamic]Element,
same_line: bool,
measure_text: MeasureTextProc,
measure_text_callback: MeasureTextProc,
measure_text_callback_data: rawptr,
}
CONTAINER_STACK_SIZE :: 16
@ -42,7 +43,6 @@ Element :: struct {
data: rawptr,
type: ElementType,
dimensions: Dimensions,
is_text: bool,
}
element_id_invalid :: proc() -> ElementId {
@ -94,11 +94,12 @@ Dimensions :: struct {
Axis :: enum {X, Y}
init :: proc(ctx: ^Context, element_capacity: int, measure_text_callback: MeasureTextProc, allocator := context.allocator) {
init :: proc(ctx: ^Context, element_capacity: int, measure_text_callback: MeasureTextProc, measure_text_callback_data: rawptr, allocator := context.allocator) {
ctx.containers = make(type_of(ctx.containers), 0, CONTAINER_STACK_SIZE, allocator)
ctx.container_last_element = make(type_of(ctx.container_last_element), 0, CONTAINER_STACK_SIZE, allocator)
ctx.elements = make(type_of(ctx.elements), 0, element_capacity, allocator)
ctx.measure_text = measure_text_callback
ctx.measure_text_callback = measure_text_callback
ctx.measure_text_callback_data = measure_text_callback_data
}
start :: proc(ui_context: ^Context, origin: v2, size: v2) {
@ -141,7 +142,7 @@ focus_next_element :: proc(id: ElementId, elements: []Element, allowed_focus: bi
container_begin :: proc(dimensions: Dimensions, config: ElementConfiguration, data: rawptr = nil) -> ^Element {
element := Element{config = config, type = .Container, dimensions = dimensions, data = data}
element.area = _resolve_element_area(element)
element.area = _resolve_element_area(element, is_text = false)
ctx.container_count += 1
element_ref := _append_element(element)
container_index := len(ctx.elements) - 1
@ -189,8 +190,7 @@ element :: proc(element_type: ElementType, dimensions: Dimensions, config: Eleme
assert(element_type != .Container)
assert_auto_with_pixels(dimensions)
element := Element{config = config, type = element_type, dimensions = dimensions, data = data}
element.is_text = element.type == .Label
element.area = _resolve_element_area(element)
element.area = _resolve_element_area(element, is_text = (element.type == .Label))
return _append_element(element)
}
@ -211,14 +211,14 @@ _append_element :: proc(element: Element) -> ^Element {
return element
}
_resolve_element_area :: proc(element: Element) -> rect2 {
_resolve_element_area :: proc(element: Element, is_text: bool) -> rect2 {
outer_position := _resolve_element_outer_position()
if !element.is_text {
if !is_text {
outer_size := _resolve_element_outer_size(element.dimensions)
return rect_grow(rect2{**outer_position, **outer_size}, -element.margin * 2.0)
}
inner_position := ctx.measure_text(element.label)
return {**outer_position, **(inner_position + element.margin * 2.0)}
inner_position := ctx.measure_text_callback(element.label, ctx.measure_text_callback_data)
return {**(outer_position + element.margin), **(inner_position + element.margin)}
}
_resolve_element_outer_position :: proc() -> v2 {