From 20c19444f2b0bf1e0cfcd5f143ba565100e59f68 Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 15 Jul 2022 01:43:17 +0200 Subject: [PATCH] Event Handling --- .../bclib/client/gui/modmenu/TestScreen.java | 42 ++++++++ .../betterx/ui/layout/components/Button.java | 78 +++++++++++++- .../ui/layout/components/Component.java | 7 +- .../ui/layout/components/HorizontalStack.java | 100 +++++++++++++++++- .../betterx/ui/layout/components/Panel.java | 77 +++++++++++++- .../ui/layout/components/VerticalScroll.java | 94 +++++++++++++++- .../ui/layout/components/VerticalStack.java | 100 +++++++++++++++++- .../layout/components/input/MouseEvent.java | 2 +- 8 files changed, 484 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/betterx/bclib/client/gui/modmenu/TestScreen.java b/src/main/java/org/betterx/bclib/client/gui/modmenu/TestScreen.java index ed262c7b..6faf3462 100644 --- a/src/main/java/org/betterx/bclib/client/gui/modmenu/TestScreen.java +++ b/src/main/java/org/betterx/bclib/client/gui/modmenu/TestScreen.java @@ -58,4 +58,46 @@ public class TestScreen extends Screen { main.render(poseStack); super.render(poseStack, i, j, f); } + + @Override + public boolean mouseClicked(double x, double y, int button) { + boolean res = super.mouseClicked(x, y, button); + if (!res) { + res = main.mouseClicked(x, y, button); + } + return res; + } + + @Override + public boolean mouseReleased(double d, double e, int i) { + boolean res = super.mouseReleased(d, e, i); + if (!res) { + res = main.mouseReleased(d, e, i); + } + return res; + } + + @Override + public void mouseMoved(double d, double e) { + super.mouseMoved(d, e); + main.mouseMoved(d, e); + } + + @Override + public boolean mouseDragged(double d, double e, int i, double f, double g) { + boolean res = super.mouseDragged(d, e, i, f, g); + if (!res) { + res = main.mouseDragged(d, e, i, f, g); + } + return res; + } + + @Override + public boolean mouseScrolled(double d, double e, double f) { + boolean res = super.mouseScrolled(d, e, f); + if (!res) { + res = main.mouseScrolled(d, e, f); + } + return res; + } } diff --git a/src/main/java/org/betterx/ui/layout/components/Button.java b/src/main/java/org/betterx/ui/layout/components/Button.java index 14a7c5a0..70715811 100644 --- a/src/main/java/org/betterx/ui/layout/components/Button.java +++ b/src/main/java/org/betterx/ui/layout/components/Button.java @@ -62,7 +62,7 @@ public class Button extends Component { mouseX = x; mouseY = y; if (vanillaButton != null && relativeBounds.contains(x, y)) { - + if (event == MouseEvent.DOWN) return vanillaButton.mouseClicked(x, y, 0); return true; } @@ -91,4 +91,80 @@ public class Button extends Component { public int getContentHeight() { return renderer.getHeight(component); } + + @Override + public void mouseMoved(double x, double y) { + if (vanillaButton != null) + vanillaButton.mouseMoved(x - relativeBounds.left, y - relativeBounds.top); + } + + @Override + public boolean mouseClicked(double x, double y, int button) { + if (vanillaButton != null) + return vanillaButton.mouseClicked(x - relativeBounds.left, y - relativeBounds.top, button); + return false; + } + + @Override + public boolean mouseReleased(double x, double y, int button) { + if (vanillaButton != null) + return vanillaButton.mouseReleased(x - relativeBounds.left, y - relativeBounds.top, button); + return false; + } + + @Override + public boolean mouseDragged(double x, double y, int button, double x2, double y2) { + if (vanillaButton != null) + return vanillaButton.mouseDragged( + x - relativeBounds.left, + y - relativeBounds.top, + button, + x2 - relativeBounds.left, + y2 - relativeBounds.top + ); + return false; + } + + @Override + public boolean mouseScrolled(double x, double y, double f) { + if (vanillaButton != null) + return vanillaButton.mouseScrolled(x - relativeBounds.left, y - relativeBounds.top, f); + return false; + } + + @Override + public boolean keyPressed(int i, int j, int k) { + if (vanillaButton != null) + return vanillaButton.keyPressed(i, j, k); + return false; + } + + @Override + public boolean keyReleased(int i, int j, int k) { + if (vanillaButton != null) + return vanillaButton.keyReleased(i, j, k); + return false; + } + + @Override + public boolean charTyped(char c, int i) { + if (vanillaButton != null) + return vanillaButton.charTyped(c, i); + return false; + } + + @Override + public boolean changeFocus(boolean bl) { + if (vanillaButton != null) + return vanillaButton.changeFocus(bl); + return false; + } + + @Override + public boolean isMouseOver(double x, double y) { + if (vanillaButton != null) + return vanillaButton.isMouseOver(x, y); + return false; + } + } diff --git a/src/main/java/org/betterx/ui/layout/components/Component.java b/src/main/java/org/betterx/ui/layout/components/Component.java index e830cde3..b1e26ded 100644 --- a/src/main/java/org/betterx/ui/layout/components/Component.java +++ b/src/main/java/org/betterx/ui/layout/components/Component.java @@ -7,8 +7,9 @@ import org.betterx.ui.layout.values.DynamicSize; import org.betterx.ui.layout.values.Rectangle; import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.gui.components.events.GuiEventListener; -public abstract class Component implements ComponentWithBounds { +public abstract class Component implements ComponentWithBounds, GuiEventListener { protected final R renderer; protected final DynamicSize width; protected final DynamicSize height; @@ -78,8 +79,8 @@ public abstract class Component implements Componen } } - void mouseEvent(MouseEvent event, int x, int y) { - onMouseEvent(event, x, y); + boolean mouseEvent(MouseEvent event, int x, int y) { + return onMouseEvent(event, x, y); } public boolean onMouseEvent(MouseEvent event, int x, int y) { diff --git a/src/main/java/org/betterx/ui/layout/components/HorizontalStack.java b/src/main/java/org/betterx/ui/layout/components/HorizontalStack.java index 31d7ae05..12060d87 100644 --- a/src/main/java/org/betterx/ui/layout/components/HorizontalStack.java +++ b/src/main/java/org/betterx/ui/layout/components/HorizontalStack.java @@ -105,12 +105,14 @@ public class HorizontalStack extends Component { } @Override - void mouseEvent(MouseEvent event, int x, int y) { + boolean mouseEvent(MouseEvent event, int x, int y) { if (!onMouseEvent(event, x, y)) { for (Component c : components) { - c.mouseEvent(event, x - relativeBounds.left, y - relativeBounds.top); + if (c.mouseEvent(event, x - relativeBounds.left, y - relativeBounds.top)) + return true; } } + return false; } public static HorizontalStack centered(Component c) { @@ -142,4 +144,98 @@ public class HorizontalStack extends Component { public HorizontalStack addFiller() { return addEmpty(DynamicSize.fill()); } + + @Override + public void mouseMoved(double x, double y) { + for (Component c : components) { + c.mouseMoved(x - relativeBounds.left, y - relativeBounds.top); + } + } + + @Override + public boolean mouseClicked(double x, double y, int button) { + for (Component c : components) { + if (c.mouseClicked(x - relativeBounds.left, y - relativeBounds.top, button)) + return true; + } + return false; + } + + @Override + public boolean mouseReleased(double x, double y, int button) { + for (Component c : components) { + if (c.mouseReleased(x - relativeBounds.left, y - relativeBounds.top, button)) + return true; + } + return false; + } + + @Override + public boolean mouseDragged(double x, double y, int button, double x2, double y2) { + for (Component c : components) { + if (c.mouseDragged( + x - relativeBounds.left, + y - relativeBounds.top, + button, + x2 - relativeBounds.left, + y2 - relativeBounds.top + )) + return true; + } + return false; + } + + @Override + public boolean mouseScrolled(double x, double y, double f) { + for (Component c : components) { + if (c.mouseScrolled(x - relativeBounds.left, y - relativeBounds.top, f)) + return true; + } + return false; + } + + @Override + public boolean keyPressed(int i, int j, int k) { + for (Component c : components) { + if (c.keyPressed(i, j, k)) + return true; + } + return false; + } + + @Override + public boolean keyReleased(int i, int j, int k) { + for (Component c : components) { + if (c.keyReleased(i, j, k)) + return true; + } + return false; + } + + @Override + public boolean charTyped(char cc, int i) { + for (Component c : components) { + if (c.charTyped(cc, i)) + return true; + } + return false; + } + + @Override + public boolean changeFocus(boolean bl) { + for (Component c : components) { + if (c.changeFocus(bl)) + return true; + } + return false; + } + + @Override + public boolean isMouseOver(double x, double y) { + for (Component c : components) { + if (c.isMouseOver(x, y)) + return true; + } + return false; + } } diff --git a/src/main/java/org/betterx/ui/layout/components/Panel.java b/src/main/java/org/betterx/ui/layout/components/Panel.java index aadcadba..35363d7b 100644 --- a/src/main/java/org/betterx/ui/layout/components/Panel.java +++ b/src/main/java/org/betterx/ui/layout/components/Panel.java @@ -5,8 +5,9 @@ import org.betterx.ui.layout.components.input.MouseEvent; import org.betterx.ui.layout.values.Rectangle; import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.gui.components.events.GuiEventListener; -public class Panel implements ComponentWithBounds { +public class Panel implements ComponentWithBounds, GuiEventListener { protected Component child; public final Rectangle bounds; @@ -18,10 +19,11 @@ public class Panel implements ComponentWithBounds { this.child = c; } - public void mouseEvent(MouseEvent event, int x, int y) { + public boolean mouseEvent(MouseEvent event, int x, int y) { if (child != null) { - child.mouseEvent(event, x - bounds.left, y - bounds.top); + return child.mouseEvent(event, x - bounds.left, y - bounds.top); } + return false; } public void calculateLayout() { @@ -42,4 +44,73 @@ public class Panel implements ComponentWithBounds { public Rectangle getRelativeBounds() { return bounds; } + + @Override + public void mouseMoved(double x, double y) { + if (child != null) + child.mouseMoved(x - bounds.left, y - bounds.top); + } + + @Override + public boolean mouseClicked(double x, double y, int button) { + if (child != null) + return child.mouseClicked(x - bounds.left, y - bounds.top, button); + return false; + } + + @Override + public boolean mouseReleased(double x, double y, int button) { + if (child != null) + return child.mouseReleased(x - bounds.left, y - bounds.top, button); + return false; + } + + @Override + public boolean mouseDragged(double x, double y, int button, double x2, double y2) { + if (child != null) + return child.mouseDragged(x - bounds.left, y - bounds.top, button, x2 - bounds.left, y2 - bounds.top); + return false; + } + + @Override + public boolean mouseScrolled(double x, double y, double f) { + if (child != null) + return child.mouseScrolled(x - bounds.left, y - bounds.top, f); + return false; + } + + @Override + public boolean keyPressed(int i, int j, int k) { + if (child != null) + return child.keyPressed(i, j, k); + return false; + } + + @Override + public boolean keyReleased(int i, int j, int k) { + if (child != null) + return child.keyReleased(i, j, k); + return false; + } + + @Override + public boolean charTyped(char c, int i) { + if (child != null) + return child.charTyped(c, i); + return false; + } + + @Override + public boolean changeFocus(boolean bl) { + if (child != null) + return child.changeFocus(bl); + return false; + } + + @Override + public boolean isMouseOver(double x, double y) { + if (child != null) + return child.isMouseOver(x, y); + return false; + } } diff --git a/src/main/java/org/betterx/ui/layout/components/VerticalScroll.java b/src/main/java/org/betterx/ui/layout/components/VerticalScroll.java index 8ee8d151..1e8d1e64 100644 --- a/src/main/java/org/betterx/ui/layout/components/VerticalScroll.java +++ b/src/main/java/org/betterx/ui/layout/components/VerticalScroll.java @@ -72,12 +72,14 @@ public class VerticalScroll relativeBounds.height; } + + @Override + public void mouseMoved(double x, double y) { + if (child != null) + child.mouseMoved(x, y); + } + + @Override + public boolean mouseClicked(double x, double y, int button) { + Rectangle scroller = scrollerRenderer.getScrollerBounds(relativeBounds); + Rectangle picker = scrollerRenderer.getPickerBounds(scroller, saveScrollerY(), scrollerHeight); + if (picker.contains((int) x, (int) y)) { + mouseDown = true; + mouseDownY = (int) y; + scrollerDownY = saveScrollerY(); + return true; + } + + if (child != null) + return child.mouseClicked(x, y, button); + return false; + } + + @Override + public boolean mouseReleased(double x, double y, int button) { + mouseDown = false; + if (child != null) + return child.mouseReleased(x - relativeBounds.left, y - relativeBounds.top, button); + return false; + } + + @Override + public boolean mouseDragged(double x, double y, int button, double x2, double y2) { + if (mouseDown) { + int delta = (int) y - mouseDownY; + scrollerY = scrollerDownY + delta; + return true; + } + if (child != null) + return child.mouseDragged(x, y, button, x2, y2); + return false; + } + + @Override + public boolean mouseScrolled(double x, double y, double f) { + if (child != null) + return child.mouseScrolled(x, y, f); + return false; + } + + @Override + public boolean keyPressed(int i, int j, int k) { + if (child != null) + return child.keyPressed(i, j, k); + return false; + } + + @Override + public boolean keyReleased(int i, int j, int k) { + if (child != null) + return child.keyReleased(i, j, k); + return false; + } + + @Override + public boolean charTyped(char c, int i) { + if (child != null) + return child.charTyped(c, i); + return false; + } + + @Override + public boolean changeFocus(boolean bl) { + if (child != null) + return child.changeFocus(bl); + return false; + } + + @Override + public boolean isMouseOver(double x, double y) { + if (child != null) + return child.isMouseOver(x, y); + return false; + } } diff --git a/src/main/java/org/betterx/ui/layout/components/VerticalStack.java b/src/main/java/org/betterx/ui/layout/components/VerticalStack.java index 5a480a3f..d6ad2980 100644 --- a/src/main/java/org/betterx/ui/layout/components/VerticalStack.java +++ b/src/main/java/org/betterx/ui/layout/components/VerticalStack.java @@ -104,12 +104,14 @@ public class VerticalStack extends Component { } @Override - void mouseEvent(MouseEvent event, int x, int y) { + boolean mouseEvent(MouseEvent event, int x, int y) { if (!onMouseEvent(event, x, y)) { for (Component c : components) { - c.mouseEvent(event, x - relativeBounds.left, y - relativeBounds.top); + if (c.mouseEvent(event, x - relativeBounds.left, y - relativeBounds.top)) + return true; } } + return false; } public static VerticalStack centered(Component c) { @@ -141,4 +143,98 @@ public class VerticalStack extends Component { public VerticalStack addFiller() { return addEmpty(DynamicSize.fill()); } + + @Override + public void mouseMoved(double x, double y) { + for (Component c : components) { + c.mouseMoved(x - relativeBounds.left, y - relativeBounds.top); + } + } + + @Override + public boolean mouseClicked(double x, double y, int button) { + for (Component c : components) { + if (c.mouseClicked(x - relativeBounds.left, y - relativeBounds.top, button)) + return true; + } + return false; + } + + @Override + public boolean mouseReleased(double x, double y, int button) { + for (Component c : components) { + if (c.mouseReleased(x - relativeBounds.left, y - relativeBounds.top, button)) + return true; + } + return false; + } + + @Override + public boolean mouseDragged(double x, double y, int button, double x2, double y2) { + for (Component c : components) { + if (c.mouseDragged( + x - relativeBounds.left, + y - relativeBounds.top, + button, + x2 - relativeBounds.left, + y2 - relativeBounds.top + )) + return true; + } + return false; + } + + @Override + public boolean mouseScrolled(double x, double y, double f) { + for (Component c : components) { + if (c.mouseScrolled(x - relativeBounds.left, y - relativeBounds.top, f)) + return true; + } + return false; + } + + @Override + public boolean keyPressed(int i, int j, int k) { + for (Component c : components) { + if (c.keyPressed(i, j, k)) + return true; + } + return false; + } + + @Override + public boolean keyReleased(int i, int j, int k) { + for (Component c : components) { + if (c.keyReleased(i, j, k)) + return true; + } + return false; + } + + @Override + public boolean charTyped(char cc, int i) { + for (Component c : components) { + if (c.charTyped(cc, i)) + return true; + } + return false; + } + + @Override + public boolean changeFocus(boolean bl) { + for (Component c : components) { + if (c.changeFocus(bl)) + return true; + } + return false; + } + + @Override + public boolean isMouseOver(double x, double y) { + for (Component c : components) { + if (c.isMouseOver(x, y)) + return true; + } + return false; + } } diff --git a/src/main/java/org/betterx/ui/layout/components/input/MouseEvent.java b/src/main/java/org/betterx/ui/layout/components/input/MouseEvent.java index 5bffb78b..29b9003b 100644 --- a/src/main/java/org/betterx/ui/layout/components/input/MouseEvent.java +++ b/src/main/java/org/betterx/ui/layout/components/input/MouseEvent.java @@ -1,5 +1,5 @@ package org.betterx.ui.layout.components.input; public enum MouseEvent { - DOWN, UP, MOVE + DOWN, UP, MOVE, DRAG, SCROLL }