From 4ddd753f57ddc89545f072747cede01fab1562a9 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 24 Feb 2025 14:34:15 -0700 Subject: [PATCH 1/6] add overloads, methods, and improve rich text --- .../modularui/drawable/text/RichText.java | 14 +++++++ .../modularui/widgets/RichTextWidget.java | 41 ++++++++----------- 2 files changed, 32 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/cleanroommc/modularui/drawable/text/RichText.java b/src/main/java/com/cleanroommc/modularui/drawable/text/RichText.java index 21ee86a02..c66b4cf82 100644 --- a/src/main/java/com/cleanroommc/modularui/drawable/text/RichText.java +++ b/src/main/java/com/cleanroommc/modularui/drawable/text/RichText.java @@ -5,6 +5,8 @@ import com.cleanroommc.modularui.theme.WidgetTheme; import com.cleanroommc.modularui.utils.Alignment; +import com.cleanroommc.modularui.widget.sizer.Area; + import net.minecraft.client.gui.FontRenderer; import java.util.ArrayList; @@ -166,11 +168,23 @@ public void draw(GuiContext context, int x, int y, int width, int height, Widget } public void draw(GuiContext context, int x, int y, int width, int height, int color, boolean shadow) { + draw(renderer, context, x, y, width, height, color, shadow); + } + + public void draw(TextRenderer renderer, GuiContext context, int x, int y, int width, int height, int color, boolean shadow) { renderer.setSimulate(false); setupRenderer(renderer, x, y, width, height, color, shadow); this.cachedText = renderer.compileAndDraw(context, this.elements); } + public int getLastHeight() { + return (int) renderer.getLastHeight(); + } + + public int getLastWidth() { + return (int) renderer.getLastWidth(); + } + public void setupRenderer(TextRenderer renderer, int x, int y, float width, float height, int color, boolean shadow) { renderer.setPos(x, y); renderer.setScale(this.scale); diff --git a/src/main/java/com/cleanroommc/modularui/widgets/RichTextWidget.java b/src/main/java/com/cleanroommc/modularui/widgets/RichTextWidget.java index efe51bfcc..e6c958dcf 100644 --- a/src/main/java/com/cleanroommc/modularui/widgets/RichTextWidget.java +++ b/src/main/java/com/cleanroommc/modularui/widgets/RichTextWidget.java @@ -42,9 +42,7 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { @Override public void drawForeground(ModularGuiContext context) { super.drawForeground(context); - Object o = this.text.getHoveringElement(context.getFontRenderer(), context.getMouseX(), context.getMouseY()); - //ModularUI.LOGGER.info("Mouse {}, {}", context.getMouseX(), context.getMouseY()); - if (o instanceof IHoverable hoverable) { + if (getHoveredElement(context) instanceof IHoverable hoverable) { hoverable.onHover(); RichTooltip tooltip = hoverable.getTooltip(); if (tooltip != null) { @@ -55,8 +53,7 @@ public void drawForeground(ModularGuiContext context) { @Override public @NotNull Result onMousePressed(int mouseButton) { - Object o = this.text.getHoveringElement(getContext().getFontRenderer(), getContext().getMouseX(), getContext().getMouseY()); - if (o instanceof Interactable interactable) { + if (getHoveredElement() instanceof Interactable interactable) { return interactable.onMousePressed(mouseButton); } return Result.ACCEPT; @@ -64,8 +61,7 @@ public void drawForeground(ModularGuiContext context) { @Override public boolean onMouseRelease(int mouseButton) { - Object o = this.text.getHoveringElement(getContext().getFontRenderer(), getContext().getMouseX(), getContext().getMouseY()); - if (o instanceof Interactable interactable) { + if (getHoveredElement() instanceof Interactable interactable) { return interactable.onMouseRelease(mouseButton); } return false; @@ -73,8 +69,7 @@ public boolean onMouseRelease(int mouseButton) { @Override public @NotNull Result onMouseTapped(int mouseButton) { - Object o = this.text.getHoveringElement(getContext().getFontRenderer(), getContext().getMouseX(), getContext().getMouseY()); - if (o instanceof Interactable interactable) { + if (getHoveredElement() instanceof Interactable interactable) { return interactable.onMouseTapped(mouseButton); } return Result.IGNORE; @@ -82,8 +77,7 @@ public boolean onMouseRelease(int mouseButton) { @Override public @NotNull Result onKeyPressed(char typedChar, int keyCode) { - Object o = this.text.getHoveringElement(getContext().getFontRenderer(), getContext().getMouseX(), getContext().getMouseY()); - if (o instanceof Interactable interactable) { + if (getHoveredElement() instanceof Interactable interactable) { return interactable.onKeyPressed(typedChar, keyCode); } return Result.ACCEPT; @@ -91,8 +85,7 @@ public boolean onMouseRelease(int mouseButton) { @Override public boolean onKeyRelease(char typedChar, int keyCode) { - Object o = this.text.getHoveringElement(getContext().getFontRenderer(), getContext().getMouseX(), getContext().getMouseY()); - if (o instanceof Interactable interactable) { + if (getHoveredElement() instanceof Interactable interactable) { return interactable.onKeyRelease(typedChar, keyCode); } return false; @@ -100,8 +93,7 @@ public boolean onKeyRelease(char typedChar, int keyCode) { @Override public @NotNull Result onKeyTapped(char typedChar, int keyCode) { - Object o = this.text.getHoveringElement(getContext().getFontRenderer(), getContext().getMouseX(), getContext().getMouseY()); - if (o instanceof Interactable interactable) { + if (getHoveredElement() instanceof Interactable interactable) { return interactable.onKeyTapped(typedChar, keyCode); } return Result.ACCEPT; @@ -109,8 +101,7 @@ public boolean onKeyRelease(char typedChar, int keyCode) { @Override public boolean onMouseScroll(ModularScreen.UpOrDown scrollDirection, int amount) { - Object o = this.text.getHoveringElement(getContext().getFontRenderer(), getContext().getMouseX(), getContext().getMouseY()); - if (o instanceof Interactable interactable) { + if (getHoveredElement() instanceof Interactable interactable) { return interactable.onMouseScroll(scrollDirection, amount); } return false; @@ -118,19 +109,23 @@ public boolean onMouseScroll(ModularScreen.UpOrDown scrollDirection, int amount) @Override public void onMouseDrag(int mouseButton, long timeSinceClick) { - Object o = this.text.getHoveringElement(getContext().getFontRenderer(), getContext().getMouseX(), getContext().getMouseY()); - if (o instanceof Interactable interactable) { + if (getHoveredElement() instanceof Interactable interactable) { interactable.onMouseDrag(mouseButton, timeSinceClick); } } @Nullable public Object getHoveredElement() { + return getHoveredElement(getContext()); + } + + @Nullable + public Object getHoveredElement(ModularGuiContext context) { if (!isHovering()) return null; - getContext().pushMatrix(); - getContext().translate(getArea().x, getArea().y); - Object o = this.text.getHoveringElement(getContext()); - getContext().popMatrix(); + context.pushMatrix(); + context.translate(getArea().x, getArea().y); + Object o = this.text.getHoveringElement(context); + context.popMatrix(); return o; } From e2e453d6da99968317ebed6f71d5683c2f1421f1 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 28 Feb 2025 15:39:13 -0700 Subject: [PATCH 2/6] fix off by one trim --- .../cleanroommc/modularui/drawable/text/RichTextCompiler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cleanroommc/modularui/drawable/text/RichTextCompiler.java b/src/main/java/com/cleanroommc/modularui/drawable/text/RichTextCompiler.java index 8ed49610e..9d7f7cba1 100644 --- a/src/main/java/com/cleanroommc/modularui/drawable/text/RichTextCompiler.java +++ b/src/main/java/com/cleanroommc/modularui/drawable/text/RichTextCompiler.java @@ -209,7 +209,7 @@ public static String trimRight(String s) { for (; i >= 0; i--) { if (!Character.isWhitespace(s.charAt(i))) break; } - if (i < s.length() - 1) s = s.substring(0, i); + if (i < s.length() - 1) s = s.substring(0, i + 1); return s; } From 84aa195b251e6c242f1dd7ea6b2f70d45bd8a53e Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 28 Feb 2025 15:41:30 -0700 Subject: [PATCH 3/6] no need to translate --- .../com/cleanroommc/modularui/widgets/RichTextWidget.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/com/cleanroommc/modularui/widgets/RichTextWidget.java b/src/main/java/com/cleanroommc/modularui/widgets/RichTextWidget.java index e6c958dcf..24bad3afd 100644 --- a/src/main/java/com/cleanroommc/modularui/widgets/RichTextWidget.java +++ b/src/main/java/com/cleanroommc/modularui/widgets/RichTextWidget.java @@ -122,11 +122,7 @@ public Object getHoveredElement() { @Nullable public Object getHoveredElement(ModularGuiContext context) { if (!isHovering()) return null; - context.pushMatrix(); - context.translate(getArea().x, getArea().y); - Object o = this.text.getHoveringElement(context); - context.popMatrix(); - return o; + return this.text.getHoveringElement(context); } @Override From 5cc68c81080626753c23425aed0a4fde8e6a5b31 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sat, 1 Mar 2025 21:52:05 -0700 Subject: [PATCH 4/6] increment x by space width --- .../cleanroommc/modularui/drawable/text/RichTextCompiler.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/cleanroommc/modularui/drawable/text/RichTextCompiler.java b/src/main/java/com/cleanroommc/modularui/drawable/text/RichTextCompiler.java index 9d7f7cba1..fb1bfe3dd 100644 --- a/src/main/java/com/cleanroommc/modularui/drawable/text/RichTextCompiler.java +++ b/src/main/java/com/cleanroommc/modularui/drawable/text/RichTextCompiler.java @@ -63,7 +63,9 @@ private void compile(List raw) { if (o instanceof IKey key) { if (key == IKey.EMPTY) continue; if (key == IKey.SPACE) { - addLineElement(key.get()); + text = key.get(); + addLineElement(text); + x += fr.getStringWidth(text); // space is typically 4 pixels continue; } if (key == IKey.LINE_FEED) { From 992d2b1d71c3337213ddc5a9474c8746f978dfea Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sat, 8 Mar 2025 18:01:31 -0700 Subject: [PATCH 5/6] add back translate in ClientScreenHandler --- .../com/cleanroommc/modularui/screen/ClientScreenHandler.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/cleanroommc/modularui/screen/ClientScreenHandler.java b/src/main/java/com/cleanroommc/modularui/screen/ClientScreenHandler.java index f94f69915..f37e2b0f6 100644 --- a/src/main/java/com/cleanroommc/modularui/screen/ClientScreenHandler.java +++ b/src/main/java/com/cleanroommc/modularui/screen/ClientScreenHandler.java @@ -517,7 +517,10 @@ public static void drawDebugScreen(@Nullable ModularScreen muiScreen, @Nullable } else if (hovered instanceof RichTextWidget richTextWidget) { drawSegmentLine(lineY -= 4, color); lineY -= 10; + context.pushMatrix(); + context.translate(richTextWidget.getArea().x, richTextWidget.getArea().y); Object hoveredElement = richTextWidget.getHoveredElement(); + context.popMatrix(); GuiDraw.drawText("Hovered: " + hoveredElement, 5, lineY, 1, color, false); } } From 2ca19ca2f9939140ec0a004582c694f70ba630d5 Mon Sep 17 00:00:00 2001 From: brachy84 Date: Thu, 2 Oct 2025 09:41:02 +0200 Subject: [PATCH 6/6] fix --- .../modularui/drawable/text/RichText.java | 19 +++++++++++++++---- .../modularui/screen/ClientScreenHandler.java | 2 ++ .../cleanroommc/modularui/test/TestGuis.java | 2 +- .../modularui/widgets/RichTextWidget.java | 15 +++++++++++++++ 4 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/cleanroommc/modularui/drawable/text/RichText.java b/src/main/java/com/cleanroommc/modularui/drawable/text/RichText.java index 5933f17ea..fb79a27f7 100644 --- a/src/main/java/com/cleanroommc/modularui/drawable/text/RichText.java +++ b/src/main/java/com/cleanroommc/modularui/drawable/text/RichText.java @@ -1,11 +1,14 @@ package com.cleanroommc.modularui.drawable.text; -import com.cleanroommc.modularui.api.drawable.*; +import com.cleanroommc.modularui.api.drawable.IDrawable; +import com.cleanroommc.modularui.api.drawable.IIcon; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.api.drawable.IRichTextBuilder; +import com.cleanroommc.modularui.api.drawable.ITextLine; import com.cleanroommc.modularui.screen.viewport.GuiContext; import com.cleanroommc.modularui.theme.WidgetTheme; import com.cleanroommc.modularui.utils.Alignment; import com.cleanroommc.modularui.utils.TooltipLines; -import com.cleanroommc.modularui.widget.sizer.Area; import net.minecraft.client.gui.FontRenderer; @@ -276,11 +279,11 @@ public void draw(TextRenderer renderer, GuiContext context, int x, int y, int wi } public int getLastHeight() { - return (int) renderer.getLastHeight(); + return (int) renderer.getLastTrimmedHeight(); } public int getLastWidth() { - return (int) renderer.getLastWidth(); + return (int) renderer.getLastTrimmedWidth(); } public void setupRenderer(TextRenderer renderer, int x, int y, float width, float height, int color, boolean shadow) { @@ -298,6 +301,14 @@ public List compileAndDraw(TextRenderer renderer, GuiContext context, return this.cachedText; } + /** + * Returns the currently hovered element of this rich text or {@code null} if none is hovered. + * Note that this method assumes, that the {@link com.cleanroommc.modularui.api.layout.IViewportStack IViewportStack} + * is transformed to 0,0 of this {@link IDrawable}. + * + * @param context the viewport stack with transformation to this widget + * @return hovered element or null + */ public Object getHoveringElement(GuiContext context) { return getHoveringElement(context.getFontRenderer(), context.getMouseX(), context.getMouseY()); } diff --git a/src/main/java/com/cleanroommc/modularui/screen/ClientScreenHandler.java b/src/main/java/com/cleanroommc/modularui/screen/ClientScreenHandler.java index c46eafe93..888ccb64c 100644 --- a/src/main/java/com/cleanroommc/modularui/screen/ClientScreenHandler.java +++ b/src/main/java/com/cleanroommc/modularui/screen/ClientScreenHandler.java @@ -588,7 +588,9 @@ public static void drawDebugScreen(@Nullable ModularScreen muiScreen, @Nullable } else if (hovered instanceof RichTextWidget richTextWidget) { drawSegmentLine(lineY -= 4, scale, color); lineY -= 10; + locatedHovered.applyMatrix(context); Object hoveredElement = richTextWidget.getHoveredElement(); + locatedHovered.unapplyMatrix(context); GuiDraw.drawText("Hovered: " + hoveredElement, 5, lineY, scale, color, true); } } diff --git a/src/main/java/com/cleanroommc/modularui/test/TestGuis.java b/src/main/java/com/cleanroommc/modularui/test/TestGuis.java index 8361157e5..e12f55092 100644 --- a/src/main/java/com/cleanroommc/modularui/test/TestGuis.java +++ b/src/main/java/com/cleanroommc/modularui/test/TestGuis.java @@ -67,7 +67,7 @@ public class TestGuis extends CustomModularScreen { @Override public @NotNull ModularPanel buildUI(ModularGuiContext context) { - return buildToggleGridListUI(context); + return buildRichTextUI(context); } public @NotNull ModularPanel buildToggleGridListUI(ModularGuiContext context) { diff --git a/src/main/java/com/cleanroommc/modularui/widgets/RichTextWidget.java b/src/main/java/com/cleanroommc/modularui/widgets/RichTextWidget.java index 9fcee5764..0f1dcd7e2 100644 --- a/src/main/java/com/cleanroommc/modularui/widgets/RichTextWidget.java +++ b/src/main/java/com/cleanroommc/modularui/widgets/RichTextWidget.java @@ -114,11 +114,26 @@ public void onMouseDrag(int mouseButton, long timeSinceClick) { } } + /** + * Returns the currently hovered element of this rich text or {@code null} if none is hovered. + * Note that this method assumes, that the {@link com.cleanroommc.modularui.api.layout.IViewportStack IViewportStack} + * is transformed to this widget. + * + * @return hovered element or null + */ @Nullable public Object getHoveredElement() { return getHoveredElement(getContext()); } + /** + * Returns the currently hovered element of this rich text or {@code null} if none is hovered. + * Note that this method assumes, that the {@link com.cleanroommc.modularui.api.layout.IViewportStack IViewportStack} + * is transformed to this widget. + * + * @param context the viewport stack with transformation to this widget + * @return hovered element or null + */ @Nullable public Object getHoveredElement(ModularGuiContext context) { if (!isHovering()) return null;