Skip to content

Commit 70bfc8a

Browse files
ghzdudeZorbatron
andauthored
Fix Scroll Text Alignment Drawing Issues (#2869)
Co-authored-by: Zorbatron <[email protected]>
1 parent 2195fe2 commit 70bfc8a

File tree

3 files changed

+49
-29
lines changed

3 files changed

+49
-29
lines changed

src/main/java/gregtech/api/capability/IMiner.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
import net.minecraftforge.items.IItemHandlerModifiable;
66

77
import codechicken.lib.vec.Cuboid6;
8+
import com.cleanroommc.modularui.api.drawable.IRichTextBuilder;
89
import com.cleanroommc.modularui.drawable.UITexture;
9-
import com.cleanroommc.modularui.drawable.text.RichText;
1010
import com.cleanroommc.modularui.utils.Alignment;
1111
import com.cleanroommc.modularui.value.sync.PanelSyncManager;
1212
import com.cleanroommc.modularui.value.sync.SyncHandlers;
@@ -39,7 +39,7 @@ default int getWorkingArea(int maximumRadius) {
3939
default Widget<?> createMinerWidgets(@NotNull PanelSyncManager panelSyncManager,
4040
@NotNull IItemHandlerModifiable inventory, int inventorySize,
4141
@NotNull UITexture textDisplayBackground,
42-
@NotNull Consumer<RichText> textBuilder) {
42+
@NotNull Consumer<IRichTextBuilder<?>> textBuilder) {
4343
int rowSize = (int) Math.sqrt(inventorySize);
4444
panelSyncManager.registerSlotGroup("export_items", rowSize);
4545

src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,6 @@ public class MultiblockUIBuilder {
7777
private IKey idlingKey = IKey.lang("gregtech.multiblock.idling").style(TextFormatting.GRAY);
7878
private IKey pausedKey = IKey.lang("gregtech.multiblock.work_paused").style(TextFormatting.GOLD);
7979
private IKey runningKey = IKey.lang("gregtech.multiblock.running").style(TextFormatting.GREEN);
80-
private boolean dirty;
8180
private Runnable onRebuild;
8281

8382
@NotNull
@@ -797,18 +796,11 @@ public void sync(String key, PanelSyncManager syncManager) {
797796
}
798797

799798
/**
800-
* Builds the passed in rich text with operations and drawables. <br />
801-
* Will clear and rebuild if this builder is marked dirty
799+
* Builds the passed in rich text with operations and drawables.
802800
*
803801
* @param richText the rich text to add drawables to
804802
*/
805803
public void build(IRichTextBuilder<?> richText) {
806-
if (dirty) {
807-
clear();
808-
onRebuild();
809-
runAction();
810-
dirty = false;
811-
}
812804
for (Operation op : operations) {
813805
op.accept(richText);
814806
}
@@ -820,13 +812,6 @@ private void onRebuild() {
820812
}
821813
}
822814

823-
/**
824-
* Mark this builder as dirty. Will be rebuilt during {@link #build(IRichTextBuilder) build()}
825-
*/
826-
public void markDirty() {
827-
dirty = true;
828-
}
829-
830815
/*
831816
* this is run on the server side to write values to the internal syncer
832817
* those values are then synced to the client and read back in the same order
@@ -856,7 +841,6 @@ public void onRebuild(Runnable onRebuild) {
856841
}
857842

858843
private void addHoverableKey(IKey key, IDrawable... hover) {
859-
if (isServer()) return;
860844
addKey(KeyUtil.setHover(key, hover));
861845
}
862846

src/main/java/gregtech/common/mui/widget/ScrollableTextWidget.java

Lines changed: 46 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,13 @@
2020
import com.cleanroommc.modularui.theme.TextFieldTheme;
2121
import com.cleanroommc.modularui.theme.WidgetTheme;
2222
import com.cleanroommc.modularui.theme.WidgetThemeEntry;
23+
import com.cleanroommc.modularui.utils.Alignment;
2324
import com.cleanroommc.modularui.utils.HoveredWidgetList;
2425
import com.cleanroommc.modularui.widget.Widget;
2526
import com.cleanroommc.modularui.widget.scroll.ScrollArea;
2627
import com.cleanroommc.modularui.widget.scroll.ScrollData;
2728
import com.cleanroommc.modularui.widget.sizer.Area;
29+
import com.cleanroommc.modularui.widget.sizer.Box;
2830
import org.jetbrains.annotations.NotNull;
2931
import org.jetbrains.annotations.Nullable;
3032

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

3739
private final RichText text = new RichText();
38-
private Consumer<RichText> builder;
40+
private Consumer<IRichTextBuilder<?>> builder;
3941
private boolean dirty = false;
4042
private boolean autoUpdate = false;
4143
private Object lastIngredient;
4244

4345
private final ScrollArea scroll = new ScrollArea();
44-
private final TextRenderer renderer = new TextRenderer();
46+
private final TextRenderer renderer = new ScrollingTextRenderer();
4547

4648
public ScrollableTextWidget() {
4749
listenGuiAction((IGuiAction.MouseReleased) mouseButton -> {
@@ -176,14 +178,27 @@ private void drawText(ModularGuiContext context) {
176178
this.dirty = false;
177179
}
178180

179-
TextFieldTheme textFieldTheme = context.getTheme().getTextFieldTheme().getTheme();
180-
this.text.setupRenderer(this.renderer, getArea().getPadding().getLeft(),
181-
getArea().getPadding().getTop() - getScrollY(), getArea().paddedWidth(), getArea().paddedHeight(),
182-
textFieldTheme.getTextColor(), textFieldTheme.getTextShadow());
183-
this.text.compileAndDraw(this.renderer, context, false);
181+
Alignment alignment = this.text.getAlignment();
182+
Area area = getArea();
183+
Box padding = area.getPadding();
184+
WidgetThemeEntry<TextFieldTheme> textThemeEntry = context.getTheme().getTextFieldTheme();
185+
TextFieldTheme textTheme = textThemeEntry.getTheme();
186+
187+
this.text.compileAndDraw(this.renderer, context, true);
188+
184189
// this isn't perfect, but i hope it's good enough
185-
int diff = (int) Math.ceil((this.renderer.getLastTrimmedHeight() - getArea().h()) / 2);
186-
this.scroll.getScrollY().setScrollSize(getArea().h() + Math.max(0, diff));
190+
int diff = (int) Math.ceil((this.renderer.getLastTrimmedHeight() - area.h()) / 2);
191+
this.scroll.getScrollY().setScrollSize(area.h() + Math.max(0, diff));
192+
193+
// this is responsible for centering the text if there's not enough to scroll
194+
int x = padding.getLeft();
195+
int y = (int) (area.h() * alignment.y);
196+
y -= (int) (this.renderer.getLastTrimmedHeight() * alignment.y);
197+
y = Math.min(Math.max(padding.getTop(), y), area.h() - padding.getBottom());
198+
this.text.setupRenderer(this.renderer, x, y - getScrollY(), area.paddedWidth(), area.paddedHeight(),
199+
textTheme.getTextColor(), textTheme.getTextShadow());
200+
201+
this.text.compileAndDraw(this.renderer, context, false);
187202
}
188203

189204
@Override
@@ -222,7 +237,7 @@ public ScrollableTextWidget autoUpdate(boolean autoUpdate) {
222237
* @param builder text builder
223238
* @return this
224239
*/
225-
public ScrollableTextWidget textBuilder(Consumer<RichText> builder) {
240+
public ScrollableTextWidget textBuilder(Consumer<IRichTextBuilder<?>> builder) {
226241
this.builder = builder;
227242
markDirty();
228243
return this;
@@ -232,4 +247,25 @@ public ScrollableTextWidget textBuilder(Consumer<RichText> builder) {
232247
public @Nullable Object getIngredient() {
233248
return this.lastIngredient;
234249
}
250+
251+
public static class ScrollingTextRenderer extends TextRenderer {
252+
253+
@Override
254+
protected int getStartX(float maxWidth, float lineWidth) {
255+
return super.getStartX(this.maxWidth, lineWidth);
256+
}
257+
258+
public int getLastY() {
259+
return (int) lastY;
260+
}
261+
262+
public int getLastX() {
263+
return (int) lastX;
264+
}
265+
266+
@Override
267+
protected int getStartY(float height) {
268+
return this.y; // always draw at the top
269+
}
270+
}
235271
}

0 commit comments

Comments
 (0)