diff --git a/invui/src/main/java/xyz/xenondevs/invui/gui/AbstractPagedGui.java b/invui/src/main/java/xyz/xenondevs/invui/gui/AbstractPagedGui.java index e6aa991..6214bae 100644 --- a/invui/src/main/java/xyz/xenondevs/invui/gui/AbstractPagedGui.java +++ b/invui/src/main/java/xyz/xenondevs/invui/gui/AbstractPagedGui.java @@ -47,14 +47,29 @@ public abstract class AbstractPagedGui extends AbstractGui implements PagedGu @Override public void setPage(int page) { - int previous = currentPage; - currentPage = page; + int previousPage = currentPage; + int newPage = correctPage(page); + + if (previousPage == newPage) + return; + + currentPage = newPage; update(); - if (previous != currentPage) { - pageChangeHandlers.forEach(handler -> handler.accept(previous, page)); + + if (pageChangeHandlers != null) { + pageChangeHandlers.forEach(handler -> handler.accept(previousPage, newPage)); } } + private int correctPage(int page) { + // page 0 always exist, every positive page exist for infinite pages + if (page == 0 || (infinitePages && page > 0)) + return page; + + // 0 <= page < pageAmount + return Math.max(0, Math.min(page, getPageAmount() - 1)); + } + @Override public boolean hasNextPage() { return currentPage < getPageAmount() - 1 || infinitePages; @@ -66,19 +81,10 @@ public abstract class AbstractPagedGui extends AbstractGui implements PagedGu } protected void update() { - correctPage(); updateControlItems(); updatePageContent(); } - private void correctPage() { - if (currentPage == 0 || infinitePages) return; - - int pageAmount = getPageAmount(); - if (currentPage < 0 || pageAmount <= 0) currentPage = 0; - else if (currentPage >= pageAmount) currentPage = pageAmount - 1; - } - private void updatePageContent() { List slotElements = getPageElements(currentPage); diff --git a/invui/src/main/java/xyz/xenondevs/invui/gui/AbstractScrollGui.java b/invui/src/main/java/xyz/xenondevs/invui/gui/AbstractScrollGui.java index db220a7..f506b08 100644 --- a/invui/src/main/java/xyz/xenondevs/invui/gui/AbstractScrollGui.java +++ b/invui/src/main/java/xyz/xenondevs/invui/gui/AbstractScrollGui.java @@ -20,6 +20,7 @@ public abstract class AbstractScrollGui extends AbstractGui implements Scroll private final int lineLength; private final int lineAmount; private final int[] contentListSlots; + private int currentLine; private int offset; private List> scrollHandlers; @@ -50,12 +51,33 @@ public abstract class AbstractScrollGui extends AbstractGui implements Scroll @Override public int getCurrentLine() { - return offset / lineLength; + return currentLine; } @Override public void setCurrentLine(int line) { + int previousLine = currentLine; + int newLine = correctLine(line); + + if (previousLine == newLine) + return; + + this.currentLine = line; this.offset = line * lineLength; + update(); + + if (scrollHandlers != null) { + scrollHandlers.forEach(handler -> handler.accept(previousLine, newLine)); + } + } + + private int correctLine(int line) { + // line 0 always exists, every positive line exists for infinite lines + if (line == 0 || (infiniteLines && line > 0)) + return 0; + + // 0 <= line <= maxLine + return Math.max(0, Math.min(line, getMaxLine())); } @Override @@ -69,39 +91,23 @@ public abstract class AbstractScrollGui extends AbstractGui implements Scroll @Override public void scroll(int lines) { - if (lines == 0) return; + if (lines == 0) + return; if (canScroll(lines)) { setCurrentLine(getCurrentLine() + lines); - update(); } else if (lines > 1) { setCurrentLine(getMaxLine()); - update(); } else if (lines < -1) { setCurrentLine(0); - update(); } - } protected void update() { - correctLine(); updateControlItems(); updateContent(); } - private void correctLine() { - if (offset == 0 || infiniteLines) return; - - if (offset < 0) { - offset = 0; - } else { - int currentLine = getCurrentLine(); - int maxLineIndex = getMaxLine(); - if (currentLine >= maxLineIndex) setCurrentLine(maxLineIndex); - } - } - private void updateContent() { List slotElements = getElements(offset, contentListSlots.length + offset);