aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuuxel <6596629+Juuxel@users.noreply.github.com>2021-01-31 16:46:03 +0200
committerJuuxel <6596629+Juuxel@users.noreply.github.com>2021-01-31 16:46:03 +0200
commit10772b146ff6af263c9c073028f85d34477b5d08 (patch)
tree363a326392394312ba9d94cfd8b3e21bee4c55d8
parent124eab73545d49b9a5188f09f7cb32714af49b1e (diff)
downloadLibGui-10772b146ff6af263c9c073028f85d34477b5d08.tar.gz
LibGui-10772b146ff6af263c9c073028f85d34477b5d08.tar.bz2
LibGui-10772b146ff6af263c9c073028f85d34477b5d08.zip
Add panel layout insets
-rw-r--r--GuiTest/src/main/java/io/github/cottonmc/test/client/TestClientGui.java14
-rw-r--r--build.gradle5
-rw-r--r--gradle.properties2
-rw-r--r--src/main/java/io/github/cottonmc/cotton/gui/SyncedGuiDescription.java3
-rw-r--r--src/main/java/io/github/cottonmc/cotton/gui/client/BackgroundPainter.java6
-rw-r--r--src/main/java/io/github/cottonmc/cotton/gui/client/LightweightGuiDescription.java3
-rw-r--r--src/main/java/io/github/cottonmc/cotton/gui/impl/client/modmenu/ConfigGui.java3
-rw-r--r--src/main/java/io/github/cottonmc/cotton/gui/widget/WGridPanel.java36
-rw-r--r--src/main/java/io/github/cottonmc/cotton/gui/widget/WPanel.java17
-rw-r--r--src/main/java/io/github/cottonmc/cotton/gui/widget/WPlainPanel.java36
-rw-r--r--src/main/java/io/github/cottonmc/cotton/gui/widget/WPlayerInvPanel.java5
-rw-r--r--src/main/java/io/github/cottonmc/cotton/gui/widget/data/Insets.java92
12 files changed, 197 insertions, 25 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 de8a06a..bdc47b3 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
@@ -1,6 +1,11 @@
package io.github.cottonmc.test.client;
-import io.github.cottonmc.cotton.gui.client.BackgroundPainter;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
+import net.minecraft.client.util.math.MatrixStack;
+import net.minecraft.text.LiteralText;
+import net.minecraft.util.Identifier;
+
import io.github.cottonmc.cotton.gui.client.LightweightGuiDescription;
import io.github.cottonmc.cotton.gui.client.ScreenDrawing;
import io.github.cottonmc.cotton.gui.widget.TooltipBuilder;
@@ -13,11 +18,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 net.fabricmc.api.EnvType;
-import net.fabricmc.api.Environment;
-import net.minecraft.client.util.math.MatrixStack;
-import net.minecraft.text.LiteralText;
-import net.minecraft.util.Identifier;
+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");
@@ -29,6 +30,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) {
private final WWidget tooltipWidget = new WSprite(new Identifier("minecraft", "textures/block/cobblestone.png"));
diff --git a/build.gradle b/build.gradle
index d7c3955..9c4aa77 100644
--- a/build.gradle
+++ b/build.gradle
@@ -36,9 +36,10 @@ dependencies {
modImplementation "io.github.cottonmc:Jankson-Fabric:${project.jankson_version}"
include "io.github.cottonmc:Jankson-Fabric:${project.jankson_version}"
- modRuntime(modCompileOnly("com.terraformersmc:modmenu:$project.modmenu_version") {
+ // TODO: Add modmenu on runtime when it's stable
+ modCompileOnly("com.terraformersmc:modmenu:$project.modmenu_version") {
exclude group: 'net.fabricmc.fabric-api'
- })
+ }
}
processResources {
diff --git a/gradle.properties b/gradle.properties
index 13efc74..8925c5f 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -15,4 +15,4 @@ org.gradle.jvmargs=-Xmx1G
# Dependencies
fabric_version=0.28.3+1.17
jankson_version=3.0.1+j1.2.0
- modmenu_version=2.0.0-beta.1+build.2
+ modmenu_version=1.14.15
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 fae723e..cee1c69 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 13ca534..f66b7bf 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
@@ -27,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("libgui", "textures/widget/panel_light.png"), 8),
- createNinePatch(new Identifier("libgui", "textures/widget/panel_dark.png"), 8)
+ createNinePatch(new Identifier("libgui", "textures/widget/panel_light.png")),
+ createNinePatch(new Identifier("libgui", "textures/widget/panel_dark.png"))
);
/**
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/client/modmenu/ConfigGui.java b/src/main/java/io/github/cottonmc/cotton/gui/impl/client/modmenu/ConfigGui.java
index 5f3d4fa..ccb2a37 100644
--- a/src/main/java/io/github/cottonmc/cotton/gui/impl/client/modmenu/ConfigGui.java
+++ b/src/main/java/io/github/cottonmc/cotton/gui/impl/client/modmenu/ConfigGui.java
@@ -1,5 +1,7 @@
package io.github.cottonmc.cotton.gui.impl.client.modmenu;
+import io.github.cottonmc.cotton.gui.widget.data.Insets;
+
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.text.TranslatableText;
@@ -16,6 +18,7 @@ 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..f78cc08 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,5 +1,9 @@
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.
*/
@@ -10,6 +14,8 @@ public class WGridPanel extends WPanel {
*/
protected int grid = 18;
+ private Insets insets = Insets.NONE;
+
/**
* Constructs a grid panel with the default grid size.
*/
@@ -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,33 @@ 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.
+ *
+ * @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 51a10ce..0e666c8 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
@@ -1,5 +1,7 @@
package io.github.cottonmc.cotton.gui.widget;
+import io.github.cottonmc.cotton.gui.widget.data.Insets;
+
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.util.math.MatrixStack;
@@ -78,8 +80,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..89a9891 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,34 @@ 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.
+ *
+ * @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 +
+ '}';
+ }
+}