scrolling

This commit is contained in:
2025-05-06 03:18:56 +02:00
parent 5a8ae263e9
commit 0f4af22346
6 changed files with 113 additions and 69 deletions
@@ -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,
@@ -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<Element> getChildren();
void draw(Element element);
public class ElementRenderer {
public static void draw(List<Element> 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<Element> 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<Element> 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<Element> 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);
}
}
}
}
@@ -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<Element> 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<Element> getChildren() {
return children;
maxScroll = Math.max(maxScroll, element.y - height);
}
}
@@ -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));
}
}
@@ -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);
@@ -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;