Reworked ControlItem and Controllable

This commit is contained in:
NichtStudioCode 2021-08-08 18:15:59 +02:00
parent 09e5492681
commit be90969f22
7 changed files with 37 additions and 87 deletions

@ -1,9 +1,7 @@
package de.studiocode.invui.gui; package de.studiocode.invui.gui;
import de.studiocode.invui.item.impl.controlitem.ControlItem;
public interface Controllable { public interface Controllable {
void addControlItem(int index, ControlItem<?> controlItem); void updateControlItems();
} }

@ -1,6 +1,7 @@
package de.studiocode.invui.gui.impl; package de.studiocode.invui.gui.impl;
import de.studiocode.invui.animation.Animation; import de.studiocode.invui.animation.Animation;
import de.studiocode.invui.gui.Controllable;
import de.studiocode.invui.gui.GUI; import de.studiocode.invui.gui.GUI;
import de.studiocode.invui.gui.GUIParent; import de.studiocode.invui.gui.GUIParent;
import de.studiocode.invui.gui.SlotElement; 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.gui.structure.Structure;
import de.studiocode.invui.item.Item; import de.studiocode.invui.item.Item;
import de.studiocode.invui.item.ItemProvider; 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.ArrayUtils;
import de.studiocode.invui.util.InventoryUtils; import de.studiocode.invui.util.InventoryUtils;
import de.studiocode.invui.util.SlotUtils; import de.studiocode.invui.util.SlotUtils;
@ -36,7 +38,7 @@ import java.util.*;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.stream.Collectors; 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 width;
private final int height; 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 @Override
public void setSlotElement(int index, SlotElement slotElement) { public void setSlotElement(int index, SlotElement slotElement) {
SlotElement oldElement = slotElements[index]; SlotElement oldElement = slotElements[index];
GUI oldLink = oldElement instanceof LinkedSlotElement ? ((LinkedSlotElement) oldElement).getGui() : null;
// set new SlotElement on index // set new SlotElement on index
slotElements[index] = slotElement; 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 // notify parents that a SlotElement has been changed
parents.forEach(parent -> parent.handleSlotElementUpdate(this, index)); 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 is the same as oldLink, there isn't anything to be done
if (newLink == oldLink) return; if (newLink == oldLink) return;

@ -1,16 +1,11 @@
package de.studiocode.invui.gui.impl; package de.studiocode.invui.gui.impl;
import de.studiocode.invui.gui.Controllable;
import de.studiocode.invui.gui.GUI; import de.studiocode.invui.gui.GUI;
import de.studiocode.invui.gui.SlotElement; import de.studiocode.invui.gui.SlotElement;
import de.studiocode.invui.gui.builder.GUIBuilder; import de.studiocode.invui.gui.builder.GUIBuilder;
import de.studiocode.invui.gui.structure.Marker; import de.studiocode.invui.gui.structure.Marker;
import de.studiocode.invui.gui.structure.Structure; 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; import java.util.List;
/** /**
@ -20,9 +15,8 @@ import java.util.List;
* @see SimplePagedItemsGUI * @see SimplePagedItemsGUI
* @see SimplePagedNestedGUI * @see SimplePagedNestedGUI
*/ */
public abstract class PagedGUI extends BaseGUI implements Controllable { public abstract class PagedGUI extends BaseGUI {
private final List<Item> controlItems = new ArrayList<>();
private final boolean infinitePages; private final boolean infinitePages;
private final int[] itemListSlots; private final int[] itemListSlots;
protected int currentPage; protected int currentPage;
@ -38,16 +32,6 @@ public abstract class PagedGUI extends BaseGUI implements Controllable {
applyStructure(structure); 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() { public void goForward() {
if (hasNextPage()) { if (hasNextPage()) {
currentPage++; currentPage++;
@ -84,10 +68,6 @@ public abstract class PagedGUI extends BaseGUI implements Controllable {
else if (currentPage >= pageAmount) currentPage = pageAmount - 1; else if (currentPage >= pageAmount) currentPage = pageAmount - 1;
} }
private void updateControlItems() {
controlItems.forEach(Item::notifyWindows);
}
private void updatePageContent() { private void updatePageContent() {
List<SlotElement> slotElements = getPageElements(currentPage); List<SlotElement> slotElements = getPageElements(currentPage);

@ -1,16 +1,11 @@
package de.studiocode.invui.gui.impl; package de.studiocode.invui.gui.impl;
import de.studiocode.invui.gui.Controllable;
import de.studiocode.invui.gui.GUI; import de.studiocode.invui.gui.GUI;
import de.studiocode.invui.gui.SlotElement; import de.studiocode.invui.gui.SlotElement;
import de.studiocode.invui.gui.structure.Marker; import de.studiocode.invui.gui.structure.Marker;
import de.studiocode.invui.gui.structure.Structure; 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 de.studiocode.invui.util.SlotUtils;
import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
@ -18,9 +13,8 @@ import java.util.List;
* *
* @see SimpleScrollGUI * @see SimpleScrollGUI
*/ */
public abstract class ScrollGUI extends BaseGUI implements Controllable { public abstract class ScrollGUI extends BaseGUI {
private final List<Item> controlItems = new ArrayList<>();
private final boolean infiniteLines; private final boolean infiniteLines;
private final int lineLength; private final int lineLength;
private final int[] itemListSlots; private final int[] itemListSlots;
@ -46,16 +40,6 @@ public abstract class ScrollGUI extends BaseGUI implements Controllable {
applyStructure(structure); 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) { public void setCurrentLine(int line) {
this.offset = line * lineLength; 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() { private void updateContent() {
List<SlotElement> slotElements = getElements(offset, itemListSlots.length + offset); List<SlotElement> slotElements = getElements(offset, itemListSlots.length + offset);

@ -4,16 +4,11 @@ import de.studiocode.invui.gui.Controllable;
import de.studiocode.invui.gui.SlotElement; import de.studiocode.invui.gui.SlotElement;
import de.studiocode.invui.gui.structure.Marker; import de.studiocode.invui.gui.structure.Marker;
import de.studiocode.invui.gui.structure.Structure; 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; import java.util.List;
public abstract class TabGUI extends BaseGUI implements Controllable { public abstract class TabGUI extends BaseGUI implements Controllable {
private final List<Item> controlItems = new ArrayList<>();
private final int tabAmount; private final int tabAmount;
private final int[] listSlots; private final int[] listSlots;
@ -38,25 +33,11 @@ public abstract class TabGUI extends BaseGUI implements Controllable {
update(); 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() { protected void update() {
updateControlItems(); updateControlItems();
updateContent(); updateContent();
} }
private void updateControlItems() {
controlItems.forEach(Item::notifyWindows);
}
private void updateContent() { private void updateContent() {
List<SlotElement> slotElements = getSlotElements(currentTab); List<SlotElement> slotElements = getSlotElements(currentTab);
for (int i = 0; i < listSlots.length; i++) { for (int i = 0; i < listSlots.length; i++) {

@ -1,11 +1,6 @@
package de.studiocode.invui.gui.structure; package de.studiocode.invui.gui.structure;
import de.studiocode.invui.gui.Controllable;
import de.studiocode.invui.gui.GUI; 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.ArrayList;
import java.util.HashMap; import java.util.HashMap;
@ -27,19 +22,8 @@ public class IngredientList extends ArrayList<Ingredient> {
for (int i = 0; i < size(); i++) { for (int i = 0; i < size(); i++) {
Ingredient ingredient = get(i); Ingredient ingredient = get(i);
if (ingredient != null && ingredient.isSlotElement()) { 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;
}
}
gui.setSlotElement(i, ingredient.getSlotElement()); gui.setSlotElement(i, ingredient.getSlotElement());
}
} }
} }

@ -1,9 +1,15 @@
package de.studiocode.invui.item.impl.controlitem; package de.studiocode.invui.item.impl.controlitem;
import de.studiocode.invui.gui.GUI; import de.studiocode.invui.gui.GUI;
import de.studiocode.invui.item.Item;
import de.studiocode.invui.item.ItemProvider; import de.studiocode.invui.item.ItemProvider;
import de.studiocode.invui.item.impl.BaseItem; import de.studiocode.invui.item.impl.BaseItem;
/**
* A special type of {@link Item} that stores the {@link GUI} in which it is displayed.
*
* @param <G> The GUI Type this {@link ControlItem} will control. Not checked when adding it to a GUI.
*/
public abstract class ControlItem<G extends GUI> extends BaseItem { public abstract class ControlItem<G extends GUI> extends BaseItem {
private G gui; private G gui;
@ -19,11 +25,12 @@ public abstract class ControlItem<G extends GUI> extends BaseItem {
return gui; return gui;
} }
public void setGui(G gui) { @SuppressWarnings("unchecked")
public void setGui(Object gui) {
if (this.gui != null) if (this.gui != null)
throw new IllegalStateException("The GUI is already set. (One ControlItem can't control multiple GUIs)"); throw new IllegalStateException("The GUI is already set. (One ControlItem can't control multiple GUIs)");
this.gui = gui; this.gui = (G) gui;
} }
} }