diff options
| author | viciscat <51047087+viciscat@users.noreply.github.com> | 2024-06-22 16:07:13 +0200 |
|---|---|---|
| committer | viciscat <51047087+viciscat@users.noreply.github.com> | 2024-12-12 18:19:05 +0100 |
| commit | 091e95564e4c48d2f6c394161d073e31643a4141 (patch) | |
| tree | 472d5a5b76fc90f46d796bc2e709da19a3a5eb3a /src/main/java | |
| parent | d1c83c40ccc691b8a77738ea6b9dcb4e3fdc68c3 (diff) | |
| download | Skyblocker-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')
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(); |
