IndustrialWires/src/main/java/malte0811/industrialwires/client/gui/GuiPanelComponent.java
2018-09-03 20:35:23 +02:00

381 lines
14 KiB
Java

/*
* This file is part of Industrial Wires.
* Copyright (C) 2016-2018 malte0811
* Industrial Wires is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* Industrial Wires is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with Industrial Wires. If not, see <http://www.gnu.org/licenses/>.
*/
package malte0811.industrialwires.client.gui;
import blusunrize.immersiveengineering.client.ClientUtils;
import blusunrize.immersiveengineering.client.gui.elements.GuiButtonCheckbox;
import blusunrize.immersiveengineering.client.gui.elements.GuiSliderIE;
import com.google.common.collect.ImmutableList;
import malte0811.industrialwires.IndustrialWires;
import malte0811.industrialwires.client.gui.elements.GuiChannelPicker;
import malte0811.industrialwires.client.gui.elements.GuiChannelPickerSmall;
import malte0811.industrialwires.client.gui.elements.GuiIntChooser;
import malte0811.industrialwires.containers.ContainerPanelComponent;
import malte0811.industrialwires.controlpanel.IConfigurableComponent;
import malte0811.industrialwires.controlpanel.PanelComponent;
import malte0811.industrialwires.network.MessageItemSync;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Gui;
import net.minecraft.client.gui.GuiTextField;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.util.EnumHand;
import net.minecraft.util.ResourceLocation;
import org.lwjgl.input.Keyboard;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import static malte0811.industrialwires.util.NBTKeys.*;
public class GuiPanelComponent extends GuiContainer {
private PanelComponent component;
private IConfigurableComponent confComp;
private ContainerPanelComponent container;
private List<GuiButtonCheckbox> boolButtons = new ArrayList<>();
private List<GuiTextField> stringTexts = new ArrayList<>();
private List<GuiChannelPicker> rsChannelChoosers = new ArrayList<>();
private List<GuiIntChooser> intChoosers = new ArrayList<>();
private List<GuiSliderIE> floatSliders = new ArrayList<>();
public GuiPanelComponent(EnumHand h, PanelComponent pc) {
super(new ContainerPanelComponent(h));
container = (ContainerPanelComponent) inventorySlots;
component = pc;
}
@Override
public void initGui() {
super.initGui();
xSize = 150;
ySize = 150;
Keyboard.enableRepeatEvents(true);
if (component instanceof IConfigurableComponent) {
confComp = (IConfigurableComponent) component;
IConfigurableComponent.BoolConfig[] bools = confComp.getBooleanOptions();
boolButtons.clear();
int componentLeft = this.guiLeft + 5;
int componentTop = this.guiTop + 5;
for (int i = 0; i < bools.length; i++) {
IConfigurableComponent.BoolConfig bc = bools[i];
boolButtons.add(new GuiButtonCheckbox(0, componentLeft + bc.x, componentTop + bc.y, confComp.fomatConfigName(IConfigurableComponent.ConfigType.BOOL, i), bc.value));
}
IConfigurableComponent.StringConfig[] strings = confComp.getStringOptions();
stringTexts.clear();
for (IConfigurableComponent.StringConfig sc : strings) {
GuiTextField toAdd = new GuiTextField(0, mc.fontRenderer, componentLeft + sc.x, componentTop + sc.y, 58, 12);
toAdd.setText(sc.value);
stringTexts.add(toAdd);
}
IConfigurableComponent.RSColorConfig[] rs = confComp.getRSChannelOptions();
rsChannelChoosers.clear();
for (IConfigurableComponent.RSColorConfig rc : rs) {
if (rc.small) {
rsChannelChoosers.add(new GuiChannelPickerSmall(0, componentLeft + rc.x, componentTop + rc.y, 10, 40, rc.value));
} else {
rsChannelChoosers.add(new GuiChannelPicker(0, componentLeft + rc.x, componentTop + rc.y, 40, rc.value));
}
}
intChoosers.clear();
IConfigurableComponent.IntConfig[] is = confComp.getIntegerOptions();
for (IConfigurableComponent.IntConfig ic : is) {
intChoosers.add(new GuiIntChooser(componentLeft + ic.x, componentTop + ic.y, ic.allowNegative, ic.value, ic.digits));
}
floatSliders.clear();
IConfigurableComponent.FloatConfig[] fs = confComp.getFloatOptions();
for (int i = 0; i < fs.length; i++) {
IConfigurableComponent.FloatConfig fc = fs[i];
floatSliders.add(new GuiSliderIE(0, componentLeft + fc.x, componentTop + fc.y, fc.width,
confComp.fomatConfigName(IConfigurableComponent.ConfigType.FLOAT, i), fc.value));
}
}
}
private ResourceLocation textureLoc = new ResourceLocation(IndustrialWires.MODID, "textures/gui/panel_component.png");
@Override
protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) {
GlStateManager.color(1, 1, 1, 1);
mc.getTextureManager().bindTexture(textureLoc);
Gui.drawModalRectWithCustomSizedTexture(guiLeft, guiTop, 0, 0, xSize, ySize, 150, 150);
}
@Override
public void onGuiClosed() {
super.onGuiClosed();
Keyboard.enableRepeatEvents(false);
syncAll();
}
@Override
protected void keyTyped(char typedChar, int keyCode) throws IOException {
boolean superCall = true;
for (int i = 0; i < stringTexts.size(); i++) {
GuiTextField field = stringTexts.get(i);
if (field.isFocused() && keyCode == 28) {
sync(i, field.getText());
superCall = false;
} else if (field.textboxKeyTyped(typedChar, keyCode)) {
superCall = false;
}
}
if (superCall) {
super.keyTyped(typedChar, keyCode);
}
}
@Override
protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException {
super.mouseClicked(mouseX, mouseY, mouseButton);
for (int i = 0; i < rsChannelChoosers.size(); i++) {
GuiChannelPicker picker = rsChannelChoosers.get(i);
int old = picker.getSelected();
boolean stopNow = picker.click(mouseX, mouseY);
if (old != picker.getSelected()) {
sync(i, picker.getSelected());
}
if (stopNow) {
for (GuiChannelPicker picker2:rsChannelChoosers) {
if (picker!=picker2&&picker2 instanceof GuiChannelPickerSmall) {
((GuiChannelPickerSmall) picker2).close();
}
}
return;
}
}
for (int i = 0; i < stringTexts.size(); i++) {
GuiTextField field = stringTexts.get(i);
boolean focus = field.isFocused();
field.mouseClicked(mouseX, mouseY, mouseButton);
if (focus && !field.isFocused()) {
sync(i, field.getText());
}
}
for (int i = 0; i < boolButtons.size(); i++) {
GuiButtonCheckbox box = boolButtons.get(i);
boolean on = box.state;
box.mousePressed(mc, mouseX, mouseY);
if (on != box.state) {
sync(i, box.state);
}
}
for (int i = 0; i < intChoosers.size(); i++) {
GuiIntChooser chooser = intChoosers.get(i);
int oldV = chooser.getValue();
chooser.click(mouseX, mouseY);
if (oldV != chooser.getValue()) {
sync(i, chooser.getValue());
}
}
for (int i = 0; i < floatSliders.size(); i++) {
GuiSliderIE slider = floatSliders.get(i);
double oldV = slider.getValue();
slider.mousePressed(mc, mouseX, mouseY);
if (oldV != slider.getValue()) {
sync(i, (float) slider.getValue());
}
}
}
@Override
protected void mouseReleased(int mouseX, int mouseY, int state) {
super.mouseReleased(mouseX, mouseY, state);
for (int i = 0; i < floatSliders.size(); i++) {
GuiSliderIE slider = floatSliders.get(i);
double oldV = slider.getValue();
slider.mouseReleased(mouseX, mouseY);
if (oldV != slider.getValue()) {
sync(i, (float) slider.getValue());
}
}
}
@Override
public void drawScreen(int mouseX, int mouseY, float partialTicks) {
this.drawDefaultBackground();
super.drawScreen(mouseX, mouseY, partialTicks);
this.renderHoveredToolTip(mouseX, mouseY);
GlStateManager.color(1, 1, 1, 1);
RenderHelper.disableStandardItemLighting();
for (GuiButtonCheckbox box : boolButtons) {
box.drawButton(mc, mouseX, mouseY, partialTicks);
}
for (GuiTextField field : stringTexts) {
field.drawTextBox();
}
for (GuiIntChooser choose : intChoosers) {
choose.drawChooser();
}
for (int i = 0; i < floatSliders.size(); i++) {
GuiSliderIE slider = floatSliders.get(i);
double oldV = slider.getValue();
slider.drawButton(mc, mouseX, mouseY, partialTicks);
if (oldV != slider.getValue()) {
sync(i, (float) slider.getValue());
}
}
GuiChannelPickerSmall openPicker = null;
for (GuiChannelPicker pick : rsChannelChoosers) {
if (pick instanceof GuiChannelPickerSmall&&((GuiChannelPickerSmall) pick).open) {
openPicker = (GuiChannelPickerSmall) pick;
} else {
pick.drawButton(mc, mouseX, mouseY, partialTicks);
}
}
if (openPicker != null) {
openPicker.drawButton(mc, mouseX, mouseY, partialTicks);
}
//TOOLTIPS
for (int i = 0; i < rsChannelChoosers.size(); i++) {
GuiChannelPicker pick = rsChannelChoosers.get(i);
String tooltip = confComp.fomatConfigDescription(IConfigurableComponent.ConfigType.RS_CHANNEL, i);
if (tooltip != null && pick.isHovered(mouseX, mouseY)) {
ClientUtils.drawHoveringText(ImmutableList.of(tooltip), mouseX, mouseY, mc.fontRenderer);
return;
}
}
for (int i = 0; i < boolButtons.size(); i++) {
GuiButtonCheckbox box = boolButtons.get(i);
String tooltip = confComp.fomatConfigDescription(IConfigurableComponent.ConfigType.BOOL, i);
if (tooltip != null && box.isMouseOver()) {
ClientUtils.drawHoveringText(ImmutableList.of(tooltip), mouseX, mouseY, mc.fontRenderer);
return;
}
}
for (int i = 0; i < stringTexts.size(); i++) {
GuiTextField field = stringTexts.get(i);
String tooltip = confComp.fomatConfigDescription(IConfigurableComponent.ConfigType.STRING, i);
if (tooltip != null && mouseX >= field.x && mouseX < field.x + field.width &&
mouseY >= field.y && mouseY < field.y + field.height) {
ClientUtils.drawHoveringText(ImmutableList.of(tooltip), mouseX, mouseY, mc.fontRenderer);
return;
}
}
for (int i = 0; i < intChoosers.size(); i++) {
GuiIntChooser choose = intChoosers.get(i);
String tooltip = confComp.fomatConfigDescription(IConfigurableComponent.ConfigType.INT, i);
if (tooltip != null && choose.isMouseOver(mouseX, mouseY)) {
ClientUtils.drawHoveringText(ImmutableList.of(tooltip), mouseX, mouseY, mc.fontRenderer);
return;
}
}
for (int i = 0; i < floatSliders.size(); i++) {
GuiSliderIE choose = floatSliders.get(i);
String tooltip = confComp.fomatConfigDescription(IConfigurableComponent.ConfigType.FLOAT, i);
if (tooltip != null && choose.isMouseOver()) {
ClientUtils.drawHoveringText(ImmutableList.of(tooltip), mouseX, mouseY, mc.fontRenderer);
return;
}
}
}
private void sync(int id, String value) {
NBTTagCompound update = new NBTTagCompound();
update.setInteger(TYPE, IConfigurableComponent.ConfigType.STRING.ordinal());
update.setInteger(ID, id);
update.setString(VALUE, value);
syncSingle(update);
}
private void sync(int id, boolean value) {
NBTTagCompound update = new NBTTagCompound();
update.setInteger(TYPE, IConfigurableComponent.ConfigType.BOOL.ordinal());
update.setInteger(ID, id);
update.setBoolean(VALUE, value);
syncSingle(update);
}
private void sync(int id, byte value) {
NBTTagCompound update = new NBTTagCompound();
update.setInteger(TYPE, IConfigurableComponent.ConfigType.RS_CHANNEL.ordinal());
update.setInteger(ID, id);
update.setByte(VALUE, value);
syncSingle(update);
}
private void sync(int id, int value) {
NBTTagCompound update = new NBTTagCompound();
update.setInteger(TYPE, IConfigurableComponent.ConfigType.INT.ordinal());
update.setInteger(ID, id);
update.setInteger(VALUE, value);
syncSingle(update);
}
private void sync(int id, float value) {
NBTTagCompound update = new NBTTagCompound();
update.setInteger(TYPE, IConfigurableComponent.ConfigType.FLOAT.ordinal());
update.setInteger(ID, id);
update.setFloat(VALUE, value);
syncSingle(update);
}
private void syncAll() {
NBTTagList list = new NBTTagList();
for (int i = 0; i < stringTexts.size(); i++) {
NBTTagCompound update = new NBTTagCompound();
update.setInteger(TYPE, IConfigurableComponent.ConfigType.STRING.ordinal());
update.setInteger(ID, i);
update.setString(VALUE, stringTexts.get(i).getText());
list.appendTag(update);
}
for (int i = 0; i < boolButtons.size(); i++) {
NBTTagCompound update = new NBTTagCompound();
update.setInteger(TYPE, IConfigurableComponent.ConfigType.BOOL.ordinal());
update.setInteger(ID, i);
update.setBoolean(VALUE, boolButtons.get(i).state);
list.appendTag(update);
}
for (int i = 0; i < rsChannelChoosers.size(); i++) {
NBTTagCompound update = new NBTTagCompound();
update.setInteger(TYPE, IConfigurableComponent.ConfigType.RS_CHANNEL.ordinal());
update.setInteger(ID, i);
update.setByte(VALUE, rsChannelChoosers.get(i).getSelected());
list.appendTag(update);
}
for (int i = 0; i < intChoosers.size(); i++) {
NBTTagCompound update = new NBTTagCompound();
update.setInteger(TYPE, IConfigurableComponent.ConfigType.INT.ordinal());
update.setInteger(ID, i);
update.setInteger(VALUE, intChoosers.get(i).getValue());
list.appendTag(update);
}
for (int i = 0; i < floatSliders.size(); i++) {
NBTTagCompound update = new NBTTagCompound();
update.setInteger(TYPE, IConfigurableComponent.ConfigType.FLOAT.ordinal());
update.setInteger(ID, i);
update.setFloat(VALUE, (float) floatSliders.get(i).getValue());
list.appendTag(update);
}
sync(list);
}
private void syncSingle(NBTTagCompound nbt) {
NBTTagList list = new NBTTagList();
list.appendTag(nbt);
sync(list);
}
private void sync(NBTTagList list) {
NBTTagCompound nbt = new NBTTagCompound();
nbt.setTag("data", list);
IndustrialWires.packetHandler.sendToServer(new MessageItemSync(container.hand, nbt));
IndustrialWires.panelComponent.onChange(nbt, Minecraft.getMinecraft().player, container.hand);
}
}