diff options
10 files changed, 195 insertions, 21 deletions
diff --git a/GuiTest/src/main/java/io/github/cottonmc/test/client/TestClientGui.java b/GuiTest/src/main/java/io/github/cottonmc/test/client/TestClientGui.java index 46db85f..140e27e 100644 --- a/GuiTest/src/main/java/io/github/cottonmc/test/client/TestClientGui.java +++ b/GuiTest/src/main/java/io/github/cottonmc/test/client/TestClientGui.java @@ -20,6 +20,7 @@ import io.github.cottonmc.cotton.gui.widget.WTiledSprite; import io.github.cottonmc.cotton.gui.widget.WWidget; import io.github.cottonmc.cotton.gui.widget.data.Axis; import io.github.cottonmc.cotton.gui.widget.data.Color; +import io.github.cottonmc.cotton.gui.widget.data.Insets; public class TestClientGui extends LightweightGuiDescription { //private static final Identifier PORTAL1 = new Identifier("libgui-test:portal.png"); @@ -31,6 +32,7 @@ public class TestClientGui extends LightweightGuiDescription { public TestClientGui() { WGridPanel root = new WGridPanel(22); + root.setInsets(Insets.ROOT_PANEL); this.setRootPanel(root); WLabel title = new WLabel(new LiteralText("Client Test Gui"), WLabel.DEFAULT_TEXT_COLOR) { @Environment(EnvType.CLIENT) diff --git a/src/main/java/io/github/cottonmc/cotton/gui/SyncedGuiDescription.java b/src/main/java/io/github/cottonmc/cotton/gui/SyncedGuiDescription.java index a7367cf..2cb1de6 100644 --- a/src/main/java/io/github/cottonmc/cotton/gui/SyncedGuiDescription.java +++ b/src/main/java/io/github/cottonmc/cotton/gui/SyncedGuiDescription.java @@ -34,6 +34,7 @@ import io.github.cottonmc.cotton.gui.widget.WPanel; import io.github.cottonmc.cotton.gui.widget.WPlayerInvPanel; import io.github.cottonmc.cotton.gui.widget.WWidget; import io.github.cottonmc.cotton.gui.widget.data.HorizontalAlignment; +import io.github.cottonmc.cotton.gui.widget.data.Insets; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; @@ -49,7 +50,7 @@ public class SyncedGuiDescription extends ScreenHandler implements GuiDescriptio protected World world; protected PropertyDelegate propertyDelegate; - protected WPanel rootPanel = new WGridPanel(); + protected WPanel rootPanel = new WGridPanel().setInsets(Insets.ROOT_PANEL); protected int titleColor = WLabel.DEFAULT_TEXT_COLOR; protected int darkTitleColor = WLabel.DEFAULT_DARKMODE_TEXT_COLOR; protected boolean fullscreen = false; diff --git a/src/main/java/io/github/cottonmc/cotton/gui/client/BackgroundPainter.java b/src/main/java/io/github/cottonmc/cotton/gui/client/BackgroundPainter.java index c4b545e..fd0a12a 100644 --- a/src/main/java/io/github/cottonmc/cotton/gui/client/BackgroundPainter.java +++ b/src/main/java/io/github/cottonmc/cotton/gui/client/BackgroundPainter.java @@ -1,10 +1,9 @@ package io.github.cottonmc.cotton.gui.client; -import io.github.cottonmc.cotton.gui.impl.LibGuiCommon; - import net.minecraft.client.util.math.MatrixStack; import net.minecraft.util.Identifier; +import io.github.cottonmc.cotton.gui.impl.LibGuiCommon; import io.github.cottonmc.cotton.gui.widget.WItemSlot; import io.github.cottonmc.cotton.gui.widget.WWidget; @@ -28,16 +27,14 @@ public interface BackgroundPainter { * <p>This background painter uses {@code libgui:textures/widget/panel_light.png} as the light texture and * {@code libgui:textures/widget/panel_dark.png} as the dark texture. * - * <p>This background painter applies a padding of 8 pixels to all sides around the widget. - * * <p>This background painter is the default painter for root panels. * * You can override {@link io.github.cottonmc.cotton.gui.GuiDescription#addPainters()} to customize the painter yourself. * * @since 1.5.0 */ public static BackgroundPainter VANILLA = createLightDarkVariants( - createNinePatch(new Identifier(LibGuiCommon.MOD_ID, "textures/widget/panel_light.png"), 8), - createNinePatch(new Identifier(LibGuiCommon.MOD_ID, "textures/widget/panel_dark.png"), 8) + createNinePatch(new Identifier(LibGuiCommon.MOD_ID, "textures/widget/panel_light.png")), + createNinePatch(new Identifier(LibGuiCommon.MOD_ID, "textures/widget/panel_dark.png")) ); /** @@ -92,7 +89,7 @@ public interface BackgroundPainter { */ public static BackgroundPainter createColorful(int panelColor) { return (matrices, left, top, panel) -> { - ScreenDrawing.drawGuiPanel(matrices, left-8, top-8, panel.getWidth()+16, panel.getHeight()+16, panelColor); + ScreenDrawing.drawGuiPanel(matrices, left, top, panel.getWidth(), panel.getHeight(), panelColor); }; } @@ -108,7 +105,7 @@ public interface BackgroundPainter { int shadowColor = ScreenDrawing.multiplyColor(panelColor, 1.0f - contrast); int hilightColor = ScreenDrawing.multiplyColor(panelColor, 1.0f + contrast); - ScreenDrawing.drawGuiPanel(matrices, left-8, top-8, panel.getWidth()+16, panel.getHeight()+16, shadowColor, panelColor, hilightColor, 0xFF000000); + ScreenDrawing.drawGuiPanel(matrices, left, top, panel.getWidth(), panel.getHeight(), shadowColor, panelColor, hilightColor, 0xFF000000); }; } diff --git a/src/main/java/io/github/cottonmc/cotton/gui/client/LightweightGuiDescription.java b/src/main/java/io/github/cottonmc/cotton/gui/client/LightweightGuiDescription.java index 54ae02f..55b62a4 100644 --- a/src/main/java/io/github/cottonmc/cotton/gui/client/LightweightGuiDescription.java +++ b/src/main/java/io/github/cottonmc/cotton/gui/client/LightweightGuiDescription.java @@ -9,13 +9,14 @@ import io.github.cottonmc.cotton.gui.widget.WLabel; import io.github.cottonmc.cotton.gui.widget.WPanel; import io.github.cottonmc.cotton.gui.widget.WWidget; import io.github.cottonmc.cotton.gui.widget.data.HorizontalAlignment; +import io.github.cottonmc.cotton.gui.widget.data.Insets; import org.jetbrains.annotations.Nullable; /** * A GuiDescription without any associated Minecraft classes */ public class LightweightGuiDescription implements GuiDescription { - protected WPanel rootPanel = new WGridPanel(); + protected WPanel rootPanel = new WGridPanel().setInsets(Insets.ROOT_PANEL); protected PropertyDelegate propertyDelegate; protected WWidget focus; diff --git a/src/main/java/io/github/cottonmc/cotton/gui/impl/modmenu/ConfigGui.java b/src/main/java/io/github/cottonmc/cotton/gui/impl/modmenu/ConfigGui.java index 625b67c..8c237a8 100644 --- a/src/main/java/io/github/cottonmc/cotton/gui/impl/modmenu/ConfigGui.java +++ b/src/main/java/io/github/cottonmc/cotton/gui/impl/modmenu/ConfigGui.java @@ -5,17 +5,19 @@ import net.minecraft.client.gui.screen.Screen; import net.minecraft.text.TranslatableText; import io.github.cottonmc.cotton.gui.client.BackgroundPainter; -import io.github.cottonmc.cotton.gui.impl.client.LibGuiClient; import io.github.cottonmc.cotton.gui.client.LightweightGuiDescription; +import io.github.cottonmc.cotton.gui.impl.client.LibGuiClient; import io.github.cottonmc.cotton.gui.widget.WButton; import io.github.cottonmc.cotton.gui.widget.WGridPanel; import io.github.cottonmc.cotton.gui.widget.WTextField; import io.github.cottonmc.cotton.gui.widget.WToggleButton; +import io.github.cottonmc.cotton.gui.widget.data.Insets; public class ConfigGui extends LightweightGuiDescription { public ConfigGui(Screen previous) { WGridPanel root = new WGridPanel(); + root.setInsets(Insets.ROOT_PANEL); setRootPanel(root); WToggleButton darkmodeButton = new WToggleButton(new TranslatableText("option.libgui.darkmode")) { diff --git a/src/main/java/io/github/cottonmc/cotton/gui/widget/WGridPanel.java b/src/main/java/io/github/cottonmc/cotton/gui/widget/WGridPanel.java index 69aa036..0fd8bd4 100644 --- a/src/main/java/io/github/cottonmc/cotton/gui/widget/WGridPanel.java +++ b/src/main/java/io/github/cottonmc/cotton/gui/widget/WGridPanel.java @@ -1,9 +1,15 @@ package io.github.cottonmc.cotton.gui.widget; +import io.github.cottonmc.cotton.gui.widget.data.Insets; + +import java.util.Objects; + /** * A panel that positions children in a grid. */ public class WGridPanel extends WPanel { + private Insets insets = Insets.NONE; + /** * The grid size in pixels. * Defaults to 18, which is the size of one item slot. @@ -35,12 +41,12 @@ public class WGridPanel extends WPanel { public void add(WWidget w, int x, int y) { children.add(w); w.parent = this; - w.setLocation(x * grid, y * grid); + w.setLocation(x * grid + insets.left, y * grid + insets.top); if (w.canResize()) { w.setSize(grid, grid); } - expandToFit(w); + expandToFit(w, insets); } /** @@ -55,11 +61,36 @@ public class WGridPanel extends WPanel { public void add(WWidget w, int x, int y, int width, int height) { children.add(w); w.parent = this; - w.setLocation(x * grid, y * grid); + w.setLocation(x * grid + insets.left, y * grid + insets.top); if (w.canResize()) { w.setSize(width * grid, height * grid); } - expandToFit(w); + expandToFit(w, insets); + } + + /** + * Gets the layout insets of this panel. + * + * @return the insets + * @since 4.0.0 + */ + public Insets getInsets() { + return insets; + } + + /** + * Sets the layout insets of this panel. + * + * <p>The insets should be set <i>before</i> adding any widgets + * to this panel. + * + * @param insets the insets, should not be null + * @return this panel + * @since 4.0.0 + */ + public WGridPanel setInsets(Insets insets) { + this.insets = Objects.requireNonNull(insets, "insets"); + return this; } } diff --git a/src/main/java/io/github/cottonmc/cotton/gui/widget/WPanel.java b/src/main/java/io/github/cottonmc/cotton/gui/widget/WPanel.java index b472d45..64b2369 100644 --- a/src/main/java/io/github/cottonmc/cotton/gui/widget/WPanel.java +++ b/src/main/java/io/github/cottonmc/cotton/gui/widget/WPanel.java @@ -6,6 +6,7 @@ import net.minecraft.client.util.math.MatrixStack; import io.github.cottonmc.cotton.gui.GuiDescription; import io.github.cottonmc.cotton.gui.client.BackgroundPainter; +import io.github.cottonmc.cotton.gui.widget.data.Insets; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; @@ -87,8 +88,19 @@ public abstract class WPanel extends WWidget { * @param w the widget */ protected void expandToFit(WWidget w) { - int pushRight = w.getX()+w.getWidth(); - int pushDown = w.getY()+w.getHeight(); + expandToFit(w, Insets.NONE); + } + + /** + * Expands this panel be at least as large as the widget. + * + * @param w the widget + * @param insets the layout insets + * @since 4.0.0 + */ + protected void expandToFit(WWidget w, Insets insets) { + int pushRight = w.getX()+w.getWidth()+insets.right; + int pushDown = w.getY()+w.getHeight()+insets.bottom; this.setSize(Math.max(this.getWidth(), pushRight), Math.max(this.getHeight(), pushDown)); } diff --git a/src/main/java/io/github/cottonmc/cotton/gui/widget/WPlainPanel.java b/src/main/java/io/github/cottonmc/cotton/gui/widget/WPlainPanel.java index d658d1f..0afd16f 100644 --- a/src/main/java/io/github/cottonmc/cotton/gui/widget/WPlainPanel.java +++ b/src/main/java/io/github/cottonmc/cotton/gui/widget/WPlainPanel.java @@ -1,9 +1,15 @@ package io.github.cottonmc.cotton.gui.widget; +import io.github.cottonmc.cotton.gui.widget.data.Insets; + +import java.util.Objects; + /** * A panel that positions children by pixel-perfect positions. */ public class WPlainPanel extends WPanel { + private Insets insets = Insets.NONE; + /** * Adds a new widget to this panel. * @@ -17,12 +23,12 @@ public class WPlainPanel extends WPanel { public void add(WWidget w, int x, int y) { children.add(w); w.parent = this; - w.setLocation(x, y); + w.setLocation(insets.left + x, insets.top + y); if (w.canResize()) { w.setSize(18, 18); } - expandToFit(w); + expandToFit(w, insets); //valid = false; } @@ -38,12 +44,37 @@ public class WPlainPanel extends WPanel { public void add(WWidget w, int x, int y, int width, int height) { children.add(w); w.parent = this; - w.setLocation(x, y); + w.setLocation(insets.left + x, insets.top + y); if (w.canResize()) { w.setSize(width, height); } - expandToFit(w); + expandToFit(w, insets); //valid = false; } + + /** + * Gets the layout insets of this panel. + * + * @return the insets + * @since 4.0.0 + */ + public Insets getInsets() { + return insets; + } + + /** + * Sets the layout insets of this panel. + * + * <p>The insets should be set <i>before</i> adding any widgets + * to this panel. + * + * @param insets the insets, should not be null + * @return this panel + * @since 4.0.0 + */ + public WPlainPanel setInsets(Insets insets) { + this.insets = Objects.requireNonNull(insets, "insets"); + return this; + } } diff --git a/src/main/java/io/github/cottonmc/cotton/gui/widget/WPlayerInvPanel.java b/src/main/java/io/github/cottonmc/cotton/gui/widget/WPlayerInvPanel.java index 2bc7d15..c105924 100644 --- a/src/main/java/io/github/cottonmc/cotton/gui/widget/WPlayerInvPanel.java +++ b/src/main/java/io/github/cottonmc/cotton/gui/widget/WPlayerInvPanel.java @@ -59,6 +59,11 @@ public class WPlayerInvPanel extends WPlainPanel { this.add(hotbar, 0, y + 58); } + @Override + public boolean canResize() { + return false; + } + /** * Creates a vanilla-style inventory label for a player inventory. * diff --git a/src/main/java/io/github/cottonmc/cotton/gui/widget/data/Insets.java b/src/main/java/io/github/cottonmc/cotton/gui/widget/data/Insets.java new file mode 100644 index 0000000..85c32ed --- /dev/null +++ b/src/main/java/io/github/cottonmc/cotton/gui/widget/data/Insets.java @@ -0,0 +1,92 @@ +package io.github.cottonmc.cotton.gui.widget.data; + +import java.util.Objects; + +/** + * The layout insets of a panel. The insets describe how many pixels should be around the panel's contents. + * For example, root panels have 7 pixels around their contents, and that is set via {@link #ROOT_PANEL}. + * + * @since 4.0.0 + */ +public final class Insets { + /** + * Empty layout insets that do not provide any borders around content. + */ + public static final Insets NONE = new Insets(0); + + /** + * The default insets of a root panel, providing 7 pixels around the content on all sides. + */ + public static final Insets ROOT_PANEL = new Insets(7); + + /** The top (-Y) inset size. */ + public final int top; + /** The left (-X) inset size. */ + public final int left; + /** The bottom (+Y) inset size. */ + public final int bottom; + /** The right (+X) inset size. */ + public final int right; + + /** + * Constructs layout insets. + * + * @param top the top (-Y) inset size + * @param left the left (-X) inset size + * @param bottom the bottom (+Y) inset size + * @param right the right (+X) inset size + */ + public Insets(int top, int left, int bottom, int right) { + if (top < 0) throw new IllegalArgumentException("top cannot be negative, found " + top); + if (left < 0) throw new IllegalArgumentException("left cannot be negative, found " + left); + if (bottom < 0) throw new IllegalArgumentException("bottom cannot be negative, found " + bottom); + if (right < 0) throw new IllegalArgumentException("right cannot be negative, found " + right); + + this.top = top; + this.left = left; + this.bottom = bottom; + this.right = right; + } + + /** + * Constructs layout insets. + * + * @param vertical the vertical (Y) size of the insets + * @param horizontal the horizontal (X) size of the insets + */ + public Insets(int vertical, int horizontal) { + this(vertical, horizontal, vertical, horizontal); + } + + /** + * Constructs layout insets. + * + * @param size the size of the insets on all sides + */ + public Insets(int size) { + this(size, size, size, size); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Insets insets = (Insets) o; + return top == insets.top && left == insets.left && bottom == insets.bottom && right == insets.right; + } + + @Override + public int hashCode() { + return Objects.hash(top, left, bottom, right); + } + + @Override + public String toString() { + return "Insets{" + + "top=" + top + + ", left=" + left + + ", bottom=" + bottom + + ", right=" + right + + '}'; + } +} |