From 05376de0ceafc08c36602ea3922a96318db6d191 Mon Sep 17 00:00:00 2001
From: Juuz <6596629+Juuxel@users.noreply.github.com>
Date: Sat, 29 May 2021 15:31:11 +0300
Subject: Add (back) NinePatchBackgroundPainter with padding support
---
.../cotton/gui/client/BackgroundPainter.java | 26 +----
.../gui/client/NinePatchBackgroundPainter.java | 105 +++++++++++++++++++++
.../cottonmc/cotton/gui/widget/WTabPanel.java | 18 +---
3 files changed, 113 insertions(+), 36 deletions(-)
create mode 100644 src/main/java/io/github/cottonmc/cotton/gui/client/NinePatchBackgroundPainter.java
(limited to 'src')
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 61fcbb8..36c6c3a 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
@@ -4,7 +4,6 @@ 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.impl.client.NinePatchTextureRendererImpl;
import io.github.cottonmc.cotton.gui.widget.WItemSlot;
import io.github.cottonmc.cotton.gui.widget.WWidget;
import io.github.cottonmc.cotton.gui.widget.data.Texture;
@@ -16,17 +15,6 @@ import java.util.function.Consumer;
/**
* Background painters are used to paint the background of a widget.
* The background painter instance of a widget can be changed to customize the look of a widget.
- *
- *
Nine-patch background painters
- *
- * Nine-patch background painters paint rectangles using a special nine-patch texture.
- * The texture is divided into nine sections: four corners, four edges and a center part.
- * The edges and the center are either tiled or stretched, depending on the mode of the painter,
- * to fill the area between the corners. By default, the texture is tiled.
- *
- * Nine-patch background painters are created using {@link #createNinePatch(Identifier)} or
- * {@link #createNinePatch(Texture, Consumer)}. The latter lets you customise the look of
- * the background more finely.
*/
@FunctionalInterface
public interface BackgroundPainter {
@@ -134,8 +122,9 @@ public interface BackgroundPainter {
* @param texture the background painter texture
* @return a new nine-patch background painter
* @since 1.5.0
+ * @see NinePatchBackgroundPainter
*/
- public static BackgroundPainter createNinePatch(Identifier texture) {
+ public static NinePatchBackgroundPainter createNinePatch(Identifier texture) {
return createNinePatch(new Texture(texture), builder -> builder.cornerSize(4).cornerUv(0.25f));
}
@@ -148,18 +137,13 @@ public interface BackgroundPainter {
* @since 4.0.0
* @see NinePatch
* @see NinePatch.Builder
+ * @see NinePatchBackgroundPainter
*/
- public static BackgroundPainter createNinePatch(Texture texture, Consumer> configurator) {
+ public static NinePatchBackgroundPainter createNinePatch(Texture texture, Consumer> configurator) {
TextureRegion region = new TextureRegion<>(texture.image(), texture.u1(), texture.v1(), texture.u2(), texture.v2());
var builder = NinePatch.builder(region);
configurator.accept(builder);
- var ninePatch = builder.build();
- return (matrices, left, top, panel) -> {
- matrices.push();
- matrices.translate(left, top, 0);
- ninePatch.draw(NinePatchTextureRendererImpl.INSTANCE, matrices, panel.getWidth(), panel.getHeight());
- matrices.pop();
- };
+ return new NinePatchBackgroundPainter(builder.build());
}
/**
diff --git a/src/main/java/io/github/cottonmc/cotton/gui/client/NinePatchBackgroundPainter.java b/src/main/java/io/github/cottonmc/cotton/gui/client/NinePatchBackgroundPainter.java
new file mode 100644
index 0000000..04e7a04
--- /dev/null
+++ b/src/main/java/io/github/cottonmc/cotton/gui/client/NinePatchBackgroundPainter.java
@@ -0,0 +1,105 @@
+package io.github.cottonmc.cotton.gui.client;
+
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
+import net.minecraft.client.util.math.MatrixStack;
+import net.minecraft.util.Identifier;
+
+import io.github.cottonmc.cotton.gui.impl.client.NinePatchTextureRendererImpl;
+import io.github.cottonmc.cotton.gui.widget.WWidget;
+import io.github.cottonmc.cotton.gui.widget.data.Texture;
+import juuxel.libninepatch.NinePatch;
+
+import java.util.function.Consumer;
+
+/**
+ * Nine-patch background painters paint rectangles using a special nine-patch texture.
+ * The texture is divided into nine sections: four corners, four edges and a center part.
+ * The edges and the center are either tiled or stretched, depending on the mode of the painter,
+ * to fill the area between the corners. By default, the texture is tiled.
+ *
+ * Nine-patch background painters can be created using {@link BackgroundPainter#createNinePatch(Identifier)},
+ * {@link #createNinePatch(Texture, Consumer)}, or with the constructor directly. The latter two let you customise
+ * the look of the background more finely.
+ *
+ *
{@code NinePatchBackgroundPainter} has a customizable padding that can be applied.
+ * By default there is no padding, but you can set it using {@link NinePatchBackgroundPainter#setPadding(int)}.
+ *
+ * @since 4.0.0
+ */
+@Environment(EnvType.CLIENT)
+public final class NinePatchBackgroundPainter implements BackgroundPainter {
+ private final NinePatch ninePatch;
+ private int topPadding = 0;
+ private int leftPadding = 0;
+ private int bottomPadding = 0;
+ private int rightPadding = 0;
+
+ public NinePatchBackgroundPainter(NinePatch ninePatch) {
+ this.ninePatch = ninePatch;
+ }
+
+ public int getTopPadding() {
+ return topPadding;
+ }
+
+ public NinePatchBackgroundPainter setTopPadding(int topPadding) {
+ this.topPadding = topPadding;
+ return this;
+ }
+
+ public int getLeftPadding() {
+ return leftPadding;
+ }
+
+ public NinePatchBackgroundPainter setLeftPadding(int leftPadding) {
+ this.leftPadding = leftPadding;
+ return this;
+ }
+
+ public int getBottomPadding() {
+ return bottomPadding;
+ }
+
+ public NinePatchBackgroundPainter setBottomPadding(int bottomPadding) {
+ this.bottomPadding = bottomPadding;
+ return this;
+ }
+
+ public int getRightPadding() {
+ return rightPadding;
+ }
+
+ public NinePatchBackgroundPainter setRightPadding(int rightPadding) {
+ this.rightPadding = rightPadding;
+ return this;
+ }
+
+ public NinePatchBackgroundPainter setPadding(int padding) {
+ this.topPadding = this.leftPadding = this.bottomPadding = this.rightPadding = padding;
+ return this;
+ }
+
+ public NinePatchBackgroundPainter setPadding(int vertical, int horizontal) {
+ this.topPadding = this.bottomPadding = vertical;
+ this.leftPadding = this.rightPadding = horizontal;
+ return this;
+ }
+
+ public NinePatchBackgroundPainter setPadding(int topPadding, int leftPadding, int bottomPadding, int rightPadding) {
+ this.topPadding = topPadding;
+ this.leftPadding = leftPadding;
+ this.bottomPadding = bottomPadding;
+ this.rightPadding = rightPadding;
+
+ return this;
+ }
+
+ @Override
+ public void paintBackground(MatrixStack matrices, int left, int top, WWidget panel) {
+ matrices.push();
+ matrices.translate(left - leftPadding, top - topPadding, 0);
+ ninePatch.draw(NinePatchTextureRendererImpl.INSTANCE, matrices, panel.getWidth() + leftPadding + rightPadding, panel.getHeight() + topPadding + bottomPadding);
+ matrices.pop();
+ }
+}
diff --git a/src/main/java/io/github/cottonmc/cotton/gui/widget/WTabPanel.java b/src/main/java/io/github/cottonmc/cotton/gui/widget/WTabPanel.java
index fab8941..2ee7e92 100644
--- a/src/main/java/io/github/cottonmc/cotton/gui/widget/WTabPanel.java
+++ b/src/main/java/io/github/cottonmc/cotton/gui/widget/WTabPanel.java
@@ -326,23 +326,11 @@ public class WTabPanel extends WPanel {
}
}
- // Make the tab a bit higher...
- if (selected) {
- height += 2;
- y -= 2;
- }
-
(selected ? Painters.SELECTED_TAB : Painters.UNSELECTED_TAB).paintBackground(matrices, x, y, this);
if (isFocused()) {
(selected ? Painters.SELECTED_TAB_FOCUS_BORDER : Painters.UNSELECTED_TAB_FOCUS_BORDER).paintBackground(matrices, x, y, this);
}
- // ...and revert the size change here
- if (selected) {
- height -= 2;
- y += 2;
- }
-
int iconX = 6;
if (title != null) {
@@ -378,8 +366,8 @@ public class WTabPanel extends WPanel {
@Environment(EnvType.CLIENT)
final static class Painters {
static final BackgroundPainter SELECTED_TAB = BackgroundPainter.createLightDarkVariants(
- BackgroundPainter.createNinePatch(new Identifier(LibGuiCommon.MOD_ID, "textures/widget/tab/selected_light.png")),
- BackgroundPainter.createNinePatch(new Identifier(LibGuiCommon.MOD_ID, "textures/widget/tab/selected_dark.png"))
+ BackgroundPainter.createNinePatch(new Identifier(LibGuiCommon.MOD_ID, "textures/widget/tab/selected_light.png")).setTopPadding(2),
+ BackgroundPainter.createNinePatch(new Identifier(LibGuiCommon.MOD_ID, "textures/widget/tab/selected_dark.png")).setTopPadding(2)
);
static final BackgroundPainter UNSELECTED_TAB = BackgroundPainter.createLightDarkVariants(
@@ -387,7 +375,7 @@ public class WTabPanel extends WPanel {
BackgroundPainter.createNinePatch(new Identifier(LibGuiCommon.MOD_ID, "textures/widget/tab/unselected_dark.png"))
);
- static final BackgroundPainter SELECTED_TAB_FOCUS_BORDER = BackgroundPainter.createNinePatch(new Identifier(LibGuiCommon.MOD_ID, "textures/widget/tab/focus.png"));
+ static final BackgroundPainter SELECTED_TAB_FOCUS_BORDER = BackgroundPainter.createNinePatch(new Identifier(LibGuiCommon.MOD_ID, "textures/widget/tab/focus.png")).setTopPadding(2);
static final BackgroundPainter UNSELECTED_TAB_FOCUS_BORDER = BackgroundPainter.createNinePatch(new Identifier(LibGuiCommon.MOD_ID, "textures/widget/tab/focus.png"));
}
}
--
cgit