Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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);
Expand All @@ -286,6 +301,14 @@ public List<ITextLine> 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());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/cleanroommc/modularui/test/TestGuis.java
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
54 changes: 30 additions & 24 deletions src/main/java/com/cleanroommc/modularui/widgets/RichTextWidget.java
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -55,83 +53,91 @@ 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;
}

@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;
}

@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;
}

@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;
}

@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;
}

@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;
}

@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;
}

@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
Expand Down