/
GuiIconToggleButton.java
83 lines (70 loc) · 2.66 KB
/
GuiIconToggleButton.java
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
81
82
83
package mezz.jei.common.gui.elements;
import com.mojang.blaze3d.vertex.PoseStack;
import mezz.jei.api.gui.drawable.IDrawable;
import mezz.jei.common.gui.TooltipRenderer;
import mezz.jei.common.gui.textures.Textures;
import mezz.jei.common.input.IInternalKeyMappings;
import mezz.jei.common.input.IUserInputHandler;
import mezz.jei.common.input.UserInput;
import mezz.jei.common.util.ImmutableRect2i;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public abstract class GuiIconToggleButton {
private final IDrawable offIcon;
private final IDrawable onIcon;
private final GuiIconButton button;
private ImmutableRect2i area;
public GuiIconToggleButton(IDrawable offIcon, IDrawable onIcon, Textures textures) {
this.offIcon = offIcon;
this.onIcon = onIcon;
this.button = new GuiIconButton(new DrawableBlank(0, 0), b -> {}, textures);
this.area = ImmutableRect2i.EMPTY;
}
public void updateBounds(ImmutableRect2i area) {
this.button.setWidth(area.getWidth());
this.button.setHeight(area.getHeight());
this.button.x = area.getX();
this.button.y = area.getY();
this.area = area;
}
public void draw(PoseStack poseStack, int mouseX, int mouseY, float partialTicks) {
this.button.render(poseStack, mouseX, mouseY, partialTicks);
IDrawable icon = isIconToggledOn() ? this.onIcon : this.offIcon;
icon.draw(poseStack, this.button.x + 2, this.button.y + 2);
}
public final boolean isMouseOver(double mouseX, double mouseY) {
return this.area.contains(mouseX, mouseY);
}
public IUserInputHandler createInputHandler() {
return new UserInputHandler();
}
public final void drawTooltips(PoseStack poseStack, int mouseX, int mouseY) {
if (isMouseOver(mouseX, mouseY)) {
List<Component> tooltip = new ArrayList<>();
getTooltips(tooltip);
TooltipRenderer.drawHoveringText(poseStack, tooltip, mouseX, mouseY);
}
}
protected abstract void getTooltips(List<Component> tooltip);
protected abstract boolean isIconToggledOn();
protected abstract boolean onMouseClicked(UserInput input);
private class UserInputHandler implements IUserInputHandler {
@Override
public final Optional<IUserInputHandler> handleUserInput(Screen screen, UserInput input, IInternalKeyMappings keyBindings) {
if (isMouseOver(input.getMouseX(), input.getMouseY())) {
IUserInputHandler handler = button.createInputHandler();
return handler.handleUserInput(screen, input, keyBindings)
.flatMap(handled -> {
if (onMouseClicked(input)) {
return Optional.of(this);
}
return Optional.empty();
});
}
return Optional.empty();
}
}
}