From dfc785351f158b4b1ccdb4b75ad901816239fa91 Mon Sep 17 00:00:00 2001 From: Marcel Konrad Date: Mon, 14 Dec 2020 21:21:11 +0100 Subject: [PATCH] Update json api (now version 1.1) --- .../usercontent/example/example.js | 2 +- .../usercontent/example/example.json | 26 +-- .../gui/content/impl/ContentUsercontent.java | 36 ++-- .../usercontent/UsercontentLoader.java | 4 +- .../usercontent/VisibleActiveObject.java | 6 +- .../factory/AbstractWidgetFactory.java | 106 ++++++++++ .../usercontent/factory/ButtonFactory.java | 125 ------------ .../usercontent/factory/MenuFactory.java | 14 +- .../usercontent/factory/WidgetFactory.java | 183 ++++++++++-------- .../usercontent/model/AbstractJsonWidget.java | 82 ++++++++ .../usercontent/model/JsonButton.java | 134 ------------- .../usercontent/model/JsonGui.java | 30 +-- .../model/{JsonText.java => JsonLabel.java} | 4 +- .../{JsonDimensions.java => JsonLayout.java} | 4 +- .../usercontent/model/JsonMenu.java | 6 +- .../usercontent/model/JsonWidget.java | 138 +++++++++---- 16 files changed, 450 insertions(+), 450 deletions(-) create mode 100644 src/main/java/exopandora/worldhandler/usercontent/factory/AbstractWidgetFactory.java delete mode 100644 src/main/java/exopandora/worldhandler/usercontent/factory/ButtonFactory.java create mode 100644 src/main/java/exopandora/worldhandler/usercontent/model/AbstractJsonWidget.java delete mode 100644 src/main/java/exopandora/worldhandler/usercontent/model/JsonButton.java rename src/main/java/exopandora/worldhandler/usercontent/model/{JsonText.java => JsonLabel.java} (91%) rename src/main/java/exopandora/worldhandler/usercontent/model/{JsonDimensions.java => JsonLayout.java} (91%) diff --git a/run/config/worldhandler/usercontent/example/example.js b/run/config/worldhandler/usercontent/example/example.js index e995177..e1a9fcb 100644 --- a/run/config/worldhandler/usercontent/example/example.js +++ b/run/config/worldhandler/usercontent/example/example.js @@ -33,4 +33,4 @@ function openContent(arg) { function addChatMessage(arg) { api.addChatMessage(arg); -} \ No newline at end of file +} diff --git a/run/config/worldhandler/usercontent/example/example.json b/run/config/worldhandler/usercontent/example/example.json index 9415a37..615aabe 100644 --- a/run/config/worldhandler/usercontent/example/example.json +++ b/run/config/worldhandler/usercontent/example/example.json @@ -77,11 +77,11 @@ "category_index": 3, "active_content": "example" }, - "buttons": [ + "widgets": [ { "text": "Button", "type": "button", - "dimensions": { + "layout": { "x": 0, "y": 0, "width": 114, @@ -114,7 +114,7 @@ "function": "updateText" } }, - "dimensions": { + "layout": { "x": 0, "y": 48, "width": 114, @@ -140,7 +140,7 @@ "value": "/give @p minecraft:diamond_sword 1" } }, - "dimensions": { + "layout": { "x": 0, "y": 24, "width": 20, @@ -158,7 +158,7 @@ "value": "main" } }, - "dimensions": { + "layout": { "x": 24, "y": 24, "width": 20, @@ -178,7 +178,7 @@ "value": "settings" } }, - "dimensions": { + "layout": { "x": 48, "y": 24, "width": 66, @@ -197,7 +197,7 @@ "index": 0 } }, - "dimensions": { + "layout": { "x": 118, "y": 72, "width": 114, @@ -234,7 +234,7 @@ "index": 2 } }, - "dimensions": { + "layout": { "x": 0, "y": 96, "width": 114, @@ -256,7 +256,7 @@ "function": "toggleVisibility" } }, - "dimensions": { + "layout": { "x": 0, "y": 72, "width": 56, @@ -275,7 +275,7 @@ "function": "toggleEnabled" } }, - "dimensions": { + "layout": { "x": 58, "y": 72, "width": 56, @@ -291,7 +291,7 @@ "action": { "type": "back_to_game" }, - "dimensions": { + "layout": { "x": 118, "y": 96, "width": 114, @@ -302,7 +302,7 @@ "menus": [ { "type": "page_list", - "dimensions": { + "layout": { "x": 118, "y": 0, "width": 114, @@ -339,7 +339,7 @@ } } ], - "texts": [ + "labels": [ { "text": "Text", "x": 0, diff --git a/src/main/java/exopandora/worldhandler/gui/content/impl/ContentUsercontent.java b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentUsercontent.java index 53ae0dd..cb9494a 100644 --- a/src/main/java/exopandora/worldhandler/gui/content/impl/ContentUsercontent.java +++ b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentUsercontent.java @@ -25,15 +25,15 @@ import exopandora.worldhandler.usercontent.UsercontentConfig; import exopandora.worldhandler.usercontent.VisibleActiveObject; import exopandora.worldhandler.usercontent.VisibleObject; import exopandora.worldhandler.usercontent.factory.ActionHandlerFactory; -import exopandora.worldhandler.usercontent.factory.ButtonFactory; +import exopandora.worldhandler.usercontent.factory.WidgetFactory; import exopandora.worldhandler.usercontent.factory.MenuFactory; -import exopandora.worldhandler.usercontent.model.JsonButton; +import exopandora.worldhandler.usercontent.model.JsonWidget; import exopandora.worldhandler.usercontent.model.JsonCommand; import exopandora.worldhandler.usercontent.model.JsonMenu; import exopandora.worldhandler.usercontent.model.JsonModel; -import exopandora.worldhandler.usercontent.model.JsonText; +import exopandora.worldhandler.usercontent.model.JsonLabel; import exopandora.worldhandler.usercontent.model.JsonUsercontent; -import exopandora.worldhandler.usercontent.model.JsonWidget; +import exopandora.worldhandler.usercontent.model.AbstractJsonWidget; import exopandora.worldhandler.util.TextUtils; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.widget.TextFieldWidget; @@ -57,7 +57,7 @@ public class ContentUsercontent extends Content private final Map> textfields = new HashMap>(); private final List> buttons = new ArrayList>(); private final UsercontentAPI api; - private final ButtonFactory buttonFactory; + private final WidgetFactory buttonFactory; private final MenuFactory menuFactory; public ContentUsercontent(UsercontentConfig config) throws Exception @@ -68,7 +68,7 @@ public class ContentUsercontent extends Content this.builders = this.createBuilders(this.content.getModel()); this.api = new UsercontentAPI(this.builders.stream().map(VisibleObject::getObject).collect(Collectors.toList())); ActionHandlerFactory actionHandlerFactory = new ActionHandlerFactory(this.api, this.builders, this.engineAdapter); - this.buttonFactory = new ButtonFactory(this.api, actionHandlerFactory); + this.buttonFactory = new WidgetFactory(this.api, actionHandlerFactory); this.menuFactory = new MenuFactory(this.api, actionHandlerFactory); this.engineAdapter.addObject("api", this.api); this.engineAdapter.eval(config.getJs()); @@ -91,22 +91,22 @@ public class ContentUsercontent extends Content this.textfields.clear(); this.buttons.clear(); - for(JsonButton button : this.getWidgets(this.content.getGui().getButtons(), JsonWidget.Type.BUTTON)) + for(JsonWidget json : this.getWidgets(this.content.getGui().getWidgets(), AbstractJsonWidget.Type.BUTTON)) { - Widget widget = this.buttonFactory.createButton(button, this, container, x, y); + Widget widget = this.buttonFactory.createWidget(json, this, container, x, y); - if(JsonButton.Type.TEXTFIELD.equals(button.getType())) + if(JsonWidget.Type.TEXTFIELD.equals(json.getType())) { - VisibleActiveObject visObj = new VisibleActiveObject(button, (TextFieldWidget) widget); - this.textfields.put(button.getAttributes().getId(), visObj); + VisibleActiveObject visObj = new VisibleActiveObject(json, (TextFieldWidget) widget); + this.textfields.put(json.getAttributes().getId(), visObj); } else { - this.buttons.add(new VisibleActiveObject(button, widget)); + this.buttons.add(new VisibleActiveObject(json, widget)); } } - for(JsonMenu menu : this.getWidgets(this.content.getGui().getMenus(), JsonWidget.Type.MENU)) + for(JsonMenu menu : this.getWidgets(this.content.getGui().getMenus(), AbstractJsonWidget.Type.MENU)) { container.add(this.menuFactory.createMenu(menu, this, container, x, y)); } @@ -147,13 +147,13 @@ public class ContentUsercontent extends Content } } - if(this.content.getGui() != null && this.content.getGui().getTexts() != null) + if(this.content.getGui() != null && this.content.getGui().getLabels() != null) { - for(JsonText text : this.content.getGui().getTexts()) + for(JsonLabel label : this.content.getGui().getLabels()) { - if(text.getVisible() == null || text.getVisible().eval(this.engineAdapter)) + if(label.getVisible() == null || label.getVisible().eval(this.engineAdapter)) { - container.getMinecraft().fontRenderer.func_243248_b(matrix, TextUtils.formatNonnull(text.getText()), text.getX() + x, text.getY() + y, text.getColor()); + container.getMinecraft().fontRenderer.func_243248_b(matrix, TextUtils.formatNonnull(label.getText()), label.getX() + x, label.getY() + y, label.getColor()); } } } @@ -227,7 +227,7 @@ public class ContentUsercontent extends Content return builders; } - private > List getWidgets(List list, JsonWidget.Type type) + private > List getWidgets(List list, AbstractJsonWidget.Type type) { List result = new ArrayList(); diff --git a/src/main/java/exopandora/worldhandler/usercontent/UsercontentLoader.java b/src/main/java/exopandora/worldhandler/usercontent/UsercontentLoader.java index dcffe5e..8956c6c 100644 --- a/src/main/java/exopandora/worldhandler/usercontent/UsercontentLoader.java +++ b/src/main/java/exopandora/worldhandler/usercontent/UsercontentLoader.java @@ -27,7 +27,7 @@ import exopandora.worldhandler.builder.types.ArgumentType; import exopandora.worldhandler.gui.widget.button.EnumIcon; import exopandora.worldhandler.usercontent.model.Action; import exopandora.worldhandler.usercontent.model.BooleanExpression; -import exopandora.worldhandler.usercontent.model.JsonButton; +import exopandora.worldhandler.usercontent.model.JsonWidget; import exopandora.worldhandler.usercontent.model.JsonMenu; import exopandora.worldhandler.usercontent.model.JsonUsercontent; import jdk.nashorn.api.scripting.NashornScriptEngineFactory; @@ -63,7 +63,7 @@ public class UsercontentLoader .registerTypeAdapter(ArgumentType.class, new EnumTypeAdapter(ArgumentType.class)) .registerTypeAdapter(EnumIcon.class, new EnumTypeAdapter(EnumIcon.class)) .registerTypeAdapter(BooleanExpression.Type.class, new EnumTypeAdapter(BooleanExpression.Type.class)) - .registerTypeAdapter(JsonButton.Type.class, new EnumTypeAdapter(JsonButton.Type.class)) + .registerTypeAdapter(JsonWidget.Type.class, new EnumTypeAdapter(JsonWidget.Type.class)) .registerTypeAdapter(Action.Type.class, new EnumTypeAdapter(Action.Type.class)) .registerTypeAdapter(JsonMenu.Type.class, new EnumTypeAdapter(JsonMenu.Type.class)) .create(); diff --git a/src/main/java/exopandora/worldhandler/usercontent/VisibleActiveObject.java b/src/main/java/exopandora/worldhandler/usercontent/VisibleActiveObject.java index c62afeb..1bd0aca 100644 --- a/src/main/java/exopandora/worldhandler/usercontent/VisibleActiveObject.java +++ b/src/main/java/exopandora/worldhandler/usercontent/VisibleActiveObject.java @@ -1,7 +1,7 @@ package exopandora.worldhandler.usercontent; import exopandora.worldhandler.usercontent.model.BooleanExpression; -import exopandora.worldhandler.usercontent.model.JsonButton; +import exopandora.worldhandler.usercontent.model.JsonWidget; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -16,9 +16,9 @@ public class VisibleActiveObject extends VisibleObject this.active = active; } - public VisibleActiveObject(JsonButton button, T object) + public VisibleActiveObject(JsonWidget widget, T object) { - this(button.getAttributes() != null ? button.getAttributes().getVisible() : null, button.getAttributes() != null ? button.getAttributes().getEnabled() : null, object); + this(widget.getAttributes() != null ? widget.getAttributes().getVisible() : null, widget.getAttributes() != null ? widget.getAttributes().getEnabled() : null, object); } public boolean isEnabled(ScriptEngineAdapter engine) diff --git a/src/main/java/exopandora/worldhandler/usercontent/factory/AbstractWidgetFactory.java b/src/main/java/exopandora/worldhandler/usercontent/factory/AbstractWidgetFactory.java new file mode 100644 index 0000000..09a1749 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/usercontent/factory/AbstractWidgetFactory.java @@ -0,0 +1,106 @@ +package exopandora.worldhandler.usercontent.factory; + +import java.util.function.Supplier; + +import exopandora.worldhandler.WorldHandler; +import exopandora.worldhandler.gui.content.Content; +import exopandora.worldhandler.gui.menu.impl.ILogicMapped; +import exopandora.worldhandler.usercontent.UsercontentAPI; +import exopandora.worldhandler.usercontent.model.JsonItem; +import exopandora.worldhandler.usercontent.model.AbstractJsonWidget; +import exopandora.worldhandler.util.ActionHandler; +import net.minecraft.util.text.IFormattableTextComponent; +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +@OnlyIn(Dist.CLIENT) +public abstract class AbstractWidgetFactory +{ + private final ActionHandlerFactory actionHandlerFactory; + private final UsercontentAPI api; + + public AbstractWidgetFactory(UsercontentAPI api, ActionHandlerFactory actionHandlerFactory) + { + this.api = api; + this.actionHandlerFactory = actionHandlerFactory; + } + + public ActionHandlerFactory getActionHandlerFactory() + { + return this.actionHandlerFactory; + } + + public UsercontentAPI getApi() + { + return this.api; + } + + @OnlyIn(Dist.CLIENT) + public static class UsercontentLogicMapped> implements ILogicMapped + { + private final ActionHandlerFactory actionHandlerFactory; + private final UsercontentAPI api; + private final Content content; + private final AbstractJsonWidget widget; + private final Supplier player; + + public UsercontentLogicMapped(UsercontentAPI api, ActionHandlerFactory actionHandlerFactory, Content content, AbstractJsonWidget widget, Supplier player) + { + this.api = api; + this.actionHandlerFactory = actionHandlerFactory; + this.content = content; + this.widget = widget; + this.player = player; + } + + @Override + public IFormattableTextComponent translate(JsonItem item) + { + if(item.getTranslation() != null) + { + return new TranslationTextComponent(item.getTranslation()); + } + + return new StringTextComponent(item.getId()); + } + + @Override + public IFormattableTextComponent toTooltip(JsonItem item) + { + return new StringTextComponent(item.getId()); + } + + @Override + public void onClick(JsonItem item) + { + try + { + this.api.updateValue(this.widget.getAttributes().getId(), item.getId()); + ActionHandler action = this.actionHandlerFactory.createActionHandler(this.content, this.widget.getAction(), this.player, item.getId()); + + if(action != null) + { + action.run(); + } + } + catch(Exception e) + { + WorldHandler.LOGGER.error("Error executing action for widget"); + } + } + + @Override + public String getId() + { + return this.widget.getAttributes().getId(); + } + + @Override + public void onInit(JsonItem item) + { + this.onClick(item); + } + } +} diff --git a/src/main/java/exopandora/worldhandler/usercontent/factory/ButtonFactory.java b/src/main/java/exopandora/worldhandler/usercontent/factory/ButtonFactory.java deleted file mode 100644 index b98d928..0000000 --- a/src/main/java/exopandora/worldhandler/usercontent/factory/ButtonFactory.java +++ /dev/null @@ -1,125 +0,0 @@ -package exopandora.worldhandler.usercontent.factory; - -import java.util.function.Consumer; - -import javax.annotation.Nullable; - -import com.google.common.base.Predicates; - -import exopandora.worldhandler.gui.container.Container; -import exopandora.worldhandler.gui.content.Content; -import exopandora.worldhandler.gui.widget.button.GuiButtonIcon; -import exopandora.worldhandler.gui.widget.button.GuiButtonItem; -import exopandora.worldhandler.gui.widget.button.GuiButtonList; -import exopandora.worldhandler.gui.widget.button.GuiButtonTooltip; -import exopandora.worldhandler.gui.widget.button.GuiSlider; -import exopandora.worldhandler.gui.widget.button.GuiTextFieldTooltip; -import exopandora.worldhandler.gui.widget.button.LogicSliderSimple; -import exopandora.worldhandler.usercontent.UsercontentAPI; -import exopandora.worldhandler.usercontent.model.JsonButton; -import exopandora.worldhandler.usercontent.model.JsonItem; -import exopandora.worldhandler.util.TextUtils; -import net.minecraft.client.gui.widget.Widget; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.registries.ForgeRegistries; - -@OnlyIn(Dist.CLIENT) -public class ButtonFactory extends WidgetFactory -{ - public ButtonFactory(UsercontentAPI api, ActionHandlerFactory actionHandlerFactory) - { - super(api, actionHandlerFactory); - } - - @Nullable - public Widget createButton(JsonButton button, Content content, Container container, int x, int y) - { - if(JsonButton.Type.BUTTON.equals(button.getType())) - { - return new GuiButtonTooltip - ( - button.getDimensions().getX() + x, - button.getDimensions().getY() + y, - button.getDimensions().getWidth(), - button.getDimensions().getHeight(), - TextUtils.formatNonnull(button.getText()), - TextUtils.formatNonnull(button.getAttributes() != null ? button.getAttributes().getTooltip() : null), - this.getActionHandlerFactory().createActionHandler(content, button.getAction(), container::getPlayer) - ); - } - else if(JsonButton.Type.ITEM_BUTTON.equals(button.getType())) - { - return new GuiButtonItem - ( - button.getDimensions().getX() + x, - button.getDimensions().getY() + y, - button.getDimensions().getWidth(), - button.getDimensions().getHeight(), - ForgeRegistries.ITEMS.getValue(new ResourceLocation(button.getAttributes().getItem())), - this.getActionHandlerFactory().createActionHandler(content, button.getAction(), container::getPlayer) - ); - } - else if(JsonButton.Type.ICON_BUTTON.equals(button.getType())) - { - return new GuiButtonIcon - ( - button.getDimensions().getX() + x, - button.getDimensions().getY() + y, - button.getDimensions().getWidth(), - button.getDimensions().getHeight(), - button.getAttributes().getIcon(), - TextUtils.formatNonnull(button.getAttributes().getTooltip()), - this.getActionHandlerFactory().createActionHandler(content, button.getAction(), container::getPlayer) - ); - } - else if(JsonButton.Type.LIST_BUTTON.equals(button.getType())) - { - return new GuiButtonList - ( - button.getDimensions().getX() + x, - button.getDimensions().getY() + y, - button.getAttributes().getItems(), - button.getDimensions().getWidth(), - button.getDimensions().getHeight(), - container, - new UsercontentLogicMapped(this.getApi(), this.getActionHandlerFactory(), content, button, container::getPlayer) - ); - } - else if(JsonButton.Type.SLIDER.equals(button.getType())) - { - Consumer responder = this.getActionHandlerFactory().createResponder(integer -> integer.toString(), button.getAttributes().getId(), button.getAction()); - return new GuiSlider - ( - button.getDimensions().getX() + x, - button.getDimensions().getY() + y, - button.getDimensions().getWidth(), - button.getDimensions().getHeight(), - button.getAttributes().getMin(), - button.getAttributes().getMax(), - button.getAttributes().getStart(), - container, - new LogicSliderSimple(button.getAttributes().getId(), TextUtils.formatNonnull(button.getText()), responder) - ); - } - else if(JsonButton.Type.TEXTFIELD.equals(button.getType())) - { - GuiTextFieldTooltip textfield = new GuiTextFieldTooltip - ( - button.getDimensions().getX() + x, - button.getDimensions().getY() + y, - button.getDimensions().getWidth(), - button.getDimensions().getHeight(), - TextUtils.formatNonnull(button.getText()) - ); - textfield.setValidator(Predicates.notNull()); - textfield.setText(this.getApi().getValue(button.getAttributes().getId())); - textfield.setResponder(this.getActionHandlerFactory().createResponder(string -> textfield.getText(), button.getAttributes().getId(), button.getAction())); - - return textfield; - } - - return null; - } -} diff --git a/src/main/java/exopandora/worldhandler/usercontent/factory/MenuFactory.java b/src/main/java/exopandora/worldhandler/usercontent/factory/MenuFactory.java index d026a87..9968223 100644 --- a/src/main/java/exopandora/worldhandler/usercontent/factory/MenuFactory.java +++ b/src/main/java/exopandora/worldhandler/usercontent/factory/MenuFactory.java @@ -14,14 +14,14 @@ import exopandora.worldhandler.gui.widget.button.GuiButtonTooltip; import exopandora.worldhandler.usercontent.UsercontentAPI; import exopandora.worldhandler.usercontent.model.JsonItem; import exopandora.worldhandler.usercontent.model.JsonMenu; -import exopandora.worldhandler.usercontent.model.JsonWidget; +import exopandora.worldhandler.usercontent.model.AbstractJsonWidget; import exopandora.worldhandler.util.ActionHandler; import net.minecraft.util.text.IFormattableTextComponent; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @OnlyIn(Dist.CLIENT) -public class MenuFactory extends WidgetFactory +public class MenuFactory extends AbstractWidgetFactory { public MenuFactory(UsercontentAPI api, ActionHandlerFactory actionHandlerFactory) { @@ -35,11 +35,11 @@ public class MenuFactory extends WidgetFactory { return new MenuPageList ( - menu.getDimensions().getX() + x, - menu.getDimensions().getY() + y, + menu.getLayout().getX() + x, + menu.getLayout().getY() + y, menu.getAttributes().getItems(), - menu.getDimensions().getWidth(), - menu.getDimensions().getHeight(), + menu.getLayout().getWidth(), + menu.getLayout().getHeight(), menu.getAttributes().getLength(), container, new UsercontentLogicPageList(this.getApi(), this.getActionHandlerFactory(), content, container, menu, container::getPlayer) @@ -54,7 +54,7 @@ public class MenuFactory extends WidgetFactory { private final Container container; - public UsercontentLogicPageList(UsercontentAPI api, ActionHandlerFactory actionHandlerFactory, Content content, Container container, JsonWidget widget, Supplier player) + public UsercontentLogicPageList(UsercontentAPI api, ActionHandlerFactory actionHandlerFactory, Content content, Container container, AbstractJsonWidget widget, Supplier player) { super(api, actionHandlerFactory, content, widget, player); this.container = container; diff --git a/src/main/java/exopandora/worldhandler/usercontent/factory/WidgetFactory.java b/src/main/java/exopandora/worldhandler/usercontent/factory/WidgetFactory.java index f754ec0..9d2dae0 100644 --- a/src/main/java/exopandora/worldhandler/usercontent/factory/WidgetFactory.java +++ b/src/main/java/exopandora/worldhandler/usercontent/factory/WidgetFactory.java @@ -1,106 +1,125 @@ package exopandora.worldhandler.usercontent.factory; -import java.util.function.Supplier; +import java.util.function.Consumer; -import exopandora.worldhandler.WorldHandler; +import javax.annotation.Nullable; + +import com.google.common.base.Predicates; + +import exopandora.worldhandler.gui.container.Container; import exopandora.worldhandler.gui.content.Content; -import exopandora.worldhandler.gui.menu.impl.ILogicMapped; +import exopandora.worldhandler.gui.widget.button.GuiButtonIcon; +import exopandora.worldhandler.gui.widget.button.GuiButtonItem; +import exopandora.worldhandler.gui.widget.button.GuiButtonList; +import exopandora.worldhandler.gui.widget.button.GuiButtonTooltip; +import exopandora.worldhandler.gui.widget.button.GuiSlider; +import exopandora.worldhandler.gui.widget.button.GuiTextFieldTooltip; +import exopandora.worldhandler.gui.widget.button.LogicSliderSimple; import exopandora.worldhandler.usercontent.UsercontentAPI; -import exopandora.worldhandler.usercontent.model.JsonItem; import exopandora.worldhandler.usercontent.model.JsonWidget; -import exopandora.worldhandler.util.ActionHandler; -import net.minecraft.util.text.IFormattableTextComponent; -import net.minecraft.util.text.StringTextComponent; -import net.minecraft.util.text.TranslationTextComponent; +import exopandora.worldhandler.usercontent.model.JsonItem; +import exopandora.worldhandler.util.TextUtils; +import net.minecraft.client.gui.widget.Widget; +import net.minecraft.util.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.registries.ForgeRegistries; @OnlyIn(Dist.CLIENT) -public abstract class WidgetFactory +public class WidgetFactory extends AbstractWidgetFactory { - private final ActionHandlerFactory actionHandlerFactory; - private final UsercontentAPI api; - public WidgetFactory(UsercontentAPI api, ActionHandlerFactory actionHandlerFactory) { - this.api = api; - this.actionHandlerFactory = actionHandlerFactory; + super(api, actionHandlerFactory); } - public ActionHandlerFactory getActionHandlerFactory() + @Nullable + public Widget createWidget(JsonWidget widget, Content content, Container container, int x, int y) { - return this.actionHandlerFactory; - } - - public UsercontentAPI getApi() - { - return this.api; - } - - @OnlyIn(Dist.CLIENT) - public static class UsercontentLogicMapped> implements ILogicMapped - { - private final ActionHandlerFactory actionHandlerFactory; - private final UsercontentAPI api; - private final Content content; - private final JsonWidget widget; - private final Supplier player; - - public UsercontentLogicMapped(UsercontentAPI api, ActionHandlerFactory actionHandlerFactory, Content content, JsonWidget widget, Supplier player) + if(JsonWidget.Type.BUTTON.equals(widget.getType())) { - this.api = api; - this.actionHandlerFactory = actionHandlerFactory; - this.content = content; - this.widget = widget; - this.player = player; + return new GuiButtonTooltip + ( + widget.getLayout().getX() + x, + widget.getLayout().getY() + y, + widget.getLayout().getWidth(), + widget.getLayout().getHeight(), + TextUtils.formatNonnull(widget.getText()), + TextUtils.formatNonnull(widget.getAttributes() != null ? widget.getAttributes().getTooltip() : null), + this.getActionHandlerFactory().createActionHandler(content, widget.getAction(), container::getPlayer) + ); } - - @Override - public IFormattableTextComponent translate(JsonItem item) + else if(JsonWidget.Type.ITEM_BUTTON.equals(widget.getType())) { - if(item.getTranslation() != null) - { - return new TranslationTextComponent(item.getTranslation()); - } + return new GuiButtonItem + ( + widget.getLayout().getX() + x, + widget.getLayout().getY() + y, + widget.getLayout().getWidth(), + widget.getLayout().getHeight(), + ForgeRegistries.ITEMS.getValue(new ResourceLocation(widget.getAttributes().getItem())), + this.getActionHandlerFactory().createActionHandler(content, widget.getAction(), container::getPlayer) + ); + } + else if(JsonWidget.Type.ICON_BUTTON.equals(widget.getType())) + { + return new GuiButtonIcon + ( + widget.getLayout().getX() + x, + widget.getLayout().getY() + y, + widget.getLayout().getWidth(), + widget.getLayout().getHeight(), + widget.getAttributes().getIcon(), + TextUtils.formatNonnull(widget.getAttributes().getTooltip()), + this.getActionHandlerFactory().createActionHandler(content, widget.getAction(), container::getPlayer) + ); + } + else if(JsonWidget.Type.LIST_BUTTON.equals(widget.getType())) + { + return new GuiButtonList + ( + widget.getLayout().getX() + x, + widget.getLayout().getY() + y, + widget.getAttributes().getItems(), + widget.getLayout().getWidth(), + widget.getLayout().getHeight(), + container, + new UsercontentLogicMapped(this.getApi(), this.getActionHandlerFactory(), content, widget, container::getPlayer) + ); + } + else if(JsonWidget.Type.SLIDER.equals(widget.getType())) + { + Consumer responder = this.getActionHandlerFactory().createResponder(integer -> integer.toString(), widget.getAttributes().getId(), widget.getAction()); + return new GuiSlider + ( + widget.getLayout().getX() + x, + widget.getLayout().getY() + y, + widget.getLayout().getWidth(), + widget.getLayout().getHeight(), + widget.getAttributes().getMin(), + widget.getAttributes().getMax(), + widget.getAttributes().getStart(), + container, + new LogicSliderSimple(widget.getAttributes().getId(), TextUtils.formatNonnull(widget.getText()), responder) + ); + } + else if(JsonWidget.Type.TEXTFIELD.equals(widget.getType())) + { + GuiTextFieldTooltip textfield = new GuiTextFieldTooltip + ( + widget.getLayout().getX() + x, + widget.getLayout().getY() + y, + widget.getLayout().getWidth(), + widget.getLayout().getHeight(), + TextUtils.formatNonnull(widget.getText()) + ); + textfield.setValidator(Predicates.notNull()); + textfield.setText(this.getApi().getValue(widget.getAttributes().getId())); + textfield.setResponder(this.getActionHandlerFactory().createResponder(string -> textfield.getText(), widget.getAttributes().getId(), widget.getAction())); - return new StringTextComponent(item.getId()); + return textfield; } - @Override - public IFormattableTextComponent toTooltip(JsonItem item) - { - return new StringTextComponent(item.getId()); - } - - @Override - public void onClick(JsonItem item) - { - try - { - this.api.updateValue(this.widget.getAttributes().getId(), item.getId()); - ActionHandler action = this.actionHandlerFactory.createActionHandler(this.content, this.widget.getAction(), this.player, item.getId()); - - if(action != null) - { - action.run(); - } - } - catch(Exception e) - { - WorldHandler.LOGGER.error("Error executing action for widget"); - } - } - - @Override - public String getId() - { - return this.widget.getAttributes().getId(); - } - - @Override - public void onInit(JsonItem item) - { - this.onClick(item); - } + return null; } } diff --git a/src/main/java/exopandora/worldhandler/usercontent/model/AbstractJsonWidget.java b/src/main/java/exopandora/worldhandler/usercontent/model/AbstractJsonWidget.java new file mode 100644 index 0000000..f5c8772 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/usercontent/model/AbstractJsonWidget.java @@ -0,0 +1,82 @@ +package exopandora.worldhandler.usercontent.model; + +import java.util.Arrays; + +import com.google.gson.annotations.SerializedName; + +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +@OnlyIn(Dist.CLIENT) +public abstract class AbstractJsonWidget> +{ + @SerializedName("action") + private Action action; + + @SerializedName("layout") + private JsonLayout layout; + + @SerializedName("attributes") + private Attributes attributes; + + public AbstractJsonWidget(Action action, JsonLayout layout, Attributes attributes) + { + this.action = action; + this.layout = layout; + this.attributes = attributes; + } + + public Action getAction() + { + return this.action; + } + + public void setAction(Action action) + { + this.action = action; + } + + public JsonLayout getLayout() + { + return this.layout; + } + + public void setDimensions(JsonLayout layout) + { + this.layout = layout; + } + + public Attributes getAttributes() + { + return this.attributes; + } + + public void setAttributes(Attributes attributes) + { + this.attributes = attributes; + } + + public abstract T getType(); + public abstract void setType(T type); + public abstract void validate() throws IllegalStateException; + + protected void validateAction(Action.Type... allowedTypes) throws IllegalStateException + { + if(this.getAction() != null) + { + this.getAction().validate(); + + if(Arrays.stream(allowedTypes).noneMatch(type -> type.equals(this.getAction().getType()))) + { + throw new IllegalStateException("Illegal action for type " + this.getType().toString().toLowerCase()); + } + } + } + + @OnlyIn(Dist.CLIENT) + public static enum Type + { + BUTTON, + MENU + } +} diff --git a/src/main/java/exopandora/worldhandler/usercontent/model/JsonButton.java b/src/main/java/exopandora/worldhandler/usercontent/model/JsonButton.java deleted file mode 100644 index ab3e1d2..0000000 --- a/src/main/java/exopandora/worldhandler/usercontent/model/JsonButton.java +++ /dev/null @@ -1,134 +0,0 @@ -package exopandora.worldhandler.usercontent.model; - -import com.google.gson.annotations.SerializedName; - -import exopandora.worldhandler.usercontent.model.JsonButton.Type; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -@OnlyIn(Dist.CLIENT) -public class JsonButton extends JsonWidget -{ - @SerializedName("text") - private String text; - - @SerializedName("type") - private Type type; - - public JsonButton(String text, Type type, Action action, JsonDimensions dimensions, Attributes attributes) - { - super(action, dimensions, attributes); - this.text = text; - this.type = type; - } - - public String getText() - { - return this.text; - } - - public void setText(String text) - { - this.text = text; - } - - public Type getType() - { - return this.type; - } - - public void setType(Type type) - { - this.type = type; - } - - @Override - public void validate() throws IllegalStateException - { - if(this.type == null) - { - throw new IllegalStateException("button.type is null"); - } - - if(this.type == Type.TEXTFIELD) - { - if(this.getAttributes() == null) - { - throw new IllegalStateException("button.attributes is null"); - } - else if(this.getAttributes().getId() == null) - { - throw new IllegalStateException("button.attributes.id is null"); - } - else if(this.getAttributes().getId().isEmpty()) - { - throw new IllegalStateException("button.attributes.id is empty"); - } - - this.validateAction(Action.Type.SET, Action.Type.JS); - } - else if(this.type == Type.ITEM_BUTTON) - { - if(this.getAttributes() == null) - { - throw new IllegalStateException("button.attributes is null"); - } - else if(this.getAttributes().getItem() == null) - { - throw new IllegalStateException("button.attributes.item is null"); - } - - this.validateAction(Action.Type.OPEN, Action.Type.SET, Action.Type.RUN, Action.Type.BACK, Action.Type.BACK_TO_GAME, Action.Type.JS); - } - else if(this.type == Type.ICON_BUTTON) - { - if(this.getAttributes() == null) - { - throw new IllegalStateException("button.attributes is null"); - } - else if(this.getAttributes().getIcon() == null) - { - throw new IllegalStateException("button.attributes.icon is null"); - } - - this.validateAction(Action.Type.OPEN, Action.Type.SET, Action.Type.RUN, Action.Type.BACK, Action.Type.BACK_TO_GAME, Action.Type.JS); - } - else if(this.type == Type.LIST_BUTTON) - { - if(this.getAttributes() == null) - { - throw new IllegalStateException("button.attributes is null"); - } - else if(this.getAttributes().getItems() == null) - { - throw new IllegalStateException("button.attributes.items is null"); - } - else if(this.getAttributes().getItems().isEmpty()) - { - throw new IllegalStateException("button.attributes.items is empty"); - } - - this.validateAction(Action.Type.SET, Action.Type.JS); - } - else if(this.type == Type.SLIDER) - { - if(this.getAttributes() == null) - { - throw new IllegalStateException("button.attributes is null"); - } - - this.validateAction(Action.Type.SET, Action.Type.JS); - } - } - - @OnlyIn(Dist.CLIENT) - public static enum Type - { - BUTTON, - TEXTFIELD, - ITEM_BUTTON, - ICON_BUTTON, - LIST_BUTTON, - SLIDER; - } -} diff --git a/src/main/java/exopandora/worldhandler/usercontent/model/JsonGui.java b/src/main/java/exopandora/worldhandler/usercontent/model/JsonGui.java index badf7a3..728df5a 100644 --- a/src/main/java/exopandora/worldhandler/usercontent/model/JsonGui.java +++ b/src/main/java/exopandora/worldhandler/usercontent/model/JsonGui.java @@ -16,22 +16,22 @@ public class JsonGui @SerializedName("tab") private JsonTab tab; - @SerializedName("buttons") - private List buttons = null; + @SerializedName("widgets") + private List widgets = null; @SerializedName("menus") private List menus = null; - @SerializedName("texts") - private List texts = null; + @SerializedName("labels") + private List labels = null; - public JsonGui(String title, JsonTab tab, List buttons, List menus, List texts) + public JsonGui(String title, JsonTab tab, List widgets, List menus, List labels) { this.title = title; this.tab = tab; - this.buttons = buttons; + this.widgets = widgets; this.menus = menus; - this.texts = texts; + this.labels = labels; } public String getTitle() @@ -54,14 +54,14 @@ public class JsonGui this.tab = tab; } - public List getButtons() + public List getWidgets() { - return this.buttons; + return this.widgets; } - public void setButtons(List buttons) + public void setButtons(List widgets) { - this.buttons = buttons; + this.widgets = widgets; } public List getMenus() @@ -74,14 +74,14 @@ public class JsonGui this.menus = menus; } - public List getTexts() + public List getLabels() { - return this.texts; + return this.labels; } - public void setTexts(List texts) + public void setTexts(List labels) { - this.texts = texts; + this.labels = labels; } public void validate() throws IllegalStateException diff --git a/src/main/java/exopandora/worldhandler/usercontent/model/JsonText.java b/src/main/java/exopandora/worldhandler/usercontent/model/JsonLabel.java similarity index 91% rename from src/main/java/exopandora/worldhandler/usercontent/model/JsonText.java rename to src/main/java/exopandora/worldhandler/usercontent/model/JsonLabel.java index 6986d77..fbf9494 100644 --- a/src/main/java/exopandora/worldhandler/usercontent/model/JsonText.java +++ b/src/main/java/exopandora/worldhandler/usercontent/model/JsonLabel.java @@ -6,7 +6,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @OnlyIn(Dist.CLIENT) -public class JsonText +public class JsonLabel { @SerializedName("text") private String text; @@ -23,7 +23,7 @@ public class JsonText @SerializedName("visible") private BooleanExpression visible; - public JsonText(String text, int x, int y, int color, BooleanExpression visible) + public JsonLabel(String text, int x, int y, int color, BooleanExpression visible) { this.text = text; this.x = x; diff --git a/src/main/java/exopandora/worldhandler/usercontent/model/JsonDimensions.java b/src/main/java/exopandora/worldhandler/usercontent/model/JsonLayout.java similarity index 91% rename from src/main/java/exopandora/worldhandler/usercontent/model/JsonDimensions.java rename to src/main/java/exopandora/worldhandler/usercontent/model/JsonLayout.java index edc4bde..2627b67 100644 --- a/src/main/java/exopandora/worldhandler/usercontent/model/JsonDimensions.java +++ b/src/main/java/exopandora/worldhandler/usercontent/model/JsonLayout.java @@ -6,7 +6,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @OnlyIn(Dist.CLIENT) -public class JsonDimensions +public class JsonLayout { @SerializedName("x") private int x; @@ -20,7 +20,7 @@ public class JsonDimensions @SerializedName("height") private int height; - public JsonDimensions(int x, int y, int width, int height) + public JsonLayout(int x, int y, int width, int height) { this.x = x; this.y = y; diff --git a/src/main/java/exopandora/worldhandler/usercontent/model/JsonMenu.java b/src/main/java/exopandora/worldhandler/usercontent/model/JsonMenu.java index b76d2e1..2fb7ab7 100644 --- a/src/main/java/exopandora/worldhandler/usercontent/model/JsonMenu.java +++ b/src/main/java/exopandora/worldhandler/usercontent/model/JsonMenu.java @@ -7,14 +7,14 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @OnlyIn(Dist.CLIENT) -public class JsonMenu extends JsonWidget +public class JsonMenu extends AbstractJsonWidget { @SerializedName("type") private Type type; - public JsonMenu(Type type, Action action, JsonDimensions dimensions, Attributes attributes) + public JsonMenu(Type type, Action action, JsonLayout layout, Attributes attributes) { - super(action, dimensions, attributes); + super(action, layout, attributes); this.type = type; } diff --git a/src/main/java/exopandora/worldhandler/usercontent/model/JsonWidget.java b/src/main/java/exopandora/worldhandler/usercontent/model/JsonWidget.java index 9609947..e3527af 100644 --- a/src/main/java/exopandora/worldhandler/usercontent/model/JsonWidget.java +++ b/src/main/java/exopandora/worldhandler/usercontent/model/JsonWidget.java @@ -1,75 +1,123 @@ package exopandora.worldhandler.usercontent.model; -import java.util.Arrays; - import com.google.gson.annotations.SerializedName; +import exopandora.worldhandler.usercontent.model.JsonWidget.Type; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @OnlyIn(Dist.CLIENT) -public abstract class JsonWidget> +public class JsonWidget extends AbstractJsonWidget { - @SerializedName("action") - private Action action; + @SerializedName("text") + private String text; - @SerializedName("dimensions") - private JsonDimensions dimensions; + @SerializedName("type") + private Type type; - @SerializedName("attributes") - private Attributes attributes; - - public JsonWidget(Action action, JsonDimensions dimensions, Attributes attributes) + public JsonWidget(String text, Type type, Action action, JsonLayout layout, Attributes attributes) { - this.action = action; - this.dimensions = dimensions; - this.attributes = attributes; + super(action, layout, attributes); + this.text = text; + this.type = type; } - public Action getAction() + public String getText() { - return this.action; + return this.text; } - public void setAction(Action action) + public void setText(String text) { - this.action = action; + this.text = text; } - public JsonDimensions getDimensions() + public Type getType() { - return this.dimensions; + return this.type; } - public void setDimensions(JsonDimensions dimensions) + public void setType(Type type) { - this.dimensions = dimensions; + this.type = type; } - public Attributes getAttributes() + @Override + public void validate() throws IllegalStateException { - return this.attributes; - } - - public void setAttributes(Attributes attributes) - { - this.attributes = attributes; - } - - public abstract T getType(); - public abstract void setType(T type); - public abstract void validate() throws IllegalStateException; - - protected void validateAction(Action.Type... allowedTypes) throws IllegalStateException - { - if(this.getAction() != null) + if(this.type == null) { - this.getAction().validate(); - - if(Arrays.stream(allowedTypes).noneMatch(type -> type.equals(this.getAction().getType()))) + throw new IllegalStateException("widget.type is null"); + } + + if(this.type == Type.TEXTFIELD) + { + if(this.getAttributes() == null) { - throw new IllegalStateException("Illegal action for type " + this.getType().toString().toLowerCase()); + throw new IllegalStateException("widget.attributes is null"); } + else if(this.getAttributes().getId() == null) + { + throw new IllegalStateException("widget.attributes.id is null"); + } + else if(this.getAttributes().getId().isEmpty()) + { + throw new IllegalStateException("widget.attributes.id is empty"); + } + + this.validateAction(Action.Type.SET, Action.Type.JS); + } + else if(this.type == Type.ITEM_BUTTON) + { + if(this.getAttributes() == null) + { + throw new IllegalStateException("widget.attributes is null"); + } + else if(this.getAttributes().getItem() == null) + { + throw new IllegalStateException("widget.attributes.item is null"); + } + + this.validateAction(Action.Type.OPEN, Action.Type.SET, Action.Type.RUN, Action.Type.BACK, Action.Type.BACK_TO_GAME, Action.Type.JS); + } + else if(this.type == Type.ICON_BUTTON) + { + if(this.getAttributes() == null) + { + throw new IllegalStateException("widget.attributes is null"); + } + else if(this.getAttributes().getIcon() == null) + { + throw new IllegalStateException("widget.attributes.icon is null"); + } + + this.validateAction(Action.Type.OPEN, Action.Type.SET, Action.Type.RUN, Action.Type.BACK, Action.Type.BACK_TO_GAME, Action.Type.JS); + } + else if(this.type == Type.LIST_BUTTON) + { + if(this.getAttributes() == null) + { + throw new IllegalStateException("widget.attributes is null"); + } + else if(this.getAttributes().getItems() == null) + { + throw new IllegalStateException("widget.attributes.items is null"); + } + else if(this.getAttributes().getItems().isEmpty()) + { + throw new IllegalStateException("widget.attributes.items is empty"); + } + + this.validateAction(Action.Type.SET, Action.Type.JS); + } + else if(this.type == Type.SLIDER) + { + if(this.getAttributes() == null) + { + throw new IllegalStateException("widget.attributes is null"); + } + + this.validateAction(Action.Type.SET, Action.Type.JS); } } @@ -77,6 +125,10 @@ public abstract class JsonWidget> public static enum Type { BUTTON, - MENU + TEXTFIELD, + ITEM_BUTTON, + ICON_BUTTON, + LIST_BUTTON, + SLIDER; } }