Files
raddebugger/src/ui/ui.mdesk
T
2025-04-14 10:49:36 -07:00

166 lines
8.1 KiB
Plaintext

// Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
//- rjf: stack table
@table(name, name_lower, type, default, manual_impl)
UI_StackTable:
{
//- rjf: parents
{ Parent parent `UI_Box *` `&ui_nil_box` }
//- rjf: layout params
{ ChildLayoutAxis child_layout_axis Axis2 `Axis2_X` }
//- rjf: size/position
{ FixedX fixed_x F32 0 }
{ FixedY fixed_y F32 0 }
{ FixedWidth fixed_width F32 0 }
{ FixedHeight fixed_height F32 0 }
{ PrefWidth pref_width UI_Size `ui_px(250.f, 1.f)` }
{ PrefHeight pref_height UI_Size `ui_px(30.f, 1.f)` }
{ MinWidth min_width F32 0 }
{ MinHeight min_height F32 0 }
//- rjf: flags
{ PermissionFlags permission_flags UI_PermissionFlags UI_PermissionFlag_All }
{ Flags flags UI_BoxFlags 0 }
{ OmitFlags omit_flags UI_BoxFlags 0 }
//- rjf: interaction
{ FocusHot focus_hot UI_FocusKind UI_FocusKind_Null }
{ FocusActive focus_active UI_FocusKind UI_FocusKind_Null }
{ FastpathCodepoint fastpath_codepoint U32 0 }
{ GroupKey group_key UI_Key `ui_key_zero()` }
//- rjf: colors
{ Transparency transparency F32 0 }
{ Tag tag String8 `str8_lit("")` 1 }
{ BackgroundColor background_color Vec4F32 `v4f32(0, 0, 0, 0)` }
{ TextColor text_color Vec4F32 `v4f32(0, 0, 0, 0)` }
//- rjf: squish
{ Squish squish F32 0 }
//- rjf: hover cursor
{ HoverCursor hover_cursor OS_Cursor OS_Cursor_Pointer }
//- rjf: font
{ Font font FNT_Tag `fnt_tag_zero()` }
{ FontSize font_size F32 24.f }
{ TextRasterFlags text_raster_flags FNT_RasterFlags FNT_RasterFlag_Hinted }
{ TabSize tab_size F32 `24.f*4.f` }
//- rjf: corner radii
{ CornerRadius00 corner_radius_00 F32 0 }
{ CornerRadius01 corner_radius_01 F32 0 }
{ CornerRadius10 corner_radius_10 F32 0 }
{ CornerRadius11 corner_radius_11 F32 0 }
//- rjf: blur size
{ BlurSize blur_size F32 0 }
//- rjf: text parameters
{ TextPadding text_padding F32 0 }
{ TextAlignment text_alignment UI_TextAlign UI_TextAlign_Left }
}
//- rjf: declaring stack node types
@gen
{
@expand(UI_StackTable a) `typedef struct UI_$(a.name)Node UI_$(a.name)Node; struct UI_$(a.name)Node{UI_$(a.name)Node *next; $(a.type) v;};`
}
//- rjf: declaring all default stack tops
@gen
{
`#define UI_DeclStackNils \\`;
`struct\\`;
`{\\`;
@expand(UI_StackTable a) `UI_$(a.name)Node $(a.name_lower)_nil_stack_top;\\`;
`}`;
}
//- rjf: initializing all default stack tops
@gen
{
`#define UI_InitStackNils(state) \\`;
@expand(UI_StackTable a) `state->$(a.name_lower)_nil_stack_top.v = $(a.default);\\`;
``;
}
//- rjf: declaring all stack nodes & free lists
@gen
{
`#define UI_DeclStacks \\`;
`struct\\`;
`{\\`;
@expand(UI_StackTable a) `struct { UI_$(a.name)Node *top; $(a.type) bottom_val; UI_$(a.name)Node *free; U64 gen; B32 auto_pop; } $(a.name_lower)_stack;\\`;
`}`;
}
//- rjf: initing all stack nodes
@gen
{
`#define UI_InitStacks(state) \\`;
@expand(UI_StackTable a) `state->$(a.name_lower)_stack.top = &state->$(a.name_lower)_nil_stack_top; state->$(a.name_lower)_stack.bottom_val = $(a.default); state->$(a.name_lower)_stack.free = 0; state->$(a.name_lower)_stack.auto_pop = 0;\\`;
``;
}
//- rjf: auto-popping all stacks
@gen
{
`#define UI_AutoPopStacks(state) \\`
@expand(UI_StackTable a)
`if(state->$(a.name_lower)_stack.auto_pop) { ui_pop_$(a.name_lower)(); state->$(a.name_lower)_stack.auto_pop = 0; }\\`;
``;
}
//- rjf: decls for the stack function operation headers
@gen
{
@expand(UI_StackTable a)
`internal $(a.type) $(=>35) ui_top_$(a.name_lower)(void);`
@expand(UI_StackTable a)
`internal $(a.type) $(=>35) ui_bottom_$(a.name_lower)(void);`
@expand(UI_StackTable a)
`internal $(a.type) $(=>35) ui_push_$(a.name_lower)($(a.type) v);`
@expand(UI_StackTable a)
`internal $(a.type) $(=>35) ui_pop_$(a.name_lower)(void);`
@expand(UI_StackTable a)
`internal $(a.type) $(=>35) ui_set_next_$(a.name_lower)($(a.type) v);`
}
//- rjf: defer-loop helpers
@gen @c_file
{
`#if 0`;
@expand(UI_StackTable a)
`#define UI_$(a.name)(v) DeferLoop(ui_push_$(a.name_lower)(v), ui_pop_$(a.name_lower)())`
`#endif`;
}
//- rjf: decls for the stack operation implementations
@gen @c_file
{
@expand(UI_StackTable a)
`$(a.manual_impl == "" -> "internal " .. a.type .. " ui_top_" .. a.name_lower .. "(void) { UI_StackTopImpl(ui_state, " .. a.name .. ", " .. a.name_lower .. ") }")`;
@expand(UI_StackTable a)
`$(a.manual_impl == "" -> "internal " .. a.type .. " ui_bottom_" .. a.name_lower .. "(void) { UI_StackBottomImpl(ui_state, " .. a.name .. ", " .. a.name_lower .. ") }")`;
@expand(UI_StackTable a)
`$(a.manual_impl == "" -> "internal " .. a.type .. " ui_push_" .. a.name_lower .. "(" .. a.type .. " v) { UI_StackPushImpl(ui_state, " .. a.name .. ", " .. a.name_lower .. ", " .. a.type .. ", v) }")`;
@expand(UI_StackTable a)
`$(a.manual_impl == "" -> "internal " .. a.type .. " ui_pop_" .. a.name_lower .. "(void) { UI_StackPopImpl(ui_state, " .. a.name .. ", " .. a.name_lower .. ") }")`;
@expand(UI_StackTable a)
`$(a.manual_impl == "" -> "internal " .. a.type .. " ui_set_next_" .. a.name_lower .. "(" .. a.type .. " v) { UI_StackSetNextImpl(ui_state, " .. a.name .. ", " .. a.name_lower .. ", " .. a.type .. ", v) }")`;
}