diff --git a/src/engine/core/gui/uiComponent/layout/UiPositioner.cpp b/src/engine/core/gui/uiComponent/layout/UiPositioner.cpp index 657bb83..3f3f277 100644 --- a/src/engine/core/gui/uiComponent/layout/UiPositioner.cpp +++ b/src/engine/core/gui/uiComponent/layout/UiPositioner.cpp @@ -90,43 +90,56 @@ void UiPositioner::compute(const Dimensions &parent) { // AlignItems for (auto& child : uiComponent.children) { + float oldX = child->uiPositioner.screenSpace.x; + float oldY = child->uiPositioner.screenSpace.y; + if (style.flexDirection == FlexDirection::Column) { float marginLeft = child->uiPositioner.resolve(child->uiPositioner.style.margin.left,screenSpace.width,screenWidth); float remainingCrossSpace = screenSpace.width - child->uiPositioner.screenSpace.width ; switch (style.alignItems) { case AlignItems::Start: - child->uiPositioner.updatePosition(screenSpace.x + marginLeft, child->uiPositioner.screenSpace.y); + child->uiPositioner.screenSpace.x = screenSpace.x + marginLeft; break; 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; case AlignItems::End: - child->uiPositioner.updatePosition(screenSpace.x + remainingCrossSpace + marginLeft, child->uiPositioner.screenSpace.y); + child->uiPositioner.screenSpace.x = screenSpace.x + remainingCrossSpace + marginLeft; break; default: break; } + + float dx = child->uiPositioner.screenSpace.x - oldX; + for (auto& grandchild : child->children) { + grandchild->uiPositioner.offsetPosition(dx,0.0f); + } } else { float remainingCrossSpace = screenSpace.height - child->uiPositioner.screenSpace.height; float marginTop = child->uiPositioner.resolve(child->uiPositioner.style.margin.top,screenSpace.height,screenHeight); switch (style.alignItems) { case AlignItems::Start: - child->uiPositioner.updatePosition(child->uiPositioner.screenSpace.x, screenSpace.y + marginTop); + child->uiPositioner.screenSpace.y = screenSpace.y + marginTop; break; 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; case AlignItems::End: - child->uiPositioner.updatePosition(child->uiPositioner.screenSpace.x, screenSpace.y + remainingCrossSpace + marginTop); + child->uiPositioner.screenSpace.y += remainingCrossSpace + marginTop; break; default: break; } + + float dy = child->uiPositioner.screenSpace.y - oldY; + for (auto& grandchild : child->children) { + grandchild->uiPositioner.offsetPosition(0.0f,dy); + } } }