diff --git a/src/main/java/org/saturnclient/ui2/Element.java b/src/main/java/org/saturnclient/ui2/Element.java index 18653aa..499a047 100644 --- a/src/main/java/org/saturnclient/ui2/Element.java +++ b/src/main/java/org/saturnclient/ui2/Element.java @@ -25,6 +25,12 @@ public class Element { public void scroll(int mouseX, int mouseY, double horizontalAmount, double verticalAmount) { } + public void keyPressed(int keyCode, int scanCode, int modifiers) { + } + + public void charTyped(char typedChar) { + } + public final Element dimensions(int width, int height) { this.width = width; this.height = height; diff --git a/src/main/java/org/saturnclient/ui2/SaturnScreen.java b/src/main/java/org/saturnclient/ui2/SaturnScreen.java index a0b3fcc..695ad62 100644 --- a/src/main/java/org/saturnclient/ui2/SaturnScreen.java +++ b/src/main/java/org/saturnclient/ui2/SaturnScreen.java @@ -131,4 +131,11 @@ public abstract class SaturnScreen extends Screen { elements.clear(); super.resize(client, width, height); } + + @Override + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + ElementRenderer.keyPressed(elements, keyCode, scanCode, modifiers); + + return super.keyPressed(keyCode, scanCode, modifiers); + } } diff --git a/src/main/java/org/saturnclient/ui2/Utils.java b/src/main/java/org/saturnclient/ui2/Utils.java index 404fbd5..58bd7fb 100644 --- a/src/main/java/org/saturnclient/ui2/Utils.java +++ b/src/main/java/org/saturnclient/ui2/Utils.java @@ -1,5 +1,7 @@ package org.saturnclient.ui2; +import org.lwjgl.glfw.GLFW; + public class Utils { public static boolean isHovering(int mouseX, int mouseY, int elementWidth, int elementHeight, float elementScale) { return mouseX >= 0 && @@ -7,4 +9,39 @@ public class Utils { mouseY >= 0 && mouseY <= (elementHeight * elementScale); } + + public static char getCharFromKey(int keyCode, int modifiers) { + boolean shift = (modifiers & GLFW.GLFW_MOD_SHIFT) != 0; + + // A-Z + if (keyCode >= GLFW.GLFW_KEY_A && keyCode <= GLFW.GLFW_KEY_Z) { + return (char) (shift + ? 'A' + (keyCode - GLFW.GLFW_KEY_A) + : 'a' + (keyCode - GLFW.GLFW_KEY_A)); + } + + // 0-9 + if (keyCode >= GLFW.GLFW_KEY_0 && keyCode <= GLFW.GLFW_KEY_9) { + return shift + ? ")!@#$%^&*(".charAt(keyCode - GLFW.GLFW_KEY_0) + : (char) ('0' + (keyCode - GLFW.GLFW_KEY_0)); + } + + // Special characters + return switch (keyCode) { + case GLFW.GLFW_KEY_SPACE -> ' '; + case GLFW.GLFW_KEY_PERIOD -> shift ? '>' : '.'; + case GLFW.GLFW_KEY_COMMA -> shift ? '<' : ','; + case GLFW.GLFW_KEY_MINUS -> shift ? '_' : '-'; + case GLFW.GLFW_KEY_EQUAL -> shift ? '+' : '='; + case GLFW.GLFW_KEY_SEMICOLON -> shift ? ':' : ';'; + case GLFW.GLFW_KEY_APOSTROPHE -> shift ? '"' : '\''; + case GLFW.GLFW_KEY_SLASH -> shift ? '?' : '/'; + case GLFW.GLFW_KEY_BACKSLASH -> shift ? '|' : '\\'; + case GLFW.GLFW_KEY_LEFT_BRACKET -> shift ? '{' : '['; + case GLFW.GLFW_KEY_RIGHT_BRACKET -> shift ? '}' : ']'; + case GLFW.GLFW_KEY_GRAVE_ACCENT -> shift ? '~' : '`'; + default -> '\0'; + }; + } } diff --git a/src/main/java/org/saturnclient/ui2/components/ElementRenderer.java b/src/main/java/org/saturnclient/ui2/components/ElementRenderer.java index 0ae0bff..abd905c 100644 --- a/src/main/java/org/saturnclient/ui2/components/ElementRenderer.java +++ b/src/main/java/org/saturnclient/ui2/components/ElementRenderer.java @@ -68,4 +68,17 @@ public class ElementRenderer { } } } + + public static void keyPressed(List elements, int keyCode, int scanCode, int modifiers) { + for (Element element : new ArrayList<>(elements)) { + if (element.focused) { + element.keyPressed(keyCode, scanCode, modifiers); + + char typedChar = Utils.getCharFromKey(keyCode, modifiers); + if (typedChar != '\0') { + element.charTyped(typedChar); + } + } + } + } } diff --git a/src/main/java/org/saturnclient/ui2/components/inputs/FloatInput.java b/src/main/java/org/saturnclient/ui2/components/inputs/FloatInput.java new file mode 100644 index 0000000..6c178d9 --- /dev/null +++ b/src/main/java/org/saturnclient/ui2/components/inputs/FloatInput.java @@ -0,0 +1,18 @@ +package org.saturnclient.ui2.components.inputs; + +import org.saturnclient.saturnclient.SaturnClient; +import org.saturnclient.ui2.Element; + +public class FloatInput extends Element { + public FloatInput() { + this.width = 120; + this.height = 120; + } + + public void keyPressed(int keyCode, int scanCode, int modifiers) { + } + + public void charTyped(char typedChar) { + SaturnClient.LOGGER.info("Char typed: "+typedChar); + } +} diff --git a/src/main/java/org/saturnclient/ui2/elements/Scroll.java b/src/main/java/org/saturnclient/ui2/elements/Scroll.java index f24d782..b51a4b1 100644 --- a/src/main/java/org/saturnclient/ui2/elements/Scroll.java +++ b/src/main/java/org/saturnclient/ui2/elements/Scroll.java @@ -82,5 +82,10 @@ public class Scroll extends Element { int scrollBarHeight = calculateScrollBarHeight(); if (maxScroll <= 0) return scrollBarPadding.value; return (scroll * (height - scrollBarHeight)) / maxScroll + scrollBarPadding.value; - } + } + + @Override + public void keyPressed(int keyCode, int scanCode, int modifiers) { + ElementRenderer.keyPressed(children, keyCode, scanCode, modifiers); + } } diff --git a/src/main/java/org/saturnclient/ui2/screens/TitleMenu.java b/src/main/java/org/saturnclient/ui2/screens/TitleMenu.java index 48c9164..31bf708 100644 --- a/src/main/java/org/saturnclient/ui2/screens/TitleMenu.java +++ b/src/main/java/org/saturnclient/ui2/screens/TitleMenu.java @@ -7,6 +7,7 @@ import org.saturnclient.ui.Textures; import org.saturnclient.ui2.SaturnScreen; import org.saturnclient.ui2.anim.Fade; import org.saturnclient.ui2.anim.SlideY; +import org.saturnclient.ui2.components.inputs.FloatInput; import org.saturnclient.ui2.elements.Button; import org.saturnclient.ui2.elements.ImageTexture; import org.saturnclient.ui2.elements.TextureButton; @@ -25,6 +26,8 @@ public class TitleMenu extends SaturnScreen { public void ui() { backgroundBlur = 0; + draw(new FloatInput()); + draw(new ImageTexture(Textures.LOGO_TEXT).dimensions(98, 10).centerOffset(width, height, 0, -36).animation(new Fade(700))); draw(new ImageTexture(SaturnClientConfig.getLogo()).dimensions(98, 98).centerOffset(width, height, 0, -82).animation(new SlideY(700, -40)));