Skip to content

Commit 8763cba

Browse files
committed
Refactor how we handle tooltips to make use of minecraft's builtin system:
- Allows properly forwarding element tooltips to EMI - Make moveable filter buttons properly use the child system so that the tooltips can render for the arrow buttons
1 parent 124d710 commit 8763cba

File tree

94 files changed

+977
-634
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

94 files changed

+977
-634
lines changed

src/generators/java/mekanism/generators/client/gui/GuiFissionReactor.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,19 +82,20 @@ protected void addGuiElements() {
8282
}));
8383
activateButton = addRenderableWidget(new TranslationButton(this, 6, 75, 81, 16, GeneratorsLang.FISSION_ACTIVATE,
8484
(element, mouseX, mouseY) -> PacketUtils.sendToServer(new PacketGeneratorsGuiInteract(GeneratorsGuiInteraction.FISSION_ACTIVE,
85-
((GuiFissionReactor) element.gui()).tile, 1)), null, () -> EnumColor.DARK_GREEN) {
85+
((GuiFissionReactor) element.gui()).tile, 1)), () -> EnumColor.DARK_GREEN) {
8686
@Override
8787
public void renderForeground(GuiGraphics guiGraphics, int mouseX, int mouseY) {
8888
super.renderForeground(guiGraphics, mouseX, mouseY);
8989
if (!active && tile.getMultiblock().isForceDisabled()) {
9090
active = true;
9191
//Temporarily set active to true, so we can easily check if the mouse is over the button
92+
// Note: We can't just use the delayed tooltip rendering as it doesn't work for inactive buttons
9293
if (isMouseOverCheckWindows(mouseX, mouseY)) {
9394
PoseStack pose = guiGraphics.pose();
9495
pose.pushPose();
9596
//Offset to fix rendering position
9697
pose.translate(-getGuiLeft(), -getGuiTop(), 0);
97-
displayTooltips(guiGraphics, mouseX, mouseY, GeneratorsLang.FISSION_FORCE_DISABLED.translate());
98+
guiGraphics.renderTooltip(getFont(), GeneratorsLang.FISSION_FORCE_DISABLED.translate(), mouseX, mouseY);
9899
pose.popPose();
99100
}
100101
active = false;
@@ -103,7 +104,7 @@ public void renderForeground(GuiGraphics guiGraphics, int mouseX, int mouseY) {
103104
});
104105
scramButton = addRenderableWidget(new TranslationButton(this, 89, 75, 81, 16, GeneratorsLang.FISSION_SCRAM,
105106
(element, mouseX, mouseY) -> PacketUtils.sendToServer(new PacketGeneratorsGuiInteract(GeneratorsGuiInteraction.FISSION_ACTIVE,
106-
((GuiFissionReactor) element.gui()).tile, 0)), null, () -> EnumColor.DARK_RED));
107+
((GuiFissionReactor) element.gui()).tile, 0)), () -> EnumColor.DARK_RED));
107108
addRenderableWidget(new GuiBigLight(this, 173, 76, tile.getMultiblock()::isActive));
108109
addRenderableWidget(new GuiDynamicHorizontalRateBar(this, new IBarInfoHandler() {
109110
@Override

src/generators/java/mekanism/generators/client/gui/GuiFissionReactorLogicAdapter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ protected void addGuiElements() {
3535
scrollBar = addRenderableWidget(new GuiScrollBar(this, 146, 31, 90, () -> tile.getModes().length, () -> DISPLAY_COUNT));
3636
for (int i = 0; i < DISPLAY_COUNT; i++) {
3737
int typeShift = 22 * i;
38-
addRenderableWidget(new ReactorLogicButton<>(this, 17, 32 + typeShift, i, tile, scrollBar::getCurrentSelection, tile::getModes, this::changeLogic));
38+
addRenderableWidget(new ReactorLogicButton<>(this, 17, 32 + typeShift, i, tile, FissionReactorLogic.class, scrollBar::getCurrentSelection, tile::getModes, this::changeLogic));
3939
}
4040
}
4141

src/generators/java/mekanism/generators/client/gui/GuiFusionReactorInfo.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ protected GuiFusionReactorInfo(EmptyTileContainer<TileEntityFusionReactorControl
3030
protected void addGuiElements() {
3131
super.addGuiElements();
3232
addRenderableWidget(new MekanismImageButton(this, 6, 6, 14, getButtonLocation("back"),
33-
(element, mouseX, mouseY) -> PacketUtils.sendToServer(new PacketTileButtonPress(ClickedTileButton.BACK_BUTTON, ((GuiFusionReactorInfo) element.gui()).tile)),
34-
(element, graphics, mouseX, mouseY) -> element.displayTooltips(graphics, mouseX, mouseY, MekanismLang.BACK.translate())));
33+
(element, mouseX, mouseY) -> PacketUtils.sendToServer(new PacketTileButtonPress(ClickedTileButton.BACK_BUTTON, ((GuiFusionReactorInfo) element.gui()).tile))))
34+
.setTooltip(MekanismLang.BACK);
3535
addRenderableWidget(new GuiEnergyTab(this, () -> {
3636
FusionReactorMultiblockData multiblock = tile.getMultiblock();
3737
return List.of(MekanismLang.STORING.translate(EnergyDisplay.of(multiblock.energyContainer)),

src/generators/java/mekanism/generators/client/gui/GuiFusionReactorLogicAdapter.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,12 @@ protected void addGuiElements() {
3737
super.addGuiElements();
3838
addRenderableWidget(new GuiElementHolder(this, 16, 31, 130, 90));
3939
addRenderableWidget(new ToggleButton(this, 16, 19, 11, tile::isActiveCooled,
40-
(element, mouseX, mouseY) -> PacketUtils.sendToServer(new PacketGuiInteract(GuiInteraction.NEXT_MODE, ((GuiFusionReactorLogicAdapter) element.gui()).tile)),
41-
(element, graphics, mouseX, mouseY) -> element.displayTooltips(graphics, mouseX, mouseY, GeneratorsLang.REACTOR_LOGIC_TOGGLE_COOLING.translate())));
40+
(element, mouseX, mouseY) -> PacketUtils.sendToServer(new PacketGuiInteract(GuiInteraction.NEXT_MODE, ((GuiFusionReactorLogicAdapter) element.gui()).tile))))
41+
.setTooltip(GeneratorsLang.REACTOR_LOGIC_TOGGLE_COOLING);
4242
scrollBar = addRenderableWidget(new GuiScrollBar(this, 146, 31, 90, () -> tile.getModes().length, () -> DISPLAY_COUNT));
4343
for (int i = 0; i < DISPLAY_COUNT; i++) {
4444
int typeShift = 22 * i;
45-
addRenderableWidget(new ReactorLogicButton<>(this, 17, 32 + typeShift, i, tile, scrollBar::getCurrentSelection, tile::getModes, this::changeLogic));
45+
addRenderableWidget(new ReactorLogicButton<>(this, 17, 32 + typeShift, i, tile, FusionReactorLogic.class, scrollBar::getCurrentSelection, tile::getModes, this::changeLogic));
4646
}
4747
}
4848

src/generators/java/mekanism/generators/client/gui/GuiIndustrialTurbine.java

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import java.util.List;
55
import mekanism.api.text.EnumColor;
66
import mekanism.client.gui.GuiMekanismTile;
7-
import mekanism.client.gui.element.GuiElement;
7+
import mekanism.client.gui.MultiLineTooltip;
88
import mekanism.client.gui.element.GuiInnerScreen;
99
import mekanism.client.gui.element.bar.GuiBar.IBarInfoHandler;
1010
import mekanism.client.gui.element.bar.GuiVerticalPowerBar;
@@ -16,7 +16,6 @@
1616
import mekanism.common.MekanismLang;
1717
import mekanism.common.config.MekanismConfig;
1818
import mekanism.common.inventory.container.tile.MekanismTileContainer;
19-
import mekanism.common.tile.TileEntityChemicalTank.GasMode;
2019
import mekanism.common.util.text.EnergyDisplay;
2120
import mekanism.common.util.text.TextUtils;
2221
import mekanism.generators.client.gui.element.GuiTurbineTab;
@@ -110,7 +109,10 @@ public double getLevel() {
110109
}
111110
return List.of(MekanismLang.STORING.translate(storing), GeneratorsLang.PRODUCING_AMOUNT.translate(producing));
112111
}));
113-
addRenderableWidget(new GuiGasMode(this, 159, 72, true, () -> tile.getMultiblock().dumpMode, tile.getBlockPos(), 0, this::dumpModeTooltip));
112+
Component warning = GeneratorsLang.TURBINE_DUMPING_STEAM_WARNING.translateColored(EnumColor.RED);
113+
addRenderableWidget(new GuiGasMode(this, 159, 72, true, () -> tile.getMultiblock().dumpMode, tile.getBlockPos(), 0,
114+
MultiLineTooltip.createMulti(GeneratorsLang.TURBINE_DUMPING_EXCESS_STEAM.translate(), warning),
115+
MultiLineTooltip.createMulti(GeneratorsLang.TURBINE_DUMPING_STEAM.translate(), warning)));
114116
}
115117

116118
@Override
@@ -119,12 +121,4 @@ protected void drawForegroundText(@NotNull GuiGraphics guiGraphics, int mouseX,
119121
drawString(guiGraphics, playerInventoryTitle, inventoryLabelX, inventoryLabelY, titleTextColor());
120122
super.drawForegroundText(guiGraphics, mouseX, mouseY);
121123
}
122-
123-
private void dumpModeTooltip(GuiElement element, GuiGraphics guiGraphics, int mouseX, int mouseY) {
124-
GasMode dumpMode = tile.getMultiblock().dumpMode;
125-
if (dumpMode != GasMode.IDLE) {
126-
GeneratorsLang firstLine = dumpMode == GasMode.DUMPING_EXCESS ? GeneratorsLang.TURBINE_DUMPING_EXCESS_STEAM : GeneratorsLang.TURBINE_DUMPING_STEAM;
127-
displayTooltips(guiGraphics, mouseX, mouseY, firstLine.translate(), GeneratorsLang.TURBINE_DUMPING_STEAM_WARNING.translateColored(EnumColor.RED));
128-
}
129-
}
130124
}

src/generators/java/mekanism/generators/client/gui/element/button/ReactorLogicButton.java

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package mekanism.generators.client.gui.element.button;
22

3+
import java.util.EnumMap;
4+
import java.util.Map;
35
import java.util.function.Consumer;
46
import java.util.function.IntSupplier;
57
import java.util.function.Supplier;
@@ -13,6 +15,7 @@
1315
import mekanism.generators.common.base.IReactorLogic;
1416
import mekanism.generators.common.base.IReactorLogicMode;
1517
import net.minecraft.client.gui.GuiGraphics;
18+
import net.minecraft.client.gui.components.Tooltip;
1619
import net.minecraft.network.chat.Component;
1720
import net.minecraft.resources.ResourceLocation;
1821
import org.jetbrains.annotations.NotNull;
@@ -25,29 +28,26 @@ public class ReactorLogicButton<TYPE extends Enum<TYPE> & IReactorLogicMode<TYPE
2528
private final IReactorLogic<TYPE> tile;
2629
private final int typeOffset;
2730
private final Supplier<@Nullable TYPE> modeSupplier;
31+
private final Map<TYPE, Tooltip> typeTooltips;
2832
private final Consumer<TYPE> onPress;
2933

3034

31-
public ReactorLogicButton(IGuiWrapper gui, int x, int y, int index, @NotNull IReactorLogic<TYPE> tile, IntSupplier indexSupplier, Supplier<TYPE[]> modeList,
35+
public ReactorLogicButton(IGuiWrapper gui, int x, int y, int index, @NotNull IReactorLogic<TYPE> tile, Class<TYPE> clazz, IntSupplier indexSupplier, Supplier<TYPE[]> modeList,
3236
Consumer<TYPE> onPress) {
33-
this(gui, x, y, index, tile, onPress, () -> {
37+
this(gui, x, y, index, tile, clazz, onPress, () -> {
3438
int i = indexSupplier.getAsInt() + index;
3539
TYPE[] modes = modeList.get();
3640
return i >= 0 && i < modes.length ? modes[i] : null;
3741
});
3842
}
3943

40-
private ReactorLogicButton(IGuiWrapper gui, int x, int y, int index, @NotNull IReactorLogic<TYPE> tile, Consumer<TYPE> onPress, Supplier<@Nullable TYPE> modeSupplier) {
41-
super(gui, x, y, 128, 22, Component.empty(), (element, mouseX, mouseY) -> ((ReactorLogicButton<?>) element).click(), (element, guiGraphics, mouseX, mouseY) -> {
42-
IReactorLogicMode<?> mode = ((ReactorLogicButton<?>) element).modeSupplier.get();
43-
if (mode != null) {
44-
element.displayTooltips(guiGraphics, mouseX, mouseY, mode.getDescription());
45-
}
46-
});
44+
private ReactorLogicButton(IGuiWrapper gui, int x, int y, int index, @NotNull IReactorLogic<TYPE> tile, Class<TYPE> clazz, Consumer<TYPE> onPress, Supplier<@Nullable TYPE> modeSupplier) {
45+
super(gui, x, y, 128, 22, Component.empty(), (element, mouseX, mouseY) -> ((ReactorLogicButton<?>) element).click());
4746
this.onPress = onPress;
4847
this.typeOffset = 22 * index;
4948
this.modeSupplier = modeSupplier;
5049
this.tile = tile;
50+
this.typeTooltips = new EnumMap<>(clazz);
5151
}
5252

5353
private boolean click() {
@@ -77,4 +77,14 @@ public void renderForeground(GuiGraphics guiGraphics, int mouseX, int mouseY) {
7777
super.renderForeground(guiGraphics, mouseX, mouseY);
7878
}
7979
}
80+
81+
@Override
82+
public void updateTooltip(int mouseX, int mouseY) {
83+
TYPE mode = modeSupplier.get();
84+
if (mode == null) {
85+
clearTooltip();
86+
} else {
87+
setTooltip(typeTooltips.computeIfAbsent(mode, m -> Tooltip.create(m.getDescription())));
88+
}
89+
}
8090
}

src/main/java/mekanism/client/gui/GuiDimensionalStabilizer.java

Lines changed: 41 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package mekanism.client.gui;
22

33
import java.util.ArrayList;
4+
import java.util.Collections;
45
import java.util.List;
56
import mekanism.api.text.EnumColor;
67
import mekanism.client.gui.element.GuiUpArrow;
78
import mekanism.client.gui.element.bar.GuiVerticalPowerBar;
89
import mekanism.client.gui.element.button.BasicColorButton;
10+
import mekanism.client.gui.element.button.TooltipColorButton;
911
import mekanism.client.gui.element.tab.GuiEnergyTab;
1012
import mekanism.client.gui.element.tab.GuiVisualsTab;
1113
import mekanism.common.MekanismLang;
@@ -18,10 +20,12 @@
1820
import mekanism.common.tile.machine.TileEntityDimensionalStabilizer;
1921
import mekanism.common.util.text.BooleanStateDisplay.OnOff;
2022
import net.minecraft.client.gui.GuiGraphics;
23+
import net.minecraft.client.gui.components.Tooltip;
2124
import net.minecraft.core.SectionPos;
2225
import net.minecraft.network.chat.Component;
2326
import net.minecraft.world.entity.player.Inventory;
2427
import org.jetbrains.annotations.NotNull;
28+
import org.jetbrains.annotations.Nullable;
2529

2630
public class GuiDimensionalStabilizer extends GuiMekanismTile<TileEntityDimensionalStabilizer, MekanismTileContainer<TileEntityDimensionalStabilizer>> {
2731

@@ -50,7 +54,7 @@ protected void addGuiElements() {
5054
int shiftedZ = z + TileEntityDimensionalStabilizer.MAX_LOAD_RADIUS;
5155
int chunkZ = tileChunkZ + z;
5256
if (x == 0 && z == 0) {
53-
addRenderableWidget(BasicColorButton.renderActive(this, 63 + 10 * shiftedX, 19 + 10 * shiftedZ, 10, EnumColor.DARK_BLUE, (element, mouseX, mouseY) -> {
57+
addRenderableWidget(new BasicColorButton(this, 63 + 10 * shiftedX, 19 + 10 * shiftedZ, 10, () -> EnumColor.DARK_BLUE, (element, mouseX, mouseY) -> {
5458
for (int i = 1; i <= TileEntityDimensionalStabilizer.MAX_LOAD_RADIUS; i++) {
5559
if (hasAtRadius(i, false)) {
5660
return PacketUtils.sendToServer(new PacketGuiInteract(GuiInteraction.ENABLE_RADIUS_CHUNKLOAD, tile, i));
@@ -64,39 +68,49 @@ protected void addGuiElements() {
6468
}
6569
}
6670
return false;
67-
}, (onHover, guiGraphics, mouseX, mouseY) -> {
68-
List<Component> tooltips = new ArrayList<>();
69-
tooltips.add(MekanismLang.STABILIZER_CENTER.translate(EnumColor.INDIGO, chunkX, EnumColor.INDIGO, chunkZ));
70-
//TODO: Can we eventually optimize this further such as if we know that we have 1 enabled as we are enabling either radius 2 or "3" (nothing)
71-
// then even if nothing is enabled at radius 2 currently, we don't have to check radius 1 to know that we should display the text for disabling it
72-
// for now it doesn't really matter as given we only support a radius of two it only checks at most the inner radius (8 extra boolean lookups)
73-
for (int i = 1; i <= TileEntityDimensionalStabilizer.MAX_LOAD_RADIUS; i++) {
74-
if (hasAtRadius(i, false)) {
75-
//Add an empty line for readability. Must be done by adding a string that just renders a space
76-
tooltips.add(Component.literal(" "));
77-
tooltips.add(MekanismLang.STABILIZER_ENABLE_RADIUS.translate(EnumColor.INDIGO, i, EnumColor.INDIGO, chunkX, EnumColor.INDIGO, chunkZ));
78-
break;
71+
}) {
72+
private List<Component> lastInfo = Collections.emptyList();
73+
@Nullable
74+
private Tooltip lastTooltip;
75+
76+
@Override
77+
public void updateTooltip(int mouseX, int mouseY) {
78+
List<Component> tooltips = new ArrayList<>();
79+
tooltips.add(MekanismLang.STABILIZER_CENTER.translate(EnumColor.INDIGO, chunkX, EnumColor.INDIGO, chunkZ));
80+
//TODO: Can we eventually optimize this further such as if we know that we have 1 enabled as we are enabling either radius 2 or "3" (nothing)
81+
// then even if nothing is enabled at radius 2 currently, we don't have to check radius 1 to know that we should display the text for disabling it
82+
// for now it doesn't really matter as given we only support a radius of two it only checks at most the inner radius (8 extra boolean lookups)
83+
for (int i = 1; i <= TileEntityDimensionalStabilizer.MAX_LOAD_RADIUS; i++) {
84+
if (hasAtRadius(i, false)) {
85+
//Add an empty line for readability. Must be done by adding a string that just renders a space
86+
tooltips.add(Component.literal(" "));
87+
tooltips.add(MekanismLang.STABILIZER_ENABLE_RADIUS.translate(EnumColor.INDIGO, i, EnumColor.INDIGO, chunkX, EnumColor.INDIGO, chunkZ));
88+
break;
89+
}
7990
}
80-
}
81-
for (int i = TileEntityDimensionalStabilizer.MAX_LOAD_RADIUS; i > 0; i--) {
82-
if (hasAtRadius(i, true)) {
83-
//Add an empty line for readability. Must be done by adding a string that just renders a space
84-
tooltips.add(Component.literal(" "));
85-
tooltips.add(MekanismLang.STABILIZER_DISABLE_RADIUS.translate(EnumColor.INDIGO, i, EnumColor.INDIGO, chunkX, EnumColor.INDIGO, chunkZ));
86-
break;
91+
for (int i = TileEntityDimensionalStabilizer.MAX_LOAD_RADIUS; i > 0; i--) {
92+
if (hasAtRadius(i, true)) {
93+
//Add an empty line for readability. Must be done by adding a string that just renders a space
94+
tooltips.add(Component.literal(" "));
95+
tooltips.add(MekanismLang.STABILIZER_DISABLE_RADIUS.translate(EnumColor.INDIGO, i, EnumColor.INDIGO, chunkX, EnumColor.INDIGO, chunkZ));
96+
break;
97+
}
98+
}
99+
if (!tooltips.equals(lastInfo)) {
100+
lastInfo = tooltips;
101+
lastTooltip = MultiLineTooltip.createMulti(tooltips);
87102
}
103+
setTooltip(lastTooltip);
88104
}
89-
onHover.displayTooltips(guiGraphics, mouseX, mouseY, tooltips);
90-
}));
105+
});
91106
} else {
92107
int packetTarget = shiftedX * TileEntityDimensionalStabilizer.MAX_LOAD_DIAMETER + shiftedZ;
93-
addRenderableWidget(BasicColorButton.toggle(this, 63 + 10 * shiftedX, 19 + 10 * shiftedZ, 10, EnumColor.DARK_BLUE,
108+
addRenderableWidget(new TooltipColorButton(this, 63 + 10 * shiftedX, 19 + 10 * shiftedZ, 10, EnumColor.DARK_BLUE,
94109
() -> tile.isChunkLoadingAt(shiftedX, shiftedZ),
95110
(element, mouseX, mouseY) -> PacketUtils.sendToServer(new PacketGuiInteract(GuiInteraction.TOGGLE_CHUNKLOAD, tile, packetTarget)),
96-
(element, graphics, mouseX, mouseY) -> element.displayTooltips(graphics, mouseX, mouseY,
97-
MekanismLang.STABILIZER_TOGGLE_LOADING.translate(OnOff.of(tile.isChunkLoadingAt(shiftedX, shiftedZ), true),
98-
EnumColor.INDIGO, chunkX, EnumColor.INDIGO, chunkZ)
99-
)));
111+
MekanismLang.STABILIZER_TOGGLE_LOADING.translate(OnOff.of(true, true), EnumColor.INDIGO, chunkX, EnumColor.INDIGO, chunkZ),
112+
MekanismLang.STABILIZER_TOGGLE_LOADING.translate(OnOff.of(false, true), EnumColor.INDIGO, chunkX, EnumColor.INDIGO, chunkZ)
113+
));
100114
}
101115
}
102116
}

0 commit comments

Comments
 (0)