aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/api/gui/widgets/GT_GuiTooltipManager.java
blob: 4304ca14fc9760aab64f0a6c3b4000ff86f0a67a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package gregtech.api.gui.widgets;

import java.util.ArrayList;
import java.util.List;

import net.minecraft.client.gui.FontRenderer;

public class GT_GuiTooltipManager {

    public interface GT_IToolTipRenderer {

        int getGuiLeft();

        int getGuiTop();

        int getXSize();

        FontRenderer getFontRenderer();

        void drawHoveringText(List<String> text, int mouseX, int mouseY, FontRenderer font);
    }

    private static final long DELAY = 5;
    private int mouseStopped;
    private int lastMouseX = -1;
    private int lastMouseY = -1;
    private final List<GT_GuiTooltip> tips = new ArrayList<>();

    public void addToolTip(GT_GuiTooltip tip) {
        if (tip != null && !tips.contains(tip)) tips.add(tip);
    }

    public boolean removeToolTip(GT_GuiTooltip tip) {
        return tips.remove(tip);
    }

    public final void onTick(GT_IToolTipRenderer render, int mouseX, int mouseY) {
        if ((Math.abs(mouseX - lastMouseX) < 2) && (Math.abs(mouseY - lastMouseY) < 2)) {
            mouseStopped = Math.min(mouseStopped + 1, 50);
        } else {
            mouseStopped = 0;
        }

        lastMouseX = mouseX;
        lastMouseY = mouseY;

        mouseX -= render.getGuiLeft();
        mouseY -= render.getGuiTop();
        for (GT_GuiTooltip tip : tips) {
            // Give the tooltip the opportunity to decide whether they should be enabled
            tip.onTick();
            if (tip.enabled && (!tip.isDelayed() || mouseStopped > DELAY)
                && tip.getBounds()
                    .contains(mouseX, mouseY)) {
                tip.updateText();
                drawTooltip(tip, mouseX, mouseY, render);
                break;
            }
        }
    }

    private void drawTooltip(GT_GuiTooltip tip, int mouseX, int mouseY, GT_IToolTipRenderer render) {
        List<String> text = tip.getToolTipText();
        if (text == null) return;

        if (mouseX > render.getGuiLeft() + render.getXSize() / 2) {
            int maxWidth = 0;
            for (String s : text) {
                int w = render.getFontRenderer()
                    .getStringWidth(s);
                if (w > maxWidth) {
                    maxWidth = w;
                }
            }
            mouseX -= (maxWidth + 18);
        }

        render.drawHoveringText(text, mouseX, mouseY, render.getFontRenderer());
    }
}