package advancedsystemsmanager.client.gui; import advancedsystemsmanager.api.network.IPacketProvider; import advancedsystemsmanager.api.network.IPacketSync; import advancedsystemsmanager.flow.elements.CheckBox; import advancedsystemsmanager.flow.elements.CheckBoxList; import advancedsystemsmanager.helpers.CollisionHelper; import advancedsystemsmanager.tileentities.manager.Settings; import advancedsystemsmanager.network.ASMPacket; import advancedsystemsmanager.network.PacketHandler; import advancedsystemsmanager.reference.Names; import advancedsystemsmanager.reference.Null; import advancedsystemsmanager.registry.CommandRegistry; import advancedsystemsmanager.tileentities.manager.TileEntityManager; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.Minecraft; import net.minecraft.util.StatCollector; import java.util.ArrayList; import java.util.List; @SideOnly(Side.CLIENT) public class GuiSettings implements IInterfaceRenderer, IPacketProvider { private static final int CHECK_BOX_WIDTH = 100; private static final int START_X = 10; private static final int START_SETTINGS_X = 380; private static final int MARGIN_X = 30; private static final int START_Y = 20; private static final int MAX_Y = 250; private static final int BUTTON_SRC_X = 242; private static final int BUTTON_SRC_Y = 0; private static final int BUTTON_SIZE = 14; private static final int BUTTON_SIZE_INNER = 12; private static final String localization = Names.SETTINGS; private TileEntityManager manager; private List<Button> buttons; private CheckBoxList checkBoxes; private String cachedString; private int currentX; private int currentY; private int offsetY; private GuiManager cachedGui; public GuiSettings(final TileEntityManager manager) { this.manager = manager; buttons = new ArrayList<Button>(); buttons.add(new Button(493, 5, Names.GO_BACK, 231, 12 * CommandRegistry.getCommands().length) { @Override protected void onClick() { manager.specialRenderer = null; } }); } private int getXAndGenerateY(String str) { currentY += offsetY; List<String> lines = cachedGui.getLinesFromText(str, CHECK_BOX_WIDTH); int height = (int)((lines.size() + 1) * cachedGui.getFontHeight() * 0.7F); offsetY = height; if (currentY + height > MAX_Y) { currentY = START_Y; currentX += CHECK_BOX_WIDTH + MARGIN_X; } return currentX; } @Override public void draw(GuiManager gui, int mX, int mY) { if (cachedString == null || !StatCollector.translateToLocal(localization).equals(cachedString)) { addCheckboxes(gui); } gui.drawString(Names.PREFERENCES, START_X - 2, 6, 0x404040); if (Minecraft.getMinecraft().thePlayer.capabilities.isCreativeMode) { gui.drawString(Names.SETTINGS, START_SETTINGS_X - 2, 6, 0x404040); } checkBoxes.draw(gui, mX, mY); for (Button button : buttons) { button.draw(gui, mX, mY); } } private void addCheckboxes(GuiManager gui) { cachedGui = gui; cachedString = StatCollector.translateToLocal(localization); checkBoxes = new CheckBoxList(); currentX = START_X; currentY = START_Y; offsetY = 0; for (String setting : Settings.settingsRegistry.keySet()) { checkBoxes.addCheckBox(new CheckBoxSetting(Null.NULL_PACKET, setting)); } currentX = START_SETTINGS_X; currentY = START_Y; offsetY = 0; checkBoxes.addCheckBox(new CheckBoxSetting("limitless") { @Override public boolean getValue() { return Settings.isLimitless(manager); } @Override public void setValue(boolean val) { Settings.setLimitless(manager, val); } @Override public boolean isVisible() { return Minecraft.getMinecraft().thePlayer.capabilities.isCreativeMode; } }); } @Override public void drawMouseOver(GuiManager gui, int mX, int mY) { for (Button button : buttons) { button.drawMouseOver(gui, mX, mY); } } @Override public void onClick(GuiManager gui, int mX, int mY, int b) { checkBoxes.onClick(mX, mY); for (Button button : buttons) { if (button.inBounds(mX, mY)) { button.onClick(); break; } } } @Override public void onDrag(GuiManager gui, int mX, int mY) { } @Override public void onRelease(GuiManager gui, int mX, int mY, int button) { } @Override public boolean onKeyTyped(GuiManager gui, char c, int k) { return false; } @Override public void onScroll(int scroll) { } @Override public ASMPacket getSyncPacket() { return PacketHandler.getServerPacket(); } @Override public void registerSyncable(IPacketSync networkSync) { } @Override public void sendPacketToServer(ASMPacket packet) { PacketHandler.sendDataToServer(packet); } private class CheckBoxSetting extends CheckBox { private String key; private String name; private CheckBoxSetting(String name) { this(GuiSettings.this, name); } private CheckBoxSetting(IPacketProvider provider, String name) { super(provider, null, getXAndGenerateY(StatCollector.translateToLocal(Names.SETTINGS + "." + name)), currentY); key = Names.SETTINGS + "." + name; this.name = name; setTextWidth(CHECK_BOX_WIDTH); } @Override public void onUpdate() { } @Override public boolean getValue() { return Settings.getSetting(name); } @Override public void setValue(boolean val) { Settings.setSetting(name, val); } @Override public String getName() { return key; } } private abstract class Button { private int x; private int y; private String name; private int srcX; private int srcY; private Button(int x, int y, String name, int srcX, int srcY) { this.x = x; this.y = y; this.name = name; this.srcX = srcX; this.srcY = srcY; } private void draw(GuiManager gui, int mX, int mY) { int srcYButton = inBounds(mX, mY) ? 1 : 0; gui.drawTexture(x, y, BUTTON_SRC_X, BUTTON_SRC_Y + srcYButton * BUTTON_SIZE, BUTTON_SIZE, BUTTON_SIZE); gui.drawTexture(x + 2, y + 2, srcX, srcY, BUTTON_SIZE_INNER, BUTTON_SIZE_INNER); } private boolean inBounds(int mX, int mY) { return CollisionHelper.inBounds(x, y, BUTTON_SIZE, BUTTON_SIZE, mX, mY); } private void drawMouseOver(GuiManager gui, int mX, int mY) { if (inBounds(mX, mY)) { gui.drawMouseOver(name, mX, mY); } } protected abstract void onClick(); } }