From ca81b5a720c4c4bf7f8fbd4b0527b61a882ac051 Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 15 Jul 2022 02:45:08 +0200 Subject: [PATCH] Fixed Hover Rendering --- .../bclib/client/gui/modmenu/TestScreen.java | 2 +- .../betterx/ui/layout/components/Button.java | 8 ++-- .../ui/layout/components/Component.java | 15 +++++-- .../ui/layout/components/HorizontalStack.java | 22 +++++++--- .../betterx/ui/layout/components/Panel.java | 21 +++++----- .../ui/layout/components/VerticalScroll.java | 15 +++++-- .../ui/layout/components/VerticalStack.java | 24 ++++++++--- .../input/RelativeContainerEventHandler.java | 42 +++++++++++++++++++ .../components/render/ComponentRenderer.java | 2 +- 9 files changed, 117 insertions(+), 34 deletions(-) create mode 100644 src/main/java/org/betterx/ui/layout/components/input/RelativeContainerEventHandler.java 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 54b15deb..569be560 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 @@ -50,7 +50,7 @@ public class TestScreen extends Screen { rows.addFiller(); main.setChild(HorizontalStack.centered(rows)); main.calculateLayout(); - + addRenderableWidget(main); } 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 70715811..620cb3ca 100644 --- a/src/main/java/org/betterx/ui/layout/components/Button.java +++ b/src/main/java/org/betterx/ui/layout/components/Button.java @@ -21,14 +21,14 @@ class ButtonRenderer implements ComponentRenderer { } public int getHeight(net.minecraft.network.chat.Component c) { - return getFont().lineHeight + 12; + return getFont().lineHeight + 11; } @Override - public void renderInBounds(PoseStack poseStack, Rectangle bounds, Rectangle clipRect) { + public void renderInBounds(PoseStack poseStack, int x, int y, float a, Rectangle bounds, Rectangle clipRect) { if (linkedButton != null) { if (linkedButton.vanillaButton != null) { - linkedButton.vanillaButton.render(poseStack, linkedButton.mouseX, linkedButton.mouseY, 1); + linkedButton.vanillaButton.render(poseStack, x, y, a); } } @@ -94,6 +94,8 @@ public class Button extends Component { @Override public void mouseMoved(double x, double y) { + mouseX = (int) x; + mouseY = (int) y; if (vanillaButton != null) vanillaButton.mouseMoved(x - relativeBounds.left, y - relativeBounds.top); } 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 b1e26ded..c1938ce6 100644 --- a/src/main/java/org/betterx/ui/layout/components/Component.java +++ b/src/main/java/org/betterx/ui/layout/components/Component.java @@ -62,20 +62,27 @@ public abstract class Component implements Componen return height.calculatedSize(); } - public void render(PoseStack poseStack, Rectangle parentBounds, Rectangle clipRect) { + public void render(PoseStack poseStack, int x, int y, float a, Rectangle parentBounds, Rectangle clipRect) { Rectangle r = relativeBounds.movedBy(parentBounds.left, parentBounds.top); Rectangle clip = r.intersect(clipRect); poseStack.pushPose(); poseStack.translate(relativeBounds.left, relativeBounds.top, 0); if (r.overlaps(clip)) { - renderInBounds(poseStack, r, clip); + renderInBounds(poseStack, x - relativeBounds.left, y - relativeBounds.top, a, r, clip); } poseStack.popPose(); } - protected void renderInBounds(PoseStack poseStack, Rectangle renderBounds, Rectangle clipRect) { + protected void renderInBounds( + PoseStack poseStack, + int x, + int y, + float a, + Rectangle renderBounds, + Rectangle clipRect + ) { if (renderer != null) { - renderer.renderInBounds(poseStack, renderBounds, clipRect); + renderer.renderInBounds(poseStack, x, y, a, renderBounds, clipRect); } } 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 26ff84ef..6f538f31 100644 --- a/src/main/java/org/betterx/ui/layout/components/HorizontalStack.java +++ b/src/main/java/org/betterx/ui/layout/components/HorizontalStack.java @@ -1,20 +1,20 @@ package org.betterx.ui.layout.components; import org.betterx.ui.layout.components.input.MouseEvent; +import org.betterx.ui.layout.components.input.RelativeContainerEventHandler; import org.betterx.ui.layout.components.render.ComponentRenderer; import org.betterx.ui.layout.values.Alignment; 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.ContainerEventHandler; import net.minecraft.client.gui.components.events.GuiEventListener; import java.util.LinkedList; import java.util.List; import org.jetbrains.annotations.Nullable; -public class HorizontalStack extends Component implements ContainerEventHandler { +public class HorizontalStack extends Component implements RelativeContainerEventHandler { protected final List> components = new LinkedList<>(); public HorizontalStack(DynamicSize width, DynamicSize height) { @@ -100,10 +100,17 @@ public class HorizontalStack extends Component i // } @Override - protected void renderInBounds(PoseStack poseStack, Rectangle renderBounds, Rectangle clipRect) { - super.renderInBounds(poseStack, renderBounds, clipRect); + protected void renderInBounds( + PoseStack poseStack, + int x, + int y, + float a, + Rectangle renderBounds, + Rectangle clipRect + ) { + super.renderInBounds(poseStack, x, y, a, renderBounds, clipRect); for (Component c : components) { - c.render(poseStack, renderBounds, clipRect); + c.render(poseStack, x, y, a, renderBounds, clipRect); } } @@ -153,6 +160,11 @@ public class HorizontalStack extends Component i return components; } + @Override + public Rectangle getInputBounds() { + return relativeBounds; + } + boolean dragging; @Override 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 305e3720..296fa207 100644 --- a/src/main/java/org/betterx/ui/layout/components/Panel.java +++ b/src/main/java/org/betterx/ui/layout/components/Panel.java @@ -2,11 +2,11 @@ package org.betterx.ui.layout.components; import org.betterx.ui.layout.components.input.MouseEvent; +import org.betterx.ui.layout.components.input.RelativeContainerEventHandler; import org.betterx.ui.layout.values.Rectangle; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.gui.components.Widget; -import net.minecraft.client.gui.components.events.ContainerEventHandler; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.narration.NarratableEntry; import net.minecraft.client.gui.narration.NarrationElementOutput; @@ -14,7 +14,7 @@ import net.minecraft.client.gui.narration.NarrationElementOutput; import java.util.List; import org.jetbrains.annotations.Nullable; -public class Panel implements ComponentWithBounds, ContainerEventHandler, NarratableEntry, Widget { +public class Panel implements ComponentWithBounds, RelativeContainerEventHandler, NarratableEntry, Widget { protected Component child; List listeners = List.of(); public final Rectangle bounds; @@ -43,12 +43,6 @@ public class Panel implements ComponentWithBounds, ContainerEventHandler, Narrat } } - public void render(PoseStack poseStack) { - if (child != null) { - child.render(poseStack, bounds, bounds); - } - } - @Override public Rectangle getRelativeBounds() { return bounds; @@ -59,6 +53,11 @@ public class Panel implements ComponentWithBounds, ContainerEventHandler, Narrat return listeners; } + @Override + public Rectangle getInputBounds() { + return bounds; + } + boolean dragging = false; @Override @@ -95,8 +94,10 @@ public class Panel implements ComponentWithBounds, ContainerEventHandler, Narrat } @Override - public void render(PoseStack poseStack, int i, int j, float f) { - render(poseStack); + public void render(PoseStack poseStack, int x, int y, float a) { + if (child != null) { + child.render(poseStack, x - bounds.left, y - bounds.top, a, bounds, bounds); + } } // @Override // public void mouseMoved(double x, double y) { 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 1e8d1e64..c6ecd423 100644 --- a/src/main/java/org/betterx/ui/layout/components/VerticalScroll.java +++ b/src/main/java/org/betterx/ui/layout/components/VerticalScroll.java @@ -83,13 +83,20 @@ public class VerticalScroll extends Component implements ContainerEventHandler { +public class VerticalStack extends Component implements RelativeContainerEventHandler { protected final List> components = new LinkedList<>(); public VerticalStack(DynamicSize width, DynamicSize height) { @@ -99,10 +99,17 @@ public class VerticalStack extends Component imp } @Override - protected void renderInBounds(PoseStack poseStack, Rectangle renderBounds, Rectangle clipRect) { - super.renderInBounds(poseStack, renderBounds, clipRect); + protected void renderInBounds( + PoseStack poseStack, + int x, + int y, + float a, + Rectangle renderBounds, + Rectangle clipRect + ) { + super.renderInBounds(poseStack, x, y, a, renderBounds, clipRect); for (Component c : components) { - c.render(poseStack, renderBounds, clipRect); + c.render(poseStack, x, y, a, renderBounds, clipRect); } } @@ -152,6 +159,11 @@ public class VerticalStack extends Component imp return components; } + @Override + public Rectangle getInputBounds() { + return relativeBounds; + } + boolean dragging; @Override @@ -177,7 +189,7 @@ public class VerticalStack extends Component imp focused = guiEventListener; } -// @Override + // @Override // public void mouseMoved(double x, double y) { // for (Component c : components) { // c.mouseMoved(x - relativeBounds.left, y - relativeBounds.top); diff --git a/src/main/java/org/betterx/ui/layout/components/input/RelativeContainerEventHandler.java b/src/main/java/org/betterx/ui/layout/components/input/RelativeContainerEventHandler.java new file mode 100644 index 00000000..ed08376b --- /dev/null +++ b/src/main/java/org/betterx/ui/layout/components/input/RelativeContainerEventHandler.java @@ -0,0 +1,42 @@ +package org.betterx.ui.layout.components.input; + +import org.betterx.ui.layout.values.Rectangle; + +import net.minecraft.client.gui.components.events.ContainerEventHandler; +import net.minecraft.client.gui.components.events.GuiEventListener; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; + +import java.util.Optional; + +@Environment(EnvType.CLIENT) +public interface RelativeContainerEventHandler extends ContainerEventHandler { + Rectangle getInputBounds(); + + default Optional getChildAt(double d, double e) { + Rectangle r = getInputBounds(); + return ContainerEventHandler.super.getChildAt(d - r.left, e - r.top); + } + + default boolean mouseClicked(double d, double e, int i) { + Rectangle r = getInputBounds(); + return ContainerEventHandler.super.mouseClicked(d - r.left, e - r.top, i); + } + + default boolean mouseReleased(double d, double e, int i) { + Rectangle r = getInputBounds(); + return ContainerEventHandler.super.mouseReleased(d - r.left, e - r.top, i); + } + + default boolean mouseDragged(double d, double e, int i, double f, double g) { + Rectangle r = getInputBounds(); + return ContainerEventHandler.super.mouseDragged(d - r.left, e - r.top, i, f - r.left, g - r.top); + } + + default boolean mouseScrolled(double d, double e, double f) { + Rectangle r = getInputBounds(); + return ContainerEventHandler.super.mouseScrolled(d - r.left, e - r.top, f); + } +} + diff --git a/src/main/java/org/betterx/ui/layout/components/render/ComponentRenderer.java b/src/main/java/org/betterx/ui/layout/components/render/ComponentRenderer.java index 55c9eef3..6c4117b8 100644 --- a/src/main/java/org/betterx/ui/layout/components/render/ComponentRenderer.java +++ b/src/main/java/org/betterx/ui/layout/components/render/ComponentRenderer.java @@ -5,5 +5,5 @@ import org.betterx.ui.layout.values.Rectangle; import com.mojang.blaze3d.vertex.PoseStack; public interface ComponentRenderer { - void renderInBounds(PoseStack stack, Rectangle bounds, Rectangle clipRect); + void renderInBounds(PoseStack stack, int x, int y, float a, Rectangle bounds, Rectangle clipRect); }