Push layout to parent instead of creating new node

This commit is contained in:
2023-12-21 17:48:06 +01:00
parent 8cbab1bbb8
commit 05782559be
3 changed files with 17 additions and 33 deletions

View File

@@ -101,6 +101,7 @@ void bzUIBegin(BzUI *ui, i32 width, i32 height) {
bzArrayPush(ui->nodeStack, ui->root); bzArrayPush(ui->nodeStack, ui->root);
bzUINodeClearLinks(ui->root); bzUINodeClearLinks(ui->root);
bzMemSet(&ui->root->style, 0, sizeof(ui->root->style));
ui->root->semanticSize[BZ_UI_AXIS_X] = (BzUISize){ ui->root->semanticSize[BZ_UI_AXIS_X] = (BzUISize){
.kind = BZ_UI_SIZE_PIXELS, .kind = BZ_UI_SIZE_PIXELS,
@@ -249,17 +250,15 @@ static void calculatePositions(BzUINode *node, f32 x, f32 y) {
node->computedPosition[BZ_UI_AXIS_X] = x; node->computedPosition[BZ_UI_AXIS_X] = x;
node->computedPosition[BZ_UI_AXIS_Y] = y; node->computedPosition[BZ_UI_AXIS_Y] = y;
BzUINode *child = node->first; switch (node->layout.type) {
while (child != NULL) {
switch (child->layout.type) {
case BZ_UI_LAYOUT_FLEX_BOX: case BZ_UI_LAYOUT_FLEX_BOX:
calculatePositionsFlexBox(child); calculatePositionsFlexBox(node);
break; break;
default: default:
for (BzUINode *child = node->first; child; child = child->next) {
calculatePositions(child, x, y); calculatePositions(child, x, y);
break;
} }
child = child->next; break;
} }
} }
@@ -425,21 +424,12 @@ BzUINode *bzUIPopParent(BzUI *ui) {
return node; return node;
} }
void bzUIPushLayout(BzUI *ui, BzUILayout layout) { void bzUISetParentLayout(BzUI *ui, BzUILayout layout) {
BzUINode *node = bzUINodeMake(ui, ui->idCount++, BZ_UI_NONE); i32 stackSize = bzArraySize(ui->nodeStack);
node->semanticSize[BZ_UI_AXIS_X] = (BzUISize) { BZ_ASSERT(stackSize > 0);
.kind = BZ_UI_SIZE_PARENT_PERCENT, BzUINode *last = bzArrayGet(ui->nodeStack, stackSize - 1);
.value = 1.0f, BZ_ASSERT(last);
}; last->layout = layout;
node->semanticSize[BZ_UI_AXIS_Y] = node->semanticSize[BZ_UI_AXIS_X];
node->layout = layout;
bzUIPushParent(ui, node);
}
void bzUIPopLayout(BzUI *ui) {
BzUINode *last = bzArrayGet(ui->nodeStack, bzArraySize(ui->nodeStack) - 1);
BZ_ASSERT(last->flags == BZ_UI_NONE);
bzUIPopParent(ui);
} }
BzUIInteraction bzUIGetInteraction(BzUI *ui, BzUINode *node) { BzUIInteraction bzUIGetInteraction(BzUI *ui, BzUINode *node) {

View File

@@ -119,22 +119,16 @@ void bzUIDestroy(BzUI *ui);
void bzUIBegin(BzUI *ui, i32 width, i32 height); void bzUIBegin(BzUI *ui, i32 width, i32 height);
void bzUIEnd(BzUI *ui); void bzUIEnd(BzUI *ui);
// Widget construction
BzUINode *bzUINodeMake(BzUI *ui, BzUIKey key, BzUIFlags flags); BzUINode *bzUINodeMake(BzUI *ui, BzUIKey key, BzUIFlags flags);
BzUINode *bzUIPushParent(BzUI *ui, BzUINode *node); BzUINode *bzUIPushParent(BzUI *ui, BzUINode *node);
BzUINode *bzUIPopParent(BzUI *ui); BzUINode *bzUIPopParent(BzUI *ui);
// Widget layout void bzUISetParentLayout(BzUI *ui, BzUILayout layout);
void bzUIPushLayout(BzUI *ui, BzUILayout layout);
void bzUIPopLayout(BzUI *ui);
// Widget interaction
BzUIInteraction bzUIGetInteraction(BzUI *ui, BzUINode *node); BzUIInteraction bzUIGetInteraction(BzUI *ui, BzUINode *node);
// UI
bool bzUIButton(BzUI *ui, const char *string, BzUIStyle *style); bool bzUIButton(BzUI *ui, const char *string, BzUIStyle *style);
#endif //BREEZE_UI_CORE_H #endif //BREEZE_UI_CORE_H

View File

@@ -19,7 +19,7 @@ void render(float dt, int *game) {
bzUIBegin(ui, GetScreenWidth(), GetScreenHeight()); bzUIBegin(ui, GetScreenWidth(), GetScreenHeight());
bzUIPushLayout(ui, *&(BzUILayout) { bzUISetParentLayout(ui, *&(BzUILayout) {
.type = BZ_UI_LAYOUT_FLEX_BOX, .type = BZ_UI_LAYOUT_FLEX_BOX,
.flags = BZ_UI_FLEX_DIR_COLUMN | BZ_UI_FLEX_ALIGN_CENTER | BZ_UI_FLEX_JUSTIFY_CENTER, .flags = BZ_UI_FLEX_DIR_COLUMN | BZ_UI_FLEX_ALIGN_CENTER | BZ_UI_FLEX_JUSTIFY_CENTER,
}); });