#ifndef BREEZE_UI_CORE_H #define BREEZE_UI_CORE_H #include "../defines.h" #include typedef enum BzUISizeKind { BZ_UI_SIZE_NULL, BZ_UI_SIZE_PIXELS, BZ_UI_SIZE_FIT, BZ_UI_SIZE_REL_PARENT, } BzUISizeKind; typedef struct BzUISize { BzUISizeKind kind; f32 value; } BzUISize; typedef enum BzUIAxis { BZ_UI_AXIS_X, BZ_UI_AXIS_Y, BZ_UI_AXIS_COUNT, } BzUIAxis; typedef u32 BzUIWidgetFlags; enum { BZ_UI_WIDGET_CLICKABLE = (1 << 0), BZ_UI_WIDGET_VIEW_SCROLL = (1 << 1), BZ_UI_WIDGET_DRAW_TEXT = (1 << 2), BZ_UI_WIDGET_DRAW_BORDER = (1 << 3), }; typedef u32 BzUIKey; typedef struct BzUIWidget BzUIWidget; typedef struct BzUIWidget { BzUIWidget *first; BzUIWidget *last; BzUIWidget *next; BzUIWidget *prev; BzUIWidget *parent; // Key+generation info BzUIKey key; u64 lastFrameTouchedIndex; // Per-frame info provided by builders BzUIWidgetFlags flags; const char *string; BzUISize semanticSize[BZ_UI_AXIS_COUNT]; // recomputed every frame f32 computedRelPosition[BZ_UI_AXIS_COUNT]; f32 computedSize[BZ_UI_AXIS_COUNT]; Rectangle rect; } BzUIWidget; typedef struct BzUIResult { BzUIWidget *widget; bool pressed; bool released; //bool dragging; bool hovering; } BzUIResult; typedef struct BzUIWidgetDesc { BzUIWidgetFlags flags; const char *string; BzUIKey key; } BzUIWidgetDesc; typedef struct BzUI BzUI; BzUIKey bzUIKeyNull(); BzUIKey bzUIKeyFromString(const char *str); BzUI *bzUICreate(); void bzUIDestroy(BzUI *ui); void bzUIBegin(BzUI *ui, i32 width, i32 height); void bzUIEnd(BzUI *ui); // Widget construction BzUIWidget *bzUIWidgetMake(const BzUIWidgetDesc *desc); BzUIWidget *bzUIPushParent(BzUIWidget *widget); BzUIWidget *bzUIPopParent(); BzUIResult bzUIGetResult(BzUIWidget *widget); // UI bool bzUIButton(const char *string); #endif //BREEZE_UI_CORE_H