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 66e8f126..fb79a27f 100644 --- a/src/main/java/com/cleanroommc/modularui/drawable/text/RichText.java +++ b/src/main/java/com/cleanroommc/modularui/drawable/text/RichText.java @@ -1,10 +1,13 @@ 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 net.minecraft.client.gui.FontRenderer; @@ -266,11 +269,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.getLastTrimmedHeight(); + } + + public int getLastWidth() { + return (int) renderer.getLastTrimmedWidth(); + } + 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); @@ -286,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 c46eafe9..888ccb64 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 8361157e..e12f5509 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 f2b9f217..0f1dcd7e 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, WidgetThemeEntry 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(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,20 +109,35 @@ public boolean onMouseScroll(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); } } + /** + * 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; - getContext().pushMatrix(); - getContext().translate(getArea().x, getArea().y); - Object o = this.text.getHoveringElement(getContext()); - getContext().popMatrix(); - return o; + return this.text.getHoveringElement(context); } @Override