diff --git a/engine/breeze/ui/ui.c b/engine/breeze/ui/ui.c index 34e5e21..92b0b7f 100644 --- a/engine/breeze/ui/ui.c +++ b/engine/breeze/ui/ui.c @@ -27,13 +27,14 @@ typedef struct BzUINode { BzUIStyle style; BzUIFlags flags; const char *string; - BzUISize semanticSize[BZ_UI_AXIS_COUNT]; - f32 padding[BZ_UI_AXIS_COUNT * 2]; - f32 margin[BZ_UI_AXIS_COUNT * 2]; + + BzUISize semanticSize[BZ_UI_AXIS_COUNT]; + f32 padding[BZ_UI_AXIS_COUNT * 2]; + f32 margin[BZ_UI_AXIS_COUNT * 2]; // recomputed every frame - f32 computedPosition[BZ_UI_AXIS_COUNT]; - f32 computedSize[BZ_UI_AXIS_COUNT]; + f32 computedPosition[BZ_UI_AXIS_COUNT]; + f32 computedSize[BZ_UI_AXIS_COUNT]; BzUIInteraction interaction; } BzUINode; @@ -188,27 +189,38 @@ static void calculatePositionsFlexBox(BzUINode *node) { BzUIFlags flags = node->layout.flags; f32 totalMainAxisSize = 0.0f; - f32 mainAxisSpacing = 0.0f; const i32 MAIN_AXIS = (flags & BZ_UI_FLEX_DIR_COLUMN) ? BZ_UI_AXIS_Y : BZ_UI_AXIS_X; const i32 CROSS_AXIS = (flags & BZ_UI_FLEX_DIR_COLUMN) ? BZ_UI_AXIS_X : BZ_UI_AXIS_Y; + i32 numChildren = 0; + for (BzUINode *child = node->first; child; child = child->next) { - totalMainAxisSize += child->computedSize[MAIN_AXIS]; - mainAxisSpacing += child->margin[MAIN_AXIS] + - child->margin[MAIN_AXIS + 2] + - child->style.borderThickness * 2; + totalMainAxisSize += child->computedSize[MAIN_AXIS] + + child->margin[MAIN_AXIS] + + child->margin[MAIN_AXIS + 2] + + child->style.borderThickness * 2; + numChildren++; } - f32 mainAxisTotalSpacing = node->computedSize[MAIN_AXIS] - totalMainAxisSize - mainAxisSpacing; + f32 mainAxisTotalSpacing = node->computedSize[MAIN_AXIS] - totalMainAxisSize; mainAxisTotalSpacing = BZ_MAX(0, mainAxisTotalSpacing); // Default: JUSTIFY_START f32 mainAxisOffset = 0.0f; + f32 mainAxisStep = 0.0f; if (flags & BZ_UI_FLEX_JUSTIFY_CENTER) { mainAxisOffset = mainAxisTotalSpacing * 0.5f; } else if (flags & BZ_UI_FLEX_JUSTIFY_END) { mainAxisOffset = mainAxisTotalSpacing; + } else if (flags & BZ_UI_FLEX_JUSTIFY_SPACE_BETWEEN) { + mainAxisStep = mainAxisTotalSpacing / BZ_MAX(1, numChildren - 1); + } else if (flags & BZ_UI_FLEX_JUSTIFY_SPACE_AROUND) { + mainAxisStep = mainAxisTotalSpacing / BZ_MAX(1, numChildren); + mainAxisOffset = mainAxisStep * 0.5f; + } else if (flags & BZ_UI_FLEX_JUSTIFY_SPACE_EVENLY) { + mainAxisStep = mainAxisTotalSpacing / (numChildren + 1); + mainAxisOffset = mainAxisStep; } f32 axisOffset[BZ_UI_AXIS_COUNT]; @@ -224,8 +236,11 @@ static void calculatePositionsFlexBox(BzUINode *node) { } axisOffset[MAIN_AXIS] += child->margin[MAIN_AXIS]; + axisOffset[MAIN_AXIS] += child->style.borderThickness; calculatePositions(child, axisOffset[BZ_UI_AXIS_X], axisOffset[BZ_UI_AXIS_Y]); + axisOffset[MAIN_AXIS] += child->style.borderThickness; axisOffset[MAIN_AXIS] += child->margin[MAIN_AXIS + 2]; + axisOffset[MAIN_AXIS] += mainAxisStep; axisOffset[MAIN_AXIS] += child->computedSize[MAIN_AXIS]; } diff --git a/engine/breeze/ui/ui.h b/engine/breeze/ui/ui.h index d4cc4cd..87ed766 100644 --- a/engine/breeze/ui/ui.h +++ b/engine/breeze/ui/ui.h @@ -35,15 +35,18 @@ enum { BZ_UI_UNIDIR_COLUMN = (1 << 1), BZ_UI_UNIDIR_WRAP = (1 << 2), // FLEX BOX - BZ_UI_FLEX_NONE = 0, - BZ_UI_FLEX_DIR_ROW = (1 << 0), - BZ_UI_FLEX_DIR_COLUMN = (1 << 1), - BZ_UI_FLEX_ALIGN_START = (1 << 2), - BZ_UI_FLEX_ALIGN_CENTER = (1 << 3), - BZ_UI_FLEX_ALIGN_END = (1 << 4), - BZ_UI_FLEX_JUSTIFY_START = (1 << 5), - BZ_UI_FLEX_JUSTIFY_CENTER = (1 << 6), - BZ_UI_FLEX_JUSTIFY_END = (1 << 7) + BZ_UI_FLEX_NONE = 0, + BZ_UI_FLEX_DIR_ROW = (1 << 0), + BZ_UI_FLEX_DIR_COLUMN = (1 << 1), + BZ_UI_FLEX_ALIGN_START = (1 << 2), + BZ_UI_FLEX_ALIGN_CENTER = (1 << 3), + BZ_UI_FLEX_ALIGN_END = (1 << 4), + BZ_UI_FLEX_JUSTIFY_START = (1 << 5), + BZ_UI_FLEX_JUSTIFY_CENTER = (1 << 6), + BZ_UI_FLEX_JUSTIFY_END = (1 << 7), + BZ_UI_FLEX_JUSTIFY_SPACE_BETWEEN = (1 << 8), + BZ_UI_FLEX_JUSTIFY_SPACE_AROUND = (1 << 9), + BZ_UI_FLEX_JUSTIFY_SPACE_EVENLY = (1 << 10), }; typedef struct BzUILayout {