Files
PixelDefense/engine/breeze/ui/ui.c

68 lines
1.5 KiB
C

#include "ui.h"
#include "../memory/memory.h"
#include "../util/object_pool.h"
#include "../util/string.h"
#include <stb_ds.h>
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) {
}