Improved PagedGUI

BackItem and ForwardItem are no longer inner classes
BackItem and ForwardItem use a Function<PagedGUI, ItemBuilder> to receive the current ItemBuilder
Improved PagedGUIBuilder
This commit is contained in:
NichtStudioCode 2021-01-27 16:25:09 +01:00
parent 548b22df97
commit 8e160a5e87
10 changed files with 145 additions and 97 deletions

@ -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<PagedGUI, ItemBuilder> backFunction;
private Function<PagedGUI, ItemBuilder> 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<PagedGUI, ItemBuilder> backFunction) {
setIngredient(key, 0);
this.backFunction = backFunction;
}
public void setListSlotIngredient(char c) {
setIngredient(c, 2);
protected Function<PagedGUI, ItemBuilder> getBackFunction() {
return backFunction;
}
protected ItemBuilder getBackBuilder() {
return backBuilder;
public void setForwardItem(char key, Function<PagedGUI, ItemBuilder> 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<PagedGUI, ItemBuilder> getForwardFunction() {
return forwardFunction;
}
}

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

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

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

@ -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<GUI> guis;
public SimplePagedGUIs(int width, int height, int backItemSlot, ItemBuilder backBuilder, int forwardItemSlot,
ItemBuilder forwardBuilder, List<GUI> guis, int... itemListSlots) {
public SimplePagedGUIs(int width, int height,
int backItemSlot, Function<PagedGUI, ItemBuilder> backFunction,
int forwardItemSlot, Function<PagedGUI, ItemBuilder> forwardFunction,
List<GUI> 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();
}

@ -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<Item> items;
public SimplePagedItemsGUI(int width, int height, int backItemSlot, ItemBuilder backBuilder, int forwardItemSlot,
ItemBuilder forwardBuilder, List<Item> items, int... itemListSlots) {
public SimplePagedItemsGUI(int width, int height,
int backItemSlot, Function<PagedGUI, ItemBuilder> backFunction,
int forwardItemSlot, Function<PagedGUI, ItemBuilder> forwardFunction,
List<Item> 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);
}

@ -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<ItemBuilder> builderSupplier;
public SupplierItem(Supplier<ItemBuilder> builderSupplier) {
this.builderSupplier = builderSupplier;
}
@Override
public ItemBuilder getItemBuilder() {
return builderSupplier.get();
}
@Override
public void handleClick(ClickType clickType, Player player, InventoryClickEvent event) {
// empty
}
}

@ -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<PagedGUI, ItemBuilder> builderFunction;
public BackItem(PagedGUI pagedGUI, Function<PagedGUI, ItemBuilder> 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();
}
}

@ -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<PagedGUI, ItemBuilder> builderFunction;
public ForwardItem(PagedGUI pagedGUI, Function<PagedGUI, ItemBuilder> 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();
}
}

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