aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/de/hysky/skyblocker
diff options
context:
space:
mode:
authorKevinthegreat <92656833+kevinthegreat1@users.noreply.github.com>2024-06-13 13:07:48 +0800
committerKevinthegreat <92656833+kevinthegreat1@users.noreply.github.com>2024-06-13 13:07:48 +0800
commitbd11cc01bfa90695ad7498336a90ee4efb5ec813 (patch)
tree65a20bc14fc2860bb9e926ecf8abe9682b2cb8d6 /src/main/java/de/hysky/skyblocker
parentee6664dd964f395cb5737b230123d65cb7c13833 (diff)
downloadSkyblocker-bd11cc01bfa90695ad7498336a90ee4efb5ec813.tar.gz
Skyblocker-bd11cc01bfa90695ad7498336a90ee4efb5ec813.tar.bz2
Skyblocker-bd11cc01bfa90695ad7498336a90ee4efb5ec813.zip
Add dropdown scrolling and allow empty string and negative sign in coordinates
Diffstat (limited to 'src/main/java/de/hysky/skyblocker')
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/waypoint/AbstractWaypointsScreen.java10
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/waypoint/DropdownWidget.java39
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/waypoint/WaypointsListWidget.java15
3 files changed, 48 insertions, 16 deletions
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<T extends Screen> 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<T extends Screen> 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<T> extends ElementListWidget<DropdownWidget.Entry<T>
protected T selected;
protected boolean open;
- public DropdownWidget(MinecraftClient minecraftClient, int x, int y, int width, List<T> entries, Consumer<T> 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<T> entries, Consumer<T> 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<T> extends ElementListWidget<DropdownWidget.Entry<T>
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<WaypointsListWidget.A
private boolean checkInt(String string) {
try {
- Integer.parseInt(string);
+ parseEmptiableInt(string);
return true;
} catch (NumberFormatException e) {
return false;
@@ -261,7 +261,7 @@ public class WaypointsListWidget extends ElementListWidget<WaypointsListWidget.A
private void updateInt(String newValueString, int currentValue, Int2ObjectFunction<NamedWaypoint> 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<WaypointsListWidget.A
private void updateColor(String colorString) {
try {
int index = category.category.waypoints().indexOf(waypoint);
- int colorInt = Integer.parseInt(colorString, 16);
+ int colorInt = parseEmptiableInt(colorString, 16);
float[] colorComponents = {((colorInt & 0x00FF0000) >> 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<WaypointsListWidget.A
}
}
+ private int parseEmptiableInt(String value) throws NumberFormatException {
+ return value.isEmpty() || value.equals("-") ? 0 : Integer.parseInt(value);
+ }
+
+ @SuppressWarnings("SameParameterValue")
+ private int parseEmptiableInt(String value, int radix) throws NumberFormatException {
+ return value.isEmpty() || value.equals("-") ? 0 : Integer.parseInt(value, radix);
+ }
+
@Override
public void render(DrawContext context, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) {
context.drawTextWithShadow(client.textRenderer, "X:", width / 2 - 56, y + 6, 0xFFFFFF);