@table(Name, Type, BoxName) UIStyleStacks: { { Parent `ui_box *` `Parent` } { Width `ui_size` `SemanticSize[Axis2_X]` } { Height `ui_size` `SemanticSize[Axis2_Y]` } { FixedX `r32` `FixedP.E[Axis2_X]` } { FixedY `r32` `FixedP.E[Axis2_Y]` } { TextColor `v4` `TextColor` } { BackgroundColor `v4` `BackgroundColor` } { BorderColor `v4` `BorderColor` } { BorderThickness `r32` `BorderThickness` } { LayoutAxis `axis2` `LayoutAxis` } { CornerRadius `r32` `CornerRadius` } { Font `font_id` `Font` } { FontSize `r32` `FontSize` } { OffsetX `r32` `Offset.x` } { OffsetY `r32` `Offset.y` } } @table_gen { `struct ui_style_stacks`; `{`; @expand(UIStyleStacks s) `$(s.Type) $(s.Name)Stack[64]; s32 $(s.Name)StackUsed; b32 AutoPop$(s.Name);`; `};`; } @c @table_gen { @expand(UIStyleStacks s) `inline void UI_Push$(s.Name)($(s.Type) Element) $(=>50) { ui *UI = UI_GetState(); Assert(UI->Stacks.$(s.Name)StackUsed $(=>125) + 1 < ArrayCount(UI->Stacks.$(s.Name)Stack)); $(=>180) UI->Stacks.$(s.Name)Stack[UI->Stacks.$(s.Name)StackUsed++] $(=>260) = Element; }`; @expand(UIStyleStacks s) `inline void UI_Pop$(s.Name)(void) $(=>50) { ui *UI = UI_GetState(); Assert(UI->Stacks.$(s.Name)StackUsed $(=>125) > 0); $(=>180) --UI->Stacks.$(s.Name)StackUsed; $(=>271) }`; @expand(UIStyleStacks s) `inline void UI_SetNext$(s.Name)($(s.Type) Element) { ui *UI = UI_GetState(); UI_Push$(s.Name)(Element); UI->Stacks.AutoPop$(s.Name) = true; }`; @expand(UIStyleStacks s) `inline $(s.Type) UI_First$(s.Name)(void) { ui *UI = UI_GetState(); return(UI->Stacks.$(s.Name)Stack[0]); }`; @expand(UIStyleStacks s) `inline $(s.Type) UI_Top$(s.Name)(void) { ui *UI = UI_GetState(); return(UI->Stacks.$(s.Name)Stack[UI->Stacks.$(s.Name)StackUsed - 1]); }`; @expand(UIStyleStacks s) `#define UI_$(s.Name)(Element) DeferLoop(UI_Push$(s.Name)(Element), UI_Pop$(s.Name)())` } @c @table_gen { `static void UI_ApplyStyles(ui_box *Box)`; `{`; `ui *UI = UI_GetState();`; @expand(UIStyleStacks s) `Assert(UI->Stacks.$(s.Name)StackUsed > 0); $(=>50) Box->$(s.BoxName) $(=>75) = UI->Stacks.$(s.Name)Stack[UI->Stacks.$(s.Name)StackUsed - 1]; $(=>160) if(UI->Stacks.AutoPop$(s.Name)) $(=>200) { UI_Pop$(s.Name)(); $(=>230) UI->Stacks.AutoPop$(s.Name) = false; $(=>260) }` `}`; }