aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/dev/isxander/yacl/gui/controllers
diff options
context:
space:
mode:
authorxander <xander@isxander.dev>2022-09-02 22:04:35 +0100
committerxander <xander@isxander.dev>2022-09-02 22:04:35 +0100
commit7f88ddf36ba7804211e8aae6b3723bd8f37c82c5 (patch)
tree791e5cb050aa1ea17bd86d0bdd64fa441b2ab123 /src/main/java/dev/isxander/yacl/gui/controllers
parentdd24e4f8e84ed02913196c8ad6093275acc92219 (diff)
downloadYetAnotherConfigLib-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')
-rw-r--r--src/main/java/dev/isxander/yacl/gui/controllers/ActionController.java20
-rw-r--r--src/main/java/dev/isxander/yacl/gui/controllers/BooleanController.java20
-rw-r--r--src/main/java/dev/isxander/yacl/gui/controllers/ControllerWidget.java20
-rw-r--r--src/main/java/dev/isxander/yacl/gui/controllers/EnumController.java35
-rw-r--r--src/main/java/dev/isxander/yacl/gui/controllers/TickBoxController.java21
-rw-r--r--src/main/java/dev/isxander/yacl/gui/controllers/slider/SliderControllerElement.java26
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;
}