From ac8401ef6b7437b1f50ff5f1c52791bba0dcbb4d Mon Sep 17 00:00:00 2001 From: NichtStudioCode <51272202+NichtStudioCode@users.noreply.github.com> Date: Thu, 28 Jan 2021 18:58:44 +0100 Subject: [PATCH] TabGUI --- .../gui/builder/impl/SimpleTabGUIBuilder.java | 23 ++++++++ .../gui/builder/impl/TabGUIBuilder.java | 57 +++++++++++++++++++ .../invgui/gui/impl/SimpleTabGUI.java | 38 +++++++++++++ .../de/studiocode/invgui/gui/impl/TabGUI.java | 55 ++++++++++++++++++ .../invgui/item/impl/tabgui/TabItem.java | 26 +++++++++ 5 files changed, 199 insertions(+) create mode 100644 src/main/java/de/studiocode/invgui/gui/builder/impl/SimpleTabGUIBuilder.java create mode 100644 src/main/java/de/studiocode/invgui/gui/builder/impl/TabGUIBuilder.java create mode 100644 src/main/java/de/studiocode/invgui/gui/impl/SimpleTabGUI.java create mode 100644 src/main/java/de/studiocode/invgui/gui/impl/TabGUI.java create mode 100644 src/main/java/de/studiocode/invgui/item/impl/tabgui/TabItem.java diff --git a/src/main/java/de/studiocode/invgui/gui/builder/impl/SimpleTabGUIBuilder.java b/src/main/java/de/studiocode/invgui/gui/builder/impl/SimpleTabGUIBuilder.java new file mode 100644 index 0000000..d812316 --- /dev/null +++ b/src/main/java/de/studiocode/invgui/gui/builder/impl/SimpleTabGUIBuilder.java @@ -0,0 +1,23 @@ +package de.studiocode.invgui.gui.builder.impl; + +import de.studiocode.invgui.gui.GUI; +import de.studiocode.invgui.gui.impl.SimpleTabGUI; + +public class SimpleTabGUIBuilder extends TabGUIBuilder { + + public SimpleTabGUIBuilder(int width, int height) { + super(width, height); + } + + @Override + public GUI build() { + if (getTabItemSlots().length != getTabs().size()) + throw new IllegalStateException("TabItemSlots length has to be the same as tabs size"); + + SimpleTabGUI tabGUI = new SimpleTabGUI(getWidth(), getHeight(), getTabs(), getListSlots(), getTabItemSlots()); + setSlotElements(tabGUI); + + return tabGUI; + } + +} diff --git a/src/main/java/de/studiocode/invgui/gui/builder/impl/TabGUIBuilder.java b/src/main/java/de/studiocode/invgui/gui/builder/impl/TabGUIBuilder.java new file mode 100644 index 0000000..cf23562 --- /dev/null +++ b/src/main/java/de/studiocode/invgui/gui/builder/impl/TabGUIBuilder.java @@ -0,0 +1,57 @@ +package de.studiocode.invgui.gui.builder.impl; + +import de.studiocode.invgui.gui.GUI; +import de.studiocode.invgui.gui.impl.TabGUI; +import de.studiocode.invgui.item.itembuilder.ItemBuilder; + +import java.util.LinkedHashMap; +import java.util.function.Function; + +public abstract class TabGUIBuilder extends BaseGUIBuilder { + + private final LinkedHashMap> tabs = new LinkedHashMap<>(); + + private int[] listSlots; + private int[] tabItemSlots; + + public TabGUIBuilder(int width, int height) { + super(width, height); + } + + public void addTab(GUI gui, Function builderFunction) { + tabs.put(gui, builderFunction); + } + + public void setListSlotIngredient(char key) { + setIngredient(key, 0); + } + + public void setTabSlotIngredient(char key) { + setIngredient(key, 1); + } + + public void setListSlots(int[] listSlots) { + this.listSlots = listSlots; + } + + public void setTabItemSlots(int[] tabItemSlots) { + this.tabItemSlots = tabItemSlots; + } + + protected int[] getListSlots() { + if (listSlots == null) { + return findIndicesOf(0).stream().mapToInt(Integer::intValue).toArray(); + } else return listSlots; + } + + protected int[] getTabItemSlots() { + if (tabItemSlots == null) { + return findIndicesOf(1).stream().mapToInt(Integer::intValue).toArray(); + } else return tabItemSlots; + } + + protected LinkedHashMap> getTabs() { + return tabs; + } + +} diff --git a/src/main/java/de/studiocode/invgui/gui/impl/SimpleTabGUI.java b/src/main/java/de/studiocode/invgui/gui/impl/SimpleTabGUI.java new file mode 100644 index 0000000..f6b86e3 --- /dev/null +++ b/src/main/java/de/studiocode/invgui/gui/impl/SimpleTabGUI.java @@ -0,0 +1,38 @@ +package de.studiocode.invgui.gui.impl; + +import de.studiocode.invgui.gui.GUI; +import de.studiocode.invgui.gui.SlotElement; +import de.studiocode.invgui.item.impl.tabgui.TabItem; +import de.studiocode.invgui.item.itembuilder.ItemBuilder; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.function.Function; + +public class SimpleTabGUI extends TabGUI { + + private final List tabs; + + public SimpleTabGUI(int width, int height, LinkedHashMap> tabs, + int[] listSlots, int[] tabItemSlots) { + + super(width, height, tabs.size(), listSlots); + this.tabs = new ArrayList<>(tabs.keySet()); + + List> builderFunctions = new ArrayList<>(tabs.values()); + for (int i = 0; i < tabs.size(); i++) { + TabItem tabItem = new TabItem(this, i, builderFunctions.get(i)); + setTabItem(i, tabItemSlots[i], tabItem); + } + + update(); + } + + @Override + public List getSlotElements(int tab) { + return Arrays.asList(tabs.get(tab).getSlotElements()); + } + +} diff --git a/src/main/java/de/studiocode/invgui/gui/impl/TabGUI.java b/src/main/java/de/studiocode/invgui/gui/impl/TabGUI.java new file mode 100644 index 0000000..5bae870 --- /dev/null +++ b/src/main/java/de/studiocode/invgui/gui/impl/TabGUI.java @@ -0,0 +1,55 @@ +package de.studiocode.invgui.gui.impl; + +import de.studiocode.invgui.gui.SlotElement; +import de.studiocode.invgui.item.Item; +import de.studiocode.invgui.item.impl.tabgui.TabItem; + +import java.util.Arrays; +import java.util.List; + +public abstract class TabGUI extends BaseGUI { + + private final int tabAmount; + private final int[] listSlots; + private final Item[] tabItems; + + private int currentTab; + + public TabGUI(int width, int height, int tabAmount, int... listSlots) { + super(width, height); + this.tabAmount = tabAmount; + this.listSlots = listSlots; + this.tabItems = new Item[tabAmount]; + } + + public void showTab(int tab) { + if (tab < 0 || tab >= tabAmount) + throw new IllegalArgumentException("Tab out of bounds"); + + currentTab = tab; + update(); + } + + public void setTabItem(int tab, int index, TabItem tabItem) { + tabItems[tab] = tabItem; + setItem(index, tabItem); + } + + protected void update() { + Arrays.stream(tabItems).forEach(Item::notifyWindows); + + List slotElements = getSlotElements(currentTab); + for (int i = 0; i < listSlots.length; i++) { + int slot = listSlots[i]; + if (slotElements.size() > i) setSlotElement(listSlots[i], slotElements.get(i)); + else remove(slot); + } + } + + public int getCurrentTab() { + return currentTab; + } + + public abstract List getSlotElements(int tab); + +} diff --git a/src/main/java/de/studiocode/invgui/item/impl/tabgui/TabItem.java b/src/main/java/de/studiocode/invgui/item/impl/tabgui/TabItem.java new file mode 100644 index 0000000..d64de6c --- /dev/null +++ b/src/main/java/de/studiocode/invgui/item/impl/tabgui/TabItem.java @@ -0,0 +1,26 @@ +package de.studiocode.invgui.item.impl.tabgui; + +import de.studiocode.invgui.gui.impl.TabGUI; +import de.studiocode.invgui.item.impl.FunctionItem; +import de.studiocode.invgui.item.itembuilder.ItemBuilder; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryClickEvent; + +import java.util.function.Function; + +public class TabItem extends FunctionItem { + + private final int tab; + + public TabItem(TabGUI tabGUI, int tab, Function builderFunction) { + super(tabGUI, builderFunction); + this.tab = tab; + } + + @Override + public void handleClick(ClickType clickType, Player player, InventoryClickEvent event) { + if (clickType == ClickType.LEFT) getT().showTab(tab); + } + +}