Skip to content
4 changes: 2 additions & 2 deletions src/main/java/gregtech/api/capability/IMiner.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<RichText> textBuilder) {
@NotNull Consumer<IRichTextBuilder<?>> textBuilder) {
int rowSize = (int) Math.sqrt(inventorySize);
panelSyncManager.registerSlotGroup("export_items", rowSize);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -797,18 +796,11 @@ public void sync(String key, PanelSyncManager syncManager) {
}

/**
* Builds the passed in rich text with operations and drawables. <br />
* 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);
}
Expand All @@ -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
Expand Down Expand Up @@ -856,7 +841,6 @@ public void onRebuild(Runnable onRebuild) {
}

private void addHoverableKey(IKey key, IDrawable... hover) {
if (isServer()) return;
addKey(KeyUtil.setHover(key, hover));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -35,13 +37,13 @@ public class ScrollableTextWidget extends Widget<ScrollableTextWidget>
RecipeViewerIngredientProvider {

private final RichText text = new RichText();
private Consumer<RichText> builder;
private Consumer<IRichTextBuilder<?>> 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 -> {
Expand Down Expand Up @@ -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<TextFieldTheme> 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
Expand Down Expand Up @@ -222,7 +237,7 @@ public ScrollableTextWidget autoUpdate(boolean autoUpdate) {
* @param builder text builder
* @return this
*/
public ScrollableTextWidget textBuilder(Consumer<RichText> builder) {
public ScrollableTextWidget textBuilder(Consumer<IRichTextBuilder<?>> builder) {
this.builder = builder;
markDirty();
return this;
Expand All @@ -232,4 +247,25 @@ public ScrollableTextWidget textBuilder(Consumer<RichText> 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
}
}
}
Loading