Add rest of justify flags to flex box
This commit is contained in:
@@ -27,13 +27,14 @@ typedef struct BzUINode {
|
|||||||
BzUIStyle style;
|
BzUIStyle style;
|
||||||
BzUIFlags flags;
|
BzUIFlags flags;
|
||||||
const char *string;
|
const char *string;
|
||||||
BzUISize semanticSize[BZ_UI_AXIS_COUNT];
|
|
||||||
f32 padding[BZ_UI_AXIS_COUNT * 2];
|
BzUISize semanticSize[BZ_UI_AXIS_COUNT];
|
||||||
f32 margin[BZ_UI_AXIS_COUNT * 2];
|
f32 padding[BZ_UI_AXIS_COUNT * 2];
|
||||||
|
f32 margin[BZ_UI_AXIS_COUNT * 2];
|
||||||
|
|
||||||
// recomputed every frame
|
// recomputed every frame
|
||||||
f32 computedPosition[BZ_UI_AXIS_COUNT];
|
f32 computedPosition[BZ_UI_AXIS_COUNT];
|
||||||
f32 computedSize[BZ_UI_AXIS_COUNT];
|
f32 computedSize[BZ_UI_AXIS_COUNT];
|
||||||
|
|
||||||
BzUIInteraction interaction;
|
BzUIInteraction interaction;
|
||||||
} BzUINode;
|
} BzUINode;
|
||||||
@@ -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];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -35,15 +35,18 @@ enum {
|
|||||||
BZ_UI_UNIDIR_COLUMN = (1 << 1),
|
BZ_UI_UNIDIR_COLUMN = (1 << 1),
|
||||||
BZ_UI_UNIDIR_WRAP = (1 << 2),
|
BZ_UI_UNIDIR_WRAP = (1 << 2),
|
||||||
// FLEX BOX
|
// FLEX BOX
|
||||||
BZ_UI_FLEX_NONE = 0,
|
BZ_UI_FLEX_NONE = 0,
|
||||||
BZ_UI_FLEX_DIR_ROW = (1 << 0),
|
BZ_UI_FLEX_DIR_ROW = (1 << 0),
|
||||||
BZ_UI_FLEX_DIR_COLUMN = (1 << 1),
|
BZ_UI_FLEX_DIR_COLUMN = (1 << 1),
|
||||||
BZ_UI_FLEX_ALIGN_START = (1 << 2),
|
BZ_UI_FLEX_ALIGN_START = (1 << 2),
|
||||||
BZ_UI_FLEX_ALIGN_CENTER = (1 << 3),
|
BZ_UI_FLEX_ALIGN_CENTER = (1 << 3),
|
||||||
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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user