This commit is contained in:
NichtStudioCode 2021-01-28 18:58:44 +01:00
parent ed64b2e60a
commit ac8401ef6b
5 changed files with 199 additions and 0 deletions

@ -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;
}
}

@ -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<GUI, Function<TabGUI, ItemBuilder>> tabs = new LinkedHashMap<>();
private int[] listSlots;
private int[] tabItemSlots;
public TabGUIBuilder(int width, int height) {
super(width, height);
}
public void addTab(GUI gui, Function<TabGUI, ItemBuilder> 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<GUI, Function<TabGUI, ItemBuilder>> getTabs() {
return tabs;
}
}

@ -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<GUI> tabs;
public SimpleTabGUI(int width, int height, LinkedHashMap<GUI, Function<TabGUI, ItemBuilder>> tabs,
int[] listSlots, int[] tabItemSlots) {
super(width, height, tabs.size(), listSlots);
this.tabs = new ArrayList<>(tabs.keySet());
List<Function<TabGUI, ItemBuilder>> 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<SlotElement> getSlotElements(int tab) {
return Arrays.asList(tabs.get(tab).getSlotElements());
}
}

@ -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<SlotElement> 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<SlotElement> getSlotElements(int tab);
}

@ -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<TabGUI> {
private final int tab;
public TabItem(TabGUI tabGUI, int tab, Function<TabGUI, ItemBuilder> builderFunction) {
super(tabGUI, builderFunction);
this.tab = tab;
}
@Override
public void handleClick(ClickType clickType, Player player, InventoryClickEvent event) {
if (clickType == ClickType.LEFT) getT().showTab(tab);
}
}