vn/code/vn_ui.md

2.7 KiB

@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) } }; }