70 lines
2.3 KiB
Java
70 lines
2.3 KiB
Java
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);
|
|
}
|
|
}
|
|
}
|