scrolling
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user