From 22e74bc0b1f2831a7971afb6a53f2a5ec14683d5 Mon Sep 17 00:00:00 2001 From: NichtStudioCode <51272202+NichtStudioCode@users.noreply.github.com> Date: Sun, 27 Feb 2022 21:18:50 +0100 Subject: [PATCH] Page & Tab change handler --- .../studiocode/invui/gui/impl/PagedGUI.java | 24 ++++++++----- .../studiocode/invui/gui/impl/ScrollGUI.java | 4 +-- .../invui/gui/impl/SimplePagedItemsGUI.java | 31 ++++++++++++++-- .../invui/gui/impl/SimplePagedNestedGUI.java | 35 +++++++++++++++--- .../invui/gui/impl/SimpleTabGUI.java | 36 ++++++++++++++++--- .../de/studiocode/invui/gui/impl/TabGUI.java | 9 +++-- 6 files changed, 113 insertions(+), 26 deletions(-) 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 e45176f..8c94aff 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 @@ -19,7 +19,7 @@ public abstract class PagedGUI extends BaseGUI { private final boolean infinitePages; private final int[] itemListSlots; - protected int currentPage; + private int currentPage; public PagedGUI(int width, int height, boolean infinitePages, int... itemListSlots) { super(width, height); @@ -33,17 +33,21 @@ public abstract class PagedGUI extends BaseGUI { } public void goForward() { - if (hasNextPage()) { - currentPage++; - update(); - } + if (hasNextPage()) + setPage(currentPage + 1); } public void goBack() { - if (hasPageBefore()) { - currentPage--; - update(); - } + if (hasPageBefore()) + setPage(currentPage - 1); + } + + public void setPage(int page) { + int previous = currentPage; + currentPage = page; + update(); + if (previous != currentPage) + handlePageChange(previous, currentPage); } public boolean hasNextPage() { @@ -93,4 +97,6 @@ public abstract class PagedGUI extends BaseGUI { protected abstract List getPageElements(int page); + protected abstract void handlePageChange(int previous, int now); + } 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 46b3c7b..95d3b8e 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 @@ -106,8 +106,8 @@ public abstract class ScrollGUI extends BaseGUI { } } - abstract protected int getMaxLineIndex(); + protected abstract int getMaxLineIndex(); - abstract protected List getElements(int from, int to); + protected abstract List getElements(int from, int to); } diff --git a/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimplePagedItemsGUI.java b/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimplePagedItemsGUI.java index bcc02d8..c16d44c 100644 --- a/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimplePagedItemsGUI.java +++ b/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimplePagedItemsGUI.java @@ -10,6 +10,7 @@ import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; +import java.util.function.BiConsumer; import java.util.stream.Collectors; /** @@ -21,6 +22,7 @@ import java.util.stream.Collectors; public class SimplePagedItemsGUI extends PagedGUI { private List items; + private List> pageChangeHandlers; public SimplePagedItemsGUI(int width, int height, @Nullable List items, int... itemListSlots) { super(width, height, false, itemListSlots); @@ -37,6 +39,29 @@ public class SimplePagedItemsGUI extends PagedGUI { return (int) Math.ceil((double) items.size() / (double) getItemListSlots().length); } + public void setItems(@Nullable List items) { + this.items = items != null ? items : new ArrayList<>(); + update(); + } + + public void addPageChangeHandler(@NotNull BiConsumer pageChangeHandler) { + if (pageChangeHandlers == null) pageChangeHandlers = new ArrayList<>(); + pageChangeHandlers.add(pageChangeHandler); + } + + public void removePageChangeHandler(@NotNull BiConsumer pageChangeHandler) { + if (pageChangeHandlers != null) pageChangeHandlers.remove(pageChangeHandler); + } + + @Nullable + public List> getPageChangeHandlers() { + return pageChangeHandlers; + } + + public void setPageChangeHandlers(@Nullable List> pageChangeHandlers) { + this.pageChangeHandlers = pageChangeHandlers; + } + @Override protected List getPageElements(int page) { int length = getItemListSlots().length; @@ -46,9 +71,9 @@ public class SimplePagedItemsGUI extends PagedGUI { return items.subList(from, to).stream().map(ItemSlotElement::new).collect(Collectors.toList()); } - public void setItems(@Nullable List items) { - this.items = items != null ? items : new ArrayList<>(); - update(); + @Override + protected void handlePageChange(int previous, int now) { + if (pageChangeHandlers != null) pageChangeHandlers.forEach(handler -> handler.accept(previous, now)); } } diff --git a/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimplePagedNestedGUI.java b/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimplePagedNestedGUI.java index 5f80b87..c90700e 100644 --- a/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimplePagedNestedGUI.java +++ b/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimplePagedNestedGUI.java @@ -9,6 +9,7 @@ import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; +import java.util.function.BiConsumer; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -21,6 +22,7 @@ import java.util.stream.IntStream; public class SimplePagedNestedGUI extends PagedGUI { private List guis; + private List> pageChangeHandlers; public SimplePagedNestedGUI(int width, int height, @Nullable List guis, int... itemListSlots) { super(width, height, false, itemListSlots); @@ -37,6 +39,34 @@ public class SimplePagedNestedGUI extends PagedGUI { return guis.size(); } + public void setGuis(@Nullable List guis) { + this.guis = guis == null ? new ArrayList<>() : guis; + update(); + } + + public void addPageChangeHandler(@NotNull BiConsumer pageChangeHandler) { + if (pageChangeHandlers == null) pageChangeHandlers = new ArrayList<>(); + pageChangeHandlers.add(pageChangeHandler); + } + + public void removePageChangeHandler(@NotNull BiConsumer pageChangeHandler) { + if (pageChangeHandlers != null) pageChangeHandlers.remove(pageChangeHandler); + } + + @Nullable + public List> getPageChangeHandlers() { + return pageChangeHandlers; + } + + public void setPageChangeHandlers(@Nullable List> pageChangeHandlers) { + this.pageChangeHandlers = pageChangeHandlers; + } + + @Override + protected void handlePageChange(int previous, int now) { + if (pageChangeHandlers != null) pageChangeHandlers.forEach(handler -> handler.accept(previous, now)); + } + @Override protected List getPageElements(int page) { if (guis.size() <= page) return new ArrayList<>(); @@ -49,9 +79,4 @@ public class SimplePagedNestedGUI extends PagedGUI { .collect(Collectors.toList()); } - public void setGuis(@Nullable List guis) { - this.guis = guis == null ? new ArrayList<>() : guis; - update(); - } - } diff --git a/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimpleTabGUI.java b/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimpleTabGUI.java index 1602966..b20a47d 100644 --- a/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimpleTabGUI.java +++ b/InvUI/src/main/java/de/studiocode/invui/gui/impl/SimpleTabGUI.java @@ -6,10 +6,12 @@ import de.studiocode.invui.gui.SlotElement.LinkedSlotElement; import de.studiocode.invui.gui.builder.GUIBuilder; import de.studiocode.invui.gui.structure.Structure; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.function.BiConsumer; import java.util.stream.Collectors; /** @@ -21,6 +23,7 @@ public class SimpleTabGUI extends TabGUI { private final List tabs; private final List> linkingElements; + private List> tabChangeHandlers; public SimpleTabGUI(int width, int height, @NotNull List tabs, int[] listSlots) { super(width, height, tabs.size(), listSlots); @@ -54,14 +57,37 @@ public class SimpleTabGUI extends TabGUI { return Collections.unmodifiableList(tabs); } - @Override - public List getSlotElements(int tab) { - return linkingElements.get(tab); - } - @Override public boolean isTabAvailable(int tab) { return tabs.get(tab) != null; } + public void addTabChangeHandler(@NotNull BiConsumer tabChangeHandler) { + if (tabChangeHandlers == null) tabChangeHandlers = new ArrayList<>(); + tabChangeHandlers.add(tabChangeHandler); + } + + public void removeTabChangeHandler(@NotNull BiConsumer tabChangeHandler) { + if (tabChangeHandlers != null) tabChangeHandlers.remove(tabChangeHandler); + } + + @Nullable + public List> getTabChangeHandlers() { + return tabChangeHandlers; + } + + public void setTabChangeHandlers(@Nullable List> tabChangeHandlers) { + this.tabChangeHandlers = tabChangeHandlers; + } + + @Override + protected void handleTabChange(int previous, int now) { + if (tabChangeHandlers != null) tabChangeHandlers.forEach(handler -> handler.accept(previous, now)); + } + + @Override + protected List getSlotElements(int tab) { + return linkingElements.get(tab); + } + } 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 808c124..1d82ef1 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 @@ -31,8 +31,11 @@ public abstract class TabGUI extends BaseGUI implements Controllable { if (!isTabAvailable(tab)) return; + int previous = currentTab; currentTab = tab; update(); + + handleTabChange(previous, currentTab); } protected void update() { @@ -63,8 +66,10 @@ public abstract class TabGUI extends BaseGUI implements Controllable { return currentTab; } - public abstract List getSlotElements(int tab); - public abstract boolean isTabAvailable(int tab); + protected abstract List getSlotElements(int tab); + + protected abstract void handleTabChange(int previous, int now); + }