From 0a940d3e20aee117ace8ba03386f5dd7b582a1c8 Mon Sep 17 00:00:00 2001 From: Frank Date: Tue, 19 Jul 2022 17:36:58 +0200 Subject: [PATCH] [Feature] Text input and Color Picker --- .../bclib/client/gui/modmenu/TestScreen.java | 15 ++++ .../modmenu/ModMenuEntryPoint.java | 8 +- src/main/java/org/betterx/ui/ColorUtil.java | 20 ++--- .../ui/layout/components/AbstractStack.java | 14 ++++ .../ui/layout/components/ColorPicker.java | 42 ++++++++++ .../ui/layout/components/ColorSwatch.java | 64 +++++++++++++++ .../betterx/ui/layout/components/Input.java | 5 ++ .../components/render/EditBoxRenderer.java | 13 +++ .../components/render/RenderHelper.java | 82 +++++++++++++++++++ src/main/resources/fabric.mod.json | 1 + src/main/resources/ui.mixins.client.json | 10 +++ 11 files changed, 261 insertions(+), 13 deletions(-) create mode 100644 src/main/java/org/betterx/ui/layout/components/ColorPicker.java create mode 100644 src/main/java/org/betterx/ui/layout/components/ColorSwatch.java create mode 100644 src/main/java/org/betterx/ui/layout/components/render/EditBoxRenderer.java create mode 100644 src/main/java/org/betterx/ui/layout/components/render/RenderHelper.java create mode 100644 src/main/resources/ui.mixins.client.json diff --git a/src/main/java/org/betterx/bclib/client/gui/modmenu/TestScreen.java b/src/main/java/org/betterx/bclib/client/gui/modmenu/TestScreen.java index 3c553009..ca9be851 100644 --- a/src/main/java/org/betterx/bclib/client/gui/modmenu/TestScreen.java +++ b/src/main/java/org/betterx/bclib/client/gui/modmenu/TestScreen.java @@ -39,6 +39,20 @@ public class TestScreen extends LayoutScreen { ).centerHorizontal() ); rows.addSpacer(16); + rows.add(new Input(Value.fitOrFill(), Value.fit(), Component.literal("Input"), "0xff00ff")); + rows.add(new ColorSwatch(Value.fit(), Value.fit(), ColorUtil.LIGHT_PURPLE).centerHorizontal()); + rows.add(new ColorPicker( + Value.fill(), + Value.fit(), + Component.literal("Color"), + ColorUtil.GREEN + ).centerHorizontal()); + rows.add(new Text( + Value.fitOrFill(), Value.fixed(20), + Component.literal("Some blue text") + ).centerHorizontal().setColor(ColorUtil.BLUE) + ); + rows.addSpacer(16); rows.add(new Image( Value.fixed(24), Value.fixed(24), BCLib.makeID("icon.png"), @@ -51,6 +65,7 @@ public class TestScreen extends LayoutScreen { "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.") ).setColor(ColorUtil.LIGHT_PURPLE).centerHorizontal() ); + rows.addSpacer(16); rows.add(new Range<>( Value.fill(), Value.fit(), diff --git a/src/main/java/org/betterx/bclib/integration/modmenu/ModMenuEntryPoint.java b/src/main/java/org/betterx/bclib/integration/modmenu/ModMenuEntryPoint.java index 9ea1f0e3..2e2bbeb8 100644 --- a/src/main/java/org/betterx/bclib/integration/modmenu/ModMenuEntryPoint.java +++ b/src/main/java/org/betterx/bclib/integration/modmenu/ModMenuEntryPoint.java @@ -1,6 +1,8 @@ package org.betterx.bclib.integration.modmenu; -import org.betterx.bclib.client.gui.modmenu.MainScreen; +import org.betterx.bclib.client.gui.modmenu.TestScreen; + +import net.minecraft.network.chat.Component; import com.terraformersmc.modmenu.api.ConfigScreenFactory; import com.terraformersmc.modmenu.api.ModMenuApi; @@ -26,8 +28,8 @@ public class ModMenuEntryPoint implements ModMenuApi { @Override public ConfigScreenFactory getModConfigScreenFactory() { - //return (parent) -> new TestScreen(parent, Component.literal("Hello Test")); - return (parent) -> new MainScreen(parent); + return (parent) -> new TestScreen(parent, Component.literal("Hello Test")); + //return (parent) -> new MainScreen(parent); } diff --git a/src/main/java/org/betterx/ui/ColorUtil.java b/src/main/java/org/betterx/ui/ColorUtil.java index a675f43b..6bbab976 100644 --- a/src/main/java/org/betterx/ui/ColorUtil.java +++ b/src/main/java/org/betterx/ui/ColorUtil.java @@ -165,16 +165,16 @@ public class ColorUtil { int color, shift; if (len == 3) { hexColor = "" - + hexColor.charAt(2) + hexColor.charAt(2) + + hexColor.charAt(0) + hexColor.charAt(0) + hexColor.charAt(1) + hexColor.charAt(1) - + hexColor.charAt(0) + hexColor.charAt(0); + + hexColor.charAt(2) + hexColor.charAt(2); len = 6; } else if (len == 4) { hexColor = "" - + hexColor.charAt(3) + hexColor.charAt(3) - + hexColor.charAt(2) + hexColor.charAt(2) + + hexColor.charAt(0) + hexColor.charAt(0) + hexColor.charAt(1) + hexColor.charAt(1) - + hexColor.charAt(0) + hexColor.charAt(0); + + hexColor.charAt(2) + hexColor.charAt(2) + + hexColor.charAt(3) + hexColor.charAt(3); len = 8; } @@ -210,16 +210,16 @@ public class ColorUtil { int color, shift; if (len == 3) { hexColor = "" - + hexColor.charAt(2) + hexColor.charAt(2) + + hexColor.charAt(0) + hexColor.charAt(0) + hexColor.charAt(1) + hexColor.charAt(1) - + hexColor.charAt(0) + hexColor.charAt(0); + + hexColor.charAt(2) + hexColor.charAt(2); len = 6; } else if (len == 4) { hexColor = "" - + hexColor.charAt(3) + hexColor.charAt(3) - + hexColor.charAt(2) + hexColor.charAt(2) + + hexColor.charAt(0) + hexColor.charAt(0) + hexColor.charAt(1) + hexColor.charAt(1) - + hexColor.charAt(0) + hexColor.charAt(0); + + hexColor.charAt(2) + hexColor.charAt(2) + + hexColor.charAt(3) + hexColor.charAt(3); len = 8; } diff --git a/src/main/java/org/betterx/ui/layout/components/AbstractStack.java b/src/main/java/org/betterx/ui/layout/components/AbstractStack.java index b85326a2..d2a338d2 100644 --- a/src/main/java/org/betterx/ui/layout/components/AbstractStack.java +++ b/src/main/java/org/betterx/ui/layout/components/AbstractStack.java @@ -208,5 +208,19 @@ public abstract class AbstractStack { + private int color; + private int borderColor = ColorUtil.BLACK; + private boolean offsetInner = false; + + public ColorSwatch(Value width, Value height, int color) { + super(width, height); + this.color = color; + } + + @Override + protected void customRender(PoseStack stack, int x, int y, float deltaTicks, Rectangle bounds, Rectangle clipRect) { + int o = offsetInner ? 2 : 1; + RenderHelper.outline(stack, 0, 0, bounds.width, bounds.height, borderColor); + GuiComponent.fill(stack, o, o, bounds.width - o, bounds.height - o, color); + } + + public int getColor() { + return color; + } + + public ColorSwatch setColor(int color) { + this.color = color; + return this; + } + + public int getBorderColor() { + return borderColor; + } + + public ColorSwatch setBorderColor(int color) { + this.borderColor = color; + return this; + } + + public boolean getOffsetInner() { + return offsetInner; + } + + public ColorSwatch setOffsetInner(boolean val) { + this.offsetInner = val; + return this; + } + + @Override + public int getContentWidth() { + return 20; + } + + @Override + public int getContentHeight() { + return 20; + } +} diff --git a/src/main/java/org/betterx/ui/layout/components/Input.java b/src/main/java/org/betterx/ui/layout/components/Input.java index f5dbd53b..e06e59b2 100644 --- a/src/main/java/org/betterx/ui/layout/components/Input.java +++ b/src/main/java/org/betterx/ui/layout/components/Input.java @@ -78,4 +78,9 @@ public class Input extends AbstractVanillaComponent { return this; } + + @Override + protected Component contentComponent() { + return Component.literal(initialValue + ".."); + } } diff --git a/src/main/java/org/betterx/ui/layout/components/render/EditBoxRenderer.java b/src/main/java/org/betterx/ui/layout/components/render/EditBoxRenderer.java new file mode 100644 index 00000000..7204376f --- /dev/null +++ b/src/main/java/org/betterx/ui/layout/components/render/EditBoxRenderer.java @@ -0,0 +1,13 @@ +package org.betterx.ui.layout.components.render; + +import org.betterx.ui.layout.components.AbstractVanillaComponentRenderer; +import org.betterx.ui.layout.components.Input; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; + +@Environment(EnvType.CLIENT) +public class EditBoxRenderer extends AbstractVanillaComponentRenderer { + +} + diff --git a/src/main/java/org/betterx/ui/layout/components/render/RenderHelper.java b/src/main/java/org/betterx/ui/layout/components/render/RenderHelper.java new file mode 100644 index 00000000..1248b3b1 --- /dev/null +++ b/src/main/java/org/betterx/ui/layout/components/render/RenderHelper.java @@ -0,0 +1,82 @@ +package org.betterx.ui.layout.components.render; + +import org.betterx.ui.ColorUtil; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.*; +import com.mojang.math.Matrix4f; +import net.minecraft.client.renderer.GameRenderer; + +public class RenderHelper { + public static void outline(PoseStack poseStack, int x0, int y0, int x1, int y1, int color) { + outline(poseStack, x0, y0, x1, y1, color, color); + } + + public static void outline(PoseStack poseStack, int x0, int y0, int x1, int y1, int color1, int color2) { + int n; + if (x1 < x0) { + n = x0; + x0 = x1; + x1 = n; + } + + if (y1 < y0) { + n = y0; + y0 = y1; + y1 = n; + } + y1--; + x1--; + + Matrix4f transform = poseStack.last().pose(); + innerHLine(transform, x0, x1, y0, color1); + innerVLine(transform, x0, y0 + 1, y1, color1); + innerHLine(transform, x0 + 1, x1, y1, color1); + innerVLine(transform, x1, y0 + 1, y1 - 1, color2); + } + + public static void hLine(PoseStack poseStack, int x0, int x1, int y, int color) { + if (x1 < x0) { + int m = x0; + x0 = x1; + x1 = m; + } + + innerHLine(poseStack.last().pose(), x0, x1, y, color); + } + + protected static void innerHLine(Matrix4f transform, int x0, int x1, int y, int color) { + innerFill(transform, x0, y, x1 + 1, y + 1, color); + } + + protected static void vLine(PoseStack poseStack, int x, int y0, int y1, int color) { + if (y1 < y0) { + int m = y0; + y0 = y1; + y1 = m; + } + innerVLine(poseStack.last().pose(), x, y0, y1, color); + } + + protected static void innerVLine(Matrix4f transform, int x, int y0, int y1, int color) { + innerFill(transform, x, y0, x + 1, y1 + 1, color); + } + + private static void innerFill(Matrix4f transform, int x0, int y0, int x1, int y1, int color) { + float[] cl = ColorUtil.toFloatArray(color); + + BufferBuilder bufferBuilder = Tesselator.getInstance().getBuilder(); + RenderSystem.enableBlend(); + RenderSystem.disableTexture(); + RenderSystem.defaultBlendFunc(); + RenderSystem.setShader(GameRenderer::getPositionColorShader); + bufferBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + bufferBuilder.vertex(transform, (float) x0, (float) y1, 0.0F).color(cl[0], cl[1], cl[2], cl[3]).endVertex(); + bufferBuilder.vertex(transform, (float) x1, (float) y1, 0.0F).color(cl[0], cl[1], cl[2], cl[3]).endVertex(); + bufferBuilder.vertex(transform, (float) x1, (float) y0, 0.0F).color(cl[0], cl[1], cl[2], cl[3]).endVertex(); + bufferBuilder.vertex(transform, (float) x0, (float) y0, 0.0F).color(cl[0], cl[1], cl[2], cl[3]).endVertex(); + BufferUploader.drawWithShader(bufferBuilder.end()); + RenderSystem.enableTexture(); + RenderSystem.disableBlend(); + } +} diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index a6cf83e2..206e6859 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -38,6 +38,7 @@ "mixins": [ "together.mixins.common.json", "together.mixins.client.json", + "ui.mixins.client.json", "bclib.mixins.common.json", "bclib.mixins.client.json" ], diff --git a/src/main/resources/ui.mixins.client.json b/src/main/resources/ui.mixins.client.json new file mode 100644 index 00000000..264f5a58 --- /dev/null +++ b/src/main/resources/ui.mixins.client.json @@ -0,0 +1,10 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "org.betterx.ui.mixin.client", + "compatibilityLevel": "JAVA_17", + "client": [], + "injectors": { + "defaultRequire": 1 + } +}