SimpleJavaEngine/src/main/java/speiger/src/coreengine/rendering/gui/helper/box/GuiBox.java

181 lines
4.8 KiB
Java

package speiger.src.coreengine.rendering.gui.helper.box;
import java.util.List;
import speiger.src.collections.objects.lists.ObjectArrayList;
public class GuiBox implements IGuiBox
{
List<IGuiBox> children = new ObjectArrayList<>();
IGuiBox parent;
float minX;
float minY;
float maxX;
float maxY;
float width;
float height;
float scale = 1F;
float baseX;
float baseY;
float baseWidth;
float baseHeight;
float baseScale = 1F;
protected GuiBox() {}
public GuiBox(float x, float y, float width, float height) {
set(x, y, width, height);
onChanged();
}
public static IGuiBox simple(float x, float y, float width, float height) {
return new GuiBox(x, y, width, height);
}
public static IGuiBox clone(IGuiBox box) {
return new GuiBox(box.getMinX(), box.getMinY(), box.getWidth(), box.getHeight());
}
public static IGuiBox clonePadded(IGuiBox box, float padding) {
return new GuiBox(box.getMinX() + padding, box.getMinY() + padding, box.getWidth() - padding * 2F, box.getHeight() - padding * 2F);
}
@Override
public IGuiBox addChild(IGuiBox box) {
children.add(box);
box.setParent(this);
return this;
}
@Override
public IGuiBox removeChild(IGuiBox box) {
if(children.remove(box)) box.setParent(null);
return this;
}
@Override
public IGuiBox clearChildren() {
for(int i = 0,m=children.size();i<m;i++) {
children.get(i).setParent(null);
}
children.clear();
return this;
}
@Override
public IGuiBox onChanged() {
minX = parent == null ? baseX : parent.getMinX(baseX);
minY = parent == null ? baseY : parent.getMinY(baseY);
maxX = parent == null ? baseX + width : parent.getMinX(baseX + width);
maxY = parent == null ? baseY + height : parent.getMinY(baseY + height);
scale = parent == null ? baseScale : parent.getScale() * baseScale;
for(int i = 0,m=children.size();i<m;i++) {
children.get(i).onChanged();
}
return this;
}
@Override
public IGuiBox setParent(IGuiBox box) {
parent = box;
return this;
}
@Override
public IGuiBox getParent() { return parent; }
@Override
public float getScale() { return scale; }
@Override
public float getBaseX() { return baseX; }
@Override
public float getBaseY() { return baseY; }
@Override
public float getRelativeX() { return parent != null ? baseX : 0F; }
@Override
public float getRelativeY() { return parent != null ? baseY : 0F; }
@Override
public float getWidth() { return baseWidth * scale; }
@Override
public float getWidth(float extra) { return baseWidth * scale + extra * baseScale; }
@Override
public float getHeight() { return baseHeight * scale; }
@Override
public float getHeight(float extra) { return baseHeight * scale + extra * baseScale; }
@Override
public float getMinX() { return minX; }
@Override
public float getMinX(float extra) { return minX + extra * scale; }
@Override
public float getMinY() { return minY; }
@Override
public float getMinY(float extra) { return minY + extra * scale; }
@Override
public float getMaxX() { return maxX; }
@Override
public float getMaxX(float extra) { return maxX + extra * scale; }
@Override
public float getMaxY() { return maxY; }
@Override
public float getMaxY(float extra) { return maxY + extra * scale; }
@Override
public float getCenterX() { return minX + (maxX - minX) * 0.5F; }
@Override
public float getCenterX(float extra) { return minX + (maxX - minX) * 0.5F + extra * scale; }
@Override
public float getCenterY() { return minY + (maxY - minY) * 0.5F; }
@Override
public float getCenterY(float extra) { return minY + (maxY - minY) * 0.5F + extra * scale; }
@Override
public IGuiBox setX(float x) {
baseX = x;
return this;
}
@Override
public IGuiBox setY(float y) {
baseY = y;
return this;
}
@Override
public IGuiBox setWidth(float width) {
baseWidth = width;
this.width = baseWidth * baseScale;
return this;
}
@Override
public IGuiBox setHeight(float height) {
baseHeight = height;
this.height = baseHeight * baseScale;
return this;
}
@Override
public IGuiBox setScale(float scale) {
baseScale = scale;
width = baseWidth * baseScale;
height = baseHeight * baseScale;
return this;
}
@Override
public IGuiBox move(float xOffset, float yOffset) { return setXY(baseX + xOffset, baseY + yOffset); }
@Override
public IGuiBox grow(float xGrowth, float yGrowth) { return setBounds(baseWidth + xGrowth, baseHeight + yGrowth); }
@Override
public IGuiBox scale(float scale) { return setScale(scale * baseScale); }
@Override
public float getBaseScale() { return baseScale; }
@Override
public float getBaseWidth() { return baseWidth; }
@Override
public float getBaseHeight() { return baseHeight; }
@Override
public String toString() { return "GuiBox[minX="+minX+", minY="+minY+", maxX="+maxX+", maxY="+maxY+", width="+width+", height="+height+"]"; }
}