aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/dev/isxander/yacl/gui
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/dev/isxander/yacl/gui')
-rw-r--r--src/main/java/dev/isxander/yacl/gui/CategoryListWidget.java2
-rw-r--r--src/main/java/dev/isxander/yacl/gui/OptionListWidget.java27
-rw-r--r--src/main/java/dev/isxander/yacl/gui/TooltipButtonWidget.java28
-rw-r--r--src/main/java/dev/isxander/yacl/gui/YACLScreen.java25
-rw-r--r--src/main/java/dev/isxander/yacl/gui/controllers/ActionController.java6
-rw-r--r--src/main/java/dev/isxander/yacl/gui/controllers/ControllerWidget.java21
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() {