From 9a2741128a78bb52eba50a631126e090a5a2abd8 Mon Sep 17 00:00:00 2001 From: miozune Date: Sat, 26 Nov 2022 01:45:28 +0900 Subject: Rewrite GUIs with ModularUI (#1381) * Base work for ModularUI compat * Remove useless interface * Add almost all the widgets * Invert method * Refactor NEI stack placement positions * NEI handlers on ModularUI * Add some more docs * AdvDebugStructureWriter * Fix NEI progressbar not working * PrimitiveBlastFurnace * clean * derp * clean * spotlessApply * Boilers * Buffers * clean * N by N slots containers * Fix boilers not having bucket interaction Put opening UI to individual MetaTEs * Maintenance Hatch * clean * spotlessApply * Add dependency * IndustrialApiary * Adapt to ModularUI change * Base work for covers & fix crash with MP * Fix crash with server * Rewrite base work for covers * Send initial cover data on cover GUI open so that the time of showing incorrect data will be eliminated * Covers part 1 * Rename package: ModularUI -> modularui * Rename class: GT_UIInfo -> GT_UIInfos * Fix build * Covers part2 * Fix missing client check with tile UI & fix title overlap * CoverTabLine * Move cover window creators to inner class * Fix crash with null base TE * Close GUI when tile is broken * Color cover window with tile colorization * Change signature of addUIWidgets * FluidFilter cover, FluidDisplaySlotWidget, BasicTank, BasicGenerator, Output Hatch, MicrowaveEnergyTransmitter, Teleporter, DigitalChest, DigitalTank * Add title tab * Move package: modularui -> modularui/widget * Programmed circuit + IConfigurationCircuitSupport * clean * VolumetricFlask * Remove integrated circuit overlay from recipe input slots * Input Hatch & Quadruple Input Hatch * Multiblock * Deprecate old cover GUI * BasicMachines * Finish BasicMachine & NEI * Expand DTPF NEI to 9 slots * Fix ME input bus on MP * Move AESlotWidget to public class * Move GT_Recipe_Map constructors with mNEIUnificateOutput to setter method * Move SteamTexture.Variant to outer enum * Switch to remote repository * oops * Update MUI * Update MUI * Minor refactor for change amount buttons * Display items and fluids that exceed usual count * blah * use +=, why didn't I do this * Update MUI * Move ModularUI to Base (#1510) * Move ModularUI to Base * Move most of the ModularUI functionality to `BaseTileEntity` (and `CoverableTileEntity`) * `CommonMetaTileEntity` delegates ato the MetaTileEntity * Added several interfaces (with defaults) to indicate if a tile/metatile override/implement certain behaviors. * Moved `IConfigurationCircuitSupport` interface such that it will work with BaseTileEntity or a MetaTileEntity * Address reviews Co-authored-by: miozune * Update MUI * Minor changes to NEI * Return :facepalm: * IGetTabIconSet override * Some more changes to NEI * Merge texture getter interfaces to new class GUITextureSet * Remove BBF structure picture as it's auto-buildable now * Make unified title tab style of texture angular * Expose some boiler texture getters for addon * Fix crash with cover GUI on pipe * Lower the number of recipe per page for DTPF & update MUI * Update MUI * Fix crash with middle-clicking slot on circuit selection GUI * Fix circuit selection window not syncing item from base machine * Merge GT_NEI_AssLineHandler into GT_NEI_DefaultHandler * Update MUI * Add in TecTech multi message * Allow changing the way of binding player inventory * Update MUI * Update MUI * Update MUI * Update MUI * Update MUI * Make MUI non-transitive to allow addons to use their own version * Force enable mixin * Format fluid amount tooltip * Add GUITextureSet.STEAM * Add guard against null ModularWindow creation * Add constructors for Muffler Hatch with inventory * Fix output slot on digital chest and tank allowing insertion * Don't log null ModularWindow * Add default implementation for IHasWorldObjectAndCoords#openGUI * Make openGTTileEntityUI accept MultiTE & cleanup Co-authored-by: Jason Mitchell --- .../java/gregtech/common/covers/GT_Cover_Arm.java | 350 ++++++++---------- .../common/covers/GT_Cover_ControlsWork.java | 158 ++++---- .../gregtech/common/covers/GT_Cover_Conveyor.java | 153 ++++---- .../gregtech/common/covers/GT_Cover_DoesWork.java | 136 ++++--- .../gregtech/common/covers/GT_Cover_EUMeter.java | 238 +++++------- .../common/covers/GT_Cover_FacadeBase.java | 158 ++++---- .../common/covers/GT_Cover_FluidLimiter.java | 101 ++---- .../common/covers/GT_Cover_FluidRegulator.java | 399 +++++++++------------ .../common/covers/GT_Cover_Fluidfilter.java | 237 ++++++------ .../common/covers/GT_Cover_ItemFilter.java | 159 ++++---- .../gregtech/common/covers/GT_Cover_ItemMeter.java | 363 ++++++++----------- .../common/covers/GT_Cover_LiquidMeter.java | 238 +++++------- .../common/covers/GT_Cover_NeedMaintainance.java | 214 +++++------ .../common/covers/GT_Cover_PlayerDetector.java | 113 +++--- .../java/gregtech/common/covers/GT_Cover_Pump.java | 153 ++++---- .../covers/GT_Cover_RedstoneWirelessBase.java | 207 +++-------- .../gregtech/common/covers/GT_Cover_Shutter.java | 131 +++---- .../GT_Cover_AdvancedRedstoneReceiverBase.java | 198 +++++----- .../GT_Cover_AdvancedRedstoneTransmitterBase.java | 101 +++--- .../GT_Cover_AdvancedWirelessRedstoneBase.java | 271 ++++---------- .../redstone/GT_Cover_WirelessFluidDetector.java | 88 ++--- .../redstone/GT_Cover_WirelessItemDetector.java | 200 ++++++----- .../GT_Cover_WirelessMaintenanceDetector.java | 105 +++--- 23 files changed, 1920 insertions(+), 2551 deletions(-) (limited to 'src/main/java/gregtech/common/covers') diff --git a/src/main/java/gregtech/common/covers/GT_Cover_Arm.java b/src/main/java/gregtech/common/covers/GT_Cover_Arm.java index fb556989c1..6a7711a242 100644 --- a/src/main/java/gregtech/common/covers/GT_Cover_Arm.java +++ b/src/main/java/gregtech/common/covers/GT_Cover_Arm.java @@ -1,19 +1,22 @@ package gregtech.common.covers; -import gregtech.api.enums.GT_Values; -import gregtech.api.gui.GT_GUICover; -import gregtech.api.gui.widgets.GT_GuiFakeItemButton; -import gregtech.api.gui.widgets.GT_GuiIcon; -import gregtech.api.gui.widgets.GT_GuiIconButton; -import gregtech.api.gui.widgets.GT_GuiIntegerTextBox; +import com.gtnewhorizons.modularui.api.math.MathExpression; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.TextWidget; +import com.gtnewhorizons.modularui.common.widget.textfield.BaseTextFieldWidget; +import com.gtnewhorizons.modularui.common.widget.textfield.TextFieldWidget; +import gregtech.api.gui.modularui.GT_CoverUIBuildContext; +import gregtech.api.gui.modularui.GT_UITextures; import gregtech.api.interfaces.ITexture; import gregtech.api.interfaces.tileentity.ICoverable; import gregtech.api.interfaces.tileentity.IMachineProgress; -import gregtech.api.net.GT_Packet_TileEntityCover; import gregtech.api.util.GT_CoverBehavior; import gregtech.api.util.GT_Utility; import gregtech.api.util.ISerializableObject; -import net.minecraft.client.gui.GuiButton; +import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollower_TextFieldWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget; +import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.tileentity.TileEntity; @@ -28,6 +31,10 @@ public class GT_Cover_Arm extends GT_CoverBehavior { protected static final int SLOT_ID_MIN = 0; protected static final int CONVERTED_BIT = 0x80000000; + // This used to be translatable, but now that cover GUI is synced with server, having conflicting texts + // among players doesn't make sense. + private static final String ANY_TEXT = "Any"; + /** * @deprecated use {@link #GT_Cover_Arm(int aTickRate, ITexture coverTexture)} instead */ @@ -264,223 +271,182 @@ public class GT_Cover_Arm extends GT_CoverBehavior { return this.mTickRate; } - /** - * GUI Stuff - */ + // GUI stuff + @Override public boolean hasCoverGUI() { return true; } @Override - public Object getClientGUI(byte aSide, int aCoverID, int coverData, ICoverable aTileEntity) { - return new GT_Cover_Arm.GUI(aSide, aCoverID, coverData, aTileEntity); + public boolean useModularUI() { + return true; } - private class GUI extends GT_GUICover { - private final byte side; - private final int coverID; - private GT_GuiIntegerTextBox intSlot, adjSlot; - private GT_GuiFakeItemButton intSlotIcon, adjSlotIcon; - private int coverVariable; + @Override + public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) { + return new ArmUIFactory(buildContext).createWindow(); + } + + private class ArmUIFactory extends UIFactory { private static final int startX = 10; private static final int startY = 25; private static final int spaceX = 18; private static final int spaceY = 18; - private final String ANY_TEXT = GT_Utility.trans("ANY", "Any"); - - private boolean export; - private int internalSlotID, adjacentSlotID; - private final int maxIntSlot, maxAdjSlot; - - private final int textColor = this.getTextColorOrDefault("text", 0xFF555555); - - public GUI(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - super(aTileEntity, 176, 107, GT_Utility.intToStack(aCoverID)); - this.side = aSide; - this.coverID = aCoverID; - this.coverVariable = aCoverVariable; - - export = (coverVariable & EXPORT_MASK) > 0; - internalSlotID = (coverVariable & SLOT_ID_MASK); - adjacentSlotID = (coverVariable >> 14) & SLOT_ID_MASK; - - new GT_GuiIconButton(this, 0, startX + spaceX * 0, startY + spaceY * 0, GT_GuiIcon.EXPORT) - .setTooltipText(GT_Utility.trans("006", "Export")); - new GT_GuiIconButton(this, 1, startX + spaceX * 1, startY + spaceY * 0, GT_GuiIcon.IMPORT) - .setTooltipText(GT_Utility.trans("007", "Import")); - - intSlot = - new GT_GuiIntegerTextBox(this, 2, startX + spaceX * 0, startY + spaceY * 1 + 2, spaceX * 2 + 5, 12); - setBoxText(intSlot, internalSlotID - 1); - intSlot.setMaxStringLength(6); - - adjSlot = - new GT_GuiIntegerTextBox(this, 3, startX + spaceX * 0, startY + spaceY * 2 + 2, spaceX * 2 + 5, 12); - setBoxText(adjSlot, adjacentSlotID - 1); - adjSlot.setMaxStringLength(6); - - // intSlotIcon = new GT_GuiFakeItemButton(this, startX + spaceX * 8-4, startY + spaceY * 1, - // GT_GuiIcon.SLOT_GRAY); - // adjSlotIcon = new GT_GuiFakeItemButton(this, startX + spaceX * 8-4, startY + spaceY * 2, - // GT_GuiIcon.SLOT_GRAY); - - if (super.tile instanceof TileEntity && !super.tile.isDead()) { - maxIntSlot = tile.getSizeInventory() - 1; - - TileEntity adj = super.tile.getTileEntityAtSide(side); - if (adj instanceof IInventory) maxAdjSlot = ((IInventory) adj).getSizeInventory() - 1; - else maxAdjSlot = -1; - } else { - maxIntSlot = -1; - maxAdjSlot = -1; - } - } - - @Override - public void drawExtras(int mouseX, int mouseY, float parTicks) { - super.drawExtras(mouseX, mouseY, parTicks); - if (export) - this.getFontRenderer() - .drawString( - GT_Utility.trans("006", "Export"), - startX + spaceX * 3, - 4 + startY + spaceY * 0, - textColor); - else - this.getFontRenderer() - .drawString( - GT_Utility.trans("007", "Import"), - startX + spaceX * 3, - 4 + startY + spaceY * 0, - textColor); - - this.getFontRenderer() - .drawString( - GT_Utility.trans("254.1", "Internal slot#"), - startX + spaceX * 3, - 4 + startY + spaceY * 1, - textColor); - this.getFontRenderer() - .drawString( - GT_Utility.trans("255", "Adjacent slot#"), - startX + spaceX * 3, - 4 + startY + spaceY * 2, - textColor); - } - - @Override - protected void onInitGui(int guiLeft, int guiTop, int gui_width, int gui_height) { - intSlot.setFocused(true); - updateButtons(); - - // updateInventorySlots(); - } + private int maxSlot; - @Override - public void buttonClicked(GuiButton btn) { - if (buttonClickable(btn.id)) { - export = btn.id == 0; - coverVariable = getNewCoverVariable(); - GT_Values.NW.sendToServer(new GT_Packet_TileEntityCover(side, coverID, coverVariable, tile)); - } - updateButtons(); - } - - private void updateButtons() { - GuiButton b; - for (Object o : buttonList) { - b = (GuiButton) o; - b.enabled = buttonClickable(b.id); - } + protected ArmUIFactory(GT_CoverUIBuildContext buildContext) { + super(buildContext); } + @SuppressWarnings("PointlessArithmeticExpression") @Override - public void onMouseWheel(int x, int y, int delta) { - for (GT_GuiIntegerTextBox box : textBoxes) { - if (box.isFocused()) { - int step = Math.max(1, Math.abs(delta / 120)); - step = (isShiftKeyDown() ? 50 : isCtrlKeyDown() ? 5 : 1) * (delta > 0 ? step : -step); - int maxSlot = box.id == 3 ? maxAdjSlot : maxIntSlot; - int val = parseTextBox(box, maxSlot); - if (val < 0) val = -1; - val = val + step; - - if (maxSlot < val) - if (maxSlot < 0) val = -1; - else val = maxSlot; - else if (val < SLOT_ID_MIN) val = -1; - - setBoxText(box, val); - return; - } - } + protected void addUIWidgets(ModularWindow.Builder builder) { + maxSlot = getMaxSlot(); + builder.widget(new CoverDataControllerWidget<>(this::getCoverData, this::setCoverData, GT_Cover_Arm.this) + .addFollower( + CoverDataFollower_ToggleButtonWidget.ofDisableable(), + coverData -> getFlagExport(convert(coverData)) > 0, + (coverData, state) -> { + if (state) { + return new ISerializableObject.LegacyCoverData( + convert(coverData) | EXPORT_MASK | CONVERTED_BIT); + } else { + return new ISerializableObject.LegacyCoverData( + convert(coverData) & ~EXPORT_MASK | CONVERTED_BIT); + } + }, + widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_EXPORT) + .addTooltip(GT_Utility.trans("006", "Export")) + .setPos(spaceX * 0, spaceY * 0)) + .addFollower( + CoverDataFollower_ToggleButtonWidget.ofDisableable(), + coverData -> getFlagExport(convert(coverData)) == 0, + (coverData, state) -> { + if (state) { + return new ISerializableObject.LegacyCoverData( + convert(coverData) & ~EXPORT_MASK | CONVERTED_BIT); + } else { + return new ISerializableObject.LegacyCoverData( + convert(coverData) | EXPORT_MASK | CONVERTED_BIT); + } + }, + widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_IMPORT) + .addTooltip(GT_Utility.trans("007", "Import")) + .setPos(spaceX * 1, spaceY * 0)) + .addFollower( + new CoverDataFollower_TextFieldWidget<>(), + coverData -> getTextFieldContent(getFlagInternalSlot(convert(coverData)) - 1), + (coverData, state) -> { + final int coverVariable = convert(coverData); + return new ISerializableObject.LegacyCoverData(getFlagExport(coverVariable) + | ((getIntFromText(state) + 1) & SLOT_ID_MASK) + | (getFlagAdjacentSlot(coverVariable) << 14) + | CONVERTED_BIT); + }, + widget -> widget.setOnScrollText() + .setValidator(val -> { + final int valSlot = getIntFromText(val); + if (valSlot > -1) { + return TextFieldWidget.format.format(Math.min(valSlot, maxSlot)); + } else { + return ANY_TEXT; + } + }) + .setPattern(BaseTextFieldWidget.NATURAL_NUMS) + .setFocusOnGuiOpen(true) + .setPos(spaceX * 0, spaceY * 1 + 2) + .setSize(spaceX * 2 + 5, 12)) + .addFollower( + new CoverDataFollower_TextFieldWidget<>(), + coverData -> getTextFieldContent(getFlagAdjacentSlot(convert(coverData)) - 1), + (coverData, state) -> { + final int coverVariable = convert(coverData); + return new ISerializableObject.LegacyCoverData(getFlagExport(coverVariable) + | getFlagInternalSlot(coverVariable) + | (((getIntFromText(state) + 1) & SLOT_ID_MASK) << 14) + | CONVERTED_BIT); + }, + widget -> widget.setValidator(val -> { + final int valSlot = getIntFromText(val); + final int adjacentMaxSlot; + final ICoverable tile = + getUIBuildContext().getTile(); + if (tile instanceof TileEntity && !tile.isDead()) { + TileEntity adj = tile.getTileEntityAtSide( + getUIBuildContext().getCoverSide()); + if (adj instanceof IInventory) + adjacentMaxSlot = ((IInventory) adj).getSizeInventory() - 1; + else adjacentMaxSlot = -1; + } else { + adjacentMaxSlot = -1; + } + if (valSlot > -1) { + return TextFieldWidget.format.format( + Math.min(valSlot, adjacentMaxSlot)); + } else { + return ANY_TEXT; + } + }) + .setOnScroll((text, direction) -> { + final int val = getIntFromText(text); + int step = (GuiScreen.isShiftKeyDown() + ? 50 + : GuiScreen.isCtrlKeyDown() ? 5 : 1) + * direction; + return TextFieldWidget.format.format(val + step); + }) + .setPattern(BaseTextFieldWidget.NATURAL_NUMS) + .setPos(spaceX * 0, spaceY * 2 + 2) + .setSize(spaceX * 2 + 5, 12)) + .setPos(startX, startY)) + .widget(TextWidget.dynamicString(() -> (convert(getCoverData()) & EXPORT_MASK) > 0 + ? GT_Utility.trans("006", "Export") + : GT_Utility.trans("007", "Import")) + .setSynced(false) + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 3, 4 + startY + spaceY * 0)) + .widget(new TextWidget(GT_Utility.trans("254.1", "Internal slot#")) + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 3, 4 + startY + spaceY * 1)) + .widget(new TextWidget(GT_Utility.trans("255", "Adjacent slot#")) + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 3, 4 + startY + spaceY * 2)); } - @Override - public void applyTextBox(GT_GuiIntegerTextBox box) { - int val = -1; - - if (box.id == 2) { - val = parseTextBox(box, maxIntSlot); - internalSlotID = val + 1; - } else if (box.id == 3) { - val = parseTextBox(box, maxAdjSlot); - adjacentSlotID = val + 1; + private int getMaxSlot() { + final ICoverable tile = getUIBuildContext().getTile(); + if (tile instanceof TileEntity && !tile.isDead()) { + return tile.getSizeInventory() - 1; + } else { + return -1; } - - setBoxText(box, val); - coverVariable = getNewCoverVariable(); - GT_Values.NW.sendToServer(new GT_Packet_TileEntityCover(side, coverID, coverVariable, tile)); - // updateInventorySlots(); } - @Override - public void resetTextBox(GT_GuiIntegerTextBox box) { - int val = 0; - if (box.id == 2) val = internalSlotID - 1; - else if (box.id == 3) val = adjacentSlotID - 1; - setBoxText(box, val); + private String getTextFieldContent(int val) { + return val < 0 ? ANY_TEXT : String.valueOf(val); } - private void setBoxText(GT_GuiIntegerTextBox box, int val) { - box.setText(val < 0 ? ANY_TEXT : String.valueOf(val)); - } - - private int parseTextBox(GT_GuiIntegerTextBox box, int maxSlot) { - String text = box.getText(); - if (text == null) return -1; - text = text.trim(); - if (text.startsWith(ANY_TEXT)) text = text.substring(ANY_TEXT.length()); - - if (text.isEmpty()) return -1; - - int val; + private int getIntFromText(String text) { try { - val = Integer.parseInt(text); - } catch (NumberFormatException e) { + return (int) MathExpression.parseMathExpression(text, -1); + } catch (Exception e) { return -1; } + } - if (maxSlot < val) - if (maxSlot < 0) return -1; - else return maxSlot; - else if (val < SLOT_ID_MIN) return SLOT_ID_MIN; - return val; + private int getFlagExport(int coverVariable) { + return coverVariable & EXPORT_MASK; } - private int getNewCoverVariable() { - return (export ? EXPORT_MASK : 0) - | ((adjacentSlotID & SLOT_ID_MASK) << 14) - | (internalSlotID & SLOT_ID_MASK) - | CONVERTED_BIT; + private int getFlagInternalSlot(int coverVariable) { + return coverVariable & SLOT_ID_MASK; } - private boolean buttonClickable(int id) { - if (id == 0) return !export; - return export; + private int getFlagAdjacentSlot(int coverVariable) { + return (coverVariable >> 14) & SLOT_ID_MASK; } } } diff --git a/src/main/java/gregtech/common/covers/GT_Cover_ControlsWork.java b/src/main/java/gregtech/common/covers/GT_Cover_ControlsWork.java index d8f09619bc..ee0a740d68 100644 --- a/src/main/java/gregtech/common/covers/GT_Cover_ControlsWork.java +++ b/src/main/java/gregtech/common/covers/GT_Cover_ControlsWork.java @@ -1,17 +1,17 @@ package gregtech.common.covers; -import gregtech.api.enums.GT_Values; -import gregtech.api.gui.GT_GUICover; -import gregtech.api.gui.widgets.GT_GuiIcon; -import gregtech.api.gui.widgets.GT_GuiIconButton; -import gregtech.api.gui.widgets.GT_GuiIconCheckButton; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.TextWidget; +import gregtech.api.gui.modularui.GT_CoverUIBuildContext; +import gregtech.api.gui.modularui.GT_UITextures; import gregtech.api.interfaces.ITexture; import gregtech.api.interfaces.tileentity.ICoverable; import gregtech.api.interfaces.tileentity.IMachineProgress; -import gregtech.api.net.GT_Packet_TileEntityCover; import gregtech.api.util.GT_CoverBehavior; import gregtech.api.util.GT_Utility; -import net.minecraft.client.gui.GuiButton; +import gregtech.api.util.ISerializableObject; +import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.Fluid; @@ -171,113 +171,103 @@ public class GT_Cover_ControlsWork extends GT_CoverBehavior { return true; } - /** - * GUI Stuff - */ + // GUI stuff + @Override public boolean hasCoverGUI() { return true; } @Override - public Object getClientGUI(byte aSide, int aCoverID, int coverData, ICoverable aTileEntity) { - return new GT_Cover_ControlsWork.GUI(aSide, aCoverID, coverData, aTileEntity); + public boolean useModularUI() { + return true; } - private class GUI extends GT_GUICover { - private final byte side; - private final int coverID; - private int coverVariable; + @Override + public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) { + return new ControlsWorkUIFactory(buildContext).createWindow(); + } + + private class ControlsWorkUIFactory extends UIFactory { private static final int startX = 10; private static final int startY = 25; private static final int spaceX = 18; private static final int spaceY = 18; - private final int textColor = this.getTextColorOrDefault("text", 0xFF555555); - - public GUI(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - super(aTileEntity, 176, 107, GT_Utility.intToStack(aCoverID)); - this.side = aSide; - this.coverID = aCoverID; - this.coverVariable = aCoverVariable; - - new GT_GuiIconButton(this, 0, startX + spaceX * 0, startY + spaceY * 0, GT_GuiIcon.REDSTONE_ON); - new GT_GuiIconButton(this, 1, startX + spaceX * 0, startY + spaceY * 1, GT_GuiIcon.REDSTONE_OFF); - new GT_GuiIconButton(this, 2, startX + spaceX * 0, startY + spaceY * 2, GT_GuiIcon.CROSS); - - new GT_GuiIconCheckButton( - this, 3, startX + spaceX * 0, startY + spaceY * 3, GT_GuiIcon.CHECKMARK, GT_GuiIcon.CROSS) - .setChecked(aCoverVariable > 2); - } - - @Override - public void drawExtras(int mouseX, int mouseY, float parTicks) { - super.drawExtras(mouseX, mouseY, parTicks); - this.fontRendererObj.drawString( - GT_Utility.trans("243", "Enable with Redstone"), - 3 + startX + spaceX * 1, - 4 + startY + spaceY * 0, - textColor); - this.fontRendererObj.drawString( - GT_Utility.trans("244", "Disable with Redstone"), - 3 + startX + spaceX * 1, - 4 + startY + spaceY * 1, - textColor); - this.fontRendererObj.drawString( - GT_Utility.trans("245", "Disable machine"), - 3 + startX + spaceX * 1, - 4 + startY + spaceY * 2, - textColor); - this.fontRendererObj.drawString( - GT_Utility.trans("507", "Safe Mode"), 3 + startX + spaceX * 1, 4 + startY + spaceY * 3, textColor); + public ControlsWorkUIFactory(GT_CoverUIBuildContext buildContext) { + super(buildContext); } + @SuppressWarnings("PointlessArithmeticExpression") @Override - protected void onInitGui(int guiLeft, int guiTop, int gui_width, int gui_height) { - updateButtons(); + protected void addUIWidgets(ModularWindow.Builder builder) { + builder.widget(new CoverDataControllerWidget.CoverDataIndexedControllerWidget_ToggleButtons<>( + this::getCoverData, + this::setCoverData, + GT_Cover_ControlsWork.this, + (id, coverData) -> !getClickable(id, convert(coverData)), + (id, coverData) -> new ISerializableObject.LegacyCoverData( + getNewCoverVariable(id, convert(coverData)))) + .addToggleButton( + 0, + CoverDataFollower_ToggleButtonWidget.ofDisableable(), + widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_REDSTONE_ON) + .setPos(spaceX * 0, spaceY * 0)) + .addToggleButton( + 1, + CoverDataFollower_ToggleButtonWidget.ofDisableable(), + widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_REDSTONE_OFF) + .setPos(spaceX * 0, spaceY * 1)) + .addToggleButton( + 2, + CoverDataFollower_ToggleButtonWidget.ofDisableable(), + widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_CROSS) + .setPos(spaceX * 0, spaceY * 2)) + .setPos(startX, startY)) + .widget(new CoverDataControllerWidget<>( + this::getCoverData, this::setCoverData, GT_Cover_ControlsWork.this) + .addFollower( + CoverDataFollower_ToggleButtonWidget.ofCheckAndCross(), + coverData -> convert(coverData) > 2, + (coverData, state) -> new ISerializableObject.LegacyCoverData( + adjustCoverVariable(state, convert(coverData))), + widget -> widget.setPos(spaceX * 0, spaceY * 3)) + .setPos(startX, startY)) + .widget(new TextWidget(GT_Utility.trans("243", "Enable with Redstone")) + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 0)) + .widget(new TextWidget(GT_Utility.trans("244", "Disable with Redstone")) + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 1)) + .widget(new TextWidget(GT_Utility.trans("245", "Disable machine")) + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 2)) + .widget(new TextWidget(GT_Utility.trans("507", "Safe Mode")) + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(3 + startX + spaceX * 1, 4 + startY + spaceY * 3)); } - @Override - public void buttonClicked(GuiButton btn) { - if (getClickable(btn.id)) { - int bID = btn.id; - if (bID == 3) { - ((GT_GuiIconCheckButton) btn).setChecked(!((GT_GuiIconCheckButton) btn).isChecked()); - } else { - coverVariable = getNewCoverVariable(bID); - } - adjustCoverVariable(); - // TODO: Set lastPlayer; - GT_Values.NW.sendToServer(new GT_Packet_TileEntityCover(side, coverID, coverVariable, tile)); - } - updateButtons(); - } - - private void updateButtons() { - GuiButton b; - for (Object o : buttonList) { - b = (GuiButton) o; - b.enabled = getClickable(b.id); + private int getNewCoverVariable(int id, int coverVariable) { + if (coverVariable > 2) { + return id + 3; + } else { + return id; } } - private int getNewCoverVariable(int id) { - return id; - } - - private boolean getClickable(int id) { + private boolean getClickable(int id, int coverVariable) { return ((id != coverVariable && id != coverVariable - 3) || id == 3); } - private void adjustCoverVariable() { - boolean safeMode = ((GT_GuiIconCheckButton) buttonList.get(3)).isChecked(); - if (safeMode && coverVariable < 2) { + private int adjustCoverVariable(boolean safeMode, int coverVariable) { + if (safeMode && coverVariable <= 2) { coverVariable += 3; } if (!safeMode && coverVariable > 2) { coverVariable -= 3; } + return coverVariable; } } } diff --git a/src/main/java/gregtech/common/covers/GT_Cover_Conveyor.java b/src/main/java/gregtech/common/covers/GT_Cover_Conveyor.java index ebd87e85ab..dc3bcc4f7b 100644 --- a/src/main/java/gregtech/common/covers/GT_Cover_Conveyor.java +++ b/src/main/java/gregtech/common/covers/GT_Cover_Conveyor.java @@ -2,17 +2,18 @@ package gregtech.common.covers; import static gregtech.api.util.GT_Utility.moveMultipleItemStacks; -import gregtech.api.enums.GT_Values; -import gregtech.api.gui.GT_GUICover; -import gregtech.api.gui.widgets.GT_GuiIcon; -import gregtech.api.gui.widgets.GT_GuiIconButton; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.TextWidget; +import gregtech.api.gui.modularui.GT_CoverUIBuildContext; +import gregtech.api.gui.modularui.GT_UITextures; import gregtech.api.interfaces.ITexture; import gregtech.api.interfaces.tileentity.ICoverable; import gregtech.api.interfaces.tileentity.IMachineProgress; -import gregtech.api.net.GT_Packet_TileEntityCover; import gregtech.api.util.GT_CoverBehavior; import gregtech.api.util.GT_Utility; -import net.minecraft.client.gui.GuiButton; +import gregtech.api.util.ISerializableObject; +import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.fluids.Fluid; @@ -184,88 +185,99 @@ public class GT_Cover_Conveyor extends GT_CoverBehavior { return this.mTickRate; } - /** - * GUI Stuff - */ + // GUI stuff + @Override public boolean hasCoverGUI() { return true; } @Override - public Object getClientGUI(byte aSide, int aCoverID, int coverData, ICoverable aTileEntity) { - return new GT_Cover_Conveyor.GUI(aSide, aCoverID, coverData, aTileEntity); + public boolean useModularUI() { + return true; + } + + @Override + public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) { + return new ConveyorUIFactory(buildContext).createWindow(); } - private class GUI extends GT_GUICover { - private final byte side; - private final int coverID; - private int coverVariable; + private class ConveyorUIFactory extends UIFactory { private static final int startX = 10; private static final int startY = 25; private static final int spaceX = 18; private static final int spaceY = 18; - private final int textColor = this.getTextColorOrDefault("text", 0xFF555555); - - public GUI(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - super(aTileEntity, 176, 107, GT_Utility.intToStack(aCoverID)); - this.side = aSide; - this.coverID = aCoverID; - this.coverVariable = aCoverVariable; - - GT_GuiIconButton b; - b = new GT_GuiIconButton(this, 0, startX + spaceX * 0, startY + spaceY * 0, GT_GuiIcon.EXPORT) - .setTooltipText(GT_Utility.trans("006", "Export")); - b = new GT_GuiIconButton(this, 1, startX + spaceX * 1, startY + spaceY * 0, GT_GuiIcon.IMPORT) - .setTooltipText(GT_Utility.trans("007", "Import")); - b = new GT_GuiIconButton(this, 2, startX + spaceX * 0, startY + spaceY * 1, GT_GuiIcon.CHECKMARK) - .setTooltipText(GT_Utility.trans("224", "Always On")); - b = new GT_GuiIconButton(this, 3, startX + spaceX * 1, startY + spaceY * 1, GT_GuiIcon.REDSTONE_ON) - .setTooltipText(GT_Utility.trans("225", "Active with Redstone Signal")); - b = new GT_GuiIconButton(this, 4, startX + spaceX * 2, startY + spaceY * 1, GT_GuiIcon.REDSTONE_OFF) - .setTooltipText(GT_Utility.trans("226", "Inactive with Redstone Signal")); - b = new GT_GuiIconButton(this, 5, startX + spaceX * 0, startY + spaceY * 2, GT_GuiIcon.ALLOW_INPUT) - .setTooltipText(GT_Utility.trans("227", "Allow Input")); - b = new GT_GuiIconButton(this, 6, startX + spaceX * 1, startY + spaceY * 2, GT_GuiIcon.BLOCK_INPUT) - .setTooltipText(GT_Utility.trans("228", "Block Input")); - } - - @Override - public void drawExtras(int mouseX, int mouseY, float parTicks) { - super.drawExtras(mouseX, mouseY, parTicks); - this.fontRendererObj.drawString( - GT_Utility.trans("229", "Import/Export"), startX + spaceX * 3, 3 + startY + spaceY * 0, textColor); - this.fontRendererObj.drawString( - GT_Utility.trans("230", "Conditional"), startX + spaceX * 3, 3 + startY + spaceY * 1, textColor); - this.fontRendererObj.drawString( - GT_Utility.trans("231", "Enable Input"), startX + spaceX * 3, 3 + startY + spaceY * 2, textColor); - } - - @Override - protected void onInitGui(int guiLeft, int guiTop, int gui_width, int gui_height) { - updateButtons(); + public ConveyorUIFactory(GT_CoverUIBuildContext buildContext) { + super(buildContext); } + @SuppressWarnings("PointlessArithmeticExpression") @Override - public void buttonClicked(GuiButton btn) { - if (getClickable(btn.id)) { - coverVariable = getNewCoverVariable(btn.id); - GT_Values.NW.sendToServer(new GT_Packet_TileEntityCover(side, coverID, coverVariable, tile)); - } - updateButtons(); + protected void addUIWidgets(ModularWindow.Builder builder) { + builder.widget(new CoverDataControllerWidget.CoverDataIndexedControllerWidget_ToggleButtons<>( + this::getCoverData, + this::setCoverData, + GT_Cover_Conveyor.this, + (id, coverData) -> !getClickable(id, convert(coverData)), + (id, coverData) -> new ISerializableObject.LegacyCoverData( + getNewCoverVariable(id, convert(coverData)))) + .addToggleButton( + 0, + CoverDataFollower_ToggleButtonWidget.ofDisableable(), + widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_EXPORT) + .addTooltip(GT_Utility.trans("006", "Export")) + .setPos(spaceX * 0, spaceY * 0)) + .addToggleButton( + 1, + CoverDataFollower_ToggleButtonWidget.ofDisableable(), + widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_IMPORT) + .addTooltip(GT_Utility.trans("007", "Import")) + .setPos(spaceX * 1, spaceY * 0)) + .addToggleButton( + 2, + CoverDataFollower_ToggleButtonWidget.ofDisableable(), + widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_CHECKMARK) + .addTooltip(GT_Utility.trans("224", "Always On")) + .setPos(spaceX * 0, spaceY * 1)) + .addToggleButton( + 3, + CoverDataFollower_ToggleButtonWidget.ofDisableable(), + widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_REDSTONE_ON) + .addTooltip(GT_Utility.trans("225", "Active with Redstone Signal")) + .setPos(spaceX * 1, spaceY * 1)) + .addToggleButton( + 4, + CoverDataFollower_ToggleButtonWidget.ofDisableable(), + widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_REDSTONE_OFF) + .addTooltip(GT_Utility.trans("226", "Inactive with Redstone Signal")) + .setPos(spaceX * 2, spaceY * 1)) + .addToggleButton( + 5, + CoverDataFollower_ToggleButtonWidget.ofDisableable(), + widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_ALLOW_INPUT) + .addTooltip(GT_Utility.trans("227", "Allow Input")) + .setPos(spaceX * 0, spaceY * 2)) + .addToggleButton( + 6, + CoverDataFollower_ToggleButtonWidget.ofDisableable(), + widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_BLOCK_INPUT) + .addTooltip(GT_Utility.trans("228", "Block Input")) + .setPos(spaceX * 1, spaceY * 2)) + .setPos(startX, startY)) + .widget(new TextWidget(GT_Utility.trans("229", "Import/Export")) + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 3, 3 + startY + spaceY * 0)) + .widget(new TextWidget(GT_Utility.trans("230", "Conditional")) + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 3, 3 + startY + spaceY * 1)) + .widget(new TextWidget(GT_Utility.trans("231", "Enable Input")) + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 3, 3 + startY + spaceY * 2)); } - private void updateButtons() { - GuiButton b; - for (Object o : buttonList) { - b = (GuiButton) o; - b.enabled = getClickable(b.id); - } - } - - private int getNewCoverVariable(int id) { + private int getNewCoverVariable(int id, int coverVariable) { switch (id) { case 0: return coverVariable & ~0x1; @@ -289,9 +301,8 @@ public class GT_Cover_Conveyor extends GT_CoverBehavior { return coverVariable; } - private boolean getClickable(int id) { + private boolean getClickable(int id, int coverVariable) { if (coverVariable < 0 | 11 < coverVariable) return false; - switch (id) { case 0: case 1: diff --git a/src/main/java/gregtech/common/covers/GT_Cover_DoesWork.java b/src/main/java/gregtech/common/covers/GT_Cover_DoesWork.java index c37e4b5cbb..d755a115c4 100644 --- a/src/main/java/gregtech/common/covers/GT_Cover_DoesWork.java +++ b/src/main/java/gregtech/common/covers/GT_Cover_DoesWork.java @@ -1,17 +1,17 @@ package gregtech.common.covers; -import gregtech.api.enums.GT_Values; -import gregtech.api.gui.GT_GUICover; -import gregtech.api.gui.widgets.GT_GuiIcon; -import gregtech.api.gui.widgets.GT_GuiIconButton; -import gregtech.api.gui.widgets.GT_GuiIconCheckButton; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.TextWidget; +import gregtech.api.gui.modularui.GT_CoverUIBuildContext; +import gregtech.api.gui.modularui.GT_UITextures; import gregtech.api.interfaces.ITexture; import gregtech.api.interfaces.tileentity.ICoverable; import gregtech.api.interfaces.tileentity.IMachineProgress; -import gregtech.api.net.GT_Packet_TileEntityCover; import gregtech.api.util.GT_CoverBehavior; import gregtech.api.util.GT_Utility; -import net.minecraft.client.gui.GuiButton; +import gregtech.api.util.ISerializableObject; +import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget; import net.minecraft.entity.player.EntityPlayer; import net.minecraftforge.fluids.Fluid; @@ -135,108 +135,96 @@ public class GT_Cover_DoesWork extends GT_CoverBehavior { return 5; } - /** - * GUI Stuff - */ + // GUI stuff + @Override public boolean hasCoverGUI() { return true; } @Override - public Object getClientGUI(byte aSide, int aCoverID, int coverData, ICoverable aTileEntity) { - return new GT_Cover_DoesWork.GUI(aSide, aCoverID, coverData, aTileEntity); + public boolean useModularUI() { + return true; + } + + @Override + public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) { + return new DoesWorkUIFactory(buildContext).createWindow(); } - private class GUI extends GT_GUICover { - private final byte side; - private final int coverID; - private int coverVariable; + private class DoesWorkUIFactory extends UIFactory { private static final int startX = 10; private static final int startY = 25; private static final int spaceX = 18; private static final int spaceY = 18; - private final int textColor = this.getTextColorOrDefault("text", 0xFF555555); - - public GUI(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { - super(aTileEntity, 176, 107, GT_Utility.intToStack(aCoverID)); - this.side = aSide; - this.coverID = aCoverID; - this.coverVariable = aCoverVariable; - - GuiButton b; - b = new GT_GuiIconButton(this, 0, startX + spaceX * 0, startY + spaceY * 0, GT_GuiIcon.PROGRESS); - b = new GT_GuiIconButton(this, 1, startX + spaceX * 1, startY + spaceY * 0, GT_GuiIcon.CHECKMARK); - b = new GT_GuiIconCheckButton( - this, 2, startX + spaceX * 0, startY + spaceY * 1, GT_GuiIcon.REDSTONE_ON, GT_GuiIcon.REDSTONE_OFF); - } - - @Override - public void drawExtras(int mouseX, int mouseY, float parTicks) { - super.drawExtras(mouseX, mouseY, parTicks); - String s1, s2; - if ((coverVariable & 0x2) > 0) s1 = GT_Utility.trans("242", "Machine idle"); - else s1 = GT_Utility.trans("241", "Recipe progress"); - if ((coverVariable & 0x1) > 0) s2 = GT_Utility.trans("INVERTED", "Inverted"); - else s2 = GT_Utility.trans("NORMAL", "Normal"); - this.fontRendererObj.drawString(s1, startX + spaceX * 3, 4 + startY + spaceY * 0, textColor); - this.fontRendererObj.drawString(s2, startX + spaceX * 3, 4 + startY + spaceY * 1, textColor); - } - - @Override - protected void onInitGui(int guiLeft, int guiTop, int gui_width, int gui_height) { - updateButtons(); + public DoesWorkUIFactory(GT_CoverUIBuildContext buildContext) { + super(buildContext); } + @SuppressWarnings("PointlessArithmeticExpression") @Override - public void buttonClicked(GuiButton btn) { - if (getClickable(btn.id)) { - boolean state = false; - if (btn.id == 2) state = ((GT_GuiIconCheckButton) btn).isChecked(); - - coverVariable = getNewCoverVariable(btn.id, state); - GT_Values.NW.sendToServer(new GT_Packet_TileEntityCover(side, coverID, coverVariable, tile)); - } - updateButtons(); + protected void addUIWidgets(ModularWindow.Builder builder) { + builder.widget(new CoverDataControllerWidget.CoverDataIndexedControllerWidget_ToggleButtons<>( + this::getCoverData, + this::setCoverData, + GT_Cover_DoesWork.this, + (id, coverData) -> isEnabled(id, convert(coverData)), + (id, coverData) -> new ISerializableObject.LegacyCoverData( + getNewCoverVariable(id, convert(coverData)))) + .addToggleButton( + 0, + CoverDataFollower_ToggleButtonWidget.ofDisableable(), + widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_PROGRESS) + .setPos(spaceX * 0, spaceY * 0)) + .addToggleButton( + 1, + CoverDataFollower_ToggleButtonWidget.ofDisableable(), + widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_CHECKMARK) + .setPos(spaceX * 1, spaceY * 0)) + .addToggleButton( + 2, + CoverDataFollower_ToggleButtonWidget.ofRedstone(), + widget -> widget.setPos(spaceX * 0, spaceY * 1)) + .setPos(startX, startY)) + .widget(TextWidget.dynamicString(() -> ((convert(getCoverData()) & 0x2) > 0) + ? GT_Utility.trans("242", "Machine idle") + : GT_Utility.trans("241", "Recipe progress")) + .setSynced(false) + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 3, 4 + startY + spaceY * 0)) + .widget(TextWidget.dynamicString(() -> ((convert(getCoverData()) & 0x1) > 0) + ? GT_Utility.trans("INVERTED", "Inverted") + : GT_Utility.trans("NORMAL", "Normal")) + .setSynced(false) + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX * 3, 4 + startY + spaceY * 1)); } - private void updateButtons() { - GuiButton b; - for (Object o : buttonList) { - b = (GuiButton) o; - if (b.id == 2) { - ((GT_GuiIconCheckButton) b).setChecked((coverVariable & 0x1) > 0); - } else { - b.enabled = getClickable(b.id); - } - } - } - - private int getNewCoverVariable(int id, boolean buttonState) { + private int getNewCoverVariable(int id, int coverVariable) { switch (id) { case 0: return coverVariable & ~0x2; case 1: return coverVariable | 0x2; case 2: - if (buttonState) return coverVariable & ~0x1; + if ((coverVariable & 0x1) > 0) return coverVariable & ~0x1; return coverVariable | 0x1; } return coverVariable; } - private boolean getClickable(int id) { + private boolean isEnabled(int id, int coverVariable) { switch (id) { case 0: - return (coverVariable & 0x2) > 0; - case 1: return (coverVariable & 0x2) == 0; + case 1: + return (coverVariable & 0x2) > 0; case 2: - return true; + return (coverVariable & 0x1) > 0; } - return false; + return true; } } } diff --git a/src/main/java/gregtech/common/covers/GT_Cover_EUMeter.java b/src/main/java/gregtech/common/covers/GT_Cover_EUMeter.java index c9e7ef363a..fbac598d19 100644 --- a/src/main/java/gregtech/common/covers/GT_Cover_EUMeter.java +++ b/src/main/java/gregtech/common/covers/GT_Cover_EUMeter.java @@ -1,31 +1,31 @@ package gregtech.common.covers; import com.google.common.io.ByteArrayDataInput; -import gregtech.api.enums.GT_Values; -import gregtech.api.gui.GT_GUICover; -import gregtech.api.gui.widgets.GT_GuiIcon; -import gregtech.api.gui.widgets.GT_GuiIconButton; -import gregtech.api.gui.widgets.GT_GuiIconCheckButton; -import gregtech.api.gui.widgets.GT_GuiIntegerTextBox; +import com.gtnewhorizons.modularui.api.math.MathExpression; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.TextWidget; +import gregtech.api.gui.modularui.GT_CoverUIBuildContext; +import gregtech.api.gui.modularui.GT_UITextures; import gregtech.api.interfaces.ITexture; import gregtech.api.interfaces.metatileentity.IMetaTileEntity; import gregtech.api.interfaces.tileentity.ICoverable; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicBatteryBuffer; -import gregtech.api.net.GT_Packet_TileEntityCoverNew; import gregtech.api.util.GT_CoverBehaviorBase; import gregtech.api.util.GT_Utility; import gregtech.api.util.ISerializableObject; +import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollower_CycleButtonWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollower_TextFieldWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget; import io.netty.buffer.ByteBuf; import java.util.function.Function; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import net.minecraft.client.gui.GuiButton; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; import net.minecraftforge.fluids.Fluid; public class GT_Cover_EUMeter extends GT_CoverBehaviorBase { @@ -208,15 +208,85 @@ public class GT_Cover_EUMeter extends GT_CoverBehaviorBase( + this::getCoverData, this::setCoverData, GT_Cover_EUMeter.this) + .addFollower( + new CoverDataFollower_CycleButtonWidget<>(), + coverData -> coverData.type.ordinal(), + (coverData, state) -> { + coverData.type = EnergyType.getEnergyType(state); + return coverData; + }, + widget -> widget.setLength(EnergyType.values().length) + .addTooltip(state -> EnergyType.getEnergyType(state) + .getTooltip()) + .setStaticTexture(GT_UITextures.OVERLAY_BUTTON_CYCLIC) + .setPos(spaceX * 0, spaceY * 0)) + .addFollower( + CoverDataFollower_ToggleButtonWidget.ofRedstone(), + coverData -> coverData.inverted, + (coverData, state) -> { + coverData.inverted = state; + return coverData; + }, + widget -> widget.addTooltip(0, NORMAL) + .addTooltip(1, INVERTED) + .setPos(spaceX * 0, spaceY * 1)) + .addFollower( + new CoverDataFollower_TextFieldWidget<>(), + coverData -> String.valueOf(coverData.threshold), + (coverData, state) -> { + coverData.threshold = (long) MathExpression.parseMathExpression(state); + return coverData; + }, + widget -> widget.setOnScrollNumbersLong(1000, 100, 100000) + .setNumbersLong(() -> 0L, () -> Long.MAX_VALUE) + .setFocusOnGuiOpen(true) + .setPos(spaceX * 0, spaceY * 2 + 2) + .setSize(spaceX * 8, 12)) + .setPos(startX, startY)) + .widget(TextWidget.dynamicString(() -> + getCoverData() != null ? getCoverData().type.getTitle() : "") + .setSynced(false) + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX, 4 + startY)) + .widget(TextWidget.dynamicString( + () -> getCoverData() != null ? getCoverData().inverted ? INVERTED : NORMAL : "") + .setSynced(false) + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX + spaceX, 4 + startY + spaceY)) + .widget(new TextWidget(GT_Utility.trans("222.1", "Energy threshold")) + .setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(startX, startY + spaceY * 3 + 4)); + } } + // endregion public static class EUMeterData implements ISerializableObject { @@ -390,138 +460,4 @@ public class GT_Cover_EUMeter extends GT_CoverBehaviorBase