diff --git a/src/main/java/appeng/client/gui/AEBaseScreen.java b/src/main/java/appeng/client/gui/AEBaseScreen.java index c8c0b32a3..6ffac2ee5 100644 --- a/src/main/java/appeng/client/gui/AEBaseScreen.java +++ b/src/main/java/appeng/client/gui/AEBaseScreen.java @@ -18,48 +18,10 @@ package appeng.client.gui; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.concurrent.TimeUnit; - -import com.google.common.base.Preconditions; -import com.google.common.base.Stopwatch; -import com.google.common.collect.Lists; -import com.mojang.blaze3d.systems.RenderSystem; - -import org.lwjgl.glfw.GLFW; -import org.lwjgl.opengl.GL11; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.player.ClientPlayerEntity; -import net.minecraft.client.gui.screen.inventory.ContainerScreen; -import net.minecraft.client.gui.widget.Widget; -import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.RenderHelper; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.texture.AtlasTexture; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import net.minecraft.client.util.InputMappings; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.fluid.Fluid; -import net.minecraft.inventory.container.ClickType; -import net.minecraft.inventory.container.Container; -import net.minecraft.inventory.container.Slot; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TextFormatting; -import net.minecraftforge.fluids.FluidAttributes; -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; @@ -86,6 +48,43 @@ import appeng.core.sync.packets.SwapSlotsPacket; import appeng.fluids.client.render.FluidStackSizeRenderer; import appeng.fluids.container.slots.IMEFluidSlot; import appeng.helpers.InventoryAction; +import com.google.common.base.Preconditions; +import com.google.common.base.Stopwatch; +import com.google.common.collect.Lists; +import com.mojang.blaze3d.systems.RenderSystem; +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; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.texture.AtlasTexture; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.client.util.InputMappings; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.fluid.Fluid; +import net.minecraft.inventory.container.ClickType; +import net.minecraft.inventory.container.Container; +import net.minecraft.inventory.container.Slot; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TextFormatting; +import net.minecraftforge.fluids.FluidAttributes; +import net.minecraftforge.fml.client.gui.GuiUtils; +import org.lwjgl.glfw.GLFW; +import org.lwjgl.opengl.GL11; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.TimeUnit; public abstract class AEBaseScreen extends ContainerScreen { private final List meSlots = new ArrayList<>(); @@ -781,4 +780,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..caeb5151a --- /dev/null +++ b/src/main/java/appeng/client/gui/NumberEntryType.java @@ -0,0 +1,19 @@ +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 0dde00f28..11a91f84f 100644 --- a/src/main/java/appeng/client/gui/implementations/CraftAmountScreen.java +++ b/src/main/java/appeng/client/gui/implementations/CraftAmountScreen.java @@ -18,24 +18,21 @@ package appeng.client.gui.implementations; +import appeng.client.gui.AEBaseScreen; +import appeng.client.gui.NumberEntryType; +import appeng.container.implementations.CraftAmountContainer; +import appeng.core.localization.GuiText; +import appeng.core.sync.network.NetworkHandler; +import appeng.core.sync.packets.CraftRequestPacket; 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.container.implementations.CraftAmountContainer; -import appeng.core.AEConfig; -import appeng.core.localization.GuiText; -import appeng.core.sync.network.NetworkHandler; -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,34 +45,16 @@ 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, value -> {}); - 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) { @@ -95,99 +74,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 aa37aac34..dc1321b89 100644 --- a/src/main/java/appeng/client/gui/implementations/LevelEmitterScreen.java +++ b/src/main/java/appeng/client/gui/implementations/LevelEmitterScreen.java @@ -18,21 +18,21 @@ package appeng.client.gui.implementations; -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.RedstoneMode; import appeng.api.config.Settings; import appeng.api.config.Upgrades; import appeng.api.config.YesNo; +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.localization.GuiText; import appeng.core.sync.network.NetworkHandler; import appeng.core.sync.packets.ConfigValuePacket; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.util.text.ITextComponent; public class LevelEmitterScreen extends UpgradeableScreen { @@ -48,7 +48,8 @@ public class LevelEmitterScreen extends UpgradeableScreen public void init() { super.init(); - this.level = new NumberEntryWidget(this, 20, 17, 79, this::onLevelChange); + this.level = new NumberEntryWidget(this, 20, 17, 138, 62, NumberEntryType.LEVEL_ITEM_COUNT, this::onLevelChange); + this.level.setTextFieldBounds(25, 44, 79); this.level.addButtons(children::add, this::addButton); container.setTextField(this.level); } @@ -114,14 +115,4 @@ public class LevelEmitterScreen extends UpgradeableScreen return GuiText.LevelEmitter; } - @Override - public boolean charTyped(char character, int key) { - return super.charTyped(character, key); - } - - public void tick() { - super.tick(); - this.level.tick(); - } - } diff --git a/src/main/java/appeng/client/gui/implementations/NumberEntryWidget.java b/src/main/java/appeng/client/gui/implementations/NumberEntryWidget.java index b113c7102..d0a7d3162 100644 --- a/src/main/java/appeng/client/gui/implementations/NumberEntryWidget.java +++ b/src/main/java/appeng/client/gui/implementations/NumberEntryWidget.java @@ -1,6 +1,8 @@ package appeng.client.gui.implementations; 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; import net.minecraft.client.gui.FontRenderer; @@ -14,7 +16,7 @@ import java.util.function.LongConsumer; * 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 { +public class NumberEntryWidget implements ITickingWidget { private final AEBaseScreen parent; @@ -22,6 +24,7 @@ public class NumberEntryWidget { private final int y; private final NumberBox level; + private final NumberEntryType type; private Button plus1; private Button plus10; private Button plus100; @@ -31,14 +34,18 @@ public class NumberEntryWidget { private Button minus100; private Button minus1000; - public NumberEntryWidget(AEBaseScreen parent, int x, int y, int width, LongConsumer changeListener) { + 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; - this.level = new NumberBox(font, parent.getGuiLeft() + x + 5, parent.getGuiTop() + y + 27, width, font.FONT_HEIGHT, - Long.class, changeListener); + 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); @@ -59,11 +66,22 @@ public class NumberEntryWidget { 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