mirror of
https://github.com/RetroDECK/ES-DE.git
synced 2025-01-18 07:05:39 +00:00
Implement origin.
This commit is contained in:
parent
af50921d4b
commit
7820a94442
|
@ -66,7 +66,7 @@ void FlexboxComponent::onSizeChanged() {
|
|||
|
||||
void FlexboxComponent::computeLayout()
|
||||
{
|
||||
// Start placing items in the top-left;
|
||||
// Start placing items in the top-left.
|
||||
float anchorX = 0;
|
||||
float anchorY = 0;
|
||||
float anchorOriginX = 0;
|
||||
|
@ -93,17 +93,27 @@ void FlexboxComponent::computeLayout()
|
|||
maxItemSize = {std::max(maxItemSize.x, newSize.x), std::max(maxItemSize.y, newSize.y)};
|
||||
}
|
||||
|
||||
// Pre-compute layout parameters;
|
||||
// Pre-compute layout parameters.
|
||||
int n = mChildren.size();
|
||||
int nLines = std::max(1, (int)std::ceil(n / std::max(1, (int)mItemsPerLine)));
|
||||
int nLines = std::max(1, (int) std::ceil(n / std::max(1, (int) mItemsPerLine)));
|
||||
float lineWidth =
|
||||
(mDirection == "row" ? (maxItemSize.y + mItemMargin.y) : (maxItemSize.x + mItemMargin.x));
|
||||
float anchorXStart = anchorX;
|
||||
float anchorYStart = anchorY;
|
||||
|
||||
// Compute total container size.
|
||||
glm::vec2 totalSize = {mItemMargin.x, mItemMargin.y};
|
||||
if (mDirection == "row") {
|
||||
totalSize.x += (mItemMargin.x + mItemWidth) * mItemsPerLine;
|
||||
totalSize.y += (mItemMargin.y + maxItemSize.y) * nLines;
|
||||
} else {
|
||||
totalSize.x += (mItemMargin.x + mItemWidth) * nLines;
|
||||
totalSize.y += (mItemMargin.y + maxItemSize.y) * mItemsPerLine;
|
||||
}
|
||||
|
||||
// Iterate through the children.
|
||||
for (int i = 0; i < n; i++) {
|
||||
GuiComponent* child = mChildren[i];
|
||||
GuiComponent *child = mChildren[i];
|
||||
auto size = child->getSize();
|
||||
|
||||
// Top-left anchor position.
|
||||
|
@ -118,20 +128,24 @@ void FlexboxComponent::computeLayout()
|
|||
if (mAlign == ITEM_ALIGN_END) {
|
||||
x += directionLine.x == 0 ? (maxItemSize.x - size.x) : 0;
|
||||
y += directionLine.y == 0 ? (maxItemSize.y - size.y) : 0;
|
||||
}
|
||||
else if (mAlign == ITEM_ALIGN_CENTER) {
|
||||
} else if (mAlign == ITEM_ALIGN_CENTER) {
|
||||
x += directionLine.x == 0 ? (maxItemSize.x - size.x) / 2 : 0;
|
||||
y += directionLine.y == 0 ? (maxItemSize.y - size.y) / 2 : 0;
|
||||
}
|
||||
else if (mAlign == ITEM_ALIGN_STRETCH && mDirection == "row") {
|
||||
} else if (mAlign == ITEM_ALIGN_STRETCH && mDirection == "row") {
|
||||
child->setSize(child->getSize().x, maxItemSize.y);
|
||||
}
|
||||
|
||||
// Apply origin.
|
||||
if (mOrigin.x > 0 && mOrigin.x <= 1)
|
||||
x -= mOrigin.x * totalSize.x;
|
||||
if (mOrigin.y > 0 && mOrigin.y <= 1)
|
||||
y -= mOrigin.y * totalSize.y;
|
||||
|
||||
// Store final item position.
|
||||
child->setPosition(getPosition().x + x, getPosition().y + y);
|
||||
|
||||
// Translate anchor.
|
||||
if ((i + 1) % std::max(1, (int)mItemsPerLine) != 0) {
|
||||
if ((i + 1) % std::max(1, (int) mItemsPerLine) != 0) {
|
||||
// Translate on same line.
|
||||
anchorX += (size.x + mItemMargin.x) * directionLine.x;
|
||||
anchorY += (size.y + mItemMargin.y) * directionLine.y;
|
||||
|
|
|
@ -238,7 +238,7 @@ based on: 'recalbox-multi' by the Recalbox community
|
|||
</text>
|
||||
<badges name="md_badges">
|
||||
<pos>0.8125 0.65</pos>
|
||||
<origin>0.5 0.5</origin>
|
||||
<origin>0 0</origin>
|
||||
|
||||
<!-- flexbox properties -->
|
||||
<direction>row</direction>
|
||||
|
|
Loading…
Reference in a new issue