aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorviciscat <51047087+viciscat@users.noreply.github.com>2024-06-22 16:07:13 +0200
committerviciscat <51047087+viciscat@users.noreply.github.com>2024-12-12 18:19:05 +0100
commit091e95564e4c48d2f6c394161d073e31643a4141 (patch)
tree472d5a5b76fc90f46d796bc2e709da19a3a5eb3a /src/main/java
parentd1c83c40ccc691b8a77738ea6b9dcb4e3fdc68c3 (diff)
downloadSkyblocker-091e95564e4c48d2f6c394161d073e31643a4141.tar.gz
Skyblocker-091e95564e4c48d2f6c394161d073e31643a4141.tar.bz2
Skyblocker-091e95564e4c48d2f6c394161d073e31643a4141.zip
some more progress, selecting widgets and changing their positioning mode
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/PreviewTab.java169
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsConfigurationScreen.java11
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/ScreenBuilder.java23
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/PositionRule.java26
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/WidgetPositioner.java26
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/HudWidget.java15
6 files changed, 235 insertions, 35 deletions
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/PreviewTab.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/PreviewTab.java
index 29aab7df..b1a4b6d5 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/PreviewTab.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/PreviewTab.java
@@ -2,45 +2,55 @@ package de.hysky.skyblocker.skyblock.tabhud.config;
import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.ScreenBuilder;
import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.ScreenMaster;
+import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.pipeline.PositionRule;
import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListMgr;
import de.hysky.skyblocker.skyblock.tabhud.widget.HudWidget;
import de.hysky.skyblocker.utils.ItemUtils;
-import de.hysky.skyblocker.utils.Utils;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.DrawContext;
+import net.minecraft.client.gui.ScreenPos;
import net.minecraft.client.gui.ScreenRect;
import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder;
import net.minecraft.client.gui.tab.Tab;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.gui.widget.ClickableWidget;
+import net.minecraft.client.gui.widget.ScrollableWidget;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.item.ItemStack;
-import net.minecraft.screen.GenericContainerScreenHandler;
import net.minecraft.text.MutableText;
import net.minecraft.text.Style;
import net.minecraft.text.Text;
import net.minecraft.util.Colors;
+import net.minecraft.util.Formatting;
+import org.jetbrains.annotations.Nullable;
-import java.awt.*;
import java.util.ArrayList;
import java.util.List;
+import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Consumer;
public class PreviewTab implements Tab {
+ private static final int RIGHT_SIDE_WIDTH = 120;
+
private final MinecraftClient client;
private final PreviewWidget previewWidget;
private final WidgetsConfigurationScreen parent;
+ private final WidgetOptionsScrollable widgetOptions;
private ScreenBuilder.Layer currentLayer = ScreenBuilder.Layer.MAIN_TAB;
private final ButtonWidget[] layerButtons;
public PreviewTab(MinecraftClient client, WidgetsConfigurationScreen parent) {
this.client = client;
- previewWidget = new PreviewWidget();
this.parent = parent;
+ previewWidget = new PreviewWidget();
+ previewWidget.setOnSelectedChanged(this::onHudWidgetSelected);
+ widgetOptions = new WidgetOptionsScrollable();
+ widgetOptions.setWidth(RIGHT_SIDE_WIDTH - 10);
+
ScreenBuilder.Layer[] values = ScreenBuilder.Layer.values();
layerButtons = new ButtonWidget[values.length];
for (int i = 0; i < values.length; i++) {
@@ -51,8 +61,9 @@ public class PreviewTab implements Tab {
layerButton.active = !layerButton.equals(button);
}
})
- .size(80, 15)
+ .size(RIGHT_SIDE_WIDTH - 20, 15)
.build();
+ if (layer == currentLayer) layerButtons[i].active = false;
}
}
@@ -67,11 +78,12 @@ public class PreviewTab implements Tab {
for (ButtonWidget layerButton : layerButtons) {
consumer.accept(layerButton);
}
+ consumer.accept(widgetOptions);
}
@Override
public void refreshGrid(ScreenRect tabArea) {
- float ratio = Math.min((tabArea.height() - 5) / (float) parent.height, (tabArea.width() - 105) / (float) parent.width);
+ float ratio = Math.min((tabArea.height() - 5) / (float) parent.height, (tabArea.width() - RIGHT_SIDE_WIDTH - 5) / (float) parent.width);
previewWidget.setPosition(5, tabArea.getTop() + 5);
previewWidget.setWidth((int) (parent.width * ratio));
previewWidget.setHeight((int) (parent.height * ratio));
@@ -82,8 +94,11 @@ public class PreviewTab implements Tab {
for (int i = 0; i < layerButtons.length; i++) {
ButtonWidget layerButton = layerButtons[i];
- layerButton.setPosition(tabArea.width() - 90, tabArea.getTop() + 10 + i * 15);
+ layerButton.setPosition(tabArea.width() - layerButton.getWidth() - 10, tabArea.getTop() + 10 + i * 15);
}
+ int optionsY = tabArea.getTop() + 10 + layerButtons.length * 15 + 5;
+ widgetOptions.setPosition(tabArea.width() - widgetOptions.getWidth() - 5, optionsY);
+ widgetOptions.setHeight(tabArea.height() - optionsY - 5);
forEachChild(clickableWidget -> clickableWidget.visible = parent.isPreviewVisible());
}
@@ -115,9 +130,46 @@ public class PreviewTab implements Tab {
PlayerListMgr.updateWidgetsFrom(lines);
}
+ void onHudWidgetSelected(@Nullable HudWidget hudWidget) {
+ widgetOptions.clearWidgets();
+ if (hudWidget == null) return;
+ ScreenBuilder screenBuilder = ScreenMaster.getScreenBuilder(parent.getCurrentLocation());
+ if (screenBuilder.getPositionRule(hudWidget.getInternalID()) == null) {
+ widgetOptions.addWidget(ButtonWidget.builder(Text.literal("Positioning: Auto"), button -> {
+ screenBuilder.setPositionRule(hudWidget.getInternalID(), PositionRule.DEFAULT);
+ updatePlayerListFromPreview();
+ screenBuilder.positionWidgets(parent.width, parent.height);
+ onHudWidgetSelected(hudWidget);
+ })
+ .width(widgetOptions.getWidth() - widgetOptions.getScrollerWidth())
+ .build());
+ } else {
+ widgetOptions.addWidget(ButtonWidget.builder(Text.literal("Positioning: Custom"), button -> {
+ screenBuilder.setPositionRule(hudWidget.getInternalID(), null);
+ updatePlayerListFromPreview();
+ screenBuilder.positionWidgets(parent.width, parent.height);
+ onHudWidgetSelected(hudWidget);
+ })
+ .width(widgetOptions.getWidth() - widgetOptions.getScrollerWidth())
+ .build());
+ }
+ }
+
+ /**
+ * The preview widget that captures clicks and displays the current state of the widgets.
+ */
public class PreviewWidget extends ClickableWidget {
private float ratio = 1f;
+ private @Nullable HudWidget hoveredWidget = null;
+ private @Nullable HudWidget selectedWidget = null;
+ private @Nullable ScreenPos selectedOriginalPos = null;
+
+ private @Nullable Consumer<@Nullable HudWidget> onSelectedChanged = null;
+
+ public void setOnSelectedChanged(@Nullable Consumer<HudWidget> onSelectedChanged) {
+ this.onSelectedChanged = onSelectedChanged;
+ }
public PreviewWidget() {
this(0, 0, 0, 0, Text.literal("Preview widget"));
@@ -129,6 +181,8 @@ public class PreviewTab implements Tab {
@Override
protected void renderWidget(DrawContext context, int mouseX, int mouseY, float delta) {
+ hoveredWidget = null;
+
ScreenBuilder screenBuilder = ScreenMaster.getScreenBuilder(parent.getCurrentLocation());
context.drawBorder(getX() - 1, getY() - 1, getWidth() + 2, getHeight() + 2, -1);
context.enableScissor(getX(), getY(), getRight(), getBottom());
@@ -145,14 +199,34 @@ public class PreviewTab implements Tab {
context.drawBorder((int) localMouseX, (int) localMouseY, 2, 2, Colors.RED);
for (HudWidget hudWidget : screenBuilder.getHudWidgets(PreviewTab.this.currentLayer)) {
- if (hudWidget.isMouseOver(localMouseX, localMouseY)) {
+ // SELECTED
+ if (hudWidget.equals(selectedWidget)) {
+ //noinspection DataFlowIssue
+ context.drawBorder(
+ hudWidget.getX() - 1,
+ hudWidget.getY() - 1,
+ hudWidget.getWidth() + 2,
+ hudWidget.getHeight() + 2,
+ Formatting.GREEN.getColorValue() | 0xFF000000);
+
+ PositionRule rule = screenBuilder.getPositionRule(selectedWidget.getInternalID());
+ if (rule != null) {
+ int thisAnchorX = (int) (hudWidget.getX() + rule.thisPoint().horizontalPoint().getPercentage() * hudWidget.getWidth());
+ int thisAnchorY = (int) (hudWidget.getY() + rule.thisPoint().verticalPoint().getPercentage() * hudWidget.getHeight());
+
+ context.drawHorizontalLine(thisAnchorX - rule.relativeX(), thisAnchorX, thisAnchorY, Colors.LIGHT_RED);
+ context.drawVerticalLine(thisAnchorX - rule.relativeX(), thisAnchorY - rule.relativeY(), thisAnchorY, Colors.LIGHT_RED);
+ }
+ }
+ // HOVERED
+ else if (hudWidget.isMouseOver(localMouseX, localMouseY) && hoveredWidget == null) {
context.drawBorder(
hudWidget.getX() - 1,
hudWidget.getY() - 1,
hudWidget.getWidth() + 2,
hudWidget.getHeight() + 2,
Colors.LIGHT_YELLOW);
- break;
+ hoveredWidget = hudWidget;
}
}
@@ -162,7 +236,84 @@ public class PreviewTab implements Tab {
@Override
protected void appendClickableNarrations(NarrationMessageBuilder builder) {
+ }
+
+ @Override
+ public void onRelease(double mouseX, double mouseY) {
+ if (!Objects.equals(hoveredWidget, selectedWidget) && onSelectedChanged != null) {
+ System.out.println("HEY!!!");
+ onSelectedChanged.accept(hoveredWidget);
+ }
+ selectedWidget = hoveredWidget;
+ selectedOriginalPos = null;
+ super.onRelease(mouseX, mouseY);
+ }
+
+ @Override
+ public boolean mouseClicked(double mouseX, double mouseY, int button) {
+ if (selectedWidget != null) {
+ selectedOriginalPos = new ScreenPos(selectedWidget.getX(), selectedWidget.getY());
+ }
+ return this.active && this.visible && isMouseOver(mouseX, mouseY);
+ }
+ }
+
+ private static class WidgetOptionsScrollable extends ScrollableWidget {
+
+ private final List<ClickableWidget> widgets = new ArrayList<>();
+ private int height = 0;
+
+ public WidgetOptionsScrollable() {
+ super(0, 0, 0, 0, Text.literal("Widget Options Scrollable"));
+ }
+
+ @Override
+ protected int getContentsHeight() {
+ return height;
+ }
+
+ @Override
+ protected double getDeltaYPerScroll() {
+ return 6;
+ }
+
+ @Override
+ protected void renderContents(DrawContext context, int mouseX, int mouseY, float delta) {
+ height = 0;
+ for (ClickableWidget widget : widgets) {
+ widget.setX(getX() + 1);
+ widget.setY(getY() + 1 + height);
+
+ height += widget.getHeight() + 1;
+ if (!isVisible(widget.getY(), widget.getBottom())) continue;
+ widget.render(context, mouseX, mouseY + (int) getScrollY(), delta);
+
+ }
+ }
+
+ @Override
+ public boolean mouseClicked(double mouseX, double mouseY, int button) {
+ for (ClickableWidget widget : widgets) {
+ if (!isVisible(widget.getY(), widget.getBottom())) continue;
+ if (widget.mouseClicked(mouseX, mouseY + getScrollY(), button)) return true;
+ }
+ return super.mouseClicked(mouseX, mouseY, button);
+ }
+
+ @Override
+ protected void drawBox(DrawContext context) {
+ }
+
+ @Override
+ protected void appendClickableNarrations(NarrationMessageBuilder builder) {
+ }
+
+ void clearWidgets() {
+ widgets.clear();
+ }
+ boolean addWidget(ClickableWidget clickableWidget) {
+ return widgets.add(clickableWidget);
}
}
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsConfigurationScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsConfigurationScreen.java
index e1684093..b9edcc5c 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsConfigurationScreen.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsConfigurationScreen.java
@@ -1,5 +1,6 @@
package de.hysky.skyblocker.skyblock.tabhud.config;
+import com.mojang.logging.LogUtils;
import de.hysky.skyblocker.utils.ItemUtils;
import de.hysky.skyblocker.utils.Location;
import de.hysky.skyblocker.utils.Utils;
@@ -14,11 +15,14 @@ import net.minecraft.screen.ScreenHandler;
import net.minecraft.screen.ScreenHandlerListener;
import net.minecraft.text.Text;
import org.jetbrains.annotations.Nullable;
+import org.slf4j.Logger;
import java.util.Map;
public class WidgetsConfigurationScreen extends Screen implements ScreenHandlerListener {
+ public static final Logger LOGGER = LogUtils.getLogger();
+
private GenericContainerScreenHandler handler;
private String titleLowercase;
@@ -103,7 +107,12 @@ public class WidgetsConfigurationScreen extends Screen implements ScreenHandlerL
.replace("widgets on", "")
.trim();
- currentLocation = nameToLocation.getOrDefault(trim, Utils.getLocation());
+ if (nameToLocation.containsKey(trim)) {
+ currentLocation = nameToLocation.get(trim);
+ } else {
+ currentLocation = Utils.getLocation();
+ LOGGER.warn("[Skyblocker] Couldn't find location for {} (trimmed: {})", this.titleLowercase, trim);
+ }
widgetsOrderingTab.updateHandler(handler);
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/ScreenBuilder.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/ScreenBuilder.java
index 8a3a0dd7..c9ea084b 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/ScreenBuilder.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/ScreenBuilder.java
@@ -152,6 +152,11 @@ public class ScreenBuilder {
return positioning.get(widgetInternalId);
}
+ public void setPositionRule(String widgetInternalId, @Nullable PositionRule newPositionRule) {
+ if (newPositionRule == null) positioning.remove(widgetInternalId);
+ else positioning.put(widgetInternalId, newPositionRule);
+ }
+
/**
* Lookup Widget instance from alias name
*/
@@ -184,11 +189,24 @@ public class ScreenBuilder {
// TODO check things and stuff
mainTabScreen.addAll(PlayerListMgr.tabWidgetsToShow);
+ // Auto positioning
for (HudWidget widget : mainTabScreen) {
- newPositioner.positionWidget(widget);
- widget.setPositioned(true);
+ System.out.println(widget.getInternalID());
+ if (getPositionRule(widget.getInternalID()) != null) {
+ widget.setPositioned(false);
+ } else {
+ newPositioner.positionWidget(widget);
+ widget.setPositioned(true);
+ }
}
newPositioner.finalizePositioning();
+ // Custom positioning
+ for (HudWidget widget : mainTabScreen) {
+ if (!widget.isPositioned()) {
+ WidgetPositioner.applyRuleToWidget(widget, screenW, screenH, this::getPositionRule);
+ }
+ }
+
for (HudWidget widget : hudScreen) {
if (!widget.isPositioned()) {
WidgetPositioner.applyRuleToWidget(widget, screenW, screenH, this::getPositionRule);
@@ -232,6 +250,7 @@ public class ScreenBuilder {
if (positionsNeedsUpdating) {
positionsNeedsUpdating = false;
positionWidgets(screenW, screenH);
+ System.out.println(location);
}
renderWidgets(context, Layer.MAIN_TAB);
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/PositionRule.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/PositionRule.java
index ff9fe22f..c84dd0a2 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/PositionRule.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/PositionRule.java
@@ -2,18 +2,38 @@ package de.hysky.skyblocker.skyblock.tabhud.screenbuilder.pipeline;
public record PositionRule(String parent, Point parentPoint, Point thisPoint, int relativeX, int relativeY) {
+ public static final PositionRule DEFAULT = new PositionRule("screen", Point.DEFAULT, Point.DEFAULT, 0, 0);
+
public enum HorizontalPoint {
LEFT,
CENTER,
- RIGHT
+ RIGHT;
+
+ public float getPercentage() {
+ return switch (this) {
+ case LEFT -> 0.f;
+ case CENTER -> 0.5f;
+ case RIGHT -> 1.f;
+ };
+ }
}
public enum VerticalPoint {
TOP,
CENTER,
- BOTTOM
+ BOTTOM;
+
+ public float getPercentage() {
+ return switch (this) {
+ case TOP -> 0.f;
+ case CENTER -> 0.5f;
+ case BOTTOM -> 1.f;
+ };
+ }
}
- public record Point(HorizontalPoint horizontalPoint, VerticalPoint verticalPoint) {}
+ public record Point(VerticalPoint verticalPoint, HorizontalPoint horizontalPoint) {
+ public static final Point DEFAULT = new Point(VerticalPoint.TOP, HorizontalPoint.LEFT);
+ }
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/WidgetPositioner.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/WidgetPositioner.java
index 2015db1d..dd3e4806 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/WidgetPositioner.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/WidgetPositioner.java
@@ -31,34 +31,20 @@ public abstract class WidgetPositioner {
int startX;
int startY;
if (rule.parent().equals("screen")) {
- startX = switch (rule.parentPoint().horizontalPoint()) {
- case LEFT -> 0;
- case CENTER -> screenWidth / 2;
- case RIGHT -> screenWidth;
- };
- startY = switch (rule.parentPoint().verticalPoint()) {
- case TOP -> 0;
- case CENTER -> screenHeight / 2;
- case BOTTOM -> screenHeight;
- };
+ startX = (int) (rule.parentPoint().horizontalPoint().getPercentage() * screenWidth);
+ startY = (int) (rule.parentPoint().verticalPoint().getPercentage() * screenHeight);
+
} else {
HudWidget parentWidget = ScreenMaster.widgetInstances.get(rule.parent());
if (parentWidget == null) return;
if (!parentWidget.isPositioned()) applyRuleToWidget(parentWidget, screenWidth, screenHeight, ruleProvider);
- startX = switch (rule.parentPoint().horizontalPoint()) {
- case LEFT -> parentWidget.getX();
- case CENTER -> parentWidget.getX() + parentWidget.getWidth() / 2;
- case RIGHT -> parentWidget.getX() + parentWidget.getWidth();
- };
- startY = switch (rule.parentPoint().verticalPoint()) {
- case TOP -> parentWidget.getY();
- case CENTER -> parentWidget.getY() + parentWidget.getHeight() / 2;
- case BOTTOM -> parentWidget.getY() + parentWidget.getHeight();
- };
+ startX = parentWidget.getX() + (int) (rule.parentPoint().horizontalPoint().getPercentage() * parentWidget.getWidth());
+ startY = parentWidget.getY() + (int) (rule.parentPoint().verticalPoint().getPercentage() * parentWidget.getHeight());
}
+ // TODO: adapt to use getPercentage()
final int relativeX = rule.relativeX();
widget.setX(switch (rule.thisPoint().horizontalPoint()) {
case LEFT -> startX + relativeX;
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/HudWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/HudWidget.java
index 0256ceca..3ce84f6f 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/HudWidget.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/HudWidget.java
@@ -1,6 +1,7 @@
package de.hysky.skyblocker.skyblock.tabhud.widget;
import java.util.ArrayList;
+import java.util.Objects;
import java.util.function.Consumer;
import com.mojang.blaze3d.systems.RenderSystem;
@@ -280,6 +281,20 @@ public abstract class HudWidget implements Element, Widget {
return mouseX >= getX() && mouseX <= getX() + getWidth() && mouseY >= getY() && mouseY <= getY() + getHeight();
}
+ /**
+ *
+ * @param object the other HudWidget
+ * @return true if they are the same instance or the internal id is the same.
+ */
+ @Override
+ public boolean equals(Object object) {
+ if (this == object) return true;
+ if (object == null || getClass() != object.getClass()) return false;
+
+ HudWidget widget = (HudWidget) object;
+ return Objects.equals(getInternalID(), widget.getInternalID());
+ }
+
@Override
public ScreenRect getNavigationFocus() {
return Element.super.getNavigationFocus();