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 --- src/main/java/gregtech/common/GT_Proxy.java | 21 +- .../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 ++--- .../common/gui/GT_ContainerVolumetricFlask.java | 20 - .../gui/GT_Container_AdvDebugStructureWriter.java | 213 --------- .../gregtech/common/gui/GT_Container_Boiler.java | 99 ----- .../gui/GT_Container_BronzeBlastFurnace.java | 31 -- .../common/gui/GT_Container_ChestBuffer.java | 102 ----- .../gregtech/common/gui/GT_Container_Filter.java | 138 ------ .../common/gui/GT_Container_IndustrialApiary.java | 249 ----------- .../common/gui/GT_Container_InputBus_ME.java | 121 ------ .../common/gui/GT_Container_ItemDistributor.java | 83 ---- .../GT_Container_MicrowaveEnergyTransmitter.java | 188 -------- .../common/gui/GT_Container_OutputHatch.java | 53 --- .../gui/GT_Container_PrimitiveBlastFurnace.java | 37 -- .../common/gui/GT_Container_QuantumChest.java | 70 --- .../common/gui/GT_Container_Regulator.java | 177 -------- .../common/gui/GT_Container_SuperBuffer.java | 97 ----- .../common/gui/GT_Container_Teleporter.java | 190 --------- .../common/gui/GT_GUIContainerVolumetricFlask.java | 234 ---------- .../GT_GUIContainer_AdvDebugStructureWriter.java | 76 ---- .../common/gui/GT_GUIContainer_Boiler.java | 46 -- .../gui/GT_GUIContainer_BronzeBlastFurnace.java | 47 -- .../common/gui/GT_GUIContainer_ChestBuffer.java | 19 - .../common/gui/GT_GUIContainer_Filter.java | 19 - .../common/gui/GT_GUIContainer_FusionReactor.java | 96 ----- .../gui/GT_GUIContainer_IndustrialApiary.java | 174 -------- .../common/gui/GT_GUIContainer_InputBus_ME.java | 77 ---- .../gui/GT_GUIContainer_ItemDistributor.java | 21 - ...GT_GUIContainer_MicrowaveEnergyTransmitter.java | 75 ---- .../common/gui/GT_GUIContainer_OutputHatch.java | 75 ---- .../gui/GT_GUIContainer_PrimitiveBlastFurnace.java | 81 ---- .../common/gui/GT_GUIContainer_QuantumChest.java | 46 -- .../common/gui/GT_GUIContainer_RecipeFilter.java | 23 - .../common/gui/GT_GUIContainer_Regulator.java | 44 -- .../common/gui/GT_GUIContainer_SuperBuffer.java | 19 - .../common/gui/GT_GUIContainer_Teleporter.java | 63 --- .../gregtech/common/gui/modularui/UIHelper.java | 222 ++++++++++ .../modularui/uifactory/SelectItemUIFactory.java | 221 ++++++++++ .../common/gui/modularui/widget/AESlotWidget.java | 40 ++ .../modularui/widget/CoverCycleButtonWidget.java | 89 ++++ .../widget/CoverDataControllerWidget.java | 138 ++++++ .../CoverDataFollower_CycleButtonWidget.java | 38 ++ .../widget/CoverDataFollower_SlotWidget.java | 102 +++++ .../widget/CoverDataFollower_TextFieldWidget.java | 110 +++++ .../CoverDataFollower_ToggleButtonWidget.java | 84 ++++ .../gui/modularui/widget/DataControllerWidget.java | 162 +++++++ .../modularui/widget/FluidDisplaySlotWidget.java | 474 +++++++++++++++++++++ .../modularui/widget/ItemWatcherSlotWidget.java | 47 ++ .../common/items/GT_IntegratedCircuit_Item.java | 15 +- .../gregtech/common/items/GT_VolumetricFlask.java | 105 ++++- .../automation/GT_MetaTileEntity_ChestBuffer.java | 37 +- .../automation/GT_MetaTileEntity_Filter.java | 86 +++- .../GT_MetaTileEntity_ItemDistributor.java | 32 +- .../automation/GT_MetaTileEntity_RecipeFilter.java | 19 +- .../automation/GT_MetaTileEntity_Regulator.java | 76 +++- .../automation/GT_MetaTileEntity_SuperBuffer.java | 18 +- .../automation/GT_MetaTileEntity_TypeFilter.java | 14 + .../boilers/GT_MetaTileEntity_Boiler.java | 114 ++++- .../boilers/GT_MetaTileEntity_Boiler_Bronze.java | 19 +- .../boilers/GT_MetaTileEntity_Boiler_Lava.java | 19 +- .../boilers/GT_MetaTileEntity_Boiler_Solar.java | 31 +- .../GT_MetaTileEntity_Boiler_Solar_Steel.java | 11 +- .../boilers/GT_MetaTileEntity_Boiler_Steel.java | 19 +- .../GT_MetaTileEntity_AdvDebugStructureWriter.java | 140 +++++- .../GT_MetaTileEntity_Hatch_InputBus_ME.java | 88 +++- .../GT_MetaTileEntity_Hatch_OutputBus_ME.java | 5 + .../basic/GT_MetaTileEntity_CuringOven.java | 28 +- .../basic/GT_MetaTileEntity_Disassembler.java | 12 + .../basic/GT_MetaTileEntity_IndustrialApiary.java | 359 +++++++++++++++- ..._MetaTileEntity_MicrowaveEnergyTransmitter.java | 109 ++++- .../machines/basic/GT_MetaTileEntity_Miner.java | 26 +- .../machines/basic/GT_MetaTileEntity_Pump.java | 22 +- .../basic/GT_MetaTileEntity_Teleporter.java | 109 ++++- .../multi/GT_MetaTileEntity_AssemblyLine.java | 8 - .../GT_MetaTileEntity_BrickedBlastFurnace.java | 6 + .../GT_MetaTileEntity_BronzeBlastFurnace.java | 6 + .../multi/GT_MetaTileEntity_Cleanroom.java | 8 - .../GT_MetaTileEntity_ConcreteBackfillerBase.java | 8 - .../multi/GT_MetaTileEntity_DieselEngine.java | 8 - .../multi/GT_MetaTileEntity_DistillationTower.java | 8 - .../GT_MetaTileEntity_ElectricBlastFurnace.java | 8 - .../GT_MetaTileEntity_ExtremeDieselEngine.java | 8 - .../multi/GT_MetaTileEntity_FusionComputer.java | 111 ++++- .../multi/GT_MetaTileEntity_HeatExchanger.java | 8 - .../GT_MetaTileEntity_ImplosionCompressor.java | 8 - .../multi/GT_MetaTileEntity_LargeBoiler.java | 8 - .../GT_MetaTileEntity_LargeChemicalReactor.java | 8 - .../multi/GT_MetaTileEntity_LargeTurbine.java | 8 - .../multi/GT_MetaTileEntity_MultiFurnace.java | 8 - .../multi/GT_MetaTileEntity_OilCracker.java | 8 - .../multi/GT_MetaTileEntity_OilDrillBase.java | 8 - .../GT_MetaTileEntity_OreDrillingPlantBase.java | 9 - .../multi/GT_MetaTileEntity_PlasmaForge.java | 8 - .../GT_MetaTileEntity_PrimitiveBlastFurnace.java | 99 +++-- .../multi/GT_MetaTileEntity_ProcessingArray.java | 8 - .../multi/GT_MetaTileEntity_PyrolyseOven.java | 8 - .../multi/GT_MetaTileEntity_VacuumFreezer.java | 8 - .../GT_MetaTileEntity_AlloySmelter_Bronze.java | 12 - .../GT_MetaTileEntity_AlloySmelter_Steel.java | 12 - .../steam/GT_MetaTileEntity_Compressor_Bronze.java | 12 - .../steam/GT_MetaTileEntity_Compressor_Steel.java | 12 - .../steam/GT_MetaTileEntity_Extractor_Bronze.java | 12 - .../steam/GT_MetaTileEntity_Extractor_Steel.java | 12 - .../GT_MetaTileEntity_ForgeHammer_Bronze.java | 14 - .../steam/GT_MetaTileEntity_ForgeHammer_Steel.java | 14 - .../steam/GT_MetaTileEntity_Furnace_Bronze.java | 12 +- .../steam/GT_MetaTileEntity_Furnace_Steel.java | 12 +- .../steam/GT_MetaTileEntity_Macerator_Bronze.java | 12 - .../steam/GT_MetaTileEntity_Macerator_Steel.java | 12 - .../GT_MetaTileEntity_DigitalChestBase.java | 58 ++- .../storage/GT_MetaTileEntity_DigitalTankBase.java | 203 ++++++++- 133 files changed, 5327 insertions(+), 6300 deletions(-) delete mode 100644 src/main/java/gregtech/common/gui/GT_ContainerVolumetricFlask.java delete mode 100644 src/main/java/gregtech/common/gui/GT_Container_AdvDebugStructureWriter.java delete mode 100644 src/main/java/gregtech/common/gui/GT_Container_Boiler.java delete mode 100644 src/main/java/gregtech/common/gui/GT_Container_BronzeBlastFurnace.java delete mode 100644 src/main/java/gregtech/common/gui/GT_Container_ChestBuffer.java delete mode 100644 src/main/java/gregtech/common/gui/GT_Container_Filter.java delete mode 100644 src/main/java/gregtech/common/gui/GT_Container_IndustrialApiary.java delete mode 100644 src/main/java/gregtech/common/gui/GT_Container_InputBus_ME.java delete mode 100644 src/main/java/gregtech/common/gui/GT_Container_ItemDistributor.java delete mode 100644 src/main/java/gregtech/common/gui/GT_Container_MicrowaveEnergyTransmitter.java delete mode 100644 src/main/java/gregtech/common/gui/GT_Container_OutputHatch.java delete mode 100644 src/main/java/gregtech/common/gui/GT_Container_PrimitiveBlastFurnace.java delete mode 100644 src/main/java/gregtech/common/gui/GT_Container_QuantumChest.java delete mode 100644 src/main/java/gregtech/common/gui/GT_Container_Regulator.java delete mode 100644 src/main/java/gregtech/common/gui/GT_Container_SuperBuffer.java delete mode 100644 src/main/java/gregtech/common/gui/GT_Container_Teleporter.java delete mode 100644 src/main/java/gregtech/common/gui/GT_GUIContainerVolumetricFlask.java delete mode 100644 src/main/java/gregtech/common/gui/GT_GUIContainer_AdvDebugStructureWriter.java delete mode 100644 src/main/java/gregtech/common/gui/GT_GUIContainer_Boiler.java delete mode 100644 src/main/java/gregtech/common/gui/GT_GUIContainer_BronzeBlastFurnace.java delete mode 100644 src/main/java/gregtech/common/gui/GT_GUIContainer_ChestBuffer.java delete mode 100644 src/main/java/gregtech/common/gui/GT_GUIContainer_Filter.java delete mode 100644 src/main/java/gregtech/common/gui/GT_GUIContainer_FusionReactor.java delete mode 100644 src/main/java/gregtech/common/gui/GT_GUIContainer_IndustrialApiary.java delete mode 100644 src/main/java/gregtech/common/gui/GT_GUIContainer_InputBus_ME.java delete mode 100644 src/main/java/gregtech/common/gui/GT_GUIContainer_ItemDistributor.java delete mode 100644 src/main/java/gregtech/common/gui/GT_GUIContainer_MicrowaveEnergyTransmitter.java delete mode 100644 src/main/java/gregtech/common/gui/GT_GUIContainer_OutputHatch.java delete mode 100644 src/main/java/gregtech/common/gui/GT_GUIContainer_PrimitiveBlastFurnace.java delete mode 100644 src/main/java/gregtech/common/gui/GT_GUIContainer_QuantumChest.java delete mode 100644 src/main/java/gregtech/common/gui/GT_GUIContainer_RecipeFilter.java delete mode 100644 src/main/java/gregtech/common/gui/GT_GUIContainer_Regulator.java delete mode 100644 src/main/java/gregtech/common/gui/GT_GUIContainer_SuperBuffer.java delete mode 100644 src/main/java/gregtech/common/gui/GT_GUIContainer_Teleporter.java create mode 100644 src/main/java/gregtech/common/gui/modularui/UIHelper.java create mode 100644 src/main/java/gregtech/common/gui/modularui/uifactory/SelectItemUIFactory.java create mode 100644 src/main/java/gregtech/common/gui/modularui/widget/AESlotWidget.java create mode 100644 src/main/java/gregtech/common/gui/modularui/widget/CoverCycleButtonWidget.java create mode 100644 src/main/java/gregtech/common/gui/modularui/widget/CoverDataControllerWidget.java create mode 100644 src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_CycleButtonWidget.java create mode 100644 src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_SlotWidget.java create mode 100644 src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_TextFieldWidget.java create mode 100644 src/main/java/gregtech/common/gui/modularui/widget/CoverDataFollower_ToggleButtonWidget.java create mode 100644 src/main/java/gregtech/common/gui/modularui/widget/DataControllerWidget.java create mode 100644 src/main/java/gregtech/common/gui/modularui/widget/FluidDisplaySlotWidget.java create mode 100644 src/main/java/gregtech/common/gui/modularui/widget/ItemWatcherSlotWidget.java (limited to 'src/main/java/gregtech/common') diff --git a/src/main/java/gregtech/common/GT_Proxy.java b/src/main/java/gregtech/common/GT_Proxy.java index 8db4c21dde..37ad05530c 100644 --- a/src/main/java/gregtech/common/GT_Proxy.java +++ b/src/main/java/gregtech/common/GT_Proxy.java @@ -70,8 +70,6 @@ import gregtech.api.util.GT_Shapeless_Recipe; import gregtech.api.util.GT_Utility; import gregtech.api.util.WorldSpawnedEventBuilder; import gregtech.common.entities.GT_Entity_Arrow; -import gregtech.common.gui.GT_ContainerVolumetricFlask; -import gregtech.common.gui.GT_GUIContainerVolumetricFlask; import gregtech.common.items.GT_MetaGenerated_Item_98; import gregtech.common.items.GT_MetaGenerated_Tool_01; import gregtech.common.misc.GlobalEnergyWorldSavedData; @@ -645,6 +643,11 @@ public abstract class GT_Proxy implements IGT_Mod, IGuiHandler, IFuelHandler, IG */ public int mTooltipShiftVerbosity = 3; + /** + * Which style to use for title tab on machine GUI? 0: text tab split-dark, 1: text tab unified, 2: item icon tab + */ + public int mTitleTabStyle = 0; + /** * Whether to show seconds or ticks on NEI */ @@ -2241,10 +2244,6 @@ public abstract class GT_Proxy implements IGT_Mod, IGuiHandler, IFuelHandler, IG @Override public Object getServerGuiElement(int aID, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ) { if (aID >= 1000) { - int ID = aID - 1000; - if (ID == 10) { - return new GT_ContainerVolumetricFlask(aPlayer.inventory); - } return null; } TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); @@ -2253,7 +2252,7 @@ public abstract class GT_Proxy implements IGT_Mod, IGuiHandler, IFuelHandler, IG return null; } IMetaTileEntity tMetaTileEntity = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity(); - if (tMetaTileEntity != null) { + if (tMetaTileEntity != null && !tMetaTileEntity.useModularUI()) { return tMetaTileEntity.getServerGUI(aID, aPlayer.inventory, (IGregTechTileEntity) tTileEntity); } } @@ -2263,10 +2262,6 @@ public abstract class GT_Proxy implements IGT_Mod, IGuiHandler, IFuelHandler, IG @Override public Object getClientGuiElement(int aID, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ) { if (aID >= 1000) { - int ID = aID - 1000; - if (ID == 10) { - return new GT_GUIContainerVolumetricFlask(new GT_ContainerVolumetricFlask(aPlayer.inventory)); - } return null; } TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); @@ -2277,7 +2272,7 @@ public abstract class GT_Proxy implements IGT_Mod, IGuiHandler, IFuelHandler, IG byte side = (byte) (aID - GT_Proxy.GUI_ID_COVER_SIDE_BASE); GT_CoverBehaviorBase cover = tile.getCoverBehaviorAtSideNew(side); - if (cover.hasCoverGUI()) { + if (cover.hasCoverGUI() && !cover.useModularUI()) { return cover.getClientGUI( side, tile.getCoverIDAtSide(side), @@ -2289,7 +2284,7 @@ public abstract class GT_Proxy implements IGT_Mod, IGuiHandler, IFuelHandler, IG return null; } IMetaTileEntity tMetaTileEntity = tile.getMetaTileEntity(); - if (tMetaTileEntity != null) { + if (tMetaTileEntity != null && !tMetaTileEntity.useModularUI()) { return tMetaTileEntity.getClientGUI(aID, aPlayer.inventory, tile); } } 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