package net.blay09.mods.eirairc.client.gui;
import net.blay09.mods.eirairc.EiraIRC;
import net.blay09.mods.eirairc.client.gui.base.GuiLabel;
import net.blay09.mods.eirairc.client.gui.base.list.GuiList;
import net.blay09.mods.eirairc.client.gui.overlay.GuiOverlay;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.GuiTextField;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.event.GuiScreenEvent;
import net.minecraftforge.common.MinecraftForge;
import org.lwjgl.input.Mouse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class EiraGuiScreen extends GuiScreen {
private static final ResourceLocation texMenuBackground = new ResourceLocation(EiraIRC.MOD_ID, "gfx/menubg.png");
protected final GuiScreen parentScreen;
protected final List<GuiTextField> textFieldList = new ArrayList<>();
protected final List<GuiLabel> labelList = new ArrayList<>();
protected final List<GuiList> listList = new ArrayList<>();
protected GuiOverlay overlay;
protected int menuX;
protected int menuY;
protected int menuWidth;
protected int menuHeight;
protected boolean allowSideClickClose = true;
private GuiButton selectedButton;
public EiraGuiScreen() {
this(null);
}
public EiraGuiScreen(GuiScreen parentScreen) {
this.parentScreen = parentScreen;
}
@Override
public void initGui() {
super.initGui();
setupMenuSize(300, 200);
textFieldList.clear();
labelList.clear();
listList.clear();
if(overlay != null) {
overlay.setWorldAndResolution(mc, width, height);
}
}
public void setupMenuSize(int menuWidth, int menuHeight) {
this.menuWidth = menuWidth;
this.menuHeight = menuHeight;
menuX = width / 2 - menuWidth / 2;
menuY = height / 2 - menuHeight / 2;
}
public boolean mouseClick(int mouseX, int mouseY, int mouseButton) throws IOException {
return overlay != null && overlay.mouseClick(mouseX, mouseY, mouseButton) || controlClicked(mouseX, mouseY, mouseButton);
}
public boolean controlClicked(int mouseX, int mouseY, int mouseButton) throws IOException {
if(mouseButton == 0) {
for(int i = 0; i < buttonList.size(); i++) {
GuiButton button = buttonList.get(i);
if(button.mousePressed(mc, mouseX, mouseY)) {
GuiScreenEvent.ActionPerformedEvent.Pre event = new GuiScreenEvent.ActionPerformedEvent.Pre(this, button, buttonList);
if(MinecraftForge.EVENT_BUS.post(event))
break;
selectedButton = event.button;
event.button.playPressSound(mc.getSoundHandler());
actionPerformed(event.button);
if(this.equals(mc.currentScreen))
MinecraftForge.EVENT_BUS.post(new GuiScreenEvent.ActionPerformedEvent.Post(this, event.button, buttonList));
return true;
}
}
}
boolean foundFocus = false;
for (GuiTextField textField : textFieldList) {
textField.mouseClicked(mouseX, mouseY, mouseButton);
if (textField.isFocused()) {
foundFocus = true;
}
}
if(foundFocus) {
return true;
}
for (GuiList list : listList) {
if (list.mouseClicked(mouseX, mouseY, mouseButton)) {
return true;
}
}
return false;
}
@Override
public void handleMouseInput() throws IOException {
super.handleMouseInput();
int wheelDelta = Mouse.getEventDWheel();
if(wheelDelta != 0) {
for (GuiList list : listList) {
list.mouseWheelMoved(wheelDelta);
}
}
}
@Override
protected void mouseClickMove(int mouseX, int mouseY, int clickedMouseButton, long timeSinceLastClick) {
super.mouseClickMove(mouseX, mouseY, clickedMouseButton, timeSinceLastClick);
if(selectedButton != null && clickedMouseButton == 0) {
selectedButton.mouseReleased(mouseX, mouseY);
selectedButton = null;
}
}
@Override
protected final void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException {
if(mouseClick(mouseX, mouseY, mouseButton)) {
return;
}
if(overlay == null && allowSideClickClose && isClickClosePosition(mouseX, mouseY)) {
gotoPrevious();
}
}
public boolean isClickClosePosition(int mouseX, int mouseY) {
return (mouseX < menuX || mouseX >= menuX + menuWidth);
}
public void gotoPrevious() {
mc.displayGuiScreen(parentScreen);
}
@Override
public void keyTyped(char unicode, int keyCode) throws IOException {
super.keyTyped(unicode, keyCode);
for (GuiTextField textField : textFieldList) {
if (textField.textboxKeyTyped(unicode, keyCode)) {
return;
}
}
}
@Override
public void updateScreen() {
super.updateScreen();
if(overlay != null) {
overlay.updateScreen();
}
textFieldList.forEach(GuiTextField::updateCursorCounter);
}
@Override
public void drawScreen (int mouseX, int mouseY, float p_73863_3_){
super.drawScreen(mouseX, mouseY, p_73863_3_);
labelList.forEach(GuiLabel::drawLabel);
textFieldList.forEach(GuiTextField::drawTextBox);
for (GuiList list : listList) {
list.drawList(mouseX, mouseY);
}
if(overlay != null) {
overlay.drawScreen(mouseX, mouseY, p_73863_3_);
}
}
public void drawLightBackground(int x, int y, int width, int height) {
mc.renderEngine.bindTexture(texMenuBackground);
EiraGui.drawTexturedRect(x, y, width, height, 0, 0, 300, 200, zLevel, 300, 200);
}
public void setOverlay(GuiOverlay overlay) {
this.overlay = overlay;
if(overlay != null) {
overlay.setWorldAndResolution(mc, width, height);
}
}
public void drawTooltip(List<String> tooltipList, int mouseX, int mouseY) {
drawHoveringText(tooltipList, mouseX, mouseY);
}
}