From 6a74920f7594082f5bbbad6f6069afd6f0d0ee48 Mon Sep 17 00:00:00 2001 From: NichtStudioCode <51272202+NichtStudioCode@users.noreply.github.com> Date: Sat, 23 Apr 2022 20:37:15 +0200 Subject: [PATCH] Improved GUIBuilder and Structure - Structure now stores width and height - Width and height are no longer part of the GUIBuilder constructor - Width and height can be omitted by using the String[] Structure constructor - Vertical item list slots - Added GUIBuilder#setBackground --- .../invui/gui/builder/GUIBuilder.java | 20 ++++++-- .../invui/gui/builder/GUIContext.java | 25 ++++------ .../gui/builder/guitype/NormalGUIType.java | 4 +- .../gui/builder/guitype/PagedGUIsGUIType.java | 4 +- .../builder/guitype/PagedItemsGUIType.java | 4 +- .../builder/guitype/ScrollGUIsGUIType.java | 4 +- .../builder/guitype/ScrollItemsGUIType.java | 4 +- .../gui/builder/guitype/ScrollVIGUIType.java | 4 +- .../invui/gui/builder/guitype/TabGUIType.java | 4 +- .../studiocode/invui/gui/impl/PagedGUI.java | 3 +- .../studiocode/invui/gui/impl/ScrollGUI.java | 2 +- .../studiocode/invui/gui/impl/SimpleGUI.java | 4 +- .../invui/gui/impl/SimplePagedItemsGUI.java | 4 +- .../invui/gui/impl/SimplePagedNestedGUI.java | 4 +- .../invui/gui/impl/SimpleScrollItemsGUI.java | 4 +- .../invui/gui/impl/SimpleScrollNestedGUI.java | 4 +- .../invui/gui/impl/SimpleScrollVIGUI.java | 4 +- .../invui/gui/impl/SimpleTabGUI.java | 4 +- .../de/studiocode/invui/gui/impl/TabGUI.java | 3 +- .../invui/gui/structure/Ingredient.java | 6 +-- .../invui/gui/structure/IngredientList.java | 47 +++++++++++++++++-- .../invui/gui/structure/Marker.java | 15 ++++++ .../invui/gui/structure/Markers.java | 10 +++- .../invui/gui/structure/Structure.java | 36 +++++++++++--- 24 files changed, 162 insertions(+), 61 deletions(-) create mode 100644 InvUI/src/main/java/de/studiocode/invui/gui/structure/Marker.java diff --git a/InvUI/src/main/java/de/studiocode/invui/gui/builder/GUIBuilder.java b/InvUI/src/main/java/de/studiocode/invui/gui/builder/GUIBuilder.java index 10572d5..555c277 100644 --- a/InvUI/src/main/java/de/studiocode/invui/gui/builder/GUIBuilder.java +++ b/InvUI/src/main/java/de/studiocode/invui/gui/builder/GUIBuilder.java @@ -3,6 +3,7 @@ package de.studiocode.invui.gui.builder; import de.studiocode.invui.gui.GUI; import de.studiocode.invui.gui.SlotElement; import de.studiocode.invui.gui.builder.guitype.GUIType; +import de.studiocode.invui.gui.structure.Marker; import de.studiocode.invui.gui.structure.Structure; import de.studiocode.invui.item.Item; import de.studiocode.invui.item.ItemProvider; @@ -27,16 +28,20 @@ public class GUIBuilder { private final GUIType guiType; private final GUIContext context; - public GUIBuilder(@NotNull GUIType guiType, int width, int height) { + public GUIBuilder(@NotNull GUIType guiType) { this.guiType = guiType; - this.context = new GUIContext(width, height); + this.context = new GUIContext(); } - public GUIBuilder setStructure(@NotNull String structureData) { - context.setStructure(new Structure(structureData)); + public GUIBuilder setStructure(int width, int height, @NotNull String structureData) { + context.setStructure(new Structure(width, height, structureData)); return this; } + public GUIBuilder setStructure(@NotNull String... structureData) { + return setStructure(new Structure(structureData)); + } + public GUIBuilder setStructure(@NotNull Structure structure) { context.setStructure(structure); return this; @@ -72,7 +77,7 @@ public class GUIBuilder { return this; } - public GUIBuilder addIngredient(char key, @NotNull String marker) { + public GUIBuilder addIngredient(char key, @NotNull Marker marker) { context.getStructure().addIngredient(key, marker); return this; } @@ -124,6 +129,11 @@ public class GUIBuilder { return this; } + public GUIBuilder setBackground(@Nullable ItemProvider background) { + context.setBackground(background); + return this; + } + public G build() { if (context.getStructure() == null) throw new IllegalStateException("GUIContext has not been set yet."); return guiType.createGUI(context); diff --git a/InvUI/src/main/java/de/studiocode/invui/gui/builder/GUIContext.java b/InvUI/src/main/java/de/studiocode/invui/gui/builder/GUIContext.java index 7af6660..e37242d 100644 --- a/InvUI/src/main/java/de/studiocode/invui/gui/builder/GUIContext.java +++ b/InvUI/src/main/java/de/studiocode/invui/gui/builder/GUIContext.java @@ -4,6 +4,7 @@ import de.studiocode.invui.gui.GUI; import de.studiocode.invui.gui.builder.guitype.GUIType; import de.studiocode.invui.gui.structure.Structure; import de.studiocode.invui.item.Item; +import de.studiocode.invui.item.ItemProvider; import de.studiocode.invui.virtualinventory.VirtualInventory; import org.jetbrains.annotations.NotNull; @@ -15,26 +16,12 @@ import java.util.List; */ public class GUIContext { - private final int width; - private final int height; private Structure structure; + private ItemProvider background; private List guis; private List items; private VirtualInventory inventory; - public GUIContext(int width, int height) { - this.width = width; - this.height = height; - } - - public int getWidth() { - return width; - } - - public int getHeight() { - return height; - } - public Structure getStructure() { return structure; } @@ -43,6 +30,14 @@ public class GUIContext { this.structure = structure; } + public ItemProvider getBackground() { + return background; + } + + public void setBackground(ItemProvider background) { + this.background = background; + } + public List getGuis() { return guis; } diff --git a/InvUI/src/main/java/de/studiocode/invui/gui/builder/guitype/NormalGUIType.java b/InvUI/src/main/java/de/studiocode/invui/gui/builder/guitype/NormalGUIType.java index 3a9c54d..d39b7b1 100644 --- a/InvUI/src/main/java/de/studiocode/invui/gui/builder/guitype/NormalGUIType.java +++ b/InvUI/src/main/java/de/studiocode/invui/gui/builder/guitype/NormalGUIType.java @@ -7,7 +7,9 @@ class NormalGUIType implements GUIType { @Override public SimpleGUI createGUI(GUIContext context) { - return new SimpleGUI(context.getWidth(), context.getHeight(), context.getStructure()); + SimpleGUI gui = new SimpleGUI(context.getStructure()); + gui.setBackground(context.getBackground()); + return gui; } @Override diff --git a/InvUI/src/main/java/de/studiocode/invui/gui/builder/guitype/PagedGUIsGUIType.java b/InvUI/src/main/java/de/studiocode/invui/gui/builder/guitype/PagedGUIsGUIType.java index f2a3905..f0fad67 100644 --- a/InvUI/src/main/java/de/studiocode/invui/gui/builder/guitype/PagedGUIsGUIType.java +++ b/InvUI/src/main/java/de/studiocode/invui/gui/builder/guitype/PagedGUIsGUIType.java @@ -7,7 +7,9 @@ class PagedGUIsGUIType implements GUIType { @Override public SimplePagedNestedGUI createGUI(GUIContext context) { - return new SimplePagedNestedGUI(context.getWidth(), context.getHeight(), context.getGuis(), context.getStructure()); + SimplePagedNestedGUI gui = new SimplePagedNestedGUI(context.getGuis(), context.getStructure()); + gui.setBackground(context.getBackground()); + return gui; } @Override diff --git a/InvUI/src/main/java/de/studiocode/invui/gui/builder/guitype/PagedItemsGUIType.java b/InvUI/src/main/java/de/studiocode/invui/gui/builder/guitype/PagedItemsGUIType.java index d67272c..93d5289 100644 --- a/InvUI/src/main/java/de/studiocode/invui/gui/builder/guitype/PagedItemsGUIType.java +++ b/InvUI/src/main/java/de/studiocode/invui/gui/builder/guitype/PagedItemsGUIType.java @@ -7,7 +7,9 @@ class PagedItemsGUIType implements GUIType { @Override public SimplePagedItemsGUI createGUI(GUIContext context) { - return new SimplePagedItemsGUI(context.getWidth(), context.getHeight(), context.getItems(), context.getStructure()); + SimplePagedItemsGUI gui = new SimplePagedItemsGUI(context.getItems(), context.getStructure()); + gui.setBackground(context.getBackground()); + return gui; } @Override diff --git a/InvUI/src/main/java/de/studiocode/invui/gui/builder/guitype/ScrollGUIsGUIType.java b/InvUI/src/main/java/de/studiocode/invui/gui/builder/guitype/ScrollGUIsGUIType.java index fbc84d1..d21e74b 100644 --- a/InvUI/src/main/java/de/studiocode/invui/gui/builder/guitype/ScrollGUIsGUIType.java +++ b/InvUI/src/main/java/de/studiocode/invui/gui/builder/guitype/ScrollGUIsGUIType.java @@ -7,7 +7,9 @@ class ScrollGUIsGUIType implements GUIType { @Override public SimpleScrollNestedGUI createGUI(GUIContext context) { - return new SimpleScrollNestedGUI(context.getWidth(), context.getHeight(), context.getGuis(), context.getStructure()); + SimpleScrollNestedGUI gui = new SimpleScrollNestedGUI(context.getGuis(), context.getStructure()); + gui.setBackground(gui.getBackground()); + return gui; } @Override diff --git a/InvUI/src/main/java/de/studiocode/invui/gui/builder/guitype/ScrollItemsGUIType.java b/InvUI/src/main/java/de/studiocode/invui/gui/builder/guitype/ScrollItemsGUIType.java index 1398fd4..fb7886b 100644 --- a/InvUI/src/main/java/de/studiocode/invui/gui/builder/guitype/ScrollItemsGUIType.java +++ b/InvUI/src/main/java/de/studiocode/invui/gui/builder/guitype/ScrollItemsGUIType.java @@ -7,7 +7,9 @@ class ScrollItemsGUIType implements GUIType { @Override public SimpleScrollItemsGUI createGUI(GUIContext context) { - return new SimpleScrollItemsGUI(context.getWidth(), context.getHeight(), context.getItems(), context.getStructure()); + SimpleScrollItemsGUI gui = new SimpleScrollItemsGUI(context.getItems(), context.getStructure()); + gui.setBackground(context.getBackground()); + return gui; } @Override diff --git a/InvUI/src/main/java/de/studiocode/invui/gui/builder/guitype/ScrollVIGUIType.java b/InvUI/src/main/java/de/studiocode/invui/gui/builder/guitype/ScrollVIGUIType.java index 69b2db5..39e01a4 100644 --- a/InvUI/src/main/java/de/studiocode/invui/gui/builder/guitype/ScrollVIGUIType.java +++ b/InvUI/src/main/java/de/studiocode/invui/gui/builder/guitype/ScrollVIGUIType.java @@ -7,7 +7,9 @@ class ScrollVIGUIType implements GUIType { @Override public SimpleScrollVIGUI createGUI(GUIContext context) { - return new SimpleScrollVIGUI(context.getWidth(), context.getHeight(), context.getInventory(), context.getStructure()); + SimpleScrollVIGUI gui = new SimpleScrollVIGUI(context.getInventory(), context.getStructure()); + gui.setBackground(context.getBackground()); + return gui; } @Override diff --git a/InvUI/src/main/java/de/studiocode/invui/gui/builder/guitype/TabGUIType.java b/InvUI/src/main/java/de/studiocode/invui/gui/builder/guitype/TabGUIType.java index 56544b5..410d0e3 100644 --- a/InvUI/src/main/java/de/studiocode/invui/gui/builder/guitype/TabGUIType.java +++ b/InvUI/src/main/java/de/studiocode/invui/gui/builder/guitype/TabGUIType.java @@ -7,7 +7,9 @@ class TabGUIType implements GUIType { @Override public SimpleTabGUI createGUI(GUIContext context) { - return new SimpleTabGUI(context.getWidth(), context.getHeight(), context.getGuis(), context.getStructure()); + SimpleTabGUI gui = new SimpleTabGUI(context.getGuis(), context.getStructure()); + gui.setBackground(context.getBackground()); + return gui; } @Override diff --git a/InvUI/src/main/java/de/studiocode/invui/gui/impl/PagedGUI.java b/InvUI/src/main/java/de/studiocode/invui/gui/impl/PagedGUI.java index 8c94aff..19b3ff6 100644 --- a/InvUI/src/main/java/de/studiocode/invui/gui/impl/PagedGUI.java +++ b/InvUI/src/main/java/de/studiocode/invui/gui/impl/PagedGUI.java @@ -3,7 +3,6 @@ package de.studiocode.invui.gui.impl; import de.studiocode.invui.gui.GUI; import de.studiocode.invui.gui.SlotElement; import de.studiocode.invui.gui.builder.GUIBuilder; -import de.studiocode.invui.gui.structure.Markers; import de.studiocode.invui.gui.structure.Structure; import java.util.List; @@ -28,7 +27,7 @@ public abstract class PagedGUI extends BaseGUI { } public PagedGUI(int width, int height, boolean infinitePages, Structure structure) { - this(width, height, infinitePages, structure.getIngredientList().findIndicesOfMarker(Markers.ITEM_LIST_SLOT)); + this(width, height, infinitePages, structure.getIngredientList().findItemListSlots()); applyStructure(structure); } diff --git a/InvUI/src/main/java/de/studiocode/invui/gui/impl/ScrollGUI.java b/InvUI/src/main/java/de/studiocode/invui/gui/impl/ScrollGUI.java index 95d3b8e..74f6e33 100644 --- a/InvUI/src/main/java/de/studiocode/invui/gui/impl/ScrollGUI.java +++ b/InvUI/src/main/java/de/studiocode/invui/gui/impl/ScrollGUI.java @@ -39,7 +39,7 @@ public abstract class ScrollGUI extends BaseGUI { } public ScrollGUI(int width, int height, boolean infiniteLines, Structure structure) { - this(width, height, infiniteLines, structure.getIngredientList().findIndicesOfMarker(Markers.ITEM_LIST_SLOT)); + this(width, height, infiniteLines, structure.getIngredientList().findItemListSlots()); applyStructure(structure); } diff --git a/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimpleGUI.java b/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimpleGUI.java index 60a775b..9623de6 100644 --- a/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimpleGUI.java +++ b/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimpleGUI.java @@ -13,8 +13,8 @@ public class SimpleGUI extends BaseGUI { super(width, height); } - public SimpleGUI(int width, int height, @NotNull Structure structure) { - super(width, height); + public SimpleGUI(@NotNull Structure structure) { + super(structure.getWidth(), structure.getHeight()); applyStructure(structure); } diff --git a/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimplePagedItemsGUI.java b/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimplePagedItemsGUI.java index c16d44c..4cd2944 100644 --- a/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimplePagedItemsGUI.java +++ b/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimplePagedItemsGUI.java @@ -29,8 +29,8 @@ public class SimplePagedItemsGUI extends PagedGUI { setItems(items); } - public SimplePagedItemsGUI(int width, int height, @Nullable List items, @NotNull Structure structure) { - super(width, height, false, structure); + public SimplePagedItemsGUI(@Nullable List items, @NotNull Structure structure) { + super(structure.getWidth(), structure.getHeight(), false, structure); setItems(items); } diff --git a/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimplePagedNestedGUI.java b/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimplePagedNestedGUI.java index c90700e..222a51a 100644 --- a/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimplePagedNestedGUI.java +++ b/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimplePagedNestedGUI.java @@ -29,8 +29,8 @@ public class SimplePagedNestedGUI extends PagedGUI { setGuis(guis); } - public SimplePagedNestedGUI(int width, int height, @Nullable List guis, @NotNull Structure structure) { - super(width, height, false, structure); + public SimplePagedNestedGUI(@Nullable List guis, @NotNull Structure structure) { + super(structure.getWidth(), structure.getHeight(), false, structure); setGuis(guis); } diff --git a/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimpleScrollItemsGUI.java b/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimpleScrollItemsGUI.java index 25bbb4f..25eef1b 100644 --- a/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimpleScrollItemsGUI.java +++ b/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimpleScrollItemsGUI.java @@ -19,8 +19,8 @@ public class SimpleScrollItemsGUI extends ScrollGUI { setItems(items); } - public SimpleScrollItemsGUI(int width, int height, @Nullable List items, @NotNull Structure structure) { - super(width, height, false, structure); + public SimpleScrollItemsGUI(@Nullable List items, @NotNull Structure structure) { + super(structure.getWidth(), structure.getHeight(), false, structure); setItems(items); } diff --git a/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimpleScrollNestedGUI.java b/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimpleScrollNestedGUI.java index 593c302..6352d58 100644 --- a/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimpleScrollNestedGUI.java +++ b/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimpleScrollNestedGUI.java @@ -19,8 +19,8 @@ public class SimpleScrollNestedGUI extends ScrollGUI { setGuis(guis); } - public SimpleScrollNestedGUI(int width, int height, @Nullable List guis, @NotNull Structure structure) { - super(width, height, false, structure); + public SimpleScrollNestedGUI(@Nullable List guis, @NotNull Structure structure) { + super(structure.getWidth(), structure.getHeight(), false, structure); setGuis(guis); } diff --git a/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimpleScrollVIGUI.java b/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimpleScrollVIGUI.java index 0872a20..db839e1 100644 --- a/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimpleScrollVIGUI.java +++ b/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimpleScrollVIGUI.java @@ -20,8 +20,8 @@ public class SimpleScrollVIGUI extends ScrollGUI { update(); } - public SimpleScrollVIGUI(int width, int height, @Nullable VirtualInventory inventory, @NotNull Structure structure) { - super(width, height, false, structure); + public SimpleScrollVIGUI(@Nullable VirtualInventory inventory, @NotNull Structure structure) { + super(structure.getWidth(), structure.getHeight(), false, structure); this.inventory = inventory; update(); diff --git a/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimpleTabGUI.java b/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimpleTabGUI.java index b20a47d..878236c 100644 --- a/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimpleTabGUI.java +++ b/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimpleTabGUI.java @@ -33,8 +33,8 @@ public class SimpleTabGUI extends TabGUI { update(); } - public SimpleTabGUI(int width, int height, @NotNull List tabs, @NotNull Structure structure) { - super(width, height, tabs.size(), structure); + public SimpleTabGUI(@NotNull List tabs, @NotNull Structure structure) { + super(structure.getWidth(), structure.getHeight(), tabs.size(), structure); this.linkingElements = tabs.stream().map(this::getLinkingElements).collect(Collectors.toList()); this.tabs = tabs; diff --git a/InvUI/src/main/java/de/studiocode/invui/gui/impl/TabGUI.java b/InvUI/src/main/java/de/studiocode/invui/gui/impl/TabGUI.java index 1d82ef1..5c9df6b 100644 --- a/InvUI/src/main/java/de/studiocode/invui/gui/impl/TabGUI.java +++ b/InvUI/src/main/java/de/studiocode/invui/gui/impl/TabGUI.java @@ -2,7 +2,6 @@ package de.studiocode.invui.gui.impl; import de.studiocode.invui.gui.Controllable; import de.studiocode.invui.gui.SlotElement; -import de.studiocode.invui.gui.structure.Markers; import de.studiocode.invui.gui.structure.Structure; import java.util.List; @@ -21,7 +20,7 @@ public abstract class TabGUI extends BaseGUI implements Controllable { } public TabGUI(int width, int height, int tabAmount, Structure structure) { - this(width, height, tabAmount, structure.getIngredientList().findIndicesOfMarker(Markers.ITEM_LIST_SLOT)); + this(width, height, tabAmount, structure.getIngredientList().findItemListSlots()); applyStructure(structure); } diff --git a/InvUI/src/main/java/de/studiocode/invui/gui/structure/Ingredient.java b/InvUI/src/main/java/de/studiocode/invui/gui/structure/Ingredient.java index 4c455a7..60a682b 100644 --- a/InvUI/src/main/java/de/studiocode/invui/gui/structure/Ingredient.java +++ b/InvUI/src/main/java/de/studiocode/invui/gui/structure/Ingredient.java @@ -7,7 +7,7 @@ import java.util.function.Supplier; class Ingredient { private final SlotElement slotElement; - private final String marker; + private final Marker marker; private final Supplier elementSupplier; public Ingredient(SlotElement slotElement) { @@ -22,7 +22,7 @@ class Ingredient { this.marker = null; } - public Ingredient(String marker) { + public Ingredient(Marker marker) { this.marker = marker; this.slotElement = null; this.elementSupplier = null; @@ -32,7 +32,7 @@ class Ingredient { return slotElement == null ? elementSupplier.get() : slotElement; } - public String getMarker() { + public Marker getMarker() { return marker; } diff --git a/InvUI/src/main/java/de/studiocode/invui/gui/structure/IngredientList.java b/InvUI/src/main/java/de/studiocode/invui/gui/structure/IngredientList.java index 15e5e55..95c9207 100644 --- a/InvUI/src/main/java/de/studiocode/invui/gui/structure/IngredientList.java +++ b/InvUI/src/main/java/de/studiocode/invui/gui/structure/IngredientList.java @@ -1,14 +1,22 @@ package de.studiocode.invui.gui.structure; import de.studiocode.invui.gui.GUI; +import de.studiocode.invui.util.SlotUtils; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.stream.Stream; public class IngredientList extends ArrayList { - public IngredientList(String structure, HashMap ingredientMap) { + private final int width; + private final int height; + + public IngredientList(int width, int height, String structure, HashMap ingredientMap) { + this.width = width; + this.height = height; + for (char c : structure.toCharArray()) { Ingredient ingredient = null; if (ingredientMap.containsKey(c)) ingredient = ingredientMap.get(c); @@ -27,15 +35,48 @@ public class IngredientList extends ArrayList { } } - public int[] findIndicesOfMarker(String marker) { + private List findIndicesOfHorizontalMarker(Marker marker) { List indices = new ArrayList<>(); for (int i = 0; i < size(); i++) { Ingredient ingredient = get(i); - if (ingredient != null && ingredient.isMarker() && ingredient.getMarker().equals(marker)) + if (ingredient != null && ingredient.isMarker() && ingredient.getMarker() == marker) indices.add(i); } + return indices; + } + + + public List findIndicesOfVerticalMarker(Marker marker) { + List indices = new ArrayList<>(); + for (int x = 0; x < width; x++) { + for (int y = 0; y < height; y++) { + int i = SlotUtils.convertToIndex(x, y, width); + Ingredient ingredient = get(i); + if (ingredient != null && ingredient.isMarker() && ingredient.getMarker() == marker) + indices.add(i); + } + } + + return indices; + } + + public int[] findIndicesOfMarker(Marker marker) { + List indices; + if (marker.isHorizontal()) { + indices = findIndicesOfHorizontalMarker(marker); + } else { + indices = findIndicesOfVerticalMarker(marker); + } + return indices.stream().mapToInt(Integer::intValue).toArray(); } + public int[] findItemListSlots() { + return Stream.concat( + findIndicesOfHorizontalMarker(Markers.ITEM_LIST_SLOT_HORIZONTAL).stream(), + findIndicesOfVerticalMarker(Markers.ITEM_LIST_SLOT_VERTICAL).stream() + ).mapToInt(Integer::intValue).toArray(); + } + } diff --git a/InvUI/src/main/java/de/studiocode/invui/gui/structure/Marker.java b/InvUI/src/main/java/de/studiocode/invui/gui/structure/Marker.java new file mode 100644 index 0000000..09e5c73 --- /dev/null +++ b/InvUI/src/main/java/de/studiocode/invui/gui/structure/Marker.java @@ -0,0 +1,15 @@ +package de.studiocode.invui.gui.structure; + +public class Marker { + + private final boolean horizontal; + + public Marker(boolean horizontal) { + this.horizontal = horizontal; + } + + public boolean isHorizontal() { + return horizontal; + } + +} diff --git a/InvUI/src/main/java/de/studiocode/invui/gui/structure/Markers.java b/InvUI/src/main/java/de/studiocode/invui/gui/structure/Markers.java index 4625673..0443e31 100644 --- a/InvUI/src/main/java/de/studiocode/invui/gui/structure/Markers.java +++ b/InvUI/src/main/java/de/studiocode/invui/gui/structure/Markers.java @@ -10,9 +10,15 @@ import de.studiocode.invui.gui.impl.TabGUI; public class Markers { /** - * The marker for item list slots in {@link PagedGUI PagedGUIs}, + * The marker for horizontal item list slots in {@link PagedGUI PagedGUIs}, * {@link ScrollGUI ScrollGUIs} and {@link TabGUI TabGUIs} */ - public static final String ITEM_LIST_SLOT = "ILS"; + public static final Marker ITEM_LIST_SLOT_HORIZONTAL = new Marker(true); + + /** + * The marker for vertical item list slots in {@link PagedGUI PagedGUIs}, + * {@link ScrollGUI ScrollGUIs} and {@link TabGUI TabGUIs} + */ + public static final Marker ITEM_LIST_SLOT_VERTICAL = new Marker(true); } diff --git a/InvUI/src/main/java/de/studiocode/invui/gui/structure/Structure.java b/InvUI/src/main/java/de/studiocode/invui/gui/structure/Structure.java index 8f4cc5b..e6f9862 100644 --- a/InvUI/src/main/java/de/studiocode/invui/gui/structure/Structure.java +++ b/InvUI/src/main/java/de/studiocode/invui/gui/structure/Structure.java @@ -26,13 +26,27 @@ public class Structure implements Cloneable { private static final HashMap globalIngredientMap = new HashMap<>(); private final String structureData; + private final int width; + private final int height; + private HashMap ingredientMap = new HashMap<>(); private IngredientList ingredientList; - public Structure(String structureData) { - this.structureData = structureData - .replace(" ", "") - .replace("\n", ""); + public Structure(String... structureData) { + this(sanitize(structureData[0]).length(), structureData.length, String.join("", structureData)); + } + + public Structure(int width, int height, String structureData) { + this.width = width; + this.height = height; + this.structureData = sanitize(structureData); + + if (width * height != this.structureData.length()) + throw new IllegalArgumentException("Length of structure data does not match width * height"); + } + + private static String sanitize(String s) { + return s.replace(" ", "").replace("\n", ""); } public static void addGlobalIngredient(char key, @NotNull ItemStack itemStack) { @@ -55,7 +69,7 @@ public class Structure implements Cloneable { globalIngredientMap.put(key, new Ingredient(element)); } - public static void addGlobalIngredient(char key, @NotNull String marker) { + public static void addGlobalIngredient(char key, @NotNull Marker marker) { globalIngredientMap.put(key, new Ingredient(marker)); } @@ -94,7 +108,7 @@ public class Structure implements Cloneable { return this; } - public Structure addIngredient(char key, @NotNull String marker) { + public Structure addIngredient(char key, @NotNull Marker marker) { if (ingredientList != null) throw new IllegalStateException("Structure is locked"); ingredientMap.put(key, new Ingredient(marker)); return this; @@ -117,7 +131,15 @@ public class Structure implements Cloneable { HashMap ingredients = new HashMap<>(globalIngredientMap); ingredients.putAll(this.ingredientMap); - return ingredientList = new IngredientList(structureData, ingredients); + return ingredientList = new IngredientList(width, height, structureData, ingredients); + } + + public int getWidth() { + return width; + } + + public int getHeight() { + return height; } @Override