diff options
author | isXander <xandersmith2008@gmail.com> | 2023-05-22 19:33:00 +0100 |
---|---|---|
committer | isXander <xandersmith2008@gmail.com> | 2023-05-22 19:33:00 +0100 |
commit | ead0b794ac57e9ab2558338f7f3da7545d2e12ff (patch) | |
tree | d1c92f8d3283a8989923e038a377af4a00c24124 /common/src/main/java/dev/isxander/yacl/gui/OptionDescriptionWidget.java | |
parent | 590e69f4bf445a39737b0b1552cf116ff780d75e (diff) | |
download | YetAnotherConfigLib-ead0b794ac57e9ab2558338f7f3da7545d2e12ff.tar.gz YetAnotherConfigLib-ead0b794ac57e9ab2558338f7f3da7545d2e12ff.tar.bz2 YetAnotherConfigLib-ead0b794ac57e9ab2558338f7f3da7545d2e12ff.zip |
scrollable navbar, group descriptions, auto-scroll descriptions
Diffstat (limited to 'common/src/main/java/dev/isxander/yacl/gui/OptionDescriptionWidget.java')
-rw-r--r-- | common/src/main/java/dev/isxander/yacl/gui/OptionDescriptionWidget.java | 70 |
1 files changed, 66 insertions, 4 deletions
diff --git a/common/src/main/java/dev/isxander/yacl/gui/OptionDescriptionWidget.java b/common/src/main/java/dev/isxander/yacl/gui/OptionDescriptionWidget.java index 882d75b..5c346d0 100644 --- a/common/src/main/java/dev/isxander/yacl/gui/OptionDescriptionWidget.java +++ b/common/src/main/java/dev/isxander/yacl/gui/OptionDescriptionWidget.java @@ -1,5 +1,7 @@ package dev.isxander.yacl.gui; +import com.mojang.blaze3d.Blaze3D; +import com.mojang.blaze3d.platform.InputConstants; import dev.isxander.yacl.api.OptionDescription; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; @@ -17,6 +19,9 @@ import java.util.List; import java.util.function.Supplier; public class OptionDescriptionWidget extends AbstractWidget { + private static final int AUTO_SCROLL_TIMER = 3000; + private static final float AUTO_SCROLL_SPEED = 1; + private @Nullable OptionDescription description; private List<FormattedCharSequence> wrappedText; @@ -25,10 +30,13 @@ public class OptionDescriptionWidget extends AbstractWidget { private Supplier<ScreenRectangle> dimensions; - private int scrollAmount; + private float targetScrollAmount, currentScrollAmount; private int maxScrollAmount; private int descriptionY; + private int lastInteractionTime; + private boolean scrollingBackward; + public OptionDescriptionWidget(Supplier<ScreenRectangle> dimensions, @Nullable OptionDescription description) { super(0, 0, 0, 0, description == null ? Component.empty() : description.descriptiveName()); this.dimensions = dimensions; @@ -39,6 +47,8 @@ public class OptionDescriptionWidget extends AbstractWidget { public void renderWidget(GuiGraphics graphics, int mouseX, int mouseY, float delta) { if (description == null) return; + currentScrollAmount = Mth.lerp(delta * 0.5f, currentScrollAmount, targetScrollAmount); + ScreenRectangle dimensions = this.dimensions.get(); this.setX(dimensions.left()); this.setY(dimensions.top()); @@ -58,7 +68,7 @@ public class OptionDescriptionWidget extends AbstractWidget { graphics.enableScissor(getX(), y, getX() + getWidth(), getY() + getHeight()); - y -= scrollAmount; + y -= (int)currentScrollAmount; if (description.image().isDone()) { var image = description.image().join(); @@ -79,12 +89,19 @@ public class OptionDescriptionWidget extends AbstractWidget { graphics.disableScissor(); - maxScrollAmount = Math.max(0, y + scrollAmount - getY() - getHeight()); + maxScrollAmount = Math.max(0, y + (int)currentScrollAmount - getY() - getHeight()); + if (isHoveredOrFocused()) { + lastInteractionTime = currentTimeMS(); + } Style hoveredStyle = getDescStyle(mouseX, mouseY); if (hoveredStyle != null && hoveredStyle.getHoverEvent() != null) { graphics.renderComponentHoverEffect(font, hoveredStyle, mouseX, mouseY); } + + if (isFocused()) { + graphics.renderOutline(getX(), getY(), getWidth(), getHeight(), -1); + } } @Override @@ -104,12 +121,50 @@ public class OptionDescriptionWidget extends AbstractWidget { @Override public boolean mouseScrolled(double mouseX, double mouseY, double amount) { if (isMouseOver(mouseX, mouseY)) { - scrollAmount = Mth.clamp(scrollAmount - (int) amount * 10, 0, maxScrollAmount); + targetScrollAmount = Mth.clamp(targetScrollAmount - (int) amount * 10, 0, maxScrollAmount); + lastInteractionTime = currentTimeMS(); + return true; + } + return false; + } + + @Override + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + if (isFocused()) { + switch (keyCode) { + case InputConstants.KEY_UP -> + targetScrollAmount = Mth.clamp(targetScrollAmount - 10, 0, maxScrollAmount); + case InputConstants.KEY_DOWN -> + targetScrollAmount = Mth.clamp(targetScrollAmount + 10, 0, maxScrollAmount); + default -> { + return false; + } + } return true; } return false; } + public void tick() { + float pxPerTick = AUTO_SCROLL_SPEED / 20f * font.lineHeight; + if (maxScrollAmount > 0 && currentTimeMS() - lastInteractionTime > AUTO_SCROLL_TIMER) { + if (scrollingBackward) { + pxPerTick *= -1; + if (targetScrollAmount + pxPerTick < 0) { + scrollingBackward = false; + lastInteractionTime = currentTimeMS(); + } + } else { + if (targetScrollAmount + pxPerTick > maxScrollAmount) { + scrollingBackward = true; + lastInteractionTime = currentTimeMS(); + } + } + + targetScrollAmount = Mth.clamp(targetScrollAmount + pxPerTick, 0, maxScrollAmount); + } + } + private Style getDescStyle(int mouseX, int mouseY) { if (!clicked(mouseX, mouseY)) return null; @@ -135,5 +190,12 @@ public class OptionDescriptionWidget extends AbstractWidget { public void setOptionDescription(OptionDescription description) { this.description = description; this.wrappedText = null; + this.targetScrollAmount = 0; + this.currentScrollAmount = 0; + this.lastInteractionTime = currentTimeMS(); + } + + private int currentTimeMS() { + return (int)(Blaze3D.getTime() * 1000); } } |