vn/code/vn_ui.h

204 lines
4.4 KiB
C

/* date = April 29th 2023 8:22 pm */
#ifndef VN_UI_H
#define VN_UI_H
struct ui_key
{
u64 Value;
};
inline b32 AreEqual(ui_key A, ui_key B)
{
b32 Result = (A.Value == B.Value);
return(Result);
}
enum
{
UI_BoxFlag_Clickable = (1 << 0),
UI_BoxFlag_DrawText = (1 << 1),
UI_BoxFlag_DrawBorder = (1 << 2),
UI_BoxFlag_DrawBackground = (1 << 3),
UI_BoxFlag_DrawDropShadow = (1 << 4),
UI_BoxFlag_Clip = (1 << 5),
UI_BoxFlag_HotAnimation = (1 << 6),
UI_BoxFlag_ActiveAnimation = (1 << 7),
UI_BoxFlag_OverflowX = (1 << 8),
UI_BoxFlag_OverflowY = (1 << 9),
UI_BoxFlag_FloatingX = (1 << 10),
UI_BoxFlag_FloatingY = (1 << 11),
};
typedef u32 ui_box_flags;
enum ui_size_type
{
UI_SizeType_Pixels,
UI_SizeType_TextContent,
UI_SizeType_PercentOfParent,
UI_SizeType_ChildrenSum,
};
struct ui_size
{
ui_size_type Type;
r32 Value;
r32 Strictness;
};
inline ui_size UI_Pixels(r32 Value, r32 Strictness)
{
ui_size Result = {UI_SizeType_Pixels, Value, Strictness};
return(Result);
}
inline ui_size UI_TextContent(r32 Value, r32 Strictness)
{
ui_size Result = {UI_SizeType_TextContent, Value, Strictness};
return(Result);
}
inline ui_size UI_Percent(r32 Value, r32 Strictness)
{
ui_size Result = {UI_SizeType_PercentOfParent, Value, Strictness};
return(Result);
}
inline ui_size UI_ChildrenSum(r32 Value, r32 Strictness)
{
ui_size Result = {UI_SizeType_ChildrenSum, Value, Strictness};
return(Result);
}
typedef void ui_draw_callback(render_group *Group, glyph_atlas *Atlas, struct ui_box *Box, void *Data);
struct ui_box
{
ui_box *First;
ui_box *Last;
ui_box *Next;
ui_box *Prev;
ui_box *Parent;
ui_box *HashNext;
ui_box *HashPrev;
ui_key Key;
ui_key Seed;
u64 LastFrameTouched;
ui_box_flags Flags;
string String;
ui_size SemanticSize[Axis2_Count];
v2 FixedP;
v4 TextColor;
v4 BackgroundColor;
v4 BorderColor;
r32 BorderThickness;
axis2 LayoutAxis;
r32 CornerRadius;
font_id Font;
r32 FontSize;
ui_draw_callback *DrawCallback;
void *DrawCallbackData;
v2 ComputedRelativeP;
v2 ComputedDim;
range2_r32 Rect;
r32 HotTransition;
r32 ActiveTransition;
};
struct ui_box_bucket
{
ui_box *First;
ui_box *Last;
};
struct ui_signal
{
ui_box *Box;
v2 MouseP;
v2 DragDelta;
b8 Clicked;
b8 Pressed;
b8 PressedRight;
b8 Released;
b8 Hovering;
b8 Dragging;
};
#include "generated/vn_generated_ui.h"
struct ui
{
memory_arena Arena;
memory_arena FrameArena;
temporary_memory FrameMemory;
ui_box *FirstFreeBox;
ui_box *LastFreeBox;
ui_box_bucket BoxBuckets[256];
ui_box *RootNode;
ui_box *TooltipNode;
ui_box *ContainerNode;
u64 CurrentFrame;
ui_key Hot;
ui_key Active;
ui_key NextHot;
b32 NextHotSet;
platform_event_list *EventList;
v2 MouseP;
u64 DragData[8];
v2 DragStartP;
ui_style_stacks Stacks;
};
//- sixten: State management
inline void UI_SetState(ui *UI);
inline ui *UI_GetState(void);
inline ui_key UI_GetHot(void);
inline ui_key UI_GetActive(void);
//- sixten: Drag helpers
inline void UI_SetDragStartP(v2 P);
inline void UI_UpdateDragStartP(void);
inline v2 UI_GetDragStartP(void);
inline void UI_StoreDragV2(v2 DragData);
inline v2 UI_GetDragV2(void);
inline void UI_StoreDragR32(r32 DragData);
inline r32 UI_GetDragR32(void);
inline void UI_StoreDragPayload(void *Data); // sixten(NOTE): Payload MUST be 64-bytes.
inline void UI_GetDragDataPayload(void *Data);
inline void UI_StoreDragPointer(void *Data);
inline void *UI_GetDragDataPointer(void);
//- sixten: Key functions
inline ui_key UI_EmptyKey(void);
inline ui_key UI_SeedKey(ui_key Key, ui_key Seed);
inline ui_key UI_GenerateKeyFromString(string String);
static string UI_GetBoxNameByKey(ui_key Key);
inline ui_box *UI_GetBoxByKey(ui *UI, ui_key Key);
//- sixten: Box creation
inline ui_box *UI_MakeBox(ui_box_flags Flags, string String);
inline ui_box *UI_MakeBoxF(ui_box_flags Flags, char *Format, ...);
//- sixten: Building and rendering
static void UI_BeginBuild(ui *UI, v2 ScreenDim);
static void UI_EndBuild(glyph_atlas *GlyphAtlas);
static void UI_RenderFrame(render_group *RenderGroup, glyph_atlas *GlyphAtlas);
static void UI_NewFrame(ui *UI, platform_event_list *EventList, v2 MouseP);
#endif //VN_UI_H