#include "ui.h" #include "../memory/memory.h" #include "../util/object_pool.h" #include "../util/string.h" #include typedef struct BzUI { struct { BzUIKey key; BzUIWidget *value; } *widgetMap; BzObjectPool *widgets; BzUIWidget **widgetStack; BzUIWidget *root; } BzUI; BzUIKey bzUIKeyNull() { return 0; } BzUIKey bzUIKeyFromString(const char *str) { return bzStringDefaultHash(str); } BzUI *bzUICreate() { BzUI *ui = bzAlloc(sizeof(*ui)); ui->widgetMap = NULL; ui->widgetStack = NULL; ui->widgets = bzObjectPoolCreate(&(BzObjectPoolDesc) { .objectsPerPage=128, .objectSize=sizeof(BzUIWidget), }); ui->root = bzObjectPool(ui->widgets); bzMemSet(ui->root, 0, sizeof(*ui->root)); hmput(ui->widgetMap, bzUIKeyFromString("##root"), ui->root); return ui; } void bzUIDestroy(BzUI *ui) { hmfree(ui->widgetMap); ui->widgetMap = NULL; arrfree(ui->widgetStack); ui->widgetStack = NULL; bzObjectPoolDestroy(ui->widgets); ui->widgets = NULL; bzFree(ui); } void bzUIBegin(BzUI *ui, i32 width, i32 height) { arrsetlen(ui->widgetStack, 0); arrpush(ui->widgetStack, ui->root); ui->root->semanticSize[BZ_UI_AXIS_X] = (BzUISize){ .kind = BZ_UI_SIZE_PIXELS, .value = width }; ui->root->semanticSize[BZ_UI_AXIS_Y] = (BzUISize) { .kind = BZ_UI_SIZE_PIXELS, .value = height }; } void bzUIEnd(BzUI *ui) { }