diff options
Diffstat (limited to 'src/main/java/dev/isxander/yacl/gui/controllers')
6 files changed, 118 insertions, 24 deletions
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 92ef3d5..d198c96 100644 --- a/src/main/java/dev/isxander/yacl/gui/controllers/ActionController.java +++ b/src/main/java/dev/isxander/yacl/gui/controllers/ActionController.java @@ -6,6 +6,7 @@ import dev.isxander.yacl.api.utils.Dimension; import dev.isxander.yacl.gui.YACLScreen; import net.minecraft.text.Text; import org.jetbrains.annotations.ApiStatus; +import org.lwjgl.glfw.GLFW; import java.util.function.Consumer; @@ -71,17 +72,32 @@ public class ActionController implements Controller<Consumer<YACLScreen>> { super(control, screen, dim); } + public void executeAction() { + playDownSound(); + control.option().action().accept(screen); + } + @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { if (isMouseOver(mouseX, mouseY)) { - playDownSound(); - control.option().action().accept(screen); + executeAction(); return true; } return false; } @Override + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + if (keyCode != GLFW.GLFW_KEY_ENTER && keyCode != GLFW.GLFW_KEY_SPACE && keyCode != GLFW.GLFW_KEY_KP_ENTER) { + return false; + } + + executeAction(); + + return true; + } + + @Override protected int getHoveredControlWidth() { return getUnhoveredControlWidth(); } 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 6bf0b80..ac8754f 100644 --- a/src/main/java/dev/isxander/yacl/gui/controllers/BooleanController.java +++ b/src/main/java/dev/isxander/yacl/gui/controllers/BooleanController.java @@ -9,6 +9,7 @@ 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; @@ -117,8 +118,7 @@ public class BooleanController implements Controller<Boolean> { if (!isMouseOver(mouseX, mouseY)) return false; - control.option().requestSet(!control.option().pendingValue()); - playDownSound(); + toggleSetting(); return true; } @@ -127,6 +127,11 @@ public class BooleanController implements Controller<Boolean> { return getUnhoveredControlWidth(); } + public void toggleSetting() { + control.option().requestSet(!control.option().pendingValue()); + playDownSound(); + } + @Override protected Text getValueText() { if (control.coloured()) { @@ -135,5 +140,16 @@ public class BooleanController implements Controller<Boolean> { return super.getValueText(); } + + @Override + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + if (keyCode != GLFW.GLFW_KEY_ENTER && keyCode != GLFW.GLFW_KEY_SPACE && keyCode != GLFW.GLFW_KEY_KP_ENTER) { + return false; + } + + toggleSetting(); + + return true; + } } } 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 77ac9ca..d712e56 100644 --- a/src/main/java/dev/isxander/yacl/gui/controllers/ControllerWidget.java +++ b/src/main/java/dev/isxander/yacl/gui/controllers/ControllerWidget.java @@ -4,6 +4,7 @@ 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.gui.DrawableHelper; import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder; import net.minecraft.client.util.math.MatrixStack; @@ -19,6 +20,7 @@ public abstract class ControllerWidget<T extends Controller<?>> extends Abstract protected Dimension<Integer> dim; protected final YACLScreen screen; + protected boolean focused = false; protected boolean hovered = false; protected float hoveredTicks = 0; @@ -34,7 +36,7 @@ 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 && mouseX == prevMouseX && mouseY == prevMouseY) { + if (hovered && (!YACLConstants.HOVER_MOUSE_RESET || (mouseX == prevMouseX && mouseY == prevMouseY))) { hoveredTicks += delta; } else { hoveredTicks = 0; @@ -53,18 +55,18 @@ 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(), hovered); + drawButtonRect(matrices, dim.x(), dim.y(), dim.xLimit(), dim.yLimit(), hovered || focused); matrices.push(); matrices.translate(dim.x() + getXPadding(), getTextY(), 0); textRenderer.drawWithShadow(matrices, shortenedName, 0, 0, -1); matrices.pop(); drawValueText(matrices, mouseX, mouseY, delta); - if (hovered) { + if (hovered || focused) { drawHoveredControl(matrices, mouseX, mouseY, delta); } - if (hoveredTicks > 30) { + if (hoveredTicks > YACLConstants.HOVER_TICKS) { screen.renderOrderedTooltip(matrices, wrappedTooltip, mouseX, mouseY); } @@ -90,7 +92,7 @@ public abstract class ControllerWidget<T extends Controller<?>> extends Abstract } protected int getControlWidth() { - return hovered ? getHoveredControlWidth() : getUnhoveredControlWidth(); + return hovered || focused ? getHoveredControlWidth() : getUnhoveredControlWidth(); } protected abstract int getHoveredControlWidth(); @@ -127,8 +129,14 @@ public abstract class ControllerWidget<T extends Controller<?>> extends Abstract } @Override + public boolean changeFocus(boolean lookForwards) { + this.focused = !this.focused; + return this.focused; + } + + @Override public SelectionType getType() { - return hovered ? SelectionType.HOVERED : SelectionType.NONE; + return focused ? SelectionType.FOCUSED : hovered ? SelectionType.HOVERED : SelectionType.NONE; } @Override diff --git a/src/main/java/dev/isxander/yacl/gui/controllers/EnumController.java b/src/main/java/dev/isxander/yacl/gui/controllers/EnumController.java index f4c4006..af52255 100644 --- a/src/main/java/dev/isxander/yacl/gui/controllers/EnumController.java +++ b/src/main/java/dev/isxander/yacl/gui/controllers/EnumController.java @@ -8,6 +8,7 @@ import dev.isxander.yacl.gui.YACLScreen; import net.minecraft.client.gui.screen.Screen; import net.minecraft.text.Text; import org.jetbrains.annotations.ApiStatus; +import org.lwjgl.glfw.GLFW; import java.util.function.Function; @@ -85,21 +86,41 @@ public class EnumController<T extends Enum<T>> implements Controller<T> { this.values = values; } + public void cycleValue(int increment) { + int targetIdx = control.option().pendingValue().ordinal() + increment; + if (targetIdx >= values.length) { + targetIdx -= values.length; + } else if (targetIdx < 0) { + targetIdx += values.length; + } + control.option().requestSet(values[targetIdx]); + } + @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { if (!isMouseOver(mouseX, mouseY) || (button != 0 && button != 1)) return false; playDownSound(); + cycleValue(button == 1 || Screen.hasShiftDown() || Screen.hasControlDown() ? -1 : 1); - int change = button == 1 || Screen.hasShiftDown() ? -1 : 1; - int targetIdx = control.option().pendingValue().ordinal() + change; - if (targetIdx >= values.length) { - targetIdx -= values.length; - } else if (targetIdx < 0) { - targetIdx += values.length; + return true; + } + + @Override + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + switch (keyCode) { + case GLFW.GLFW_KEY_LEFT, GLFW.GLFW_KEY_DOWN -> + cycleValue(-1); + case GLFW.GLFW_KEY_RIGHT, GLFW.GLFW_KEY_UP -> + cycleValue(1); + case GLFW.GLFW_KEY_ENTER, GLFW.GLFW_KEY_SPACE, GLFW.GLFW_KEY_KP_ENTER -> + cycleValue(Screen.hasControlDown() || Screen.hasShiftDown() ? -1 : 1); + default -> { + return false; + } } - control.option().requestSet(values[targetIdx]); + return true; } 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 1d78c78..a1c0095 100644 --- a/src/main/java/dev/isxander/yacl/gui/controllers/TickBoxController.java +++ b/src/main/java/dev/isxander/yacl/gui/controllers/TickBoxController.java @@ -5,10 +5,10 @@ import dev.isxander.yacl.api.Option; import dev.isxander.yacl.api.utils.Dimension; import dev.isxander.yacl.gui.YACLScreen; import net.minecraft.client.gui.DrawableHelper; -import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.Text; import org.jetbrains.annotations.ApiStatus; +import org.lwjgl.glfw.GLFW; /** * This controller renders a tickbox @@ -81,8 +81,7 @@ public class TickBoxController implements Controller<Boolean> { if (!isMouseOver(mouseX, mouseY)) return false; - control.option().requestSet(!control.option().pendingValue()); - playDownSound(); + toggleSetting(); return true; } @@ -90,5 +89,21 @@ public class TickBoxController implements Controller<Boolean> { protected int getHoveredControlWidth() { return 10; } + + public void toggleSetting() { + control.option().requestSet(!control.option().pendingValue()); + playDownSound(); + } + + @Override + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + if (keyCode != GLFW.GLFW_KEY_ENTER && keyCode != GLFW.GLFW_KEY_SPACE && keyCode != GLFW.GLFW_KEY_KP_ENTER) { + return false; + } + + toggleSetting(); + + return true; + } } } diff --git a/src/main/java/dev/isxander/yacl/gui/controllers/slider/SliderControllerElement.java b/src/main/java/dev/isxander/yacl/gui/controllers/slider/SliderControllerElement.java index 8af2433..a6f046a 100644 --- a/src/main/java/dev/isxander/yacl/gui/controllers/slider/SliderControllerElement.java +++ b/src/main/java/dev/isxander/yacl/gui/controllers/slider/SliderControllerElement.java @@ -8,6 +8,7 @@ import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.util.math.MathHelper; import org.jetbrains.annotations.ApiStatus; +import org.lwjgl.glfw.GLFW; @ApiStatus.Internal public class SliderControllerElement extends ControllerWidget<ISliderController<?>> { @@ -49,7 +50,7 @@ public class SliderControllerElement extends ControllerWidget<ISliderController< @Override protected void drawValueText(MatrixStack matrices, int mouseX, int mouseY, float delta) { matrices.push(); - if (hovered) + if (hovered || focused) matrices.translate(-(sliderBounds.width() + 6 + getThumbWidth() / 2f), 0, 0); super.drawValueText(matrices, mouseX, mouseY, delta); matrices.pop(); @@ -75,13 +76,17 @@ public class SliderControllerElement extends ControllerWidget<ISliderController< return true; } + public void incrementValue(double amount) { + control.setPendingValue(MathHelper.clamp(control.pendingValue() + interval * amount, min, max)); + calculateInterpolation(); + } + @Override public boolean mouseScrolled(double mouseX, double mouseY, double amount) { - if (!isMouseOver(mouseX, mouseY) || !Screen.hasShiftDown()) + if ((!isMouseOver(mouseX, mouseY)) || (!Screen.hasShiftDown() && !Screen.hasControlDown())) return false; - control.setPendingValue(MathHelper.clamp(control.pendingValue() + interval * amount, min, max)); - calculateInterpolation(); + incrementValue(amount); return true; } @@ -95,6 +100,19 @@ public class SliderControllerElement extends ControllerWidget<ISliderController< } @Override + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + switch (keyCode) { + case GLFW.GLFW_KEY_LEFT, GLFW.GLFW_KEY_DOWN -> incrementValue(-1); + case GLFW.GLFW_KEY_RIGHT, GLFW.GLFW_KEY_UP -> incrementValue(1); + default -> { + return false; + } + } + + return true; + } + + @Override public boolean isMouseOver(double mouseX, double mouseY) { return super.isMouseOver(mouseX, mouseY) || mouseDown; } |