Add rest of justify flags to flex box

This commit is contained in:
2023-12-21 17:29:16 +01:00
parent 27257f55ca
commit 8cbab1bbb8
2 changed files with 38 additions and 20 deletions

View File

@@ -27,6 +27,7 @@ typedef struct BzUINode {
BzUIStyle style; BzUIStyle style;
BzUIFlags flags; BzUIFlags flags;
const char *string; const char *string;
BzUISize semanticSize[BZ_UI_AXIS_COUNT]; BzUISize semanticSize[BZ_UI_AXIS_COUNT];
f32 padding[BZ_UI_AXIS_COUNT * 2]; f32 padding[BZ_UI_AXIS_COUNT * 2];
f32 margin[BZ_UI_AXIS_COUNT * 2]; f32 margin[BZ_UI_AXIS_COUNT * 2];
@@ -188,27 +189,38 @@ static void calculatePositionsFlexBox(BzUINode *node) {
BzUIFlags flags = node->layout.flags; BzUIFlags flags = node->layout.flags;
f32 totalMainAxisSize = 0.0f; 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 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; 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) { for (BzUINode *child = node->first; child; child = child->next) {
totalMainAxisSize += child->computedSize[MAIN_AXIS]; totalMainAxisSize += child->computedSize[MAIN_AXIS] +
mainAxisSpacing += child->margin[MAIN_AXIS] + child->margin[MAIN_AXIS] +
child->margin[MAIN_AXIS + 2] + child->margin[MAIN_AXIS + 2] +
child->style.borderThickness * 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); mainAxisTotalSpacing = BZ_MAX(0, mainAxisTotalSpacing);
// Default: JUSTIFY_START // Default: JUSTIFY_START
f32 mainAxisOffset = 0.0f; f32 mainAxisOffset = 0.0f;
f32 mainAxisStep = 0.0f;
if (flags & BZ_UI_FLEX_JUSTIFY_CENTER) { if (flags & BZ_UI_FLEX_JUSTIFY_CENTER) {
mainAxisOffset = mainAxisTotalSpacing * 0.5f; mainAxisOffset = mainAxisTotalSpacing * 0.5f;
} else if (flags & BZ_UI_FLEX_JUSTIFY_END) { } else if (flags & BZ_UI_FLEX_JUSTIFY_END) {
mainAxisOffset = mainAxisTotalSpacing; 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]; 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->margin[MAIN_AXIS];
axisOffset[MAIN_AXIS] += child->style.borderThickness;
calculatePositions(child, axisOffset[BZ_UI_AXIS_X], axisOffset[BZ_UI_AXIS_Y]); 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] += child->margin[MAIN_AXIS + 2];
axisOffset[MAIN_AXIS] += mainAxisStep;
axisOffset[MAIN_AXIS] += child->computedSize[MAIN_AXIS]; axisOffset[MAIN_AXIS] += child->computedSize[MAIN_AXIS];
} }

View File

@@ -43,7 +43,10 @@ enum {
BZ_UI_FLEX_ALIGN_END = (1 << 4), BZ_UI_FLEX_ALIGN_END = (1 << 4),
BZ_UI_FLEX_JUSTIFY_START = (1 << 5), BZ_UI_FLEX_JUSTIFY_START = (1 << 5),
BZ_UI_FLEX_JUSTIFY_CENTER = (1 << 6), BZ_UI_FLEX_JUSTIFY_CENTER = (1 << 6),
BZ_UI_FLEX_JUSTIFY_END = (1 << 7) 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 { typedef struct BzUILayout {