package mcjty.rftools.blocks.relay;
import mcjty.lib.container.GenericGuiContainer;
import mcjty.lib.gui.Window;
import mcjty.lib.gui.events.ButtonEvent;
import mcjty.lib.gui.events.ChoiceEvent;
import mcjty.lib.gui.events.TextEvent;
import mcjty.lib.gui.layout.HorizontalLayout;
import mcjty.lib.gui.layout.PositionalLayout;
import mcjty.lib.gui.layout.VerticalLayout;
import mcjty.lib.gui.widgets.Button;
import mcjty.lib.gui.widgets.*;
import mcjty.lib.gui.widgets.Label;
import mcjty.lib.gui.widgets.Panel;
import mcjty.lib.gui.widgets.TextField;
import mcjty.lib.network.Argument;
import mcjty.rftools.RFTools;
import mcjty.rftools.network.RFToolsMessages;
import net.minecraft.inventory.Container;
import net.minecraft.util.ResourceLocation;
import java.awt.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class GuiRelay extends GenericGuiContainer<RelayTileEntity> {
public static final int RELAY_WIDTH = 255;
public static final int RELAY_HEIGHT = 130;
private static final ResourceLocation iconGuiElements = new ResourceLocation(RFTools.MODID, "textures/gui/guielements.png");
// Maps from specific label to list of related widgets that needs to be enabled/disabled.
private Map<String,ImageChoiceLabel> inputOutputs = new HashMap<String, ImageChoiceLabel>();
private Map<String,TextField> energyValues = new HashMap<String, TextField>();
public GuiRelay(RelayTileEntity relayTileEntity, Container container) {
super(RFTools.instance, RFToolsMessages.INSTANCE, relayTileEntity, container, RFTools.GUI_MANUAL_MAIN, "prelay");
xSize = RELAY_WIDTH;
ySize = RELAY_HEIGHT;
}
@Override
public void initGui() {
super.initGui();
Panel toplevel = new Panel(mc, this).setFilledRectThickness(2).setLayout(new VerticalLayout());
toplevel.addChild(createRedstonePanel());
for (int i = 0 ; i < 6 ; i++) {
toplevel.addChild(createSidePanel(i));
}
toplevel.setBounds(new Rectangle(guiLeft, guiTop, RELAY_WIDTH, RELAY_HEIGHT));
window = new Window(this, toplevel);
}
private Panel createRedstonePanel() {
ImageLabel redstoneOff = new ImageLabel(mc, this).setImage(iconGuiElements, 16, 0);
redstoneOff.setDesiredWidth(16).setDesiredHeight(16).setTooltips("Redstone signal off").setLayoutHint(new PositionalLayout.PositionalHint(70, 0, 16, 16));
ImageLabel redstoneOn = new ImageLabel(mc, this).setImage(iconGuiElements, 32, 0);
redstoneOn.setDesiredWidth(16).setDesiredHeight(16).setTooltips("Redstone signal on").setLayoutHint(new PositionalLayout.PositionalHint(190, 0, 16, 16));
Panel panel = new Panel(mc, this).setLayout(new PositionalLayout()).
addChild(redstoneOff).
addChild(redstoneOn);
return panel;
}
private Panel createSidePanel(int side) {
String labelText = String.valueOf(RelayTileEntity.DUNSWE.charAt(side));
Label label = new Label(mc, this).setText(labelText);
label.setDesiredWidth(14).setDesiredHeight(14);
Panel panel = new Panel(mc, this).setLayout(new HorizontalLayout().setHorizontalMargin(1)).
addChild(label).
addChild(createSubPanel(side, "Off").setDesiredWidth(115)).
addChild(createSubPanel(side, "On").setDesiredWidth(115));
return panel;
}
private Panel createSubPanel(int side, String redstoneState) {
String labelText = String.valueOf(RelayTileEntity.DUNSWE.charAt(side));
int rf;
boolean input;
if ("Off".equals(redstoneState)) {
rf = tileEntity.getRfOff(side);
input = tileEntity.isInputModeOff(side);
} else {
rf = tileEntity.getRfOn(side);
input = tileEntity.isInputModeOn(side);
}
ImageChoiceLabel inputOutput = new ImageChoiceLabel(mc, this).
setDesiredWidth(14).setDesiredHeight(14).
addChoice("Output", "Side set to output mode", iconGuiElements, 80, 16).
addChoice("Input", "Side set to input mode", iconGuiElements, 96, 16).
addChoiceEvent(new ChoiceEvent() {
@Override
public void choiceChanged(Widget parent, String newChoice) {
changeSettings();
}
});
String key = labelText + redstoneState;
if (input) {
inputOutput.setCurrentChoice("Input");
} else {
inputOutput.setCurrentChoice("Output");
}
inputOutputs.put(key, inputOutput);
TextField energyField = new TextField(mc, this).setTooltips("Amount of RF to input/output", "when redstone is " + redstoneState).
setDesiredWidth(42).setDesiredHeight(14).
addTextEvent(new TextEvent() {
@Override
public void textChanged(Widget parent, String newText) {
adjustEnergy((TextField) parent, 0);
}
});
energyField.setText(String.valueOf(rf));
Button sub100 = createEnergyOffsetButton(energyField, "-", -500);
Button add100 = createEnergyOffsetButton(energyField, "+", 500);
Panel panel = new Panel(mc, this).setLayout(new HorizontalLayout().setHorizontalMargin(1)).
addChild(inputOutput).
addChild(sub100).
addChild(energyField).
addChild(add100);
energyValues.put(key, energyField);
return panel;
}
private Button createEnergyOffsetButton(final TextField energyField, String label, final int amount) {
return new Button(mc, this).setText(label).setDesiredHeight(14).setDesiredWidth(16).addButtonEvent(new ButtonEvent() {
@Override
public void buttonClicked(Widget parent) {
adjustEnergy(energyField, amount);
}
});
}
private void adjustEnergy(TextField energyField, int amount) {
int energy;
try {
energy = Integer.parseInt(energyField.getText());
} catch (NumberFormatException e) {
energy = 0;
}
energy += amount;
if (energy < 0) {
energy = 0;
} else if (energy > 50000) {
energy = 50000;
}
energyField.setText(Integer.toString(energy));
changeSettings();
}
private void changeSettings() {
List<Argument> arguments = new ArrayList<Argument>();
for (int i = 0 ; i < 6 ; i++) {
addArgument(arguments, i, "On");
addArgument(arguments, i, "Off");
}
sendServerCommand(RFToolsMessages.INSTANCE, RelayTileEntity.CMD_SETTINGS, arguments.toArray(new Argument[arguments.size()]));
}
private void addArgument(List<Argument> arguments, int i, String suffix) {
char prefix = RelayTileEntity.DUNSWE.charAt(i);
String key = prefix + suffix;
int energy = Integer.parseInt(energyValues.get(key).getText());
boolean input = "Input".equals(inputOutputs.get(key).getCurrentChoice());
arguments.add(new Argument(key, energy));
arguments.add(new Argument(prefix + "In" + suffix, input));
}
@Override
protected void drawGuiContainerBackgroundLayer(float v, int i, int i2) {
drawWindow();
}
}