diff --git a/src/main/java/appeng/client/gui/AEBaseScreen.java b/src/main/java/appeng/client/gui/AEBaseScreen.java index c8c0b32a3..fe2166933 100644 --- a/src/main/java/appeng/client/gui/AEBaseScreen.java +++ b/src/main/java/appeng/client/gui/AEBaseScreen.java @@ -35,6 +35,7 @@ import org.lwjgl.opengl.GL11; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; +import net.minecraft.client.gui.IGuiEventListener; import net.minecraft.client.gui.screen.inventory.ContainerScreen; import net.minecraft.client.gui.widget.Widget; import net.minecraft.client.renderer.BufferBuilder; @@ -60,6 +61,7 @@ import net.minecraftforge.fml.client.gui.GuiUtils; import appeng.api.storage.data.IAEFluidStack; import appeng.api.storage.data.IAEItemStack; import appeng.client.gui.widgets.CustomSlotWidget; +import appeng.client.gui.widgets.ITickingWidget; import appeng.client.gui.widgets.ITooltip; import appeng.client.gui.widgets.Scrollbar; import appeng.client.me.InternalSlotME; @@ -88,6 +90,9 @@ import appeng.fluids.container.slots.IMEFluidSlot; import appeng.helpers.InventoryAction; public abstract class AEBaseScreen extends ContainerScreen { + + public static final int COLOR_DARK_GRAY = 4210752; + private final List meSlots = new ArrayList<>(); // drag y private final Set drag_click = new HashSet<>(); @@ -781,4 +786,14 @@ public abstract class AEBaseScreen extends ContainerS protected List getMeSlots() { return this.meSlots; } + + public void tick() { + super.tick(); + for (IGuiEventListener child : children) { + if (child instanceof ITickingWidget) { + ((ITickingWidget) child).tick(); + } + } + } + } diff --git a/src/main/java/appeng/client/gui/NumberEntryType.java b/src/main/java/appeng/client/gui/NumberEntryType.java new file mode 100644 index 000000000..10b079b5e --- /dev/null +++ b/src/main/java/appeng/client/gui/NumberEntryType.java @@ -0,0 +1,16 @@ +package appeng.client.gui; + +public enum NumberEntryType { + CRAFT_ITEM_COUNT(Long.class), PRIORITY(Long.class), LEVEL_ITEM_COUNT(Long.class), LEVEL_FLUID_VOLUME(Long.class); + + private final Class inputType; + + NumberEntryType(Class inputType) { + this.inputType = inputType; + } + + public Class getInputType() { + return inputType; + } + +} diff --git a/src/main/java/appeng/client/gui/implementations/CraftAmountScreen.java b/src/main/java/appeng/client/gui/implementations/CraftAmountScreen.java index 629b7ac80..418579bee 100644 --- a/src/main/java/appeng/client/gui/implementations/CraftAmountScreen.java +++ b/src/main/java/appeng/client/gui/implementations/CraftAmountScreen.java @@ -19,15 +19,13 @@ package appeng.client.gui.implementations; import net.minecraft.client.gui.widget.button.Button; -import net.minecraft.client.util.InputMappings; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.util.text.ITextComponent; import net.minecraftforge.fml.client.gui.GuiUtils; import appeng.client.gui.AEBaseScreen; -import appeng.client.gui.widgets.NumberBox; +import appeng.client.gui.NumberEntryType; import appeng.container.implementations.CraftAmountContainer; -import appeng.core.AEConfig; import appeng.core.localization.GuiText; import appeng.core.sync.network.NetworkHandler; import appeng.core.sync.packets.CraftRequestPacket; @@ -35,7 +33,7 @@ import appeng.core.sync.packets.CraftRequestPacket; public class CraftAmountScreen extends AEBaseScreen { private final AESubScreen subGui; - private NumberBox amountToCraft; + private NumberEntryWidget amountToCraft; private Button next; @@ -48,39 +46,22 @@ public class CraftAmountScreen extends AEBaseScreen { public void init() { super.init(); - final int a = AEConfig.instance().craftItemsByStackAmounts(0); - final int b = AEConfig.instance().craftItemsByStackAmounts(1); - final int c = AEConfig.instance().craftItemsByStackAmounts(2); - final int d = AEConfig.instance().craftItemsByStackAmounts(3); - - this.addButton(new Button(this.guiLeft + 20, this.guiTop + 26, 22, 20, "+" + a, btn -> addQty(a))); - this.addButton(new Button(this.guiLeft + 48, this.guiTop + 26, 28, 20, "+" + b, btn -> addQty(b))); - this.addButton(new Button(this.guiLeft + 82, this.guiTop + 26, 32, 20, "+" + c, btn -> addQty(c))); - this.addButton(new Button(this.guiLeft + 120, this.guiTop + 26, 38, 20, "+" + d, btn -> addQty(d))); - - this.addButton(new Button(this.guiLeft + 20, this.guiTop + 75, 22, 20, "-" + a, btn -> addQty(-a))); - this.addButton(new Button(this.guiLeft + 48, this.guiTop + 75, 28, 20, "-" + b, btn -> addQty(-b))); - this.addButton(new Button(this.guiLeft + 82, this.guiTop + 75, 32, 20, "-" + c, btn -> addQty(-c))); - this.addButton(new Button(this.guiLeft + 120, this.guiTop + 75, 38, 20, "-" + d, btn -> addQty(-d))); + this.amountToCraft = new NumberEntryWidget(this, 20, 30, 138, 62, NumberEntryType.CRAFT_ITEM_COUNT, value -> { + }); + this.amountToCraft.setValue(1); + this.amountToCraft.setTextFieldBounds(62, 57, 50); + this.amountToCraft.setMinValue(1); + this.amountToCraft.addButtons(children::add, this::addButton); this.next = this.addButton( new Button(this.guiLeft + 128, this.guiTop + 51, 38, 20, GuiText.Next.getLocal(), this::confirm)); subGui.addBackButton(this::addButton, 154, 0); - - this.amountToCraft = new NumberBox(this.font, this.guiLeft + 62, this.guiTop + 57, 59, this.font.FONT_HEIGHT, - Integer.class); - this.amountToCraft.setEnableBackgroundDrawing(false); - this.amountToCraft.setMaxStringLength(16); - this.amountToCraft.setTextColor(0xFFFFFF); - this.amountToCraft.setVisible(true); - this.amountToCraft.setFocused2(true); - this.amountToCraft.setText("1"); } private void confirm(Button button) { NetworkHandler.instance() - .sendToServer(new CraftRequestPacket(Integer.parseInt(this.amountToCraft.getText()), hasShiftDown())); + .sendToServer(new CraftRequestPacket((int) this.amountToCraft.getValue(), hasShiftDown())); } @Override @@ -95,99 +76,23 @@ public class CraftAmountScreen extends AEBaseScreen { this.bindTexture("guis/craft_amt.png"); GuiUtils.drawTexturedModalRect(offsetX, offsetY, 0, 0, this.xSize, this.ySize, getBlitOffset()); - try { - Long.parseLong(this.amountToCraft.getText()); - this.next.active = !this.amountToCraft.getText().isEmpty(); - } catch (final NumberFormatException e) { - this.next.active = false; - } + this.next.active = this.amountToCraft.getValue() > 0; this.amountToCraft.render(offsetX, offsetY, partialTicks); } - @Override - public boolean charTyped(char ch, int p_charTyped_2_) { - // Forward entered text to the craft amount text-field - return this.amountToCraft.charTyped(ch, p_charTyped_2_); - } - @Override public boolean keyPressed(int keyCode, int scanCode, int p_keyPressed_3_) { - if (!this.checkHotbarKeys(InputMappings.getInputByCode(keyCode, scanCode))) { - if (keyCode == 28) { - this.next.onPress(); - } - if ((keyCode == 211 || keyCode == 205 || keyCode == 203 || keyCode == 14) - && this.amountToCraft.keyPressed(keyCode, scanCode, p_keyPressed_3_)) { - try { - String out = this.amountToCraft.getText(); - - boolean fixed = false; - while (out.startsWith("0") && out.length() > 1) { - out = out.substring(1); - fixed = true; - } - - if (fixed) { - this.amountToCraft.setText(out); - } - - if (out.isEmpty()) { - out = "0"; - } - - final long result = Long.parseLong(out); - if (result < 0) { - this.amountToCraft.setText("1"); - } - } catch (final NumberFormatException e) { - // :P - } - return true; - } - } - - return super.keyPressed(keyCode, scanCode, p_keyPressed_3_); - } - - private void addQty(final int i) { - try { - String out = this.amountToCraft.getText(); - - boolean fixed = false; - while (out.startsWith("0") && out.length() > 1) { - out = out.substring(1); - fixed = true; - } - - if (fixed) { - this.amountToCraft.setText(out); - } - - if (out.isEmpty()) { - out = "0"; - } - - long result = Integer.parseInt(out); - - if (result == 1 && i > 1) { - result = 0; - } - - result += i; - if (result < 1) { - result = 1; - } - - out = Long.toString(result); - Integer.parseInt(out); - this.amountToCraft.setText(out); - } catch (final NumberFormatException e) { - // :P + if (keyCode == 28) { + this.next.onPress(); + return true; + } else { + return super.keyPressed(keyCode, scanCode, p_keyPressed_3_); } } protected String getBackground() { return "guis/craftAmt.png"; } + } diff --git a/src/main/java/appeng/client/gui/implementations/LevelEmitterScreen.java b/src/main/java/appeng/client/gui/implementations/LevelEmitterScreen.java index 78954efce..a9c608bbb 100644 --- a/src/main/java/appeng/client/gui/implementations/LevelEmitterScreen.java +++ b/src/main/java/appeng/client/gui/implementations/LevelEmitterScreen.java @@ -18,39 +18,27 @@ package appeng.client.gui.implementations; -import net.minecraft.client.gui.widget.button.Button; -import net.minecraft.client.util.InputMappings; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.util.text.ITextComponent; import appeng.api.config.FuzzyMode; import appeng.api.config.LevelType; +import appeng.api.config.PowerUnits; import appeng.api.config.RedstoneMode; import appeng.api.config.Settings; import appeng.api.config.Upgrades; import appeng.api.config.YesNo; -import appeng.client.gui.widgets.NumberBox; +import appeng.client.gui.NumberEntryType; import appeng.client.gui.widgets.ServerSettingToggleButton; import appeng.client.gui.widgets.SettingToggleButton; import appeng.container.implementations.LevelEmitterContainer; -import appeng.core.AEConfig; import appeng.core.localization.GuiText; import appeng.core.sync.network.NetworkHandler; import appeng.core.sync.packets.ConfigValuePacket; public class LevelEmitterScreen extends UpgradeableScreen { - private NumberBox level; - - private Button plus1; - private Button plus10; - private Button plus100; - private Button plus1000; - private Button minus1; - private Button minus10; - private Button minus100; - private Button minus1000; - + private NumberEntryWidget level; private SettingToggleButton levelMode; private SettingToggleButton craftingMode; @@ -62,16 +50,17 @@ public class LevelEmitterScreen extends UpgradeableScreen public void init() { super.init(); - this.level = new NumberBox(this.font, this.guiLeft + 24, this.guiTop + 43, 79, this.font.FONT_HEIGHT, - Long.class); - this.level.setEnableBackgroundDrawing(false); - this.level.setMaxStringLength(16); - this.level.setTextColor(0xFFFFFF); - this.level.setVisible(true); - this.level.setFocused2(true); + this.level = new NumberEntryWidget(this, 20, 17, 138, 62, NumberEntryType.LEVEL_ITEM_COUNT, + this::onLevelChange); + this.level.setTextFieldBounds(25, 44, 75); + this.level.addButtons(children::add, this::addButton); container.setTextField(this.level); } + private void onLevelChange(long level) { + NetworkHandler.instance().sendToServer(new ConfigValuePacket("LevelEmitter.Value", String.valueOf(level))); + } + @Override protected void addButtons() { this.levelMode = new ServerSettingToggleButton<>(this.guiLeft - 18, this.guiTop + 8, Settings.LEVEL_TYPE, @@ -82,29 +71,6 @@ public class LevelEmitterScreen extends UpgradeableScreen FuzzyMode.IGNORE_ALL); this.craftingMode = new ServerSettingToggleButton<>(this.guiLeft - 18, this.guiTop + 48, Settings.CRAFT_VIA_REDSTONE, YesNo.NO); - - final int a = AEConfig.instance().levelByStackAmounts(0); - final int b = AEConfig.instance().levelByStackAmounts(1); - final int c = AEConfig.instance().levelByStackAmounts(2); - final int d = AEConfig.instance().levelByStackAmounts(3); - - this.addButton(this.plus1 = new Button(this.guiLeft + 20, this.guiTop + 17, 22, 20, "+" + a, btn -> addQty(a))); - this.addButton( - this.plus10 = new Button(this.guiLeft + 48, this.guiTop + 17, 28, 20, "+" + b, btn -> addQty(b))); - this.addButton( - this.plus100 = new Button(this.guiLeft + 82, this.guiTop + 17, 32, 20, "+" + c, btn -> addQty(c))); - this.addButton( - this.plus1000 = new Button(this.guiLeft + 120, this.guiTop + 17, 38, 20, "+" + d, btn -> addQty(d))); - - this.addButton( - this.minus1 = new Button(this.guiLeft + 20, this.guiTop + 59, 22, 20, "-" + a, btn -> addQty(-a))); - this.addButton( - this.minus10 = new Button(this.guiLeft + 48, this.guiTop + 59, 28, 20, "-" + b, btn -> addQty(-b))); - this.addButton( - this.minus100 = new Button(this.guiLeft + 82, this.guiTop + 59, 32, 20, "-" + c, btn -> addQty(-c))); - this.addButton( - this.minus1000 = new Button(this.guiLeft + 120, this.guiTop + 59, 38, 20, "-" + d, btn -> addQty(-d))); - this.addButton(this.levelMode); this.addButton(this.redstoneMode); this.addButton(this.craftingMode); @@ -115,15 +81,7 @@ public class LevelEmitterScreen extends UpgradeableScreen final boolean notCraftingMode = this.bc.getInstalledUpgrades(Upgrades.CRAFTING) == 0; // configure enabled status... - this.level.setEnabled(notCraftingMode); - this.plus1.active = notCraftingMode; - this.plus10.active = notCraftingMode; - this.plus100.active = notCraftingMode; - this.plus1000.active = notCraftingMode; - this.minus1.active = notCraftingMode; - this.minus10.active = notCraftingMode; - this.minus100.active = notCraftingMode; - this.minus1000.active = notCraftingMode; + this.level.setActive(notCraftingMode); this.levelMode.active = notCraftingMode; this.redstoneMode.active = notCraftingMode; @@ -134,7 +92,14 @@ public class LevelEmitterScreen extends UpgradeableScreen } if (this.levelMode != null) { - this.levelMode.set(((LevelEmitterContainer) this.cvb).getLevelMode()); + LevelType currentLevelMode = ((LevelEmitterContainer) this.cvb).getLevelMode(); + this.levelMode.set(currentLevelMode); + + if (notCraftingMode) { + if (currentLevelMode == LevelType.ENERGY_LEVEL) { + this.font.drawString(PowerUnits.AE.textComponent().getString(), 110, 44, COLOR_DARK_GRAY); + } + } } } @@ -160,70 +125,4 @@ public class LevelEmitterScreen extends UpgradeableScreen return GuiText.LevelEmitter; } - private void addQty(final long i) { - try { - String Out = this.level.getText(); - - boolean Fixed = false; - while (Out.startsWith("0") && Out.length() > 1) { - Out = Out.substring(1); - Fixed = true; - } - - if (Fixed) { - this.level.setText(Out); - } - - if (Out.isEmpty()) { - Out = "0"; - } - - long result = Long.parseLong(Out); - result += i; - if (result < 0) { - result = 0; - } - - this.level.setText(Out = Long.toString(result)); - - NetworkHandler.instance().sendToServer(new ConfigValuePacket("LevelEmitter.Value", Out)); - } catch (final NumberFormatException e) { - // nope.. - this.level.setText("0"); - } - } - - @Override - public boolean charTyped(char character, int key) { - // Forward entered characters to the number-text-field - return level.charTyped(character, key); - } - - @Override - public boolean keyPressed(int keyCode, int scanCode, int p_keyPressed_3_) { - if (!this.checkHotbarKeys(InputMappings.getInputByCode(keyCode, scanCode))) { - if (keyCode == 211 || keyCode == 205 || keyCode == 203 || keyCode == 14) { - String Out = this.level.getText(); - - boolean Fixed = false; - while (Out.startsWith("0") && Out.length() > 1) { - Out = Out.substring(1); - Fixed = true; - } - - if (Fixed) { - this.level.setText(Out); - } - - if (Out.isEmpty()) { - Out = "0"; - } - - NetworkHandler.instance().sendToServer(new ConfigValuePacket("LevelEmitter.Value", Out)); - return true; - } - } - - return super.keyPressed(keyCode, scanCode, p_keyPressed_3_); - } } diff --git a/src/main/java/appeng/client/gui/implementations/NumberEntryWidget.java b/src/main/java/appeng/client/gui/implementations/NumberEntryWidget.java new file mode 100644 index 000000000..ccabecad7 --- /dev/null +++ b/src/main/java/appeng/client/gui/implementations/NumberEntryWidget.java @@ -0,0 +1,130 @@ +package appeng.client.gui.implementations; + +import java.util.function.Consumer; +import java.util.function.LongConsumer; + +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.IGuiEventListener; +import net.minecraft.client.gui.widget.button.Button; + +import appeng.client.gui.AEBaseScreen; +import appeng.client.gui.NumberEntryType; +import appeng.client.gui.widgets.ITickingWidget; +import appeng.client.gui.widgets.NumberBox; +import appeng.core.AEConfig; + +/** + * A utility widget that consists of a text-field to enter a number with + * attached buttons to increment/decrement the number in fixed intervals. + */ +public class NumberEntryWidget implements ITickingWidget { + + private final AEBaseScreen parent; + + private final int x; + private final int y; + + private final NumberBox level; + private final NumberEntryType type; + private Button plus1; + private Button plus10; + private Button plus100; + private Button plus1000; + private Button minus1; + private Button minus10; + private Button minus100; + private Button minus1000; + + public NumberEntryWidget(AEBaseScreen parent, int x, int y, int width, int height, NumberEntryType type, + LongConsumer changeListener) { + this.parent = parent; + this.x = x; + this.y = y; + this.type = type; + + FontRenderer font = parent.getMinecraft().fontRenderer; + int inputX = parent.getGuiLeft() + x; + int inputY = parent.getGuiTop() + y; + this.level = new NumberBox(font, inputX, inputY, width, font.FONT_HEIGHT, type.getInputType(), changeListener); + this.level.setEnableBackgroundDrawing(false); + this.level.setMaxStringLength(16); + this.level.setTextColor(0xFFFFFF); + this.level.setVisible(true); + this.level.setFocused2(true); + parent.setFocusedDefault(this.level); + } + + public void setActive(boolean active) { + this.level.setEnabled(active); + this.plus1.active = active; + this.plus10.active = active; + this.plus100.active = active; + this.plus1000.active = active; + this.minus1.active = active; + this.minus10.active = active; + this.minus100.active = active; + this.minus1000.active = active; + } + + public void setTextFieldBounds(int x, int y, int width) { + this.level.x = parent.getGuiLeft() + x; + this.level.y = parent.getGuiTop() + y; + this.level.setWidth(width); + } + + public void setMinValue(long minValue) { + this.level.setMinValue(minValue); + } + + public void addButtons(Consumer addChildren, Consumer