package net.minecraft.client.gui.components; import java.time.Duration; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.Util; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.narration.NarrationElementOutput; import net.minecraft.client.gui.navigation.ScreenRectangle; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.inventory.tooltip.BelowOrAboveWidgetTooltipPositioner; import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipPositioner; import net.minecraft.client.gui.screens.inventory.tooltip.MenuTooltipPositioner; import org.jetbrains.annotations.Nullable; @Environment(EnvType.CLIENT) public class WidgetTooltipHolder { @Nullable private Tooltip tooltip; private Duration delay = Duration.ZERO; private long displayStartTime; private boolean wasDisplayed; public void setDelay(Duration delay) { this.delay = delay; } public void set(@Nullable Tooltip tooltip) { this.tooltip = tooltip; } @Nullable public Tooltip get() { return this.tooltip; } public void refreshTooltipForNextRenderPass(boolean hovering, boolean focused, ScreenRectangle screenRectangle) { if (this.tooltip == null) { this.wasDisplayed = false; } else { boolean bl = hovering || focused && Minecraft.getInstance().getLastInputType().isKeyboard(); if (bl != this.wasDisplayed) { if (bl) { this.displayStartTime = Util.getMillis(); } this.wasDisplayed = bl; } if (bl && Util.getMillis() - this.displayStartTime > this.delay.toMillis()) { Screen screen = Minecraft.getInstance().screen; if (screen != null) { screen.setTooltipForNextRenderPass(this.tooltip, this.createTooltipPositioner(screenRectangle, hovering, focused), focused); } } } } private ClientTooltipPositioner createTooltipPositioner(ScreenRectangle screenRectangle, boolean hovering, boolean focused) { return (ClientTooltipPositioner)(!hovering && focused && Minecraft.getInstance().getLastInputType().isKeyboard() ? new BelowOrAboveWidgetTooltipPositioner(screenRectangle) : new MenuTooltipPositioner(screenRectangle)); } public void updateNarration(NarrationElementOutput output) { if (this.tooltip != null) { this.tooltip.updateNarration(output); } } }