Skip to content

Commit ea18b72

Browse files
committed
Move configurator slot hovering tooltips to the slot rather than being on the main gui
1 parent d9df0bb commit ea18b72

File tree

4 files changed

+44
-83
lines changed

4 files changed

+44
-83
lines changed
Lines changed: 0 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,13 @@
11
package mekanism.client.gui;
22

3-
import java.util.Set;
4-
import mekanism.api.inventory.IInventorySlot;
53
import mekanism.api.security.IBlockSecurityUtils;
6-
import mekanism.api.text.EnumColor;
74
import mekanism.client.gui.element.tab.GuiRedstoneControlTab;
85
import mekanism.client.gui.element.tab.GuiSecurityTab;
96
import mekanism.client.gui.element.tab.window.GuiUpgradeWindowTab;
10-
import mekanism.common.MekanismLang;
11-
import mekanism.common.inventory.container.slot.InventoryContainerSlot;
127
import mekanism.common.inventory.container.tile.MekanismTileContainer;
13-
import mekanism.common.item.ItemConfigurator;
14-
import mekanism.common.lib.transmitter.TransmissionType;
158
import mekanism.common.tile.base.TileEntityMekanism;
16-
import mekanism.common.tile.component.config.ConfigInfo;
17-
import mekanism.common.tile.component.config.DataType;
18-
import mekanism.common.tile.component.config.slot.ISlotInfo;
19-
import mekanism.common.tile.component.config.slot.InventorySlotInfo;
20-
import mekanism.common.tile.interfaces.ISideConfiguration;
21-
import net.minecraft.client.gui.GuiGraphics;
22-
import net.minecraft.client.gui.components.Tooltip;
23-
import net.minecraft.client.gui.navigation.ScreenAxis;
24-
import net.minecraft.client.gui.navigation.ScreenRectangle;
259
import net.minecraft.network.chat.Component;
2610
import net.minecraft.world.entity.player.Inventory;
27-
import net.minecraft.world.inventory.Slot;
28-
import net.minecraft.world.item.ItemStack;
29-
import org.jetbrains.annotations.NotNull;
3011
import org.jetbrains.annotations.Nullable;
3112

3213
public abstract class GuiMekanismTile<TILE extends TileEntityMekanism, CONTAINER extends MekanismTileContainer<TILE>> extends GuiMekanism<CONTAINER> {
@@ -38,11 +19,6 @@ public abstract class GuiMekanismTile<TILE extends TileEntityMekanism, CONTAINER
3819
@Nullable
3920
private GuiUpgradeWindowTab upgradeWindowTab;
4021

41-
@Nullable
42-
private Component lastInfo = null;
43-
@Nullable
44-
private Tooltip lastTooltip;
45-
4622
protected GuiMekanismTile(CONTAINER container, Inventory inv, Component title) {
4723
super(container, inv, title);
4824
tile = container.getTileEntity();
@@ -74,53 +50,4 @@ protected void addGenericTabs() {
7450
protected void addSecurityTab() {
7551
addRenderableWidget(new GuiSecurityTab(this, tile));
7652
}
77-
78-
@Override
79-
protected void renderTooltip(@NotNull GuiGraphics guiGraphics, int mouseX, int mouseY) {
80-
super.renderTooltip(guiGraphics, mouseX, mouseY);
81-
//TODO: Can we move this into GuiSlot#updateTooltip to mirror how we do it for GuiGauge?
82-
// would potentially let us have an even more accurate screen rectangle, especially for sawmill output
83-
if (tile instanceof ISideConfiguration) {
84-
ItemStack stack = getCarriedItem();
85-
if (!stack.isEmpty() && stack.getItem() instanceof ItemConfigurator) {
86-
Slot slot = getSlotUnderMouse();
87-
if (slot != null) {
88-
DataType data = getFromSlot(slot);
89-
if (data != null) {
90-
EnumColor color = data.getColor();
91-
Component info = MekanismLang.GENERIC_WITH_PARENTHESIS.translateColored(color, data, color.getName());
92-
if (!info.equals(lastInfo)) {
93-
lastInfo = info;
94-
lastTooltip = Tooltip.create(info);
95-
}
96-
if (lastTooltip != null) {
97-
lastTooltip.refreshTooltipForNextRenderPass(true, true,
98-
ScreenRectangle.of(ScreenAxis.HORIZONTAL, slot.x, slot.y, 16, 16));
99-
return;
100-
}
101-
}
102-
}
103-
}
104-
}
105-
lastInfo = null;
106-
lastTooltip = null;
107-
}
108-
109-
private DataType getFromSlot(Slot slot) {
110-
if (slot.index < tile.getSlots() && slot instanceof InventoryContainerSlot containerSlot) {
111-
ISideConfiguration config = (ISideConfiguration) tile;
112-
ConfigInfo info = config.getConfig().getConfig(TransmissionType.ITEM);
113-
if (info != null) {
114-
Set<DataType> supportedDataTypes = info.getSupportedDataTypes();
115-
IInventorySlot inventorySlot = containerSlot.getInventorySlot();
116-
for (DataType type : supportedDataTypes) {
117-
ISlotInfo slotInfo = info.getSlotInfo(type);
118-
if (slotInfo instanceof InventorySlotInfo inventorySlotInfo && inventorySlotInfo.hasSlot(inventorySlot)) {
119-
return type;
120-
}
121-
}
122-
}
123-
}
124-
return null;
125-
}
12653
}

src/main/java/mekanism/client/gui/element/gauge/GuiGauge.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import java.util.ArrayList;
44
import java.util.Collections;
55
import java.util.List;
6-
import java.util.Set;
76
import java.util.function.BooleanSupplier;
87
import mekanism.api.text.EnumColor;
98
import mekanism.client.gui.GuiMekanismTile;
@@ -128,8 +127,7 @@ public void updateTooltip(int mouseX, int mouseY) {
128127
DataType dataType = null;
129128
ConfigInfo config = sideConfig.getConfig().getConfig(getTransmission());
130129
if (config != null) {
131-
Set<DataType> supportedDataTypes = config.getSupportedDataTypes();
132-
for (DataType type : supportedDataTypes) {
130+
for (DataType type : config.getSupportedDataTypes()) {
133131
if (type.getColor() == color) {
134132
dataType = type;
135133
break;

src/main/java/mekanism/client/gui/element/slot/GuiSlot.java

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,35 @@
11
package mekanism.client.gui.element.slot;
22

3+
import java.util.Collections;
4+
import java.util.List;
35
import java.util.function.BooleanSupplier;
46
import java.util.function.Function;
57
import java.util.function.IntSupplier;
68
import java.util.function.Supplier;
9+
import mekanism.api.inventory.IInventorySlot;
710
import mekanism.api.text.EnumColor;
11+
import mekanism.client.gui.GuiMekanismTile;
812
import mekanism.client.gui.IGuiWrapper;
13+
import mekanism.client.gui.MultiLineTooltip;
914
import mekanism.client.gui.element.GuiTexturedElement;
1015
import mekanism.client.recipe_viewer.interfaces.IRecipeViewerGhostTarget;
1116
import mekanism.client.render.MekanismRenderer;
17+
import mekanism.common.MekanismLang;
18+
import mekanism.common.inventory.container.slot.InventoryContainerSlot;
1219
import mekanism.common.inventory.container.slot.SlotOverlay;
1320
import mekanism.common.inventory.warning.ISupportsWarning;
1421
import mekanism.common.inventory.warning.WarningTracker.WarningType;
22+
import mekanism.common.item.ItemConfigurator;
23+
import mekanism.common.lib.transmitter.TransmissionType;
24+
import mekanism.common.tile.component.config.ConfigInfo;
25+
import mekanism.common.tile.component.config.DataType;
26+
import mekanism.common.tile.component.config.slot.InventorySlotInfo;
27+
import mekanism.common.tile.interfaces.ISideConfiguration;
1528
import net.minecraft.client.gui.GuiGraphics;
1629
import net.minecraft.client.gui.components.Tooltip;
1730
import net.minecraft.client.renderer.RenderType;
1831
import net.minecraft.core.Holder;
32+
import net.minecraft.network.chat.Component;
1933
import net.minecraft.resources.ResourceLocation;
2034
import net.minecraft.sounds.SoundEvent;
2135
import net.minecraft.sounds.SoundEvents;
@@ -38,12 +52,16 @@ public class GuiSlot extends GuiTexturedElement implements IRecipeViewerGhostTar
3852
@Nullable
3953
private SlotOverlay overlay;
4054
@Nullable
41-
private Function<GuiSlot, Tooltip> onHover;
55+
private Function<GuiSlot, List<Component>> onHover;
4256
@Nullable
4357
private IClickable onClick;
4458
private boolean renderHover;
4559
private boolean renderAboveSlots;
4660

61+
private List<Component> lastInfo = Collections.emptyList();
62+
@Nullable
63+
private Tooltip lastTooltip;
64+
4765
@Nullable
4866
private IGhostIngredientConsumer ghostHandler;
4967

@@ -73,7 +91,7 @@ public GuiSlot stored(Supplier<ItemStack> storedStackSupplier) {
7391
return this;
7492
}
7593

76-
public GuiSlot hover(Function<GuiSlot, Tooltip> onHover) {
94+
public GuiSlot hover(Function<GuiSlot, List<Component>> onHover) {
7795
this.onHover = onHover;
7896
return this;
7997
}
@@ -188,9 +206,30 @@ public void renderForeground(GuiGraphics guiGraphics, int mouseX, int mouseY) {
188206

189207
@Override
190208
public void updateTooltip(int mouseX, int mouseY) {
209+
ItemStack stack = gui().getCarriedItem();
210+
List<Component> list = Collections.emptyList();
191211
if (onHover != null) {
192-
setTooltip(onHover.apply(this));
212+
list = onHover.apply(this);
213+
}
214+
if (list.isEmpty() && !stack.isEmpty() && stack.getItem() instanceof ItemConfigurator && gui() instanceof GuiMekanismTile<?, ?> gui &&
215+
gui.getTileEntity() instanceof ISideConfiguration config && gui.getSlotUnderMouse() instanceof InventoryContainerSlot slot) {
216+
ConfigInfo info = config.getConfig().getConfig(TransmissionType.ITEM);
217+
if (info != null) {
218+
IInventorySlot inventorySlot = slot.getInventorySlot();
219+
for (DataType type : info.getSupportedDataTypes()) {
220+
if (info.getSlotInfo(type) instanceof InventorySlotInfo slotInfo && slotInfo.hasSlot(inventorySlot)) {
221+
EnumColor color = type.getColor();
222+
list = List.of(MekanismLang.GENERIC_WITH_PARENTHESIS.translateColored(color, type, color.getName()));
223+
break;
224+
}
225+
}
226+
}
227+
}
228+
if (!list.equals(lastInfo)) {
229+
lastInfo = list;
230+
lastTooltip = MultiLineTooltip.createMulti(list);
193231
}
232+
setTooltip(lastTooltip);
194233
}
195234

196235
@Override

src/main/java/mekanism/client/gui/machine/GuiDigitalMiner.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
import mekanism.common.util.text.EnergyDisplay;
3333
import mekanism.common.util.text.TextUtils;
3434
import net.minecraft.client.gui.GuiGraphics;
35-
import net.minecraft.client.gui.components.Tooltip;
3635
import net.minecraft.network.chat.Component;
3736
import net.minecraft.resources.ResourceLocation;
3837
import net.minecraft.world.entity.player.Inventory;
@@ -43,8 +42,6 @@ public class GuiDigitalMiner extends GuiMekanismTile<TileEntityDigitalMiner, Mek
4342
private static final ResourceLocation EJECT = MekanismUtils.getResource(ResourceType.GUI, "switch/eject.png");
4443
private static final ResourceLocation INPUT = MekanismUtils.getResource(ResourceType.GUI, "switch/input.png");
4544
private static final ResourceLocation SILK = MekanismUtils.getResource(ResourceType.GUI, "switch/silk.png");
46-
private static final Tooltip MINER_WELL = Tooltip.create(MekanismLang.MINER_WELL.translate());
47-
private static final Tooltip MINER_MISSING_BLOCK = Tooltip.create(MekanismLang.MINER_MISSING_BLOCK.translate());
4845

4946
private MekanismButton startButton;
5047
private MekanismButton stopButton;
@@ -92,7 +89,7 @@ protected void addGuiElements() {
9289
addRenderableWidget(new GuiVisualsTab(this, tile));
9390
addRenderableWidget(new GuiSlot(SlotType.DIGITAL, this, 64, 21).setRenderAboveSlots().validity(() -> tile.missingStack)
9491
.with(() -> tile.missingStack.isEmpty() ? SlotOverlay.CHECK : null)
95-
.hover(element -> ((GuiDigitalMiner) element.gui()).tile.missingStack.isEmpty() ? MINER_WELL : MINER_MISSING_BLOCK));
92+
.hover(element -> ((GuiDigitalMiner) element.gui()).tile.missingStack.isEmpty() ? List.of(MekanismLang.MINER_WELL.translate()) : List.of(MekanismLang.MINER_MISSING_BLOCK.translate())));
9693
addRenderableWidget(new GuiEnergyTab(this, () -> {
9794
MinerEnergyContainer energyContainer = tile.getEnergyContainer();
9895
return List.of(

0 commit comments

Comments
 (0)