From 7007b03d0b6a6bc80bf32d6ea345d7f59b781f23 Mon Sep 17 00:00:00 2001 From: Leo dev Date: Sat, 5 Apr 2025 17:33:08 +0200 Subject: [PATCH] cloaks search --- .../saturnclient/menus/CloaksMenu.java | 53 +++-- .../java/org/saturnclient/ui/Textures.java | 2 + .../ui/widgets/SaturnInputBox.java | 197 ++++++++++++++++++ .../saturnclient/ui/widgets/SaturnScroll.java | 4 + .../textures/gui/sprites/rect_border.png | Bin 0 -> 1052 bytes .../gui/sprites/rect_border.png.mcmeta | 10 + 6 files changed, 252 insertions(+), 14 deletions(-) create mode 100644 src/main/java/org/saturnclient/ui/widgets/SaturnInputBox.java create mode 100644 src/main/resources/assets/saturnclient/textures/gui/sprites/rect_border.png create mode 100644 src/main/resources/assets/saturnclient/textures/gui/sprites/rect_border.png.mcmeta diff --git a/src/main/java/org/saturnclient/saturnclient/menus/CloaksMenu.java b/src/main/java/org/saturnclient/saturnclient/menus/CloaksMenu.java index caf63aa..017ba31 100644 --- a/src/main/java/org/saturnclient/saturnclient/menus/CloaksMenu.java +++ b/src/main/java/org/saturnclient/saturnclient/menus/CloaksMenu.java @@ -3,17 +3,22 @@ package org.saturnclient.saturnclient.menus; import net.minecraft.text.Text; import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.saturnclient.auth.SaturnSocket; +import org.saturnclient.saturnclient.config.Property; import org.saturnclient.saturnclient.cosmetics.cloaks.Cloaks; import org.saturnclient.ui.SaturnUi; import org.saturnclient.ui.Textures; import org.saturnclient.ui.widgets.SaturnClickableImage; import org.saturnclient.ui.widgets.SaturnClickableSprite; import org.saturnclient.ui.widgets.SaturnImage; +import org.saturnclient.ui.widgets.SaturnInputBox; import org.saturnclient.ui.widgets.SaturnScroll; import org.saturnclient.ui.widgets.SaturnSprite; public class CloaksMenu extends SaturnUi { + private SaturnScroll scroll; + private Property search = new Property<>(""); + public CloaksMenu() { super(Text.of("Cloaks Menu")); } @@ -44,6 +49,15 @@ public class CloaksMenu extends SaturnUi { .setHeight(15) .setAnimations(SaturnClient.getAnimations())); + draw( + new SaturnInputBox(search, rectX + rectWidth - 72, tabsY, 70).onUpdate(() -> { + scroll.clear(); + drawItems(rectX, rectY, rectWidth, rectHeight); + }) + .setHeight(15) + .setWidth(72) + .setAnimations(SaturnClient.getAnimations())); + int tabSize = 9; tabsX = (width - tabSize) / 2; draw( @@ -77,6 +91,21 @@ public class CloaksMenu extends SaturnUi { .setHeight(tabSize) .setAnimations(SaturnClient.getAnimations())); + scroll = new SaturnScroll(); + + drawItems(rectX, rectY, rectWidth, rectHeight); + + draw(scroll + .setX(rectX + 17) + .setY(rectY + 10) + .setWidth(rectWidth - 17) + .setHeight(rectHeight - 10) + .setAnimations(SaturnClient.getAnimations())); + + super.init(); + } + + private void drawItems(int rectX, int rectY, int rectWidth, int rectHeight) { int cloakWidth = 32; int cloakHeight = 70; @@ -84,10 +113,16 @@ public class CloaksMenu extends SaturnUi { int modY = 0; int col = 0; - SaturnScroll modsScroll = new SaturnScroll(); + String[] searchTokens = search.value.split("\\ "); - for (String cloak : Cloaks.availableCloaks) { - modsScroll.draw( + outer: for (String cloak : Cloaks.availableCloaks) { + for (String searchToken : searchTokens) { + if (!cloak.contains(searchToken)) { + continue outer; + } + } + + scroll.draw( new SaturnClickableSprite(Textures.BUTTON_BORDER, () -> { Cloaks.setCloak(SaturnSocket.uuid, cloak); }) @@ -96,7 +131,7 @@ public class CloaksMenu extends SaturnUi { .setWidth(cloakWidth + 6) .setHeight(cloakHeight + 6)); - modsScroll.draw( + scroll.draw( new SaturnImage(Textures.getCloakPreview(cloak)) .setX(modX + 3) .setY(modY + 3) @@ -113,15 +148,5 @@ public class CloaksMenu extends SaturnUi { col = 0; } } - - draw( - modsScroll - .setX(rectX + 17) - .setY(rectY + 10) - .setWidth(rectWidth - 17) - .setHeight(rectHeight - 10) - .setAnimations(SaturnClient.getAnimations())); - - super.init(); } } diff --git a/src/main/java/org/saturnclient/ui/Textures.java b/src/main/java/org/saturnclient/ui/Textures.java index 39e4859..4d30e10 100644 --- a/src/main/java/org/saturnclient/ui/Textures.java +++ b/src/main/java/org/saturnclient/ui/Textures.java @@ -22,8 +22,10 @@ public class Textures { // Widgets public static final Identifier BUTTON_BORDER = Identifier.of("saturnclient", "button_border"); public static final Identifier BUTTON = Identifier.of("saturnclient", "button"); + public static final Identifier BUTTON_OP = Identifier.of("saturnclient", "button_op"); public static final Identifier SETTINGS_BG = Identifier.of("saturnclient", "settings_bg"); public static final Identifier RECT = Identifier.of("saturnclient", "rect"); + public static final Identifier RECT_BORDER = Identifier.of("saturnclient", "rect_border"); public static final Identifier MOD = Identifier.of("saturnclient", "textures/gui/components/mod.png"); public static final Identifier MOD_BG = Identifier.of("saturnclient", "textures/gui/components/mod_bg.png"); diff --git a/src/main/java/org/saturnclient/ui/widgets/SaturnInputBox.java b/src/main/java/org/saturnclient/ui/widgets/SaturnInputBox.java new file mode 100644 index 0000000..74d3c7e --- /dev/null +++ b/src/main/java/org/saturnclient/ui/widgets/SaturnInputBox.java @@ -0,0 +1,197 @@ +package org.saturnclient.ui.widgets; + +import org.saturnclient.ui.SaturnWidget; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.util.math.MatrixStack; + +import org.lwjgl.glfw.GLFW; +import org.saturnclient.saturnclient.SaturnClient; +import org.saturnclient.saturnclient.config.Property; +import org.saturnclient.ui.SaturnUi; +import org.saturnclient.ui.Textures; + +public class SaturnInputBox extends SaturnWidget { + + private TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; + private int tick = 0; + private boolean cursorVisible = true; + + public Property prop; + public int cursorPosition = 0; + public Runnable onUpdate; + + public SaturnInputBox(Property prop, int x, int y, int width) { + this.x = x; + this.y = y; + this.width = width; + this.prop = prop; + this.height = textRenderer.fontHeight + 4; + this.scale = 1.0f; + } + + @Override + public void click(int mouseX, int mouseY) { + int scrollOffset = getScrollOffset(); + String visibleText = prop.value.substring(scrollOffset); + + int newCursorPos = scrollOffset; + int textWidth = 0; + + for (int i = 0; i < visibleText.length(); i++) { + textWidth = textRenderer.getWidth(visibleText.substring(0, i + 1)); + + if (textWidth > mouseX) { + break; + } + + newCursorPos++; + } + + cursorPosition = newCursorPos; + } + + @Override + public void charTyped(char chr) { + prop.value = prop.value.substring(0, cursorPosition) + + chr + + prop.value.substring(cursorPosition); + + cursorPosition++; + + onUpdate.run(); + } + + @Override + public void keyPressed(int keyCode, int scanCode, int modifiers) { + if (keyCode == GLFW.GLFW_KEY_BACKSPACE) { + if (cursorPosition > 0) { + prop.value = prop.value.substring(0, cursorPosition - 1) + + prop.value.substring(cursorPosition); + cursorPosition--; + } + onUpdate.run(); + } else if (keyCode == GLFW.GLFW_KEY_LEFT) { + if (cursorPosition > 0) { + cursorPosition--; + } + } else if (keyCode == GLFW.GLFW_KEY_RIGHT) { + if (cursorPosition < prop.value.length()) { + cursorPosition++; + } + } + } + + @Override + public void render( + DrawContext context, + boolean hovering, + int mouseX, + int mouseY) { + SaturnUi.drawHighResGuiTexture( + context, + Textures.BUTTON, + 0, + 0, + this.width, + this.height, + focused + ? SaturnClient.COLOR.value + : SaturnClient.getWhite(this.alpha)); + SaturnUi.drawHighResGuiTexture( + context, + Textures.BUTTON_BORDER, + 0, + 0, + this.width, + this.height, + focused + ? SaturnClient.COLOR.value + : SaturnClient.getWhite(this.alpha)); + + int scrollOffset = getScrollOffset(); + String visibleText = getVisibleText(scrollOffset); + + MatrixStack matrices = context.getMatrices(); + matrices.push(); + int textColor = focused ? 0xFFFFFF : 0xAAAAAA; + matrices.scale(0.9f, 0.9f, 1.0f); + context.drawText( + textRenderer, + SaturnUi.text(visibleText), + 3, + textRenderer.fontHeight / 2, + textColor, + false); + + if (focused && cursorVisible) { + int cursorX = 2 + + textRenderer.getWidth( + SaturnUi.text( + visibleText.substring(0, cursorPosition - scrollOffset))); + matrices.translate(cursorX, 0, 0); + context.fill( + 1, + 2, + 2, + textRenderer.fontHeight + 3, + 0xFFFFFFFF); + } + + matrices.pop(); + } + + public void clearText() { + prop.value = ""; + cursorPosition = 1; + } + + private int getScrollOffset() { + if (prop.value.isEmpty()) { + return 0; + } + + int offset = 0; + int maxWidth = width - 4; // Available width for prop.value + while (offset < cursorPosition) { // Ensure cursor remains visible + String visibleText = prop.value.substring(offset, cursorPosition); + if (textRenderer.getWidth(SaturnUi.text(visibleText)) > maxWidth) { + offset++; + } else { + break; + } + } + return offset; + } + + private String getVisibleText(int scrollOffset) { + String visibleText = prop.value.substring(scrollOffset); + + // Ensure prop.value does not overflow past the available width + for (int i = 1; i <= visibleText.length(); i++) { + if (textRenderer.getWidth( + SaturnUi.text(visibleText.substring(0, i))) > width - 4) { + return visibleText.substring(0, i - 1); // Trim overflow + } + } + return visibleText; + } + + public SaturnInputBox onUpdate(Runnable onUpdate) { + this.onUpdate = onUpdate; + return this; + } + + @Override + public void tick() { + if (focused) { + if (tick < 45 || tick < 60 && cursorVisible) { + tick++; + } else { + tick = 0; + cursorVisible = !cursorVisible; + } + } + } +} diff --git a/src/main/java/org/saturnclient/ui/widgets/SaturnScroll.java b/src/main/java/org/saturnclient/ui/widgets/SaturnScroll.java index 90b4b93..3fdc8e5 100644 --- a/src/main/java/org/saturnclient/ui/widgets/SaturnScroll.java +++ b/src/main/java/org/saturnclient/ui/widgets/SaturnScroll.java @@ -143,4 +143,8 @@ public class SaturnScroll extends SaturnWidget { } } } + + public void clear() { + children.clear(); + } } diff --git a/src/main/resources/assets/saturnclient/textures/gui/sprites/rect_border.png b/src/main/resources/assets/saturnclient/textures/gui/sprites/rect_border.png new file mode 100644 index 0000000000000000000000000000000000000000..49c0855207cb70a69c47ad0927e384952cfe81bf GIT binary patch literal 1052 zcmeAS@N?(olHy`uVBq!ia0vp^Pe7Q14M=u`ck}`&&H|6fVg?3oVGw3ym^DWND9BhG zV<>`vPSkm+`8kzGx$#*Po9w7v;FfAi-x_ryPqC4 zJf(VK_2J^}r!SWBidHygN89_)+HIvbZ>~-Z--D~VYv*n$-{*5LM=g(S!|bmnRV90U z{?vwP0NFpPzU1e8Kh5|iYv=NtW)`{5bMh;f0eQC{>}E{i5OQMSRBUPyaCGWWP;{9f zpya_JsM0bjJQ^kxCy4V+HZpwg**~OBQ+RKFU!Hx#>`Gyq`!)A;9sk|)sgXV~Z(q*6 z_j25}HtJqC4qm$DS)G2o_4VY|*^}3bR4|^lJ-dtZ-aM1?y=(lB%b)GP{m@=zPwVc= z7@x~uK2)6EwMR$z^AE!YTivs