SimpleJavaEngine/src/main/java/speiger/src/coreengine/rendering/gui/components/layouts/FlowLayout.java

56 lines
1.5 KiB
Java

package speiger.src.coreengine.rendering.gui.components.layouts;
import java.util.List;
import java.util.function.Consumer;
import speiger.src.coreengine.math.vector.floats.Vec2f;
import speiger.src.coreengine.rendering.gui.GuiComponent;
import speiger.src.coreengine.rendering.gui.helper.box.IGuiBox;
public class FlowLayout implements Consumer<GuiComponent>
{
IGuiBox box;
List<? extends GuiComponent> components;
Vec2f padding;
public FlowLayout(IGuiBox box, Vec2f padding, List<? extends GuiComponent> components)
{
this.padding = padding;
this.box = box;
this.components = components;
}
@Override
public void accept(GuiComponent t)
{
float minX = box.getRelativeX();
float minY = box.getRelativeY();
float maxWidth = box.getWidth();
int xInserted = 0;
int yInserted = 0;
float widthUsed = 0F;
float heightOffset = 0F;
float maxHeight = 0F;
for(int i = 0,m=components.size();i<m;i++)
{
GuiComponent component = components.get(i);
float[] bounds = new float[4];
component.calculateActualBounds(bounds, true);
float width = bounds[2] - bounds[0];
if(widthUsed + width + padding.getX() >= maxWidth && xInserted > 0)
{
xInserted = 0;
maxHeight += heightOffset;
heightOffset = 0F;
widthUsed = 0F;
yInserted++;
}
component.set(minX + widthUsed + padding.getX(), minY + maxHeight + (padding.getY() * yInserted));
heightOffset = Math.max(heightOffset, bounds[3] - bounds[1]);
widthUsed += width + padding.getX();
xInserted++;
}
}
}