diff options
author | xander <xander@isxander.dev> | 2022-09-02 22:04:35 +0100 |
---|---|---|
committer | xander <xander@isxander.dev> | 2022-09-02 22:04:35 +0100 |
commit | 7f88ddf36ba7804211e8aae6b3723bd8f37c82c5 (patch) | |
tree | 791e5cb050aa1ea17bd86d0bdd64fa441b2ab123 /src/main/java/dev/isxander/yacl/gui/controllers | |
parent | dd24e4f8e84ed02913196c8ad6093275acc92219 (diff) | |
download | YetAnotherConfigLib-7f88ddf36ba7804211e8aae6b3723bd8f37c82c5.tar.gz YetAnotherConfigLib-7f88ddf36ba7804211e8aae6b3723bd8f37c82c5.tar.bz2 YetAnotherConfigLib-7f88ddf36ba7804211e8aae6b3723bd8f37c82c5.zip |
implement keyboard-operation for all controllers
fix crash when focusing on option list with tab
add tooltip to groups
check that pending values actually applied on save, if not, error in log and the save button displays an error
when trying to escape with unsaved changes, save button text goes green and bold
YACLConstants file to change certain behaviours, could evolve into its own settings!
update icon
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; } |