From 06950a5a47dd38e5f9588643da1c5afba2fae215 Mon Sep 17 00:00:00 2001 From: Draylar Date: Fri, 12 Mar 2021 19:08:29 -0600 Subject: [PATCH] big refactoring and cleanup --- .../omegaconfiggui/OmegaConfigGui.java | 20 +++++-------- .../api/screen/ModMenuHelper.java | 14 ++++----- .../api/screen/OmegaConfigScreen.java | 28 ++++++++++++++--- .../screen/widget/BaseTextFieldWidget.java | 30 +++++++++++++++++++ .../api/screen/widget/DoubleFieldWidget.java | 8 ++--- .../api/screen/widget/WidgetSupplier.java | 3 +- .../supplier/BooleanWidgetSupplier.java | 3 +- .../widget/supplier/DoubleWidgetSupplier.java | 9 +++--- .../widget/supplier/StringWidgetSupplier.java | 15 ++++++---- .../mixin/AbstractButtonWidgetAccessor.java | 11 +++++++ .../src/main/resources/fabric.mod.json | 5 ---- .../resources/omega-config-gui.mixins.json | 2 +- .../java/draylar/omegatest/TestConfig.java | 2 ++ 13 files changed, 103 insertions(+), 47 deletions(-) create mode 100644 omega-config-gui/src/main/java/draylar/omegaconfiggui/api/screen/widget/BaseTextFieldWidget.java create mode 100644 omega-config-gui/src/main/java/draylar/omegaconfiggui/mixin/AbstractButtonWidgetAccessor.java diff --git a/omega-config-gui/src/main/java/draylar/omegaconfiggui/OmegaConfigGui.java b/omega-config-gui/src/main/java/draylar/omegaconfiggui/OmegaConfigGui.java index 7b32893..d43508c 100644 --- a/omega-config-gui/src/main/java/draylar/omegaconfiggui/OmegaConfigGui.java +++ b/omega-config-gui/src/main/java/draylar/omegaconfiggui/OmegaConfigGui.java @@ -3,27 +3,21 @@ package draylar.omegaconfiggui; import draylar.omegaconfig.api.Config; import draylar.omegaconfiggui.api.screen.ModMenuHelper; import draylar.omegaconfiggui.api.screen.OmegaConfigScreen; -import draylar.omegaconfiggui.api.screen.OmegaConfigScreenSupplier; -import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.loader.api.FabricLoader; @Environment(EnvType.CLIENT) -public class OmegaConfigGui implements ClientModInitializer { - - @Override - public void onInitializeClient() { - - } +public class OmegaConfigGui { + /** + * Registers a ModMenu configuration screen for the given {@link Config} instance. + * @param config registered config to create a ModMenu screen for + * @param config type + */ public static void registerConfigScreen(T config) { - registerConfigScreen(config, parent -> new OmegaConfigScreen<>(config, parent)); - } - - public static void registerConfigScreen(T config, OmegaConfigScreenSupplier screenFactory) { if(FabricLoader.getInstance().isModLoaded("modmenu")) { - ModMenuHelper.injectScreen(config, screenFactory); + ModMenuHelper.injectScreen(config, parent -> new OmegaConfigScreen<>(config, parent)); } } } diff --git a/omega-config-gui/src/main/java/draylar/omegaconfiggui/api/screen/ModMenuHelper.java b/omega-config-gui/src/main/java/draylar/omegaconfiggui/api/screen/ModMenuHelper.java index a4b75c3..26faa46 100644 --- a/omega-config-gui/src/main/java/draylar/omegaconfiggui/api/screen/ModMenuHelper.java +++ b/omega-config-gui/src/main/java/draylar/omegaconfiggui/api/screen/ModMenuHelper.java @@ -14,15 +14,11 @@ import java.util.Map; public class ModMenuHelper { public static void injectScreen(T config, OmegaConfigScreenSupplier factory) { - // collect existing configurations - ImmutableMap> configScreenFactories = ModMenuAccessor.getConfigScreenFactories(); - Map> nMap = new HashMap<>(); - nMap.putAll(configScreenFactories); - - // add our factory - nMap.put(config.getModid(), factory::get); - // they will suspect nothing - ModMenuAccessor.setConfigScreenFactories(ImmutableMap.copyOf(nMap)); + ModMenuAccessor.setConfigScreenFactories( + new ImmutableMap.Builder>() + .putAll(ModMenuAccessor.getConfigScreenFactories()) + .put(config.getModid(), factory::get) + .build()); } } diff --git a/omega-config-gui/src/main/java/draylar/omegaconfiggui/api/screen/OmegaConfigScreen.java b/omega-config-gui/src/main/java/draylar/omegaconfiggui/api/screen/OmegaConfigScreen.java index 3341b62..658415d 100644 --- a/omega-config-gui/src/main/java/draylar/omegaconfiggui/api/screen/OmegaConfigScreen.java +++ b/omega-config-gui/src/main/java/draylar/omegaconfiggui/api/screen/OmegaConfigScreen.java @@ -1,5 +1,6 @@ package draylar.omegaconfiggui.api.screen; +import com.mojang.blaze3d.systems.RenderSystem; import draylar.omegaconfig.api.Config; import draylar.omegaconfiggui.api.screen.widget.LabelWidget; import draylar.omegaconfiggui.api.screen.widget.TypeWidgets; @@ -11,6 +12,9 @@ import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.widget.AbstractButtonWidget; import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.gui.widget.TextFieldWidget; +import net.minecraft.client.render.BufferBuilder; +import net.minecraft.client.render.Tessellator; +import net.minecraft.client.render.VertexFormats; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.LiteralText; import net.minecraft.util.Identifier; @@ -50,7 +54,7 @@ public class OmegaConfigScreen extends Screen { Class unbox = TypeWidgets.unbox(field.getType()); // label - addChild(new LabelWidget(150, 15 + 20 * over, new LiteralText(field.getName()))); + addChild(new LabelWidget(150, 15 + height / 6 + 20 * over, new LiteralText(field.getName()))); // get value field.setAccessible(true); @@ -60,9 +64,9 @@ public class OmegaConfigScreen extends Screen { AbstractButtonWidget button; WidgetSupplier widgetSupplier = (WidgetSupplier) TypeWidgets.get(unbox); if(widgetSupplier != null) { - button = widgetSupplier.create(250, 5 + 25 * over, 50, 20, new LiteralText(field.getName()), value); + button = widgetSupplier.create(this,250, 5 + height / 6 + 25 * over, 100, 20, new LiteralText(field.getName()), value); } else { - button = new TextFieldWidget(client.textRenderer, 250, 5 + 25 * over, 50, 20, new LiteralText(field.getName())); + button = new TextFieldWidget(client.textRenderer, 250, 5 + height / 6 + 25 * over, 100, 20, new LiteralText(field.getName())); } fieldWidgets.put(field, new Pair<>(widgetSupplier, button)); @@ -116,6 +120,22 @@ public class OmegaConfigScreen extends Screen { public void renderBackground(MatrixStack matrices) { // TODO: option for transparent BG // this.fillGradient(matrices, 0, 0, this.width, this.height, -1072689136, -804253680); - this.renderBackgroundTexture(0); + renderCustomBackgroundTexture(0, 64, 64, 64, 0, 0, this.height, this.width); + renderCustomBackgroundTexture(0, 32, 32, 32, 0, this.height / 8, this.height / 8 * 6, this.width); + textRenderer.draw(matrices, config.getName(), width / 2f - textRenderer.getWidth(config.getName()) / 2f, 10, 0xffffff); + } + + public void renderCustomBackgroundTexture(int vOffset, int r, int g, int b, int x, int y, int height, int width) { + Tessellator tessellator = Tessellator.getInstance(); + BufferBuilder bufferBuilder = tessellator.getBuffer(); + this.client.getTextureManager().bindTexture(OPTIONS_BACKGROUND_TEXTURE); + RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); + + bufferBuilder.begin(7, VertexFormats.POSITION_TEXTURE_COLOR); + bufferBuilder.vertex(x, height + y, 0.0D).texture(0.0F, (float)height / 32.0F + (float)vOffset).color(r, g, b, 255).next(); + bufferBuilder.vertex(width + x, height + y, 0.0D).texture((float)width / 32.0F, (float)height / 32.0F + (float)vOffset).color(r, g, b, 255).next(); + bufferBuilder.vertex(width + x, y, 0.0D).texture((float)width / 32.0F, (float)vOffset).color(r, g, b, 255).next(); + bufferBuilder.vertex(x, y, 0.0D).texture(0.0F, (float)vOffset).color(r, g, b, 255).next(); + tessellator.draw(); } } diff --git a/omega-config-gui/src/main/java/draylar/omegaconfiggui/api/screen/widget/BaseTextFieldWidget.java b/omega-config-gui/src/main/java/draylar/omegaconfiggui/api/screen/widget/BaseTextFieldWidget.java new file mode 100644 index 0000000..367b5df --- /dev/null +++ b/omega-config-gui/src/main/java/draylar/omegaconfiggui/api/screen/widget/BaseTextFieldWidget.java @@ -0,0 +1,30 @@ +package draylar.omegaconfiggui.api.screen.widget; + +import draylar.omegaconfiggui.mixin.AbstractButtonWidgetAccessor; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.widget.AbstractButtonWidget; +import net.minecraft.client.gui.widget.TextFieldWidget; +import net.minecraft.text.Text; + +public class BaseTextFieldWidget extends TextFieldWidget { + + protected final Screen parent; + + public BaseTextFieldWidget(Screen parent, TextRenderer textRenderer, int x, int y, int width, int height, Text text) { + super(textRenderer, x, y, width, height, text); + this.parent = parent; + } + + @Override + public void setTextFieldFocused(boolean focused) { + // unfocus all others + parent.children().forEach(element -> { + if(element instanceof AbstractButtonWidget) { + ((AbstractButtonWidgetAccessor) element).callSetFocused(false); + } + }); + + super.setFocused(focused); + } +} diff --git a/omega-config-gui/src/main/java/draylar/omegaconfiggui/api/screen/widget/DoubleFieldWidget.java b/omega-config-gui/src/main/java/draylar/omegaconfiggui/api/screen/widget/DoubleFieldWidget.java index e01531d..5154828 100644 --- a/omega-config-gui/src/main/java/draylar/omegaconfiggui/api/screen/widget/DoubleFieldWidget.java +++ b/omega-config-gui/src/main/java/draylar/omegaconfiggui/api/screen/widget/DoubleFieldWidget.java @@ -1,13 +1,13 @@ package draylar.omegaconfiggui.api.screen.widget; import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.widget.TextFieldWidget; +import net.minecraft.client.gui.screen.Screen; import net.minecraft.text.Text; -public class DoubleFieldWidget extends TextFieldWidget { +public class DoubleFieldWidget extends BaseTextFieldWidget { - public DoubleFieldWidget(TextRenderer textRenderer, int x, int y, int width, int height, Text text) { - super(textRenderer, x, y, width, height, text); + public DoubleFieldWidget(Screen parent, TextRenderer textRenderer, int x, int y, int width, int height, Text text) { + super(parent, textRenderer, x, y, width, height, text); } @Override diff --git a/omega-config-gui/src/main/java/draylar/omegaconfiggui/api/screen/widget/WidgetSupplier.java b/omega-config-gui/src/main/java/draylar/omegaconfiggui/api/screen/widget/WidgetSupplier.java index b2c2b4c..f5c1bb2 100644 --- a/omega-config-gui/src/main/java/draylar/omegaconfiggui/api/screen/widget/WidgetSupplier.java +++ b/omega-config-gui/src/main/java/draylar/omegaconfiggui/api/screen/widget/WidgetSupplier.java @@ -1,9 +1,10 @@ package draylar.omegaconfiggui.api.screen.widget; +import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.widget.AbstractButtonWidget; import net.minecraft.text.LiteralText; public interface WidgetSupplier { - AbstractButtonWidget create(int x, int y, int width, int height, LiteralText prompt, T value); + AbstractButtonWidget create(Screen parent, int x, int y, int width, int height, LiteralText prompt, T value); T get(A widget); } diff --git a/omega-config-gui/src/main/java/draylar/omegaconfiggui/api/screen/widget/supplier/BooleanWidgetSupplier.java b/omega-config-gui/src/main/java/draylar/omegaconfiggui/api/screen/widget/supplier/BooleanWidgetSupplier.java index 47ed37b..c9d3717 100644 --- a/omega-config-gui/src/main/java/draylar/omegaconfiggui/api/screen/widget/supplier/BooleanWidgetSupplier.java +++ b/omega-config-gui/src/main/java/draylar/omegaconfiggui/api/screen/widget/supplier/BooleanWidgetSupplier.java @@ -1,13 +1,14 @@ package draylar.omegaconfiggui.api.screen.widget.supplier; import draylar.omegaconfiggui.api.screen.widget.WidgetSupplier; +import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.widget.CheckboxWidget; import net.minecraft.text.LiteralText; public class BooleanWidgetSupplier implements WidgetSupplier { @Override - public CheckboxWidget create(int x, int y, int width, int height, LiteralText prompt, Boolean value) { + public CheckboxWidget create(Screen parent, int x, int y, int width, int height, LiteralText prompt, Boolean value) { return new CheckboxWidget(x, y, 20, 20, new LiteralText(""), value); } diff --git a/omega-config-gui/src/main/java/draylar/omegaconfiggui/api/screen/widget/supplier/DoubleWidgetSupplier.java b/omega-config-gui/src/main/java/draylar/omegaconfiggui/api/screen/widget/supplier/DoubleWidgetSupplier.java index 57f1423..b9546df 100644 --- a/omega-config-gui/src/main/java/draylar/omegaconfiggui/api/screen/widget/supplier/DoubleWidgetSupplier.java +++ b/omega-config-gui/src/main/java/draylar/omegaconfiggui/api/screen/widget/supplier/DoubleWidgetSupplier.java @@ -3,16 +3,17 @@ package draylar.omegaconfiggui.api.screen.widget.supplier; import draylar.omegaconfiggui.api.screen.widget.DoubleFieldWidget; import draylar.omegaconfiggui.api.screen.widget.WidgetSupplier; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.screen.Screen; import net.minecraft.text.LiteralText; public class DoubleWidgetSupplier implements WidgetSupplier { @Override - public DoubleFieldWidget create(int x, int y, int width, int height, LiteralText prompt, Double value) { + public DoubleFieldWidget create(Screen parent, int x, int y, int width, int height, LiteralText prompt, Double value) { LiteralText text = new LiteralText(String.valueOf(value)); - DoubleFieldWidget doubleField = new DoubleFieldWidget(MinecraftClient.getInstance().textRenderer, x, y, width, height, text); - doubleField.setText(text.asString()); - return doubleField; + DoubleFieldWidget widget = new DoubleFieldWidget(parent, MinecraftClient.getInstance().textRenderer, x, y, width, height, text); + widget.setText(text.asString()); + return widget; } @Override diff --git a/omega-config-gui/src/main/java/draylar/omegaconfiggui/api/screen/widget/supplier/StringWidgetSupplier.java b/omega-config-gui/src/main/java/draylar/omegaconfiggui/api/screen/widget/supplier/StringWidgetSupplier.java index 98d4f65..87e6a27 100644 --- a/omega-config-gui/src/main/java/draylar/omegaconfiggui/api/screen/widget/supplier/StringWidgetSupplier.java +++ b/omega-config-gui/src/main/java/draylar/omegaconfiggui/api/screen/widget/supplier/StringWidgetSupplier.java @@ -1,20 +1,25 @@ package draylar.omegaconfiggui.api.screen.widget.supplier; +import draylar.omegaconfiggui.api.screen.widget.BaseTextFieldWidget; import draylar.omegaconfiggui.api.screen.widget.WidgetSupplier; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.widget.AbstractButtonWidget; import net.minecraft.client.gui.widget.TextFieldWidget; import net.minecraft.text.LiteralText; -public class StringWidgetSupplier implements WidgetSupplier { +public class StringWidgetSupplier implements WidgetSupplier { @Override - public AbstractButtonWidget create(int x, int y, int width, int height, LiteralText prompt, String value) { - return new TextFieldWidget(MinecraftClient.getInstance().textRenderer, x, y, width, height, new LiteralText(value)); + public TextFieldWidget create(Screen parent, int x, int y, int width, int height, LiteralText prompt, String value) { + LiteralText text = new LiteralText(value); + TextFieldWidget textField = new BaseTextFieldWidget(parent, MinecraftClient.getInstance().textRenderer, x, y, width, height, text); + textField.setText(value); + return textField; } @Override - public String get(AbstractButtonWidget widget) { - return widget.getMessage().asString(); + public String get(TextFieldWidget widget) { + return widget.getText(); } } diff --git a/omega-config-gui/src/main/java/draylar/omegaconfiggui/mixin/AbstractButtonWidgetAccessor.java b/omega-config-gui/src/main/java/draylar/omegaconfiggui/mixin/AbstractButtonWidgetAccessor.java new file mode 100644 index 0000000..19187a2 --- /dev/null +++ b/omega-config-gui/src/main/java/draylar/omegaconfiggui/mixin/AbstractButtonWidgetAccessor.java @@ -0,0 +1,11 @@ +package draylar.omegaconfiggui.mixin; + +import net.minecraft.client.gui.widget.AbstractButtonWidget; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(AbstractButtonWidget.class) +public interface AbstractButtonWidgetAccessor { + @Invoker + void callSetFocused(boolean focused); +} diff --git a/omega-config-gui/src/main/resources/fabric.mod.json b/omega-config-gui/src/main/resources/fabric.mod.json index e66838a..23b1f3e 100644 --- a/omega-config-gui/src/main/resources/fabric.mod.json +++ b/omega-config-gui/src/main/resources/fabric.mod.json @@ -10,11 +10,6 @@ "contact": {}, "license": "MIT", "environment": "*", - "entrypoints": { - "client": [ - "draylar.omegaconfiggui.OmegaConfigGui" - ] - }, "mixins": [ "omega-config-gui.mixins.json" ], diff --git a/omega-config-gui/src/main/resources/omega-config-gui.mixins.json b/omega-config-gui/src/main/resources/omega-config-gui.mixins.json index 6eb0f88..e62bd4a 100644 --- a/omega-config-gui/src/main/resources/omega-config-gui.mixins.json +++ b/omega-config-gui/src/main/resources/omega-config-gui.mixins.json @@ -4,10 +4,10 @@ "package": "draylar.omegaconfiggui.mixin", "compatibilityLevel": "JAVA_8", "mixins": [ + "AbstractButtonWidgetAccessor", "ModMenuAccessor" ], "client": [ - ], "injectors": { "defaultRequire": 1 diff --git a/src/testmod/java/draylar/omegatest/TestConfig.java b/src/testmod/java/draylar/omegatest/TestConfig.java index b727872..a2796ec 100644 --- a/src/testmod/java/draylar/omegatest/TestConfig.java +++ b/src/testmod/java/draylar/omegatest/TestConfig.java @@ -14,6 +14,8 @@ public class TestConfig implements Config { @Comment(value = "I'm a double.") double doubleTest = 0.0; + String stringTest = "Hello, world!"; + @Comment(value = "This is an inner static class.") public Test test = new Test();