From bd11cc01bfa90695ad7498336a90ee4efb5ec813 Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Thu, 13 Jun 2024 13:07:48 +0800 Subject: Add dropdown scrolling and allow empty string and negative sign in coordinates --- .../skyblock/waypoint/AbstractWaypointsScreen.java | 10 +++++- .../skyblock/waypoint/DropdownWidget.java | 39 +++++++++++++++------- .../skyblock/waypoint/WaypointsListWidget.java | 15 +++++++-- 3 files changed, 48 insertions(+), 16 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/waypoint/AbstractWaypointsScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/waypoint/AbstractWaypointsScreen.java index 932bc144..da6f52c8 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/waypoint/AbstractWaypointsScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/waypoint/AbstractWaypointsScreen.java @@ -37,7 +37,7 @@ public abstract class AbstractWaypointsScreen extends Screen { protected void init() { super.init(); waypointsListWidget = addDrawableChild(new WaypointsListWidget(client, this, width, height - 96, 32, 24)); - islandWidget = addDrawableChild(new DropdownWidget<>(client, width - 160, 8, 150, Arrays.asList(Location.values()), this::islandChanged, Location.from(island))); + islandWidget = addDrawableChild(new DropdownWidget<>(client, width - 160, 8, 150, height - 8, Arrays.asList(Location.values()), this::islandChanged, Location.from(island))); } @Override @@ -50,6 +50,14 @@ public abstract class AbstractWaypointsScreen extends Screen { return mouseClicked; } + @Override + public boolean mouseScrolled(double mouseX, double mouseY, double horizontalAmount, double verticalAmount) { + if (islandWidget.isMouseOver(mouseX, mouseY) && islandWidget.mouseScrolled(mouseX, mouseY, horizontalAmount, verticalAmount)) { + return true; + } + return super.mouseScrolled(mouseX, mouseY, horizontalAmount, verticalAmount); + } + protected void islandChanged(Location location) { island = location.id(); waypointsListWidget.setIsland(island); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/waypoint/DropdownWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/waypoint/DropdownWidget.java index 157b0b15..724cb461 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/waypoint/DropdownWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/waypoint/DropdownWidget.java @@ -20,8 +20,8 @@ public class DropdownWidget extends ElementListWidget protected T selected; protected boolean open; - public DropdownWidget(MinecraftClient minecraftClient, int x, int y, int width, List entries, Consumer selectCallback, T selected) { - super(minecraftClient, width, (entries.size() + 1) * ENTRY_HEIGHT + 8, y, ENTRY_HEIGHT); + public DropdownWidget(MinecraftClient minecraftClient, int x, int y, int width, int maxHeight, List entries, Consumer selectCallback, T selected) { + super(minecraftClient, width, Math.min((entries.size() + 1) * ENTRY_HEIGHT + 8, maxHeight), y, ENTRY_HEIGHT); setX(x); this.entries = entries; this.selectCallback = selectCallback; @@ -58,29 +58,44 @@ public class DropdownWidget extends ElementListWidget context.getMatrices().push(); context.getMatrices().translate(0, 0, 100); - context.fill(getX(), getY(), getX() + width, getY() + headerHeight, 0xFF000000); - context.drawHorizontalLine(getX(), getX() + width, getY(), 0xFFFFFFFF); - context.drawHorizontalLine(getX(), getX() + width, getY() + headerHeight, 0xFFFFFFFF); - context.drawVerticalLine(getX(), getY(), getY() + headerHeight, 0xFFFFFFFF); - context.drawVerticalLine(getX() + width, getY(), getY() + headerHeight, 0xFFFFFFFF); + int y = getY() - (int) getScrollAmount(); + int height = getMaxPosition(); + + context.fill(getX(), y, getX() + width, y + headerHeight, 0xFF000000); + context.drawHorizontalLine(getX(), getX() + width, y, 0xFFFFFFFF); + context.drawHorizontalLine(getX(), getX() + width, y + headerHeight, 0xFFFFFFFF); + context.drawVerticalLine(getX(), y, y + headerHeight, 0xFFFFFFFF); + context.drawVerticalLine(getX() + width, y, y + headerHeight, 0xFFFFFFFF); if (open) { - context.fill(getX(), getY() + headerHeight + 1, getX() + width, getY() + height, 0xFF000000); - context.drawHorizontalLine(getX(), getX() + width, getY() + height, 0xFFFFFFFF); - context.drawVerticalLine(getX(), getY() + headerHeight, getY() + height, 0xFFFFFFFF); - context.drawVerticalLine(getX() + width, getY() + headerHeight, getY() + height, 0xFFFFFFFF); + context.fill(getX(), y + headerHeight + 1, getX() + width, y + height, 0xFF000000); + context.drawHorizontalLine(getX(), getX() + width, y + height, 0xFFFFFFFF); + context.drawVerticalLine(getX(), y + headerHeight, y + height, 0xFFFFFFFF); + context.drawVerticalLine(getX() + width, y + headerHeight, y + height, 0xFFFFFFFF); super.renderWidget(context, mouseX, mouseY, delta); } else { - renderHeader(context, getRowLeft(), getY() + 4 - (int) getScrollAmount()); + renderHeader(context, getRowLeft(), y + 4); } context.getMatrices().pop(); } + @Override + protected void drawMenuListBackground(DrawContext context) {} + + @Override + protected void drawHeaderAndFooterSeparators(DrawContext context) {} + + @Override + public boolean mouseScrolled(double mouseX, double mouseY, double horizontalAmount, double verticalAmount) { + return open && super.mouseScrolled(mouseX, mouseY, horizontalAmount, verticalAmount); + } + protected void select(T entry) { selected = entry; open = false; + setScrollAmount(0); if (selected != prevSelected) { selectCallback.accept(entry); prevSelected = selected; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/waypoint/WaypointsListWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/waypoint/WaypointsListWidget.java index 96e82b63..045c694d 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/waypoint/WaypointsListWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/waypoint/WaypointsListWidget.java @@ -239,7 +239,7 @@ public class WaypointsListWidget extends ElementListWidget wither) { try { int index = category.category.waypoints().indexOf(waypoint); - int newValue = Integer.parseInt(newValueString); + int newValue = parseEmptiableInt(newValueString); if (newValue == currentValue) return; waypoint = wither.apply(newValue); if (index >= 0) { @@ -275,7 +275,7 @@ public class WaypointsListWidget extends ElementListWidget> 16) / 255f, ((colorInt & 0x0000FF00) >> 8) / 255f, (colorInt & 0x000000FF) / 255f}; float alpha = ((colorInt & 0xFF000000) >>> 24) / 255f; if (Arrays.equals(waypoint.getColorComponents(), colorComponents) && waypoint.alpha == alpha) return; @@ -288,6 +288,15 @@ public class WaypointsListWidget extends ElementListWidget