diff options
Diffstat (limited to 'src/main/java/dev/isxander/yacl/gui')
11 files changed, 142 insertions, 37 deletions
diff --git a/src/main/java/dev/isxander/yacl/gui/AbstractWidget.java b/src/main/java/dev/isxander/yacl/gui/AbstractWidget.java index d4cae93..03dc9b9 100644 --- a/src/main/java/dev/isxander/yacl/gui/AbstractWidget.java +++ b/src/main/java/dev/isxander/yacl/gui/AbstractWidget.java @@ -22,7 +22,7 @@ public abstract class AbstractWidget implements Element, Drawable, Selectable { protected final TextRenderer textRenderer = client.textRenderer; protected final int inactiveColor = 0xFFA0A0A0; - protected Dimension<Integer> dim; + private Dimension<Integer> dim; public AbstractWidget(Dimension<Integer> dim) { this.dim = dim; @@ -32,6 +32,10 @@ public abstract class AbstractWidget implements Element, Drawable, Selectable { } + public boolean canReset() { + return false; + } + @Override public boolean isMouseOver(double mouseX, double mouseY) { if (dim == null) return false; diff --git a/src/main/java/dev/isxander/yacl/gui/OptionListWidget.java b/src/main/java/dev/isxander/yacl/gui/OptionListWidget.java index ddbb06e..cf50a58 100644 --- a/src/main/java/dev/isxander/yacl/gui/OptionListWidget.java +++ b/src/main/java/dev/isxander/yacl/gui/OptionListWidget.java @@ -28,6 +28,9 @@ public class OptionListWidget extends ElementListWidget<OptionListWidget.Entry> private ImmutableList<Entry> viewableChildren; + private double smoothScrollAmount = getScrollAmount(); + private boolean returnSmoothAmount = false; + public OptionListWidget(YACLScreen screen, MinecraftClient client, int width, int height) { super(client, width / 3 * 2, height, 0, height, 22); this.yaclScreen = screen; @@ -62,7 +65,7 @@ public class OptionListWidget extends ElementListWidget<OptionListWidget.Entry> List<OptionEntry> optionEntries = new ArrayList<>(); for (Option<?> option : group.options()) { - OptionEntry entry = new OptionEntry(category, group, option.controller().provideWidget(yaclScreen, Dimension.ofInt(getRowLeft(), 0, getRowWidth(), 20)), viewableSupplier); + OptionEntry entry = new OptionEntry(option, category, group, option.controller().provideWidget(yaclScreen, Dimension.ofInt(getRowLeft(), 0, getRowWidth(), 20)), viewableSupplier); addEntry(entry); optionEntries.add(entry); } @@ -148,14 +151,34 @@ public class OptionListWidget extends ElementListWidget<OptionListWidget.Entry> } } + /* END cloth config code */ + + @Override + public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { + smoothScrollAmount = MathHelper.lerp(MinecraftClient.getInstance().getLastFrameDuration() * 0.5, smoothScrollAmount, getScrollAmount()); + returnSmoothAmount = true; + super.render(matrices, mouseX, mouseY, delta); + returnSmoothAmount = false; + } + + /** + * awful code to only use smooth scroll state when rendering, + * not other code that needs target scroll amount + */ + @Override + public double getScrollAmount() { + if (returnSmoothAmount) + return smoothScrollAmount; + + return super.getScrollAmount(); + } + public void postRender(MatrixStack matrices, int mouseX, int mouseY, float delta) { for (Entry entry : children()) { entry.postRender(matrices, mouseX, mouseY, delta); } } - /* END cloth config code */ - @Override public int getRowWidth() { return Math.min(396, (int)(width / 1.3f)); @@ -178,7 +201,7 @@ public class OptionListWidget extends ElementListWidget<OptionListWidget.Entry> return true; } - this.setScrollAmount(this.getScrollAmount() - amount * (double) (getMaxScroll() / getEntryCount()) / 2.0D); + this.setScrollAmount(this.getScrollAmount() - amount * 20 /* * (double) (getMaxScroll() / getEntryCount()) / 2.0D */); return true; } @@ -221,7 +244,7 @@ public class OptionListWidget extends ElementListWidget<OptionListWidget.Entry> int i = 0; for (Entry entry : viewableChildren) { if (entry instanceof OptionEntry optionEntry) - optionEntry.widget.setDimension(optionEntry.widget.getDimension().setY(getRowTop(i))); + optionEntry.widget.setDimension(optionEntry.widget.getDimension().withY(getRowTop(i))); i++; } } @@ -250,29 +273,48 @@ public class OptionListWidget extends ElementListWidget<OptionListWidget.Entry> } public class OptionEntry extends Entry { + public final Option<?> option; public final ConfigCategory category; public final OptionGroup group; public final AbstractWidget widget; private final Supplier<Boolean> viewableSupplier; + private final TextScaledButtonWidget resetButton; + private final String categoryName; private final String groupName; - private OptionEntry(ConfigCategory category, OptionGroup group, AbstractWidget widget, Supplier<Boolean> viewableSupplier) { + private OptionEntry(Option<?> option, ConfigCategory category, OptionGroup group, AbstractWidget widget, Supplier<Boolean> viewableSupplier) { + this.option = option; this.category = category; this.group = group; this.widget = widget; this.viewableSupplier = viewableSupplier; this.categoryName = category.name().getString().toLowerCase(); this.groupName = group.name().getString().toLowerCase(); + if (this.widget.canReset()) { + this.widget.setDimension(this.widget.getDimension().expanded(-21, 0)); + this.resetButton = new TextScaledButtonWidget(widget.getDimension().xLimit() + 1, -50, 20, 20, 2f, Text.of("\u21BB"), button -> { + option.requestSetDefault(); + }); + option.addListener((opt, val) -> this.resetButton.active = !opt.isPendingValueDefault() && opt.available()); + this.resetButton.active = !option.isPendingValueDefault() && option.available(); + } else { + this.resetButton = null; + } } @Override public void render(MatrixStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) { - widget.setDimension(widget.getDimension().setY(y)); + widget.setDimension(widget.getDimension().withY(y)); widget.render(matrices, mouseX, mouseY, tickDelta); + + if (resetButton != null) { + resetButton.y = y; + resetButton.render(matrices, mouseX, mouseY, tickDelta); + } } @Override @@ -312,12 +354,18 @@ public class OptionListWidget extends ElementListWidget<OptionListWidget.Entry> @Override public List<? extends Selectable> selectableChildren() { - return ImmutableList.of(widget); + if (resetButton == null) + return ImmutableList.of(widget); + + return ImmutableList.of(widget, resetButton); } @Override public List<? extends Element> children() { - return ImmutableList.of(widget); + if (resetButton == null) + return ImmutableList.of(widget); + + return ImmutableList.of(widget, resetButton); } } diff --git a/src/main/java/dev/isxander/yacl/gui/TextScaledButtonWidget.java b/src/main/java/dev/isxander/yacl/gui/TextScaledButtonWidget.java new file mode 100644 index 0000000..d588d52 --- /dev/null +++ b/src/main/java/dev/isxander/yacl/gui/TextScaledButtonWidget.java @@ -0,0 +1,43 @@ +package dev.isxander.yacl.gui; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.TextRenderer; +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 net.minecraft.util.math.MathHelper; + +public class TextScaledButtonWidget extends ButtonWidget { + public float textScale; + + public TextScaledButtonWidget(int x, int y, int width, int height, float textScale, Text message, PressAction onPress) { + super(x, y, width, height, message, onPress); + this.textScale = textScale; + } + + public TextScaledButtonWidget(int x, int y, int width, int height, float textScale, Text message, PressAction onPress, TooltipSupplier tooltipSupplier) { + super(x, y, width, height, message, onPress, tooltipSupplier); + this.textScale = textScale; + } + + @Override + public void renderButton(MatrixStack matrices, int mouseX, int mouseY, float delta) { + // prevents super from rendering text + Text message = getMessage(); + setMessage(Text.empty()); + + super.renderButton(matrices, mouseX, mouseY, delta); + + setMessage(message); + int j = this.active ? 16777215 : 10526880; + OrderedText orderedText = getMessage().asOrderedText(); + TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; + + matrices.push(); + matrices.translate(((this.x + this.width / 2f) - textRenderer.getWidth(orderedText) * textScale / 2), (float)this.y + (this.height - 8 * textScale) / 2f / textScale, 0); + matrices.scale(textScale, textScale, 1); + textRenderer.drawWithShadow(matrices, orderedText, 0, 0, j | MathHelper.ceil(this.alpha * 255.0F) << 24); + matrices.pop(); + } +} diff --git a/src/main/java/dev/isxander/yacl/gui/YACLScreen.java b/src/main/java/dev/isxander/yacl/gui/YACLScreen.java index 70c61c1..629fd4c 100644 --- a/src/main/java/dev/isxander/yacl/gui/YACLScreen.java +++ b/src/main/java/dev/isxander/yacl/gui/YACLScreen.java @@ -3,6 +3,7 @@ package dev.isxander.yacl.gui; import com.mojang.blaze3d.systems.RenderSystem; import dev.isxander.yacl.api.*; import dev.isxander.yacl.api.utils.Dimension; +import dev.isxander.yacl.api.utils.MutableDimension; import dev.isxander.yacl.api.utils.OptionUtils; import net.minecraft.client.font.MultilineText; import net.minecraft.client.font.TextRenderer; @@ -48,7 +49,7 @@ public class YACLScreen extends Screen { columnWidth = Math.min(columnWidth, 400); int paddedWidth = columnWidth - padding * 2; - Dimension<Integer> actionDim = Dimension.ofInt(width / 3 / 2, height - padding - 20, paddedWidth, 20); + MutableDimension<Integer> actionDim = Dimension.ofInt(width / 3 / 2, height - padding - 20, paddedWidth, 20); finishedSaveButton = new TooltipButtonWidget(this, actionDim.x() - actionDim.width() / 2, actionDim.y(), actionDim.width(), actionDim.height(), Text.empty(), Text.empty(), (btn) -> { saveButtonMessage = null; 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 6207f03..b8e2cd1 100644 --- a/src/main/java/dev/isxander/yacl/gui/controllers/ActionController.java +++ b/src/main/java/dev/isxander/yacl/gui/controllers/ActionController.java @@ -108,6 +108,11 @@ public class ActionController implements Controller<BiConsumer<YACLScreen, Butto } @Override + public boolean canReset() { + return false; + } + + @Override public boolean matchesSearch(String query) { return super.matchesSearch(query) || buttonString.contains(query); } diff --git a/src/main/java/dev/isxander/yacl/gui/controllers/BooleanController.java b/src/main/java/dev/isxander/yacl/gui/controllers/BooleanController.java index cea6028..b7a77dd 100644 --- a/src/main/java/dev/isxander/yacl/gui/controllers/BooleanController.java +++ b/src/main/java/dev/isxander/yacl/gui/controllers/BooleanController.java @@ -8,7 +8,6 @@ import dev.isxander.yacl.gui.YACLScreen; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.Text; import net.minecraft.util.Formatting; -import org.jetbrains.annotations.ApiStatus; import org.lwjgl.glfw.GLFW; import java.util.function.Function; diff --git a/src/main/java/dev/isxander/yacl/gui/controllers/ColorController.java b/src/main/java/dev/isxander/yacl/gui/controllers/ColorController.java index 11e33d0..0a83fbe 100644 --- a/src/main/java/dev/isxander/yacl/gui/controllers/ColorController.java +++ b/src/main/java/dev/isxander/yacl/gui/controllers/ColorController.java @@ -3,6 +3,7 @@ package dev.isxander.yacl.gui.controllers; import com.google.common.collect.ImmutableList; import dev.isxander.yacl.api.Option; import dev.isxander.yacl.api.utils.Dimension; +import dev.isxander.yacl.api.utils.MutableDimension; import dev.isxander.yacl.gui.AbstractWidget; import dev.isxander.yacl.gui.YACLScreen; import dev.isxander.yacl.gui.controllers.string.IStringController; @@ -102,7 +103,7 @@ public class ColorController implements IStringController<Color> { public static class ColorControllerElement extends StringControllerElement { private final ColorController colorController; - protected Dimension<Integer> colorPreviewDim; + protected MutableDimension<Integer> colorPreviewDim; private final List<Character> allowedChars; 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 520efa7..c7f9e97 100644 --- a/src/main/java/dev/isxander/yacl/gui/controllers/ControllerWidget.java +++ b/src/main/java/dev/isxander/yacl/gui/controllers/ControllerWidget.java @@ -40,7 +40,7 @@ public abstract class ControllerWidget<T extends Controller<?>> extends Abstract String nameString = name.getString(); boolean firstIter = true; - while (textRenderer.getWidth(nameString) > dim.width() - getControlWidth() - getXPadding() - 7) { + while (textRenderer.getWidth(nameString) > getDimension().width() - getControlWidth() - getXPadding() - 7) { nameString = nameString.substring(0, Math.max(nameString.length() - (firstIter ? 2 : 5), 0)).trim(); nameString += "..."; @@ -49,9 +49,9 @@ public abstract class ControllerWidget<T extends Controller<?>> extends Abstract Text shortenedName = Text.literal(nameString).fillStyle(name.getStyle()); - drawButtonRect(matrices, dim.x(), dim.y(), dim.xLimit(), dim.yLimit(), isHovered(), isAvailable()); + drawButtonRect(matrices, getDimension().x(), getDimension().y(), getDimension().xLimit(), getDimension().yLimit(), isHovered(), isAvailable()); matrices.push(); - matrices.translate(dim.x() + getXPadding(), getTextY(), 0); + matrices.translate(getDimension().x() + getXPadding(), getTextY(), 0); textRenderer.drawWithShadow(matrices, shortenedName, 0, 0, getValueColor()); matrices.pop(); @@ -64,7 +64,7 @@ public abstract class ControllerWidget<T extends Controller<?>> extends Abstract @Override public void postRender(MatrixStack matrices, int mouseX, int mouseY, float delta) { if (hovered) { - YACLScreen.renderMultilineTooltip(matrices, textRenderer, wrappedTooltip, dim.centerX(), dim.y() - 5, dim.yLimit() + 5, screen.width, screen.height); + YACLScreen.renderMultilineTooltip(matrices, textRenderer, wrappedTooltip, getDimension().centerX(), getDimension().y() - 5, getDimension().yLimit() + 5, screen.width, screen.height); } } @@ -75,7 +75,7 @@ public abstract class ControllerWidget<T extends Controller<?>> extends Abstract protected void drawValueText(MatrixStack matrices, int mouseX, int mouseY, float delta) { Text valueText = getValueText(); matrices.push(); - matrices.translate(dim.xLimit() - textRenderer.getWidth(valueText) - getXPadding(), getTextY(), 0); + matrices.translate(getDimension().xLimit() - textRenderer.getWidth(valueText) - getXPadding(), getTextY(), 0); textRenderer.drawWithShadow(matrices, valueText, 0, 0, getValueColor()); matrices.pop(); } @@ -118,6 +118,11 @@ public abstract class ControllerWidget<T extends Controller<?>> extends Abstract return isAvailable() ? -1 : inactiveColor; } + @Override + public boolean canReset() { + return true; + } + protected void drawOutline(MatrixStack matrices, int x1, int y1, int x2, int y2, int width, int color) { DrawableHelper.fill(matrices, x1, y1, x2, y1 + width, color); DrawableHelper.fill(matrices, x2, y1, x2 - width, y2, color); @@ -126,7 +131,7 @@ public abstract class ControllerWidget<T extends Controller<?>> extends Abstract } protected float getTextY() { - return dim.y() + dim.height() / 2f - textRenderer.fontHeight / 2f; + return getDimension().y() + getDimension().height() / 2f - textRenderer.fontHeight / 2f; } @Override diff --git a/src/main/java/dev/isxander/yacl/gui/controllers/LabelController.java b/src/main/java/dev/isxander/yacl/gui/controllers/LabelController.java index 98f69e1..8369680 100644 --- a/src/main/java/dev/isxander/yacl/gui/controllers/LabelController.java +++ b/src/main/java/dev/isxander/yacl/gui/controllers/LabelController.java @@ -62,9 +62,9 @@ public class LabelController implements Controller<Text> { public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { updateText(); - float y = dim.y(); + float y = getDimension().y(); for (OrderedText text : wrappedText) { - textRenderer.drawWithShadow(matrices, text, dim.x(), y + getYPadding(), option().available() ? -1 : 0xFFA0A0A0); + textRenderer.drawWithShadow(matrices, text, getDimension().x(), y + getYPadding(), option().available() ? -1 : 0xFFA0A0A0); y += textRenderer.fontHeight; } } @@ -72,7 +72,7 @@ public class LabelController implements Controller<Text> { @Override public void postRender(MatrixStack matrices, int mouseX, int mouseY, float delta) { if (isMouseOver(mouseX, mouseY)) { - YACLScreen.renderMultilineTooltip(matrices, textRenderer, wrappedTooltip, dim.centerX(), dim.y() - 5, dim.yLimit() + 5, screen.width, screen.height); + YACLScreen.renderMultilineTooltip(matrices, textRenderer, wrappedTooltip, getDimension().centerX(), getDimension().y() - 5, getDimension().yLimit() + 5, screen.width, screen.height); Style style = getStyle(mouseX, mouseY); if (style != null && style.getHoverEvent() != null) { @@ -90,8 +90,8 @@ public class LabelController implements Controller<Text> { } else { Text text = hoverEvent.getValue(HoverEvent.Action.SHOW_TEXT); if (text != null) { - MultilineText multilineText = MultilineText.create(textRenderer, text, dim.width()); - YACLScreen.renderMultilineTooltip(matrices, textRenderer, multilineText, dim.centerX(), dim.y(), dim.yLimit(), screen.width, screen.height); + MultilineText multilineText = MultilineText.create(textRenderer, text, getDimension().width()); + YACLScreen.renderMultilineTooltip(matrices, textRenderer, multilineText, getDimension().centerX(), getDimension().y(), getDimension().yLimit(), screen.width, screen.height); } } } @@ -109,15 +109,15 @@ public class LabelController implements Controller<Text> { } protected Style getStyle(int mouseX, int mouseY) { - if (!dim.isPointInside(mouseX, mouseY)) + if (!getDimension().isPointInside(mouseX, mouseY)) return null; - int x = mouseX - dim.x(); - int y = mouseY - dim.y() - getYPadding(); + int x = mouseX - getDimension().x(); + int y = mouseY - getDimension().y() - getYPadding(); int line = y / textRenderer.fontHeight; - if (x < 0 || x > dim.xLimit()) return null; - if (y < 0 || y > dim.yLimit()) return null; + if (x < 0 || x > getDimension().xLimit()) return null; + if (y < 0 || y > getDimension().yLimit()) return null; if (line < 0 || line >= wrappedText.size()) return null; return textRenderer.getTextHandler().getStyleAt(wrappedText.get(line), x); @@ -128,8 +128,8 @@ public class LabelController implements Controller<Text> { } private void updateText() { - wrappedText = textRenderer.wrapLines(formatValue(), dim.width()); - dim.setHeight(wrappedText.size() * textRenderer.fontHeight + getYPadding() * 2); + wrappedText = textRenderer.wrapLines(formatValue(), getDimension().width()); + setDimension(getDimension().withHeight(wrappedText.size() * textRenderer.fontHeight + getYPadding() * 2)); } private void updateTooltip() { diff --git a/src/main/java/dev/isxander/yacl/gui/controllers/TickBoxController.java b/src/main/java/dev/isxander/yacl/gui/controllers/TickBoxController.java index ece6bce..ff693a9 100644 --- a/src/main/java/dev/isxander/yacl/gui/controllers/TickBoxController.java +++ b/src/main/java/dev/isxander/yacl/gui/controllers/TickBoxController.java @@ -8,7 +8,6 @@ import dev.isxander.yacl.gui.YACLScreen; import net.minecraft.client.gui.DrawableHelper; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.Text; -import org.jetbrains.annotations.ApiStatus; import org.lwjgl.glfw.GLFW; /** @@ -58,10 +57,10 @@ public class TickBoxController implements Controller<Boolean> { @Override protected void drawHoveredControl(MatrixStack matrices, int mouseX, int mouseY, float delta) { int outlineSize = 10; - int outlineX1 = dim.xLimit() - getXPadding() - outlineSize; - int outlineY1 = dim.centerY() - outlineSize / 2; - int outlineX2 = dim.xLimit() - getXPadding(); - int outlineY2 = dim.centerY() + outlineSize / 2; + int outlineX1 = getDimension().xLimit() - getXPadding() - outlineSize; + int outlineY1 = getDimension().centerY() - outlineSize / 2; + int outlineX2 = getDimension().xLimit() - getXPadding(); + int outlineY2 = getDimension().centerY() + outlineSize / 2; int color = getValueColor(); int shadowColor = multiplyColor(color, 0.25f); diff --git a/src/main/java/dev/isxander/yacl/gui/controllers/string/StringControllerElement.java b/src/main/java/dev/isxander/yacl/gui/controllers/string/StringControllerElement.java index 8598172..0c3b7c9 100644 --- a/src/main/java/dev/isxander/yacl/gui/controllers/string/StringControllerElement.java +++ b/src/main/java/dev/isxander/yacl/gui/controllers/string/StringControllerElement.java @@ -205,7 +205,7 @@ public class StringControllerElement extends ControllerWidget<IStringController< } public int getMaxLength() { - return dim.width() / 8 * 7; + return getDimension().width() / 8 * 7; } public int getSelectionStart() { |