2025-11-24 22:52:51 +03:00

123 lines
4.4 KiB
Java

/*
* Decompiled with CFR 0.152.
*/
package net.minecraft.client.gui.layouts;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import net.minecraft.client.gui.layouts.AbstractLayout;
import net.minecraft.client.gui.layouts.LayoutElement;
import net.minecraft.client.gui.layouts.LayoutSettings;
import net.minecraft.client.gui.navigation.ScreenRectangle;
import net.minecraft.util.Mth;
import net.minecraft.util.Util;
public class FrameLayout
extends AbstractLayout {
private final List<ChildContainer> children = new ArrayList<ChildContainer>();
private int minWidth;
private int minHeight;
private final LayoutSettings defaultChildLayoutSettings = LayoutSettings.defaults().align(0.5f, 0.5f);
public FrameLayout() {
this(0, 0, 0, 0);
}
public FrameLayout(int minWidth, int minHeight) {
this(0, 0, minWidth, minHeight);
}
public FrameLayout(int x, int y, int minWidth, int minHeight) {
super(x, y, minWidth, minHeight);
this.setMinDimensions(minWidth, minHeight);
}
public FrameLayout setMinDimensions(int minWidth, int minHeight) {
return this.setMinWidth(minWidth).setMinHeight(minHeight);
}
public FrameLayout setMinHeight(int minHeight) {
this.minHeight = minHeight;
return this;
}
public FrameLayout setMinWidth(int minWidth) {
this.minWidth = minWidth;
return this;
}
public LayoutSettings newChildLayoutSettings() {
return this.defaultChildLayoutSettings.copy();
}
public LayoutSettings defaultChildLayoutSetting() {
return this.defaultChildLayoutSettings;
}
@Override
public void arrangeElements() {
super.arrangeElements();
int resultWidth = this.minWidth;
int resultHeight = this.minHeight;
for (ChildContainer child : this.children) {
resultWidth = Math.max(resultWidth, child.getWidth());
resultHeight = Math.max(resultHeight, child.getHeight());
}
for (ChildContainer child : this.children) {
child.setX(this.getX(), resultWidth);
child.setY(this.getY(), resultHeight);
}
this.width = resultWidth;
this.height = resultHeight;
}
public <T extends LayoutElement> T addChild(T child) {
return this.addChild(child, this.newChildLayoutSettings());
}
public <T extends LayoutElement> T addChild(T child, LayoutSettings childLayoutSettings) {
this.children.add(new ChildContainer(child, childLayoutSettings));
return child;
}
public <T extends LayoutElement> T addChild(T child, Consumer<LayoutSettings> layoutSettingsAdjustments) {
return this.addChild(child, Util.make(this.newChildLayoutSettings(), layoutSettingsAdjustments));
}
@Override
public void visitChildren(Consumer<LayoutElement> layoutElementVisitor) {
this.children.forEach(wrapper -> layoutElementVisitor.accept(wrapper.child));
}
public static void centerInRectangle(LayoutElement widget, int x, int y, int width, int height) {
FrameLayout.alignInRectangle(widget, x, y, width, height, 0.5f, 0.5f);
}
public static void centerInRectangle(LayoutElement widget, ScreenRectangle rectangle) {
FrameLayout.centerInRectangle(widget, rectangle.position().x(), rectangle.position().y(), rectangle.width(), rectangle.height());
}
public static void alignInRectangle(LayoutElement widget, ScreenRectangle rectangle, float alignX, float alignY) {
FrameLayout.alignInRectangle(widget, rectangle.left(), rectangle.top(), rectangle.width(), rectangle.height(), alignX, alignY);
}
public static void alignInRectangle(LayoutElement widget, int x, int y, int width, int height, float alignX, float alignY) {
FrameLayout.alignInDimension(x, width, widget.getWidth(), widget::setX, alignX);
FrameLayout.alignInDimension(y, height, widget.getHeight(), widget::setY, alignY);
}
public static void alignInDimension(int pos, int length, int widgetLength, Consumer<Integer> setWidgetPos, float align) {
int offset = (int)Mth.lerp(align, 0.0f, length - widgetLength);
setWidgetPos.accept(pos + offset);
}
private static class ChildContainer
extends AbstractLayout.AbstractChildWrapper {
protected ChildContainer(LayoutElement child, LayoutSettings layoutSettings) {
super(child, layoutSettings);
}
}
}