diff --git a/src/main/java/gregtech/api/capability/IMiner.java b/src/main/java/gregtech/api/capability/IMiner.java index 837ee9fd161..5d1fd04553f 100644 --- a/src/main/java/gregtech/api/capability/IMiner.java +++ b/src/main/java/gregtech/api/capability/IMiner.java @@ -5,8 +5,8 @@ import net.minecraftforge.items.IItemHandlerModifiable; import codechicken.lib.vec.Cuboid6; +import com.cleanroommc.modularui.api.drawable.IRichTextBuilder; import com.cleanroommc.modularui.drawable.UITexture; -import com.cleanroommc.modularui.drawable.text.RichText; import com.cleanroommc.modularui.utils.Alignment; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.value.sync.SyncHandlers; @@ -39,7 +39,7 @@ default int getWorkingArea(int maximumRadius) { default Widget createMinerWidgets(@NotNull PanelSyncManager panelSyncManager, @NotNull IItemHandlerModifiable inventory, int inventorySize, @NotNull UITexture textDisplayBackground, - @NotNull Consumer textBuilder) { + @NotNull Consumer> textBuilder) { int rowSize = (int) Math.sqrt(inventorySize); panelSyncManager.registerSlotGroup("export_items", rowSize); diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index 535d1460519..e4f0bc5acf8 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -77,7 +77,6 @@ public class MultiblockUIBuilder { private IKey idlingKey = IKey.lang("gregtech.multiblock.idling").style(TextFormatting.GRAY); private IKey pausedKey = IKey.lang("gregtech.multiblock.work_paused").style(TextFormatting.GOLD); private IKey runningKey = IKey.lang("gregtech.multiblock.running").style(TextFormatting.GREEN); - private boolean dirty; private Runnable onRebuild; @NotNull @@ -797,18 +796,11 @@ public void sync(String key, PanelSyncManager syncManager) { } /** - * Builds the passed in rich text with operations and drawables.
- * Will clear and rebuild if this builder is marked dirty + * Builds the passed in rich text with operations and drawables. * * @param richText the rich text to add drawables to */ public void build(IRichTextBuilder richText) { - if (dirty) { - clear(); - onRebuild(); - runAction(); - dirty = false; - } for (Operation op : operations) { op.accept(richText); } @@ -820,13 +812,6 @@ private void onRebuild() { } } - /** - * Mark this builder as dirty. Will be rebuilt during {@link #build(IRichTextBuilder) build()} - */ - public void markDirty() { - dirty = true; - } - /* * this is run on the server side to write values to the internal syncer * those values are then synced to the client and read back in the same order @@ -856,7 +841,6 @@ public void onRebuild(Runnable onRebuild) { } private void addHoverableKey(IKey key, IDrawable... hover) { - if (isServer()) return; addKey(KeyUtil.setHover(key, hover)); } diff --git a/src/main/java/gregtech/common/mui/widget/ScrollableTextWidget.java b/src/main/java/gregtech/common/mui/widget/ScrollableTextWidget.java index ee06fa2f5bf..5d21696125b 100644 --- a/src/main/java/gregtech/common/mui/widget/ScrollableTextWidget.java +++ b/src/main/java/gregtech/common/mui/widget/ScrollableTextWidget.java @@ -20,11 +20,13 @@ import com.cleanroommc.modularui.theme.TextFieldTheme; import com.cleanroommc.modularui.theme.WidgetTheme; import com.cleanroommc.modularui.theme.WidgetThemeEntry; +import com.cleanroommc.modularui.utils.Alignment; import com.cleanroommc.modularui.utils.HoveredWidgetList; import com.cleanroommc.modularui.widget.Widget; import com.cleanroommc.modularui.widget.scroll.ScrollArea; import com.cleanroommc.modularui.widget.scroll.ScrollData; import com.cleanroommc.modularui.widget.sizer.Area; +import com.cleanroommc.modularui.widget.sizer.Box; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -35,13 +37,13 @@ public class ScrollableTextWidget extends Widget RecipeViewerIngredientProvider { private final RichText text = new RichText(); - private Consumer builder; + private Consumer> builder; private boolean dirty = false; private boolean autoUpdate = false; private Object lastIngredient; private final ScrollArea scroll = new ScrollArea(); - private final TextRenderer renderer = new TextRenderer(); + private final TextRenderer renderer = new ScrollingTextRenderer(); public ScrollableTextWidget() { listenGuiAction((IGuiAction.MouseReleased) mouseButton -> { @@ -176,14 +178,27 @@ private void drawText(ModularGuiContext context) { this.dirty = false; } - TextFieldTheme textFieldTheme = context.getTheme().getTextFieldTheme().getTheme(); - this.text.setupRenderer(this.renderer, getArea().getPadding().getLeft(), - getArea().getPadding().getTop() - getScrollY(), getArea().paddedWidth(), getArea().paddedHeight(), - textFieldTheme.getTextColor(), textFieldTheme.getTextShadow()); - this.text.compileAndDraw(this.renderer, context, false); + Alignment alignment = this.text.getAlignment(); + Area area = getArea(); + Box padding = area.getPadding(); + WidgetThemeEntry textThemeEntry = context.getTheme().getTextFieldTheme(); + TextFieldTheme textTheme = textThemeEntry.getTheme(); + + this.text.compileAndDraw(this.renderer, context, true); + // this isn't perfect, but i hope it's good enough - int diff = (int) Math.ceil((this.renderer.getLastTrimmedHeight() - getArea().h()) / 2); - this.scroll.getScrollY().setScrollSize(getArea().h() + Math.max(0, diff)); + int diff = (int) Math.ceil((this.renderer.getLastTrimmedHeight() - area.h()) / 2); + this.scroll.getScrollY().setScrollSize(area.h() + Math.max(0, diff)); + + // this is responsible for centering the text if there's not enough to scroll + int x = padding.getLeft(); + int y = (int) (area.h() * alignment.y); + y -= (int) (this.renderer.getLastTrimmedHeight() * alignment.y); + y = Math.min(Math.max(padding.getTop(), y), area.h() - padding.getBottom()); + this.text.setupRenderer(this.renderer, x, y - getScrollY(), area.paddedWidth(), area.paddedHeight(), + textTheme.getTextColor(), textTheme.getTextShadow()); + + this.text.compileAndDraw(this.renderer, context, false); } @Override @@ -222,7 +237,7 @@ public ScrollableTextWidget autoUpdate(boolean autoUpdate) { * @param builder text builder * @return this */ - public ScrollableTextWidget textBuilder(Consumer builder) { + public ScrollableTextWidget textBuilder(Consumer> builder) { this.builder = builder; markDirty(); return this; @@ -232,4 +247,25 @@ public ScrollableTextWidget textBuilder(Consumer builder) { public @Nullable Object getIngredient() { return this.lastIngredient; } + + public static class ScrollingTextRenderer extends TextRenderer { + + @Override + protected int getStartX(float maxWidth, float lineWidth) { + return super.getStartX(this.maxWidth, lineWidth); + } + + public int getLastY() { + return (int) lastY; + } + + public int getLastX() { + return (int) lastX; + } + + @Override + protected int getStartY(float height) { + return this.y; // always draw at the top + } + } }