diff --git a/InvUI/src/main/java/de/studiocode/invui/gui/Controllable.java b/InvUI/src/main/java/de/studiocode/invui/gui/Controllable.java index 971176e..b8f25a7 100644 --- a/InvUI/src/main/java/de/studiocode/invui/gui/Controllable.java +++ b/InvUI/src/main/java/de/studiocode/invui/gui/Controllable.java @@ -1,9 +1,7 @@ package de.studiocode.invui.gui; -import de.studiocode.invui.item.impl.controlitem.ControlItem; - public interface Controllable { - void addControlItem(int index, ControlItem controlItem); + void updateControlItems(); -} +} \ No newline at end of file diff --git a/InvUI/src/main/java/de/studiocode/invui/gui/impl/BaseGUI.java b/InvUI/src/main/java/de/studiocode/invui/gui/impl/BaseGUI.java index e2dc99f..714f0b6 100644 --- a/InvUI/src/main/java/de/studiocode/invui/gui/impl/BaseGUI.java +++ b/InvUI/src/main/java/de/studiocode/invui/gui/impl/BaseGUI.java @@ -1,6 +1,7 @@ package de.studiocode.invui.gui.impl; import de.studiocode.invui.animation.Animation; +import de.studiocode.invui.gui.Controllable; import de.studiocode.invui.gui.GUI; import de.studiocode.invui.gui.GUIParent; import de.studiocode.invui.gui.SlotElement; @@ -10,6 +11,7 @@ import de.studiocode.invui.gui.SlotElement.VISlotElement; import de.studiocode.invui.gui.structure.Structure; import de.studiocode.invui.item.Item; import de.studiocode.invui.item.ItemProvider; +import de.studiocode.invui.item.impl.controlitem.ControlItem; import de.studiocode.invui.util.ArrayUtils; import de.studiocode.invui.util.InventoryUtils; import de.studiocode.invui.util.SlotUtils; @@ -36,7 +38,7 @@ import java.util.*; import java.util.function.Predicate; import java.util.stream.Collectors; -public abstract class BaseGUI implements GUI { +public abstract class BaseGUI implements GUI, Controllable { private final int width; private final int height; @@ -451,19 +453,37 @@ public abstract class BaseGUI implements GUI { } } + @Override + public void updateControlItems() { + for (SlotElement element : slotElements) { + if (element instanceof ItemSlotElement) { + Item item = ((ItemSlotElement) element).getItem(); + if (item instanceof ControlItem) + item.notifyWindows(); + } + } + } + @Override public void setSlotElement(int index, SlotElement slotElement) { SlotElement oldElement = slotElements[index]; - GUI oldLink = oldElement instanceof LinkedSlotElement ? ((LinkedSlotElement) oldElement).getGui() : null; // set new SlotElement on index slotElements[index] = slotElement; - GUI newLink = slotElement instanceof LinkedSlotElement ? ((LinkedSlotElement) slotElement).getGui() : null; + // set the gui if it is a ControlItem + if (slotElement instanceof ItemSlotElement) { + Item item = ((ItemSlotElement) slotElement).getItem(); + if (item instanceof ControlItem) + ((ControlItem) item).setGui(this); + } // notify parents that a SlotElement has been changed parents.forEach(parent -> parent.handleSlotElementUpdate(this, index)); + GUI oldLink = oldElement instanceof LinkedSlotElement ? ((LinkedSlotElement) oldElement).getGui() : null; + GUI newLink = slotElement instanceof LinkedSlotElement ? ((LinkedSlotElement) slotElement).getGui() : null; + // if newLink is the same as oldLink, there isn't anything to be done if (newLink == oldLink) return; 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 3eeeaa1..5a04400 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 @@ -1,16 +1,11 @@ package de.studiocode.invui.gui.impl; -import de.studiocode.invui.gui.Controllable; 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.Marker; import de.studiocode.invui.gui.structure.Structure; -import de.studiocode.invui.item.Item; -import de.studiocode.invui.item.impl.controlitem.ControlItem; -import de.studiocode.invui.item.impl.controlitem.PageItem; -import java.util.ArrayList; import java.util.List; /** @@ -20,9 +15,8 @@ import java.util.List; * @see SimplePagedItemsGUI * @see SimplePagedNestedGUI */ -public abstract class PagedGUI extends BaseGUI implements Controllable { +public abstract class PagedGUI extends BaseGUI { - private final List controlItems = new ArrayList<>(); private final boolean infinitePages; private final int[] itemListSlots; protected int currentPage; @@ -38,16 +32,6 @@ public abstract class PagedGUI extends BaseGUI implements Controllable { applyStructure(structure); } - @Override - public void addControlItem(int index, ControlItem controlItem) { - if (!(controlItem instanceof PageItem)) - throw new IllegalArgumentException("controlItem is not an instance of PageItem"); - - ((PageItem) controlItem).setGui(this); - setItem(index, controlItem); - controlItems.add(controlItem); - } - public void goForward() { if (hasNextPage()) { currentPage++; @@ -84,10 +68,6 @@ public abstract class PagedGUI extends BaseGUI implements Controllable { else if (currentPage >= pageAmount) currentPage = pageAmount - 1; } - private void updateControlItems() { - controlItems.forEach(Item::notifyWindows); - } - private void updatePageContent() { List slotElements = getPageElements(currentPage); 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 603c224..05b90d3 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 @@ -1,16 +1,11 @@ package de.studiocode.invui.gui.impl; -import de.studiocode.invui.gui.Controllable; import de.studiocode.invui.gui.GUI; import de.studiocode.invui.gui.SlotElement; 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.impl.controlitem.ControlItem; -import de.studiocode.invui.item.impl.controlitem.ScrollItem; import de.studiocode.invui.util.SlotUtils; -import java.util.ArrayList; import java.util.List; /** @@ -18,9 +13,8 @@ import java.util.List; * * @see SimpleScrollGUI */ -public abstract class ScrollGUI extends BaseGUI implements Controllable { +public abstract class ScrollGUI extends BaseGUI { - private final List controlItems = new ArrayList<>(); private final boolean infiniteLines; private final int lineLength; private final int[] itemListSlots; @@ -46,16 +40,6 @@ public abstract class ScrollGUI extends BaseGUI implements Controllable { applyStructure(structure); } - @Override - public void addControlItem(int index, ControlItem controlItem) { - if (!(controlItem instanceof ScrollItem)) - throw new IllegalArgumentException("controlItem is not an instance of ScrollItem"); - - ((ScrollItem) controlItem).setGui(this); - setItem(index, controlItem); - controlItems.add(controlItem); - } - public void setCurrentLine(int line) { this.offset = line * lineLength; } @@ -115,10 +99,6 @@ public abstract class ScrollGUI extends BaseGUI implements Controllable { } } - private void updateControlItems() { - controlItems.forEach(Item::notifyWindows); - } - private void updateContent() { List slotElements = getElements(offset, itemListSlots.length + offset); 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 ce6f4d2..b39c76e 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 @@ -4,16 +4,11 @@ import de.studiocode.invui.gui.Controllable; import de.studiocode.invui.gui.SlotElement; 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.impl.controlitem.ControlItem; -import de.studiocode.invui.item.impl.controlitem.TabItem; -import java.util.ArrayList; import java.util.List; public abstract class TabGUI extends BaseGUI implements Controllable { - private final List controlItems = new ArrayList<>(); private final int tabAmount; private final int[] listSlots; @@ -38,25 +33,11 @@ public abstract class TabGUI extends BaseGUI implements Controllable { update(); } - @Override - public void addControlItem(int index, ControlItem controlItem) { - if (!(controlItem instanceof TabItem)) - throw new IllegalArgumentException("controlItem is not an instance of TabItem"); - - ((TabItem) controlItem).setGui(this); - setItem(index, controlItem); - controlItems.add(controlItem); - } - protected void update() { updateControlItems(); updateContent(); } - private void updateControlItems() { - controlItems.forEach(Item::notifyWindows); - } - private void updateContent() { List slotElements = getSlotElements(currentTab); for (int i = 0; i < listSlots.length; i++) { 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 b79f7d8..6b21b41 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,11 +1,6 @@ package de.studiocode.invui.gui.structure; -import de.studiocode.invui.gui.Controllable; import de.studiocode.invui.gui.GUI; -import de.studiocode.invui.gui.SlotElement; -import de.studiocode.invui.gui.SlotElement.ItemSlotElement; -import de.studiocode.invui.item.Item; -import de.studiocode.invui.item.impl.controlitem.ControlItem; import java.util.ArrayList; import java.util.HashMap; @@ -27,19 +22,8 @@ public class IngredientList extends ArrayList { for (int i = 0; i < size(); i++) { Ingredient ingredient = get(i); - if (ingredient != null && ingredient.isSlotElement()) { - SlotElement slotElement = ingredient.getSlotElement(); - - if (gui instanceof Controllable && slotElement instanceof ItemSlotElement) { - Item item = ((ItemSlotElement) slotElement).getItem(); - if (item instanceof ControlItem) { - ((Controllable) gui).addControlItem(i, (ControlItem) item); - continue; - } - } - + if (ingredient != null && ingredient.isSlotElement()) gui.setSlotElement(i, ingredient.getSlotElement()); - } } } diff --git a/InvUI/src/main/java/de/studiocode/invui/item/impl/controlitem/ControlItem.java b/InvUI/src/main/java/de/studiocode/invui/item/impl/controlitem/ControlItem.java index f171204..b025df9 100644 --- a/InvUI/src/main/java/de/studiocode/invui/item/impl/controlitem/ControlItem.java +++ b/InvUI/src/main/java/de/studiocode/invui/item/impl/controlitem/ControlItem.java @@ -1,9 +1,15 @@ package de.studiocode.invui.item.impl.controlitem; import de.studiocode.invui.gui.GUI; +import de.studiocode.invui.item.Item; import de.studiocode.invui.item.ItemProvider; import de.studiocode.invui.item.impl.BaseItem; +/** + * A special type of {@link Item} that stores the {@link GUI} in which it is displayed. + * + * @param The GUI Type this {@link ControlItem} will control. Not checked when adding it to a GUI. + */ public abstract class ControlItem extends BaseItem { private G gui; @@ -19,11 +25,12 @@ public abstract class ControlItem extends BaseItem { return gui; } - public void setGui(G gui) { + @SuppressWarnings("unchecked") + public void setGui(Object gui) { if (this.gui != null) throw new IllegalStateException("The GUI is already set. (One ControlItem can't control multiple GUIs)"); - this.gui = gui; + this.gui = (G) gui; } }