diff options
Diffstat (limited to 'src/main/java/dev/isxander/yacl/gui')
6 files changed, 31 insertions, 78 deletions
diff --git a/src/main/java/dev/isxander/yacl/gui/CategoryListWidget.java b/src/main/java/dev/isxander/yacl/gui/CategoryListWidget.java index fa1e0f9..b5c010c 100644 --- a/src/main/java/dev/isxander/yacl/gui/CategoryListWidget.java +++ b/src/main/java/dev/isxander/yacl/gui/CategoryListWidget.java @@ -80,7 +80,7 @@ public class CategoryListWidget extends ElementListWidget<CategoryListWidget.Cat } private void postRender(MatrixStack matrices, int mouseX, int mouseY, float tickDelta) { - categoryButton.renderHoveredTooltip(matrices, mouseX, mouseY); + categoryButton.renderHoveredTooltip(matrices); } @Override diff --git a/src/main/java/dev/isxander/yacl/gui/OptionListWidget.java b/src/main/java/dev/isxander/yacl/gui/OptionListWidget.java index a947f61..08007c3 100644 --- a/src/main/java/dev/isxander/yacl/gui/OptionListWidget.java +++ b/src/main/java/dev/isxander/yacl/gui/OptionListWidget.java @@ -5,7 +5,6 @@ import dev.isxander.yacl.api.ConfigCategory; import dev.isxander.yacl.api.Option; import dev.isxander.yacl.api.OptionGroup; import dev.isxander.yacl.api.utils.Dimension; -import dev.isxander.yacl.impl.YACLConstants; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.MultilineText; import net.minecraft.client.font.TextRenderer; @@ -14,10 +13,8 @@ import net.minecraft.client.gui.Selectable; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder; import net.minecraft.client.gui.screen.narration.NarrationPart; -import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.gui.widget.ElementListWidget; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.OrderedText; import net.minecraft.text.Text; import net.minecraft.util.math.MathHelper; import org.jetbrains.annotations.Nullable; @@ -296,13 +293,10 @@ public class OptionListWidget extends ElementListWidget<OptionListWidget.Entry> public class GroupSeparatorEntry extends Entry { private final OptionGroup group; private final MultilineText wrappedName; - private final List<OrderedText> wrappedTooltip; + private final MultilineText wrappedTooltip; private final LowProfileButtonWidget expandMinimizeButton; - private float hoveredTicks = 0; - private int prevMouseX, prevMouseY; - private final Screen screen; private final TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; @@ -310,11 +304,13 @@ public class OptionListWidget extends ElementListWidget<OptionListWidget.Entry> private List<OptionEntry> optionEntries; + private int y; + private GroupSeparatorEntry(OptionGroup group, Screen screen) { this.group = group; this.screen = screen; this.wrappedName = MultilineText.create(textRenderer, group.name(), getRowWidth() - 45); - this.wrappedTooltip = textRenderer.wrapLines(group.tooltip(), screen.width / 2); + this.wrappedTooltip = MultilineText.create(textRenderer, group.tooltip(), screen.width / 3 * 2); this.groupExpanded = !group.collapsed(); this.expandMinimizeButton = new LowProfileButtonWidget(0, 0, 20, 20, Text.empty(), btn -> { setExpanded(!isExpanded()); @@ -324,26 +320,19 @@ public class OptionListWidget extends ElementListWidget<OptionListWidget.Entry> @Override public void render(MatrixStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) { + this.y = y; + expandMinimizeButton.x = x; expandMinimizeButton.y = y + entryHeight / 2 - expandMinimizeButton.getHeight() / 2; expandMinimizeButton.render(matrices, mouseX, mouseY, tickDelta); - hovered &= !expandMinimizeButton.isMouseOver(mouseX, mouseY); - if (hovered && (!YACLConstants.HOVER_MOUSE_RESET || (mouseX == prevMouseX && mouseY == prevMouseY))) - hoveredTicks += tickDelta; - else - hoveredTicks = 0; - wrappedName.drawCenterWithShadow(matrices, x + entryWidth / 2, y + getYPadding()); - - prevMouseX = mouseX; - prevMouseY = mouseY; } @Override public void postRender(MatrixStack matrices, int mouseX, int mouseY, float delta) { - if (hoveredTicks >= YACLConstants.HOVER_TICKS) { - screen.renderOrderedTooltip(matrices, wrappedTooltip, mouseX, mouseY); + if (isHovered() && !expandMinimizeButton.isMouseOver(mouseX, mouseY)) { + YACLScreen.renderMultilineTooltip(matrices, textRenderer, wrappedTooltip, getRowLeft() + getRowWidth() / 2, y - 3, y + getItemHeight() + 3, screen.width, screen.height); } } diff --git a/src/main/java/dev/isxander/yacl/gui/TooltipButtonWidget.java b/src/main/java/dev/isxander/yacl/gui/TooltipButtonWidget.java index 0f34e61..e59c06c 100644 --- a/src/main/java/dev/isxander/yacl/gui/TooltipButtonWidget.java +++ b/src/main/java/dev/isxander/yacl/gui/TooltipButtonWidget.java @@ -1,19 +1,13 @@ package dev.isxander.yacl.gui; -import dev.isxander.yacl.impl.YACLConstants; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.MultilineText; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.OrderedText; import net.minecraft.text.Text; -import java.util.List; - public class TooltipButtonWidget extends ButtonWidget { - protected float hoveredTicks = 0; - protected int prevMouseX, prevMouseY; protected final Screen screen; protected MultilineText wrappedDescription; @@ -24,27 +18,13 @@ public class TooltipButtonWidget extends ButtonWidget { setTooltip(tooltip); } - @Override - public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { - super.render(matrices, mouseX, mouseY, delta); - - if (isHovered() && (!YACLConstants.HOVER_MOUSE_RESET || (prevMouseX == mouseX && prevMouseY == mouseY))) { - hoveredTicks += delta; - } else { - hoveredTicks = 0; - } - - prevMouseX = mouseX; - prevMouseY = mouseY; - } - - public void renderHoveredTooltip(MatrixStack matrices, int mouseX, int mouseY) { - if (hoveredTicks >= YACLConstants.HOVER_TICKS) { - YACLScreen.renderMultilineTooltip(matrices, MinecraftClient.getInstance().textRenderer, wrappedDescription, mouseX, mouseY, screen.width, screen.height); + public void renderHoveredTooltip(MatrixStack matrices) { + if (isHovered()) { + YACLScreen.renderMultilineTooltip(matrices, MinecraftClient.getInstance().textRenderer, wrappedDescription, x + width / 2, y - 4, y + height + 4, screen.width, screen.height); } } public void setTooltip(Text tooltip) { - wrappedDescription = MultilineText.create(MinecraftClient.getInstance().textRenderer, tooltip, screen.width / 2); + wrappedDescription = MultilineText.create(MinecraftClient.getInstance().textRenderer, tooltip, screen.width / 3); } } diff --git a/src/main/java/dev/isxander/yacl/gui/YACLScreen.java b/src/main/java/dev/isxander/yacl/gui/YACLScreen.java index cef8fec..6b5a2e4 100644 --- a/src/main/java/dev/isxander/yacl/gui/YACLScreen.java +++ b/src/main/java/dev/isxander/yacl/gui/YACLScreen.java @@ -4,21 +4,17 @@ import com.mojang.blaze3d.systems.RenderSystem; import dev.isxander.yacl.api.*; import dev.isxander.yacl.api.utils.Dimension; import dev.isxander.yacl.api.utils.OptionUtils; -import dev.isxander.yacl.impl.YACLConstants; import net.minecraft.client.font.MultilineText; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.Element; import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.tooltip.TooltipComponent; import net.minecraft.client.render.*; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.Text; import net.minecraft.util.Formatting; import net.minecraft.util.math.Matrix4f; -import java.util.ArrayList; import java.util.HashSet; -import java.util.List; import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; @@ -118,7 +114,7 @@ public class YACLScreen extends Screen { for (Element child : children()) { if (child instanceof TooltipButtonWidget tooltipButtonWidget) { - tooltipButtonWidget.renderHoveredTooltip(matrices, mouseX, mouseY); + tooltipButtonWidget.renderHoveredTooltip(matrices); } } } @@ -220,21 +216,24 @@ public class YACLScreen extends Screen { client.setScreen(parent); } - public static void renderMultilineTooltip(MatrixStack matrices, TextRenderer textRenderer, MultilineText text, int x, int y, int screenWidth, int screenHeight) { + public static void renderMultilineTooltip(MatrixStack matrices, TextRenderer textRenderer, MultilineText text, int centerX, int yAbove, int yBelow, int screenWidth, int screenHeight) { if (text.count() > 0) { int maxWidth = text.getMaxWidth(); int lineHeight = textRenderer.fontHeight + 1; int height = text.count() * lineHeight - 1; + int belowY = yBelow + 12; + int aboveY = yAbove - height + 12; + int maxBelow = screenHeight - (belowY + height); + int minAbove = aboveY - height; + int y = belowY; + if (maxBelow < -8) + y = maxBelow > minAbove ? belowY : aboveY; + + int x = centerX - text.getMaxWidth() / 2 - 12; + int drawX = x + 12; int drawY = y - 12; - if (drawX + maxWidth > screenWidth) { - drawX -= 28 + maxWidth; - } - - if (drawY + height + 6 > screenHeight) { - drawY = screenHeight - height - 6; - } matrices.push(); Tessellator tessellator = Tessellator.getInstance(); diff --git a/src/main/java/dev/isxander/yacl/gui/controllers/ActionController.java b/src/main/java/dev/isxander/yacl/gui/controllers/ActionController.java index 3550072..673b614 100644 --- a/src/main/java/dev/isxander/yacl/gui/controllers/ActionController.java +++ b/src/main/java/dev/isxander/yacl/gui/controllers/ActionController.java @@ -9,13 +9,13 @@ import net.minecraft.text.Text; import org.jetbrains.annotations.ApiStatus; import org.lwjgl.glfw.GLFW; -import java.util.function.Consumer; +import java.util.function.BiConsumer; /** * Simple controller that simply runs the button action on press * and renders a {@link} Text on the right. */ -public class ActionController implements Controller<Consumer<YACLScreen>> { +public class ActionController implements Controller<BiConsumer<YACLScreen, ButtonOption>> { public static final Text DEFAULT_TEXT = Text.translatable("yacl.control.action.execute"); private final ButtonOption option; @@ -75,7 +75,7 @@ public class ActionController implements Controller<Consumer<YACLScreen>> { public void executeAction() { playDownSound(); - control.option().action().accept(screen); + control.option().action().accept(screen, control.option()); } @Override diff --git a/src/main/java/dev/isxander/yacl/gui/controllers/ControllerWidget.java b/src/main/java/dev/isxander/yacl/gui/controllers/ControllerWidget.java index cd70872..dded9c1 100644 --- a/src/main/java/dev/isxander/yacl/gui/controllers/ControllerWidget.java +++ b/src/main/java/dev/isxander/yacl/gui/controllers/ControllerWidget.java @@ -4,16 +4,12 @@ import dev.isxander.yacl.api.Controller; import dev.isxander.yacl.api.utils.Dimension; import dev.isxander.yacl.gui.AbstractWidget; import dev.isxander.yacl.gui.YACLScreen; -import dev.isxander.yacl.impl.YACLConstants; import net.minecraft.client.font.MultilineText; import net.minecraft.client.gui.DrawableHelper; import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.OrderedText; import net.minecraft.text.Text; -import java.util.List; - public abstract class ControllerWidget<T extends Controller<?>> extends AbstractWidget { protected final T control; protected MultilineText wrappedTooltip; @@ -21,9 +17,6 @@ public abstract class ControllerWidget<T extends Controller<?>> extends Abstract protected boolean focused = false; protected boolean hovered = false; - protected float hoveredTicks = 0; - - private int prevMouseX, prevMouseY; public ControllerWidget(T control, YACLScreen screen, Dimension<Integer> dim) { super(dim); @@ -36,11 +29,6 @@ public abstract class ControllerWidget<T extends Controller<?>> extends Abstract @Override public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { hovered = isMouseOver(mouseX, mouseY); - if (hovered && (!YACLConstants.HOVER_MOUSE_RESET || (mouseX == prevMouseX && mouseY == prevMouseY))) { - hoveredTicks += delta; - } else { - hoveredTicks = 0; - } Text name = control.option().name(); String nameString = name.getString(); @@ -65,15 +53,12 @@ public abstract class ControllerWidget<T extends Controller<?>> extends Abstract if (isHovered()) { drawHoveredControl(matrices, mouseX, mouseY, delta); } - - prevMouseX = mouseX; - prevMouseY = mouseY; } @Override public void postRender(MatrixStack matrices, int mouseX, int mouseY, float delta) { - if (hoveredTicks >= YACLConstants.HOVER_TICKS) { - YACLScreen.renderMultilineTooltip(matrices, textRenderer, wrappedTooltip, mouseX, mouseY, screen.width, screen.height); + if (hovered) { + YACLScreen.renderMultilineTooltip(matrices, textRenderer, wrappedTooltip, dim.centerX(), dim.y() - 5, dim.yLimit() + 5, screen.width, screen.height); } } @@ -96,7 +81,7 @@ public abstract class ControllerWidget<T extends Controller<?>> extends Abstract } private void updateTooltip() { - this.wrappedTooltip = MultilineText.create(textRenderer, control.option().tooltip(), screen.width / 2); + this.wrappedTooltip = MultilineText.create(textRenderer, control.option().tooltip(), screen.width / 3 * 2); } protected int getControlWidth() { |