Fix scroll- and page change handlers

This commit is contained in:
NichtStudioCode 2023-04-07 17:24:17 +02:00
parent a752768854
commit f3ab498a32
2 changed files with 44 additions and 32 deletions

@ -47,14 +47,29 @@ public abstract class AbstractPagedGui<C> extends AbstractGui implements PagedGu
@Override @Override
public void setPage(int page) { public void setPage(int page) {
int previous = currentPage; int previousPage = currentPage;
currentPage = page; int newPage = correctPage(page);
if (previousPage == newPage)
return;
currentPage = newPage;
update(); 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 @Override
public boolean hasNextPage() { public boolean hasNextPage() {
return currentPage < getPageAmount() - 1 || infinitePages; return currentPage < getPageAmount() - 1 || infinitePages;
@ -66,19 +81,10 @@ public abstract class AbstractPagedGui<C> extends AbstractGui implements PagedGu
} }
protected void update() { protected void update() {
correctPage();
updateControlItems(); updateControlItems();
updatePageContent(); 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() { private void updatePageContent() {
List<SlotElement> slotElements = getPageElements(currentPage); List<SlotElement> slotElements = getPageElements(currentPage);

@ -20,6 +20,7 @@ public abstract class AbstractScrollGui<C> extends AbstractGui implements Scroll
private final int lineLength; private final int lineLength;
private final int lineAmount; private final int lineAmount;
private final int[] contentListSlots; private final int[] contentListSlots;
private int currentLine;
private int offset; private int offset;
private List<BiConsumer<Integer, Integer>> scrollHandlers; private List<BiConsumer<Integer, Integer>> scrollHandlers;
@ -50,12 +51,33 @@ public abstract class AbstractScrollGui<C> extends AbstractGui implements Scroll
@Override @Override
public int getCurrentLine() { public int getCurrentLine() {
return offset / lineLength; return currentLine;
} }
@Override @Override
public void setCurrentLine(int line) { public void setCurrentLine(int line) {
int previousLine = currentLine;
int newLine = correctLine(line);
if (previousLine == newLine)
return;
this.currentLine = line;
this.offset = line * lineLength; 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 @Override
@ -69,39 +91,23 @@ public abstract class AbstractScrollGui<C> extends AbstractGui implements Scroll
@Override @Override
public void scroll(int lines) { public void scroll(int lines) {
if (lines == 0) return; if (lines == 0)
return;
if (canScroll(lines)) { if (canScroll(lines)) {
setCurrentLine(getCurrentLine() + lines); setCurrentLine(getCurrentLine() + lines);
update();
} else if (lines > 1) { } else if (lines > 1) {
setCurrentLine(getMaxLine()); setCurrentLine(getMaxLine());
update();
} else if (lines < -1) { } else if (lines < -1) {
setCurrentLine(0); setCurrentLine(0);
update();
} }
} }
protected void update() { protected void update() {
correctLine();
updateControlItems(); updateControlItems();
updateContent(); 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() { private void updateContent() {
List<? extends SlotElement> slotElements = getElements(offset, contentListSlots.length + offset); List<? extends SlotElement> slotElements = getElements(offset, contentListSlots.length + offset);