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,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];
}

View File

@@ -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 {