package mcjty.rftools.blocks.screens;
import mcjty.lib.container.GenericGuiContainer;
import mcjty.lib.gui.Window;
import mcjty.lib.gui.events.ButtonEvent;
import mcjty.lib.gui.layout.PositionalLayout;
import mcjty.lib.gui.widgets.Panel;
import mcjty.lib.gui.widgets.ToggleButton;
import mcjty.lib.gui.widgets.Widget;
import mcjty.rftools.RFTools;
import mcjty.rftools.blocks.screens.modulesclient.ClientScreenModule;
import mcjty.rftools.blocks.screens.network.PacketModuleUpdate;
import mcjty.rftools.network.RFToolsMessages;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ResourceLocation;
import org.lwjgl.input.Keyboard;
import java.awt.*;
public class GuiScreen extends GenericGuiContainer<ScreenTileEntity> {
public static final int SCREEN_WIDTH = 256;
public static final int SCREEN_HEIGHT = 224;
private static final ResourceLocation iconLocation = new ResourceLocation(RFTools.MODID, "textures/gui/screen.png");
private Panel toplevel;
private ToggleButton buttons[] = new ToggleButton[ScreenContainer.SCREEN_MODULES];
private Panel modulePanels[] = new Panel[ScreenContainer.SCREEN_MODULES];
private ClientScreenModule[] clientScreenModules = new ClientScreenModule[ScreenContainer.SCREEN_MODULES];
private int selected = -1;
public GuiScreen(ScreenTileEntity screenTileEntity, ScreenContainer container) {
super(RFTools.instance, RFToolsMessages.INSTANCE, screenTileEntity, container, RFTools.GUI_MANUAL_MAIN, "screens");
xSize = SCREEN_WIDTH;
ySize = SCREEN_HEIGHT;
}
@Override
public void initGui() {
super.initGui();
toplevel = new Panel(mc, this).setBackground(iconLocation).setLayout(new PositionalLayout());
for (int i = 0 ; i < ScreenContainer.SCREEN_MODULES ; i++) {
buttons[i] = new ToggleButton(mc, this).setLayoutHint(new PositionalLayout.PositionalHint(30, 7 + i * 18 + 1, 40, 16)).setEnabled(false).setTooltips("Open the gui for this", "module");
final int finalI = i;
buttons[i].addButtonEvent(new ButtonEvent() {
@Override
public void buttonClicked(Widget parent) {
selectPanel(finalI);
}
});
toplevel.addChild(buttons[i]);
modulePanels[i] = null;
clientScreenModules[i] = null;
}
toplevel.setBounds(new Rectangle(guiLeft, guiTop, xSize, ySize));
window = new Window(this, toplevel);
Keyboard.enableRepeatEvents(true);
selected = -1;
}
private void selectPanel(int i) {
if (buttons[i].isPressed()) {
selected = i;
} else {
selected = -1;
}
}
private void refreshButtons() {
for (int i = 0 ; i < ScreenContainer.SCREEN_MODULES ; i++) {
final ItemStack slot = tileEntity.getStackInSlot(i);
if (slot != null && slot.getItem() != null && slot.getItem() instanceof ModuleProvider) {
ModuleProvider moduleProvider = (ModuleProvider) slot.getItem();
Class<? extends ClientScreenModule> clientScreenModuleClass = moduleProvider.getClientScreenModule();
if (!clientScreenModuleClass.isInstance(clientScreenModules[i])) {
installModuleGui(i, slot, moduleProvider, clientScreenModuleClass);
}
} else {
uninstallModuleGui(i);
}
if (modulePanels[i] != null) {
modulePanels[i].setVisible(selected == i);
buttons[i].setPressed(selected == i);
}
}
}
private void uninstallModuleGui(int i) {
buttons[i].setEnabled(false);
buttons[i].setPressed(false);
buttons[i].setText("");
clientScreenModules[i] = null;
toplevel.removeChild(modulePanels[i]);
modulePanels[i] = null;
if (selected == i) {
selected = -1;
}
}
private void installModuleGui(int i, final ItemStack slot, ModuleProvider moduleProvider, Class<? extends ClientScreenModule> clientScreenModuleClass) {
buttons[i].setEnabled(true);
toplevel.removeChild(modulePanels[i]);
try {
ClientScreenModule clientScreenModule = clientScreenModuleClass.newInstance();
clientScreenModules[i] = clientScreenModule;
} catch (InstantiationException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
NBTTagCompound tagCompound = slot.getTagCompound();
if (tagCompound == null) {
tagCompound = new NBTTagCompound();
}
final NBTTagCompound finalTagCompound = tagCompound;
final int finalI = i;
modulePanels[i] = clientScreenModules[i].createGui(mc, this, tagCompound, new ModuleGuiChanged() {
@Override
public void updateData() {
slot.setTagCompound(finalTagCompound);
tileEntity.setInventorySlotContents(finalI, slot);
RFToolsMessages.INSTANCE.sendToServer(new PacketModuleUpdate(tileEntity.xCoord, tileEntity.yCoord, tileEntity.zCoord, finalI, finalTagCompound));
}
});
modulePanels[i].setLayoutHint(new PositionalLayout.PositionalHint(80, 8, 170, 130));
modulePanels[i].setFilledRectThickness(-2).setFilledBackground(0xff8b8b8b);
toplevel.addChild(modulePanels[i]);
buttons[i].setText(moduleProvider.getName());
}
@Override
protected void drawGuiContainerBackgroundLayer(float v, int i, int i2) {
refreshButtons();
drawWindow();
}
}