From 8e160a5e87b40de2e9e57992e12953373757b125 Mon Sep 17 00:00:00 2001 From: NichtStudioCode <51272202+NichtStudioCode@users.noreply.github.com> Date: Wed, 27 Jan 2021 16:25:09 +0100 Subject: [PATCH] Improved PagedGUI BackItem and ForwardItem are no longer inner classes BackItem and ForwardItem use a Function to receive the current ItemBuilder Improved PagedGUIBuilder --- .../gui/builder/impl/PagedGUIBuilder.java | 36 +++++----- .../builder/impl/SimplePagedGUIsBuilder.java | 6 +- .../impl/SimplePagedItemsGUIBuilder.java | 6 +- .../studiocode/invgui/gui/impl/PagedGUI.java | 67 ++----------------- .../invgui/gui/impl/SimplePagedGUIs.java | 16 +++-- .../invgui/gui/impl/SimplePagedItemsGUI.java | 14 ++-- .../invgui/item/impl/SupplierItem.java | 28 ++++++++ .../invgui/item/impl/pagedgui/BackItem.java | 32 +++++++++ .../item/impl/pagedgui/ForwardItem.java | 32 +++++++++ .../invgui/item/itembuilder/ItemBuilder.java | 5 +- 10 files changed, 145 insertions(+), 97 deletions(-) create mode 100644 src/main/java/de/studiocode/invgui/item/impl/SupplierItem.java create mode 100644 src/main/java/de/studiocode/invgui/item/impl/pagedgui/BackItem.java create mode 100644 src/main/java/de/studiocode/invgui/item/impl/pagedgui/ForwardItem.java diff --git a/src/main/java/de/studiocode/invgui/gui/builder/impl/PagedGUIBuilder.java b/src/main/java/de/studiocode/invgui/gui/builder/impl/PagedGUIBuilder.java index 2fe7622..2fb6fad 100644 --- a/src/main/java/de/studiocode/invgui/gui/builder/impl/PagedGUIBuilder.java +++ b/src/main/java/de/studiocode/invgui/gui/builder/impl/PagedGUIBuilder.java @@ -1,13 +1,15 @@ package de.studiocode.invgui.gui.builder.impl; +import de.studiocode.invgui.gui.impl.PagedGUI; import de.studiocode.invgui.item.itembuilder.ItemBuilder; import java.util.List; +import java.util.function.Function; public abstract class PagedGUIBuilder extends BaseGUIBuilder { - private ItemBuilder backBuilder; - private ItemBuilder forwardBuilder; + private Function backFunction; + private Function forwardFunction; private int[] listSlots; public PagedGUIBuilder(int width, int height) { @@ -40,32 +42,26 @@ public abstract class PagedGUIBuilder extends BaseGUIBuilder { this.listSlots = listSlots; } - public void setBackItemIngredient(char c) { - setIngredient(c, 0); + public void setListSlotIngredient(char key) { + setIngredient(key, 2); } - public void setForwardItemIngredient(char c) { - setIngredient(c, 1); + public void setBackItem(char key, Function backFunction) { + setIngredient(key, 0); + this.backFunction = backFunction; } - public void setListSlotIngredient(char c) { - setIngredient(c, 2); + protected Function getBackFunction() { + return backFunction; } - protected ItemBuilder getBackBuilder() { - return backBuilder; + public void setForwardItem(char key, Function forwardFunction) { + setIngredient(key, 1); + this.forwardFunction = forwardFunction; } - public void setBackBuilder(ItemBuilder backBuilder) { - this.backBuilder = backBuilder; - } - - protected ItemBuilder getForwardBuilder() { - return forwardBuilder; - } - - public void setForwardBuilder(ItemBuilder forwardBuilder) { - this.forwardBuilder = forwardBuilder; + protected Function getForwardFunction() { + return forwardFunction; } } diff --git a/src/main/java/de/studiocode/invgui/gui/builder/impl/SimplePagedGUIsBuilder.java b/src/main/java/de/studiocode/invgui/gui/builder/impl/SimplePagedGUIsBuilder.java index 029ad61..0c7fac2 100644 --- a/src/main/java/de/studiocode/invgui/gui/builder/impl/SimplePagedGUIsBuilder.java +++ b/src/main/java/de/studiocode/invgui/gui/builder/impl/SimplePagedGUIsBuilder.java @@ -15,13 +15,13 @@ public class SimplePagedGUIsBuilder extends PagedGUIBuilder { @Override public SimplePagedGUIs build() { - if (getBackBuilder() == null || getForwardBuilder() == null) + if (getBackFunction() == null || getForwardFunction() == null) throw new IllegalStateException("BackBuilder or ForwardBuilder haven't been set yet"); if (guis == null) throw new IllegalStateException("GUIs haven't been set yet"); - SimplePagedGUIs gui = new SimplePagedGUIs(getWidth(), getHeight(), getBackItemIndex(), getBackBuilder(), - getForwardItemIndex(), getForwardBuilder(), guis, getListSlots()); + SimplePagedGUIs gui = new SimplePagedGUIs(getWidth(), getHeight(), getBackItemIndex(), getBackFunction(), + getForwardItemIndex(), getForwardFunction(), guis, getListSlots()); setSlotElements(gui); return gui; diff --git a/src/main/java/de/studiocode/invgui/gui/builder/impl/SimplePagedItemsGUIBuilder.java b/src/main/java/de/studiocode/invgui/gui/builder/impl/SimplePagedItemsGUIBuilder.java index 1aca903..7ba3e6e 100644 --- a/src/main/java/de/studiocode/invgui/gui/builder/impl/SimplePagedItemsGUIBuilder.java +++ b/src/main/java/de/studiocode/invgui/gui/builder/impl/SimplePagedItemsGUIBuilder.java @@ -15,13 +15,13 @@ public class SimplePagedItemsGUIBuilder extends PagedGUIBuilder { @Override public SimplePagedItemsGUI build() { - if (getBackBuilder() == null || getForwardBuilder() == null) + if (getBackFunction() == null || getForwardFunction() == null) throw new IllegalStateException("BackBuilder or ForwardBuilder haven't been set yet"); if (items == null) throw new IllegalStateException("Items haven't been set yet"); - SimplePagedItemsGUI gui = new SimplePagedItemsGUI(getWidth(), getHeight(), getBackItemIndex(), getBackBuilder(), - getForwardItemIndex(), getForwardBuilder(), items, getListSlots()); + SimplePagedItemsGUI gui = new SimplePagedItemsGUI(getWidth(), getHeight(), getBackItemIndex(), getBackFunction(), + getForwardItemIndex(), getForwardFunction(), items, getListSlots()); setSlotElements(gui); return gui; diff --git a/src/main/java/de/studiocode/invgui/gui/impl/PagedGUI.java b/src/main/java/de/studiocode/invgui/gui/impl/PagedGUI.java index 7accdd1..8ee8e11 100644 --- a/src/main/java/de/studiocode/invgui/gui/impl/PagedGUI.java +++ b/src/main/java/de/studiocode/invgui/gui/impl/PagedGUI.java @@ -2,12 +2,8 @@ package de.studiocode.invgui.gui.impl; import de.studiocode.invgui.gui.SlotElement; import de.studiocode.invgui.item.Item; -import de.studiocode.invgui.item.impl.BaseItem; -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 org.jetbrains.annotations.NotNull; +import de.studiocode.invgui.item.impl.pagedgui.BackItem; +import de.studiocode.invgui.item.impl.pagedgui.ForwardItem; import java.util.List; @@ -63,7 +59,7 @@ public abstract class PagedGUI extends BaseGUI { } private void updatePageContent() { - if (getCurrentPage() < getPageAmount()) { + if (getCurrentPageIndex() < getPageAmount()) { List slotElements = getPageItems(currentPage); for (int i = 0; i < itemListSlots.length; i++) { @@ -73,7 +69,7 @@ public abstract class PagedGUI extends BaseGUI { } else setCurrentPage(getPageAmount() - 1); } - public int getCurrentPage() { + public int getCurrentPageIndex() { return currentPage; } @@ -98,61 +94,8 @@ public abstract class PagedGUI extends BaseGUI { return itemListSlots; } - protected abstract int getPageAmount(); + public abstract int getPageAmount(); protected abstract List getPageItems(int page); - class ForwardItem extends BaseItem { - - private final ItemBuilder itemBuilder; - - public ForwardItem(@NotNull ItemBuilder itemBuilder) { - this.itemBuilder = itemBuilder; - } - - @Override - public ItemBuilder getItemBuilder() { - itemBuilder.clearLore(); - - if (hasNextPage()) - itemBuilder.addLoreLines("§7Go to page §e" + (getCurrentPage() + 1) - + (infinitePages ? "" : "§7/§e" + getPageAmount())); - else itemBuilder.addLoreLines("§7There are no more pages"); - - return itemBuilder; - } - - @Override - public void handleClick(ClickType clickType, Player player, InventoryClickEvent event) { - if (clickType == ClickType.LEFT) goForward(); - } - - } - - class BackItem extends BaseItem { - - private final ItemBuilder itemBuilder; - - public BackItem(@NotNull ItemBuilder itemBuilder) { - this.itemBuilder = itemBuilder; - } - - @Override - public ItemBuilder getItemBuilder() { - itemBuilder.clearLore(); - - if (hasPageBefore()) - itemBuilder.addLoreLines("§7Go to page §e" + getCurrentPage() + "§7/§e" + getPageAmount()); - else itemBuilder.addLoreLines("§7You can't go further back"); - - return itemBuilder; - } - - @Override - public void handleClick(ClickType clickType, Player player, InventoryClickEvent event) { - if (clickType == ClickType.LEFT) goBack(); - } - - } - } diff --git a/src/main/java/de/studiocode/invgui/gui/impl/SimplePagedGUIs.java b/src/main/java/de/studiocode/invgui/gui/impl/SimplePagedGUIs.java index e58a70c..767315e 100644 --- a/src/main/java/de/studiocode/invgui/gui/impl/SimplePagedGUIs.java +++ b/src/main/java/de/studiocode/invgui/gui/impl/SimplePagedGUIs.java @@ -2,26 +2,34 @@ package de.studiocode.invgui.gui.impl; import de.studiocode.invgui.gui.GUI; import de.studiocode.invgui.gui.SlotElement; +import de.studiocode.invgui.item.impl.pagedgui.BackItem; +import de.studiocode.invgui.item.impl.pagedgui.ForwardItem; import de.studiocode.invgui.item.itembuilder.ItemBuilder; import java.util.Arrays; import java.util.List; +import java.util.function.Function; public class SimplePagedGUIs extends PagedGUI { private final List guis; - public SimplePagedGUIs(int width, int height, int backItemSlot, ItemBuilder backBuilder, int forwardItemSlot, - ItemBuilder forwardBuilder, List guis, int... itemListSlots) { + public SimplePagedGUIs(int width, int height, + int backItemSlot, Function backFunction, + int forwardItemSlot, Function forwardFunction, + List guis, int... itemListSlots) { + super(width, height, false, itemListSlots); this.guis = guis; - setControlItems(backItemSlot, new BackItem(backBuilder), forwardItemSlot, new ForwardItem(forwardBuilder)); + setControlItems(backItemSlot, new BackItem(this, backFunction), + forwardItemSlot, new ForwardItem(this, forwardFunction)); + update(); } @Override - protected int getPageAmount() { + public int getPageAmount() { return guis.size(); } diff --git a/src/main/java/de/studiocode/invgui/gui/impl/SimplePagedItemsGUI.java b/src/main/java/de/studiocode/invgui/gui/impl/SimplePagedItemsGUI.java index 29ff667..497cf43 100644 --- a/src/main/java/de/studiocode/invgui/gui/impl/SimplePagedItemsGUI.java +++ b/src/main/java/de/studiocode/invgui/gui/impl/SimplePagedItemsGUI.java @@ -3,27 +3,33 @@ package de.studiocode.invgui.gui.impl; import de.studiocode.invgui.gui.SlotElement; import de.studiocode.invgui.gui.SlotElement.ItemSlotElement; import de.studiocode.invgui.item.Item; +import de.studiocode.invgui.item.impl.pagedgui.BackItem; +import de.studiocode.invgui.item.impl.pagedgui.ForwardItem; import de.studiocode.invgui.item.itembuilder.ItemBuilder; import java.util.List; +import java.util.function.Function; import java.util.stream.Collectors; public class SimplePagedItemsGUI extends PagedGUI { private final List items; - public SimplePagedItemsGUI(int width, int height, int backItemSlot, ItemBuilder backBuilder, int forwardItemSlot, - ItemBuilder forwardBuilder, List items, int... itemListSlots) { + public SimplePagedItemsGUI(int width, int height, + int backItemSlot, Function backFunction, + int forwardItemSlot, Function forwardFunction, + List items, int... itemListSlots) { super(width, height, false, itemListSlots); this.items = items; - setControlItems(backItemSlot, new BackItem(backBuilder), forwardItemSlot, new ForwardItem(forwardBuilder)); + setControlItems(backItemSlot, new BackItem(this, backFunction), + forwardItemSlot, new ForwardItem(this, forwardFunction)); update(); } @Override - protected int getPageAmount() { + public int getPageAmount() { return (int) Math.ceil((double) items.size() / (double) getItemListSlots().length); } diff --git a/src/main/java/de/studiocode/invgui/item/impl/SupplierItem.java b/src/main/java/de/studiocode/invgui/item/impl/SupplierItem.java new file mode 100644 index 0000000..bced03d --- /dev/null +++ b/src/main/java/de/studiocode/invgui/item/impl/SupplierItem.java @@ -0,0 +1,28 @@ +package de.studiocode.invgui.item.impl; + +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.Supplier; + +public class SupplierItem extends BaseItem { + + private final Supplier builderSupplier; + + public SupplierItem(Supplier builderSupplier) { + this.builderSupplier = builderSupplier; + } + + @Override + public ItemBuilder getItemBuilder() { + return builderSupplier.get(); + } + + @Override + public void handleClick(ClickType clickType, Player player, InventoryClickEvent event) { + // empty + } + +} diff --git a/src/main/java/de/studiocode/invgui/item/impl/pagedgui/BackItem.java b/src/main/java/de/studiocode/invgui/item/impl/pagedgui/BackItem.java new file mode 100644 index 0000000..b8b0fcd --- /dev/null +++ b/src/main/java/de/studiocode/invgui/item/impl/pagedgui/BackItem.java @@ -0,0 +1,32 @@ +package de.studiocode.invgui.item.impl.pagedgui; + +import de.studiocode.invgui.gui.impl.PagedGUI; +import de.studiocode.invgui.item.impl.BaseItem; +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 BackItem extends BaseItem { + + private final PagedGUI pagedGUI; + private final Function builderFunction; + + public BackItem(PagedGUI pagedGUI, Function builderFunction) { + this.pagedGUI = pagedGUI; + this.builderFunction = builderFunction; + } + + @Override + public ItemBuilder getItemBuilder() { + return builderFunction.apply(pagedGUI); + } + + @Override + public void handleClick(ClickType clickType, Player player, InventoryClickEvent event) { + if (clickType == ClickType.LEFT) pagedGUI.goBack(); + } + +} diff --git a/src/main/java/de/studiocode/invgui/item/impl/pagedgui/ForwardItem.java b/src/main/java/de/studiocode/invgui/item/impl/pagedgui/ForwardItem.java new file mode 100644 index 0000000..ca4f4ac --- /dev/null +++ b/src/main/java/de/studiocode/invgui/item/impl/pagedgui/ForwardItem.java @@ -0,0 +1,32 @@ +package de.studiocode.invgui.item.impl.pagedgui; + +import de.studiocode.invgui.gui.impl.PagedGUI; +import de.studiocode.invgui.item.impl.BaseItem; +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 ForwardItem extends BaseItem { + + private final PagedGUI pagedGUI; + private final Function builderFunction; + + public ForwardItem(PagedGUI pagedGUI, Function builderFunction) { + this.pagedGUI = pagedGUI; + this.builderFunction = builderFunction; + } + + @Override + public ItemBuilder getItemBuilder() { + return builderFunction.apply(pagedGUI); + } + + @Override + public void handleClick(ClickType clickType, Player player, InventoryClickEvent event) { + if (clickType == ClickType.LEFT) pagedGUI.goForward(); + } + +} diff --git a/src/main/java/de/studiocode/invgui/item/itembuilder/ItemBuilder.java b/src/main/java/de/studiocode/invgui/item/itembuilder/ItemBuilder.java index 7fe3d38..75840fc 100644 --- a/src/main/java/de/studiocode/invgui/item/itembuilder/ItemBuilder.java +++ b/src/main/java/de/studiocode/invgui/item/itembuilder/ItemBuilder.java @@ -175,7 +175,10 @@ public class ItemBuilder implements Cloneable { @Override public ItemBuilder clone() { try { - return (ItemBuilder) super.clone(); + return ((ItemBuilder) super.clone()) + .setLore(new ArrayList<>(lore)) + .setItemFlags(new ArrayList<>(itemFlags)) + .setEnchantments(new HashMap<>(enchantments)); } catch (CloneNotSupportedException e) { throw new Error(e); }