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;
import de.studiocode.invui.item.impl.controlitem.ControlItem;
public interface Controllable {
void addControlItem(int index, ControlItem<?> controlItem);
void updateControlItems();
}

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

@ -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<Item> 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<SlotElement> slotElements = getPageElements(currentPage);

@ -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<Item> 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<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.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<Item> 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<SlotElement> slotElements = getSlotElements(currentTab);
for (int i = 0; i < listSlots.length; i++) {

@ -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,21 +22,10 @@ public class IngredientList extends ArrayList<Ingredient> {
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());
}
}
}
public int[] findIndicesOfMarker(Marker marker) {
List<Integer> indices = new ArrayList<>();

@ -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 <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 {
private G gui;
@ -19,11 +25,12 @@ public abstract class ControlItem<G extends GUI> 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;
}
}