FIX: Align Items recurisvely

This commit is contained in:
sebastian 2026-02-13 15:09:20 +01:00
parent 9a05a0c854
commit a06d649f99

View File

@ -90,43 +90,56 @@ void UiPositioner::compute(const Dimensions &parent) {
// AlignItems // AlignItems
for (auto& child : uiComponent.children) { for (auto& child : uiComponent.children) {
float oldX = child->uiPositioner.screenSpace.x;
float oldY = child->uiPositioner.screenSpace.y;
if (style.flexDirection == FlexDirection::Column) { if (style.flexDirection == FlexDirection::Column) {
float marginLeft = child->uiPositioner.resolve(child->uiPositioner.style.margin.left,screenSpace.width,screenWidth); float marginLeft = child->uiPositioner.resolve(child->uiPositioner.style.margin.left,screenSpace.width,screenWidth);
float remainingCrossSpace = screenSpace.width - child->uiPositioner.screenSpace.width ; float remainingCrossSpace = screenSpace.width - child->uiPositioner.screenSpace.width ;
switch (style.alignItems) { switch (style.alignItems) {
case AlignItems::Start: case AlignItems::Start:
child->uiPositioner.updatePosition(screenSpace.x + marginLeft, child->uiPositioner.screenSpace.y); child->uiPositioner.screenSpace.x = screenSpace.x + marginLeft;
break; break;
case AlignItems::Center: case AlignItems::Center:
child->uiPositioner.updatePosition(screenSpace.x + remainingCrossSpace / 2.0f + marginLeft, child->uiPositioner.screenSpace.y); child->uiPositioner.screenSpace.x = screenSpace.x + remainingCrossSpace / 2.0f + marginLeft;
break; break;
case AlignItems::End: case AlignItems::End:
child->uiPositioner.updatePosition(screenSpace.x + remainingCrossSpace + marginLeft, child->uiPositioner.screenSpace.y); child->uiPositioner.screenSpace.x = screenSpace.x + remainingCrossSpace + marginLeft;
break; break;
default: default:
break; break;
} }
float dx = child->uiPositioner.screenSpace.x - oldX;
for (auto& grandchild : child->children) {
grandchild->uiPositioner.offsetPosition(dx,0.0f);
}
} else { } else {
float remainingCrossSpace = screenSpace.height - child->uiPositioner.screenSpace.height; float remainingCrossSpace = screenSpace.height - child->uiPositioner.screenSpace.height;
float marginTop = child->uiPositioner.resolve(child->uiPositioner.style.margin.top,screenSpace.height,screenHeight); float marginTop = child->uiPositioner.resolve(child->uiPositioner.style.margin.top,screenSpace.height,screenHeight);
switch (style.alignItems) { switch (style.alignItems) {
case AlignItems::Start: case AlignItems::Start:
child->uiPositioner.updatePosition(child->uiPositioner.screenSpace.x, screenSpace.y + marginTop); child->uiPositioner.screenSpace.y = screenSpace.y + marginTop;
break; break;
case AlignItems::Center: case AlignItems::Center:
child->uiPositioner.updatePosition(child->uiPositioner.screenSpace.x, screenSpace.y + remainingCrossSpace / 2.0f + marginTop); child->uiPositioner.screenSpace.y += remainingCrossSpace / 2.0f + marginTop;
break; break;
case AlignItems::End: case AlignItems::End:
child->uiPositioner.updatePosition(child->uiPositioner.screenSpace.x, screenSpace.y + remainingCrossSpace + marginTop); child->uiPositioner.screenSpace.y += remainingCrossSpace + marginTop;
break; break;
default: default:
break; break;
} }
float dy = child->uiPositioner.screenSpace.y - oldY;
for (auto& grandchild : child->children) {
grandchild->uiPositioner.offsetPosition(0.0f,dy);
}
} }
} }