From 0f4af2234627d8053bfa33621d8c5f1dfe4814e5 Mon Sep 17 00:00:00 2001 From: Leo dev Date: Tue, 6 May 2025 03:18:56 +0200 Subject: [PATCH] scrolling --- .../org/saturnclient/ui2/SaturnScreen.java | 51 +----------- .../ui2/components/ElementRenderer.java | 80 ++++++++++++++++++- .../org/saturnclient/ui2/elements/Scroll.java | 30 ++++--- .../org/saturnclient/ui2/screens/ModMenu.java | 18 ++++- .../saturnclient/ui2/screens/ShiftMenu.java | 2 +- .../saturnclient/ui2/screens/TitleMenu.java | 1 - 6 files changed, 113 insertions(+), 69 deletions(-) diff --git a/src/main/java/org/saturnclient/ui2/SaturnScreen.java b/src/main/java/org/saturnclient/ui2/SaturnScreen.java index d2427a8..1edac29 100644 --- a/src/main/java/org/saturnclient/ui2/SaturnScreen.java +++ b/src/main/java/org/saturnclient/ui2/SaturnScreen.java @@ -41,10 +41,6 @@ public abstract class SaturnScreen extends Screen { public void draw(Element element) { synchronized (elements) { elements.add(element); - - if (element instanceof ElementRenderer) { - elements.addAll(((ElementRenderer) element).getChildren()); - } } if (element.animation != null) { @@ -97,40 +93,14 @@ public abstract class SaturnScreen extends Screen { renderScope.matrices.scale(0.5f, 0.5f, 0.5f); - for (Element element : elements) { - renderScope.enableScissor(element.x, element.y, element.x + element.width, element.y + element.height); - - renderScope.matrices.push(); - renderScope.setOpacity(element.opacity); - renderScope.matrices.translate(element.x, element.y, 0); - renderScope.matrices.scale(element.scale, element.scale, 1.0f); - element.render(renderScope, new RenderContext(mouseX, mouseY, element)); - renderScope.matrices.pop(); - renderScope.setRenderLayer(null); - - renderScope.disableScissor(); - } + ElementRenderer.render(elements, renderScope, mouseX, mouseY); renderScope.matrices.pop(); } @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { - mouseX *= 2; - mouseY *= 2; - if (button == 0) { - for (Element element : new ArrayList<>(elements)) { - element.focused = false; - - int adjustedMouseX = (int) mouseX - element.x; - int adjustedMouseY = (int) mouseY - element.y; - - if (Utils.isHovering(adjustedMouseX, adjustedMouseY, element.width, element.height, element.scale)) { - element.focused = true; - element.click(adjustedMouseX, adjustedMouseY); - } - } - } + ElementRenderer.mouseClicked(elements, mouseX, mouseY, button); return false; } @@ -141,22 +111,7 @@ public abstract class SaturnScreen extends Screen { double mouseY, double horizontalAmount, double verticalAmount) { - for (Element element : new ArrayList<>(elements)) { - double adjustedMouseX = mouseX - element.x; - double adjustedMouseY = mouseY - element.y; - boolean isMouseInside = adjustedMouseX >= 0 && - adjustedMouseX <= (element.width * element.scale) && - adjustedMouseY >= 0 && - adjustedMouseY <= (element.height * element.scale); - - if (isMouseInside) { - element.scroll( - (int) (adjustedMouseX / element.scale), - (int) (adjustedMouseY / element.scale), - horizontalAmount, - verticalAmount); - } - } + ElementRenderer.mouseScrolled(elements, mouseX, mouseY, horizontalAmount, verticalAmount); return super.mouseScrolled( mouseX, diff --git a/src/main/java/org/saturnclient/ui2/components/ElementRenderer.java b/src/main/java/org/saturnclient/ui2/components/ElementRenderer.java index ad4f36d..679787d 100644 --- a/src/main/java/org/saturnclient/ui2/components/ElementRenderer.java +++ b/src/main/java/org/saturnclient/ui2/components/ElementRenderer.java @@ -1,10 +1,84 @@ package org.saturnclient.ui2.components; +import java.util.ArrayList; import java.util.List; import org.saturnclient.ui2.Element; +import org.saturnclient.ui2.RenderContext; +import org.saturnclient.ui2.RenderScope; +import org.saturnclient.ui2.Utils; +import org.saturnclient.ui2.anim.Animation; -public interface ElementRenderer { - List getChildren(); - void draw(Element element); +public class ElementRenderer { + public static void draw(List elements, Element element) { + synchronized (elements) { + elements.add(element); + } + + if (element.animation != null) { + element.animation.init(element); + + Animation.execute((Float progress) -> { + element.animation.tick(progress, element); + }, element.animation.duration); + } + } + + public static void render(List elements, RenderScope renderScope, int mouseX, int mouseY) { + for (Element element : elements) { + renderScope.enableScissor(element.x, element.y, element.x + element.width, element.y + element.height); + + renderScope.matrices.push(); + renderScope.setOpacity(element.opacity); + renderScope.matrices.translate(element.x, element.y, 0); + renderScope.matrices.scale(element.scale, element.scale, 1.0f); + element.render(renderScope, new RenderContext(mouseX, mouseY, element)); + renderScope.matrices.pop(); + renderScope.setRenderLayer(null); + + renderScope.disableScissor(); + } + } + + public static void mouseClicked(List elements, double mouseX, double mouseY, int button) { + mouseX *= 2; + mouseY *= 2; + if (button == 0) { + for (Element element : new ArrayList<>(elements)) { + element.focused = false; + + int adjustedMouseX = (int) mouseX - element.x; + int adjustedMouseY = (int) mouseY - element.y; + + if (Utils.isHovering(adjustedMouseX, adjustedMouseY, element.width, element.height, element.scale)) { + element.focused = true; + element.click(adjustedMouseX, adjustedMouseY); + } + } + } + } + + public static void mouseScrolled( + List elements, + double mouseX, + double mouseY, + double horizontalAmount, + double verticalAmount) { + for (Element element : new ArrayList<>(elements)) { + double adjustedMouseX = mouseX - element.x; + double adjustedMouseY = mouseY - element.y; + boolean isMouseInside = adjustedMouseX >= 0 && + adjustedMouseX <= (element.width * element.scale) && + adjustedMouseY >= 0 && + adjustedMouseY <= (element.height * element.scale); + + if (isMouseInside) { + element.scroll( + (int) (adjustedMouseX / element.scale), + (int) (adjustedMouseY / element.scale), + horizontalAmount, + verticalAmount); + } + } + } } diff --git a/src/main/java/org/saturnclient/ui2/elements/Scroll.java b/src/main/java/org/saturnclient/ui2/elements/Scroll.java index cb6aeed..6ee7486 100644 --- a/src/main/java/org/saturnclient/ui2/elements/Scroll.java +++ b/src/main/java/org/saturnclient/ui2/elements/Scroll.java @@ -8,14 +8,29 @@ import org.saturnclient.ui2.RenderContext; import org.saturnclient.ui2.RenderScope; import org.saturnclient.ui2.components.ElementRenderer; -public class Scroll extends Element implements ElementRenderer { +public class Scroll extends Element { protected List children = new ArrayList<>(); + int scroll = 0; + int maxScroll = 0; @Override public void render(RenderScope renderScope, RenderContext ctx) { + renderScope.matrices.push(); + renderScope.matrices.translate(0, -scroll, 0); + ElementRenderer.render(children, renderScope, ctx.mouseX, ctx.mouseY); + renderScope.matrices.pop(); + // renderScope.drawRoundedRectangle(width - 10, 0, 10, 50, 0, Button.fgColor.value); } @Override + public void scroll(int mouseX, int mouseY, double horizontalAmount, double verticalAmount) { + if (scroll - verticalAmount <= 0) { + scroll = 0; + } else if (scroll - verticalAmount <= maxScroll) { + scroll -= verticalAmount; + } + } + public void draw(Element element) { children.add(element); @@ -26,18 +41,7 @@ public class Scroll extends Element implements ElementRenderer { if (element.height > height) { height = element.height; } - } - @Override - public void scroll(int mouseX, int mouseY, double horizontalAmount, double verticalAmount) { - for (Element child : children) { - child.y -= verticalAmount; - } - } - - - @Override - public List getChildren() { - return children; + maxScroll = Math.max(maxScroll, element.y - height); } } diff --git a/src/main/java/org/saturnclient/ui2/screens/ModMenu.java b/src/main/java/org/saturnclient/ui2/screens/ModMenu.java index ccd9c4e..99f817b 100644 --- a/src/main/java/org/saturnclient/ui2/screens/ModMenu.java +++ b/src/main/java/org/saturnclient/ui2/screens/ModMenu.java @@ -14,10 +14,22 @@ public class ModMenu extends SaturnScreen { public void ui() { Scroll scroll = new Scroll(); - scroll.draw(new Button("Hello World!", () -> { + scroll.draw(new Button("Hello World! 1", () -> { SaturnClient.LOGGER.info("Clicked Hello World!"); - })); + }).position(0, 0)); + + scroll.draw(new Button("Hello World! 1", () -> { + SaturnClient.LOGGER.info("Clicked Hello World!"); + }).position(0, 50)); - draw(scroll); + scroll.draw(new Button("Hello World! 2", () -> { + SaturnClient.LOGGER.info("Clicked Hello World!"); + }).position(0, 100)); + + scroll.draw(new Button("Hello World! 3", () -> { + SaturnClient.LOGGER.info("Clicked Hello World!"); + }).position(0, 150)); + + draw(scroll.dimensions(width, 100)); } } diff --git a/src/main/java/org/saturnclient/ui2/screens/ShiftMenu.java b/src/main/java/org/saturnclient/ui2/screens/ShiftMenu.java index 181bd90..13f9be4 100644 --- a/src/main/java/org/saturnclient/ui2/screens/ShiftMenu.java +++ b/src/main/java/org/saturnclient/ui2/screens/ShiftMenu.java @@ -25,7 +25,7 @@ public class ShiftMenu extends SaturnScreen { Element button = new Button("Settings", () -> { SaturnClient.client.setScreen(new ModMenu()); - }).center(width, height); + }).center(width, height); draw(button); diff --git a/src/main/java/org/saturnclient/ui2/screens/TitleMenu.java b/src/main/java/org/saturnclient/ui2/screens/TitleMenu.java index d24676f..2feccb5 100644 --- a/src/main/java/org/saturnclient/ui2/screens/TitleMenu.java +++ b/src/main/java/org/saturnclient/ui2/screens/TitleMenu.java @@ -4,7 +4,6 @@ import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.saturnclient.SaturnClientConfig; import org.saturnclient.saturnclient.menus.CloaksMenu; import org.saturnclient.saturnclient.menus.HudEditor; -import org.saturnclient.saturnclient.menus.ModMenu; import org.saturnclient.ui.Textures; import org.saturnclient.ui2.SaturnScreen; import org.saturnclient.ui2.anim.Fade;