aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/api/gui/modularui
diff options
context:
space:
mode:
authormiozune <miozune@gmail.com>2022-11-26 01:45:28 +0900
committerGitHub <noreply@github.com>2022-11-25 17:45:28 +0100
commit9a2741128a78bb52eba50a631126e090a5a2abd8 (patch)
treea90f47aa94951acb4050e45dc3ed60698e79cf32 /src/main/java/gregtech/api/gui/modularui
parent51537482fefc4f9c6d3fbd93d119c333a63dcd7b (diff)
downloadGT5-Unofficial-9a2741128a78bb52eba50a631126e090a5a2abd8.tar.gz
GT5-Unofficial-9a2741128a78bb52eba50a631126e090a5a2abd8.tar.bz2
GT5-Unofficial-9a2741128a78bb52eba50a631126e090a5a2abd8.zip
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 <miozune@gmail.com> * 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 <mitchej@gmail.com>
Diffstat (limited to 'src/main/java/gregtech/api/gui/modularui')
-rw-r--r--src/main/java/gregtech/api/gui/modularui/GT_CoverUIBuildContext.java70
-rw-r--r--src/main/java/gregtech/api/gui/modularui/GT_UIInfos.java204
-rw-r--r--src/main/java/gregtech/api/gui/modularui/GT_UITextures.java347
-rw-r--r--src/main/java/gregtech/api/gui/modularui/GUITextureSet.java150
-rw-r--r--src/main/java/gregtech/api/gui/modularui/IDataFollowerWidget.java48
-rw-r--r--src/main/java/gregtech/api/gui/modularui/SteamTexture.java74
6 files changed, 893 insertions, 0 deletions
diff --git a/src/main/java/gregtech/api/gui/modularui/GT_CoverUIBuildContext.java b/src/main/java/gregtech/api/gui/modularui/GT_CoverUIBuildContext.java
new file mode 100644
index 0000000000..811ad8be5f
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/modularui/GT_CoverUIBuildContext.java
@@ -0,0 +1,70 @@
+package gregtech.api.gui.modularui;
+
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import net.minecraft.entity.player.EntityPlayer;
+
+public class GT_CoverUIBuildContext extends UIBuildContext {
+
+ // cover data is not synced to client, while ID is
+ private final int coverID;
+ private final byte side;
+ private final ICoverable tile;
+ private final boolean anotherWindow;
+ private final int guiColorization;
+
+ /**
+ * @param player Player opened this UI
+ * @param coverID See {@link ICoverable#getCoverIDAtSide}
+ * @param side Side this cover is attached to
+ * @param tile Tile this cover is attached to
+ * @param anotherWindow If cover UI is shown on top of another window
+ * @param guiColorization The color used to render machine's GUI
+ */
+ public GT_CoverUIBuildContext(
+ EntityPlayer player, int coverID, byte side, ICoverable tile, boolean anotherWindow, int guiColorization) {
+ super(player);
+ this.coverID = coverID;
+ this.side = side;
+ this.tile = tile;
+ this.anotherWindow = anotherWindow;
+ this.guiColorization = guiColorization;
+ }
+
+ /**
+ * @param player Player opened this UI
+ * @param coverID See {@link ICoverable#getCoverIDAtSide}
+ * @param side Side this cover is attached to
+ * @param tile Tile this cover is attached to
+ * @param anotherWindow If cover GUI is shown in opened on top of another window
+ */
+ public GT_CoverUIBuildContext(EntityPlayer player, int coverID, byte side, ICoverable tile, boolean anotherWindow) {
+ this(player, coverID, side, tile, anotherWindow, tile.getGUIColorization());
+ }
+
+ public int getCoverID() {
+ return coverID;
+ }
+
+ public byte getCoverSide() {
+ return side;
+ }
+
+ /**
+ * Note that this will return different object between client v.s. server side on SP.
+ */
+ public ICoverable getTile() {
+ return tile;
+ }
+
+ /**
+ * If cover GUI is shown in opened on top of another window.
+ */
+ public boolean isAnotherWindow() {
+ return anotherWindow;
+ }
+
+ public int getGuiColorization() {
+ return guiColorization;
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/modularui/GT_UIInfos.java b/src/main/java/gregtech/api/gui/modularui/GT_UIInfos.java
new file mode 100644
index 0000000000..2d776ce71e
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/modularui/GT_UIInfos.java
@@ -0,0 +1,204 @@
+package gregtech.api.gui.modularui;
+
+import com.gtnewhorizons.modularui.api.UIInfos;
+import com.gtnewhorizons.modularui.api.screen.ITileWithModularUI;
+import com.gtnewhorizons.modularui.api.screen.ModularUIContext;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.builder.UIBuilder;
+import com.gtnewhorizons.modularui.common.builder.UIInfo;
+import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils;
+import com.gtnewhorizons.modularui.common.internal.wrapper.ModularGui;
+import com.gtnewhorizons.modularui.common.internal.wrapper.ModularUIContainer;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.interfaces.tileentity.IHasWorldObjectAndCoords;
+import gregtech.api.net.GT_Packet_SendCoverData;
+import gregtech.api.util.GT_CoverBehaviorBase;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.function.Function;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraftforge.common.util.ForgeDirection;
+
+public class GT_UIInfos {
+
+ /**
+ * Generator for {@link UIInfo} which is responsible for registering and opening UIs.
+ * Unlike {@link com.gtnewhorizons.modularui.api.UIInfos#TILE_MODULAR_UI}, this accepts
+ * custom constructors for UI.
+ * <br> Do NOT run {@link UIBuilder#build} on-the-fly, otherwise MP client won't register UIs.
+ * Instead, store to static field, just like {@link #GTTileEntityDefaultUI}.
+ * Such mistake can be easily overlooked by testing only SP.
+ */
+ public static final Function<ContainerConstructor, UIInfo<?, ?>> GTTileEntityUIFactory =
+ containerConstructor -> UIBuilder.of()
+ .container((player, world, x, y, z) -> {
+ TileEntity te = world.getTileEntity(x, y, z);
+ if (te instanceof ITileWithModularUI) {
+ return createTileEntityContainer(
+ player,
+ ((ITileWithModularUI) te)::createWindow,
+ te::markDirty,
+ containerConstructor);
+ }
+ return null;
+ })
+ .gui(((player, world, x, y, z) -> {
+ if (!world.isRemote) return null;
+ TileEntity te = world.getTileEntity(x, y, z);
+ if (te instanceof ITileWithModularUI) {
+ return createTileEntityGuiContainer(
+ player, ((ITileWithModularUI) te)::createWindow, containerConstructor);
+ }
+ return null;
+ }))
+ .build();
+
+ private static final UIInfo<?, ?> GTTileEntityDefaultUI = GTTileEntityUIFactory.apply(ModularUIContainer::new);
+
+ private static final Map<Byte, UIInfo<?, ?>> coverUI = new HashMap<>();
+
+ static {
+ for (byte i = 0; i < ForgeDirection.VALID_DIRECTIONS.length; i++) {
+ final byte side = i;
+ coverUI.put(
+ side,
+ UIBuilder.of()
+ .container((player, world, x, y, z) -> {
+ TileEntity te = world.getTileEntity(x, y, z);
+ if (!(te instanceof ICoverable)) return null;
+ ICoverable gtTileEntity = (ICoverable) te;
+ GT_CoverBehaviorBase<?> cover = gtTileEntity.getCoverBehaviorAtSideNew(side);
+ return createCoverContainer(
+ player,
+ cover::createWindow,
+ te::markDirty,
+ gtTileEntity.getCoverIDAtSide(side),
+ side,
+ gtTileEntity);
+ })
+ .gui((player, world, x, y, z) -> {
+ if (!world.isRemote) return null;
+ TileEntity te = world.getTileEntity(x, y, z);
+ if (!(te instanceof ICoverable)) return null;
+ ICoverable gtTileEntity = (ICoverable) te;
+ GT_CoverBehaviorBase<?> cover = gtTileEntity.getCoverBehaviorAtSideNew(side);
+ return createCoverGuiContainer(
+ player,
+ cover::createWindow,
+ gtTileEntity.getCoverIDAtSide(side),
+ side,
+ gtTileEntity);
+ })
+ .build());
+ }
+ }
+
+ /**
+ * Opens TileEntity UI, created by {@link ITileWithModularUI#createWindow}.
+ */
+ public static void openGTTileEntityUI(IHasWorldObjectAndCoords aTileEntity, EntityPlayer aPlayer) {
+ if (aTileEntity.isClientSide()) return;
+ GTTileEntityDefaultUI.open(
+ aPlayer,
+ aTileEntity.getWorld(),
+ aTileEntity.getXCoord(),
+ aTileEntity.getYCoord(),
+ aTileEntity.getZCoord());
+ }
+
+ /**
+ * Opens cover UI, created by {@link GT_CoverBehaviorBase#createWindow}.
+ */
+ public static void openCoverUI(ICoverable tileEntity, EntityPlayer player, byte side) {
+ if (tileEntity.isClientSide()) return;
+
+ GT_Values.NW.sendToPlayer(
+ new GT_Packet_SendCoverData(
+ side,
+ tileEntity.getCoverIDAtSide(side),
+ tileEntity.getComplexCoverDataAtSide(side),
+ tileEntity),
+ (EntityPlayerMP) player);
+
+ coverUI.get(side)
+ .open(
+ player,
+ tileEntity.getWorld(),
+ tileEntity.getXCoord(),
+ tileEntity.getYCoord(),
+ tileEntity.getZCoord());
+ }
+
+ /**
+ * Opens UI for player's item, created by {@link com.gtnewhorizons.modularui.api.screen.IItemWithModularUI#createWindow}.
+ */
+ public static void openPlayerHeldItemUI(EntityPlayer player) {
+ if (NetworkUtils.isClient()) return;
+ UIInfos.PLAYER_HELD_ITEM_UI.open(player);
+ }
+
+ private static ModularUIContainer createTileEntityContainer(
+ EntityPlayer player,
+ Function<UIBuildContext, ModularWindow> windowCreator,
+ Runnable onWidgetUpdate,
+ ContainerConstructor containerCreator) {
+ UIBuildContext buildContext = new UIBuildContext(player);
+ ModularWindow window = windowCreator.apply(buildContext);
+ if (window == null) {
+ return null;
+ }
+ return containerCreator.of(new ModularUIContext(buildContext, onWidgetUpdate), window);
+ }
+
+ @SideOnly(Side.CLIENT)
+ private static ModularGui createTileEntityGuiContainer(
+ EntityPlayer player,
+ Function<UIBuildContext, ModularWindow> windowCreator,
+ ContainerConstructor containerConstructor) {
+ ModularUIContainer container = createTileEntityContainer(player, windowCreator, null, containerConstructor);
+ if (container == null) {
+ return null;
+ }
+ return new ModularGui(container);
+ }
+
+ private static ModularUIContainer createCoverContainer(
+ EntityPlayer player,
+ Function<GT_CoverUIBuildContext, ModularWindow> windowCreator,
+ Runnable onWidgetUpdate,
+ int coverID,
+ byte side,
+ ICoverable tile) {
+ GT_CoverUIBuildContext buildContext = new GT_CoverUIBuildContext(player, coverID, side, tile, false);
+ ModularWindow window = windowCreator.apply(buildContext);
+ if (window == null) {
+ return null;
+ }
+ return new ModularUIContainer(new ModularUIContext(buildContext, onWidgetUpdate), window);
+ }
+
+ @SideOnly(Side.CLIENT)
+ private static ModularGui createCoverGuiContainer(
+ EntityPlayer player,
+ Function<GT_CoverUIBuildContext, ModularWindow> windowCreator,
+ int coverID,
+ byte side,
+ ICoverable tile) {
+ ModularUIContainer container = createCoverContainer(player, windowCreator, null, coverID, side, tile);
+ if (container == null) {
+ return null;
+ }
+ return new ModularGui(container);
+ }
+
+ @FunctionalInterface
+ public interface ContainerConstructor {
+ ModularUIContainer of(ModularUIContext context, ModularWindow mainWindow);
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/modularui/GT_UITextures.java b/src/main/java/gregtech/api/gui/modularui/GT_UITextures.java
new file mode 100644
index 0000000000..76b4874838
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/modularui/GT_UITextures.java
@@ -0,0 +1,347 @@
+package gregtech.api.gui.modularui;
+
+import com.gtnewhorizons.modularui.api.drawable.AdaptableUITexture;
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
+import java.util.function.BiFunction;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+public class GT_UITextures {
+
+ private static final String MODID = "gregtech";
+
+ public static final UITexture TRANSPARENT = UITexture.fullImage(MODID, "gui/picture/transparent");
+
+ public static final AdaptableUITexture BACKGROUND_SINGLEBLOCK_DEFAULT =
+ AdaptableUITexture.of(MODID, "gui/background/singleblock_default", 176, 166, 4);
+ public static final SteamTexture BACKGROUND_STEAM =
+ SteamTexture.adaptableTexture(MODID, "gui/background/%s", 176, 166, 4);
+ public static final UITexture BACKGROUND_FUSION_COMPUTER =
+ UITexture.fullImage(MODID, "gui/background/fusion_computer");
+ public static final AdaptableUITexture BACKGROUND_TEXT_FIELD =
+ AdaptableUITexture.of(MODID, "gui/background/text_field", 142, 28, 1);
+ public static final AdaptableUITexture BACKGROUND_TEXT_FIELD_LIGHT_GRAY =
+ AdaptableUITexture.of(MODID, "gui/background/text_field_light_gray", 61, 12, 1);
+
+ public static final SteamTexture SLOT_ITEM_STEAM = SteamTexture.fullImage(MODID, "gui/slot/item_%s");
+ public static final AdaptableUITexture SLOT_DARK_GRAY =
+ AdaptableUITexture.of(MODID, "gui/slot/dark_gray", 18, 18, 1);
+ public static final AdaptableUITexture SLOT_MAINTENANCE =
+ AdaptableUITexture.of(MODID, "gui/slot/maintenance", 20, 20, 1);
+ public static final AdaptableUITexture SLOT_UPLIFTED = AdaptableUITexture.of(MODID, "gui/slot/uplifted", 18, 18, 1);
+
+ public static final UITexture OVERLAY_SLOT_ARROW_ME = UITexture.fullImage(MODID, "gui/overlay_slot/arrow_me");
+ public static final UITexture OVERLAY_SLOT_BEAKER_1 = UITexture.fullImage(MODID, "gui/overlay_slot/beaker_1");
+ public static final UITexture OVERLAY_SLOT_BEAKER_2 = UITexture.fullImage(MODID, "gui/overlay_slot/beaker_2");
+ public static final UITexture OVERLAY_SLOT_BEE_DRONE = UITexture.fullImage(MODID, "gui/overlay_slot/bee_drone");
+ public static final UITexture OVERLAY_SLOT_BEE_QUEEN = UITexture.fullImage(MODID, "gui/overlay_slot/bee_queen");
+ public static final UITexture OVERLAY_SLOT_BENDER = UITexture.fullImage(MODID, "gui/overlay_slot/bender");
+ public static final UITexture OVERLAY_SLOT_BOX = UITexture.fullImage(MODID, "gui/overlay_slot/box");
+ public static final UITexture OVERLAY_SLOT_BOXED = UITexture.fullImage(MODID, "gui/overlay_slot/boxed");
+ public static final UITexture OVERLAY_SLOT_CANISTER = UITexture.fullImage(MODID, "gui/overlay_slot/canister");
+ public static final SteamTexture OVERLAY_SLOT_CANISTER_STEAM =
+ SteamTexture.fullImage(MODID, "gui/overlay_slot/canister_%s");
+ public static final UITexture OVERLAY_SLOT_CANNER = UITexture.fullImage(MODID, "gui/overlay_slot/canner");
+ public static final UITexture OVERLAY_SLOT_CAULDRON = UITexture.fullImage(MODID, "gui/overlay_slot/cauldron");
+ public static final UITexture OVERLAY_SLOT_CENTRIFUGE = UITexture.fullImage(MODID, "gui/overlay_slot/centrifuge");
+ public static final UITexture OVERLAY_SLOT_CENTRIFUGE_FLUID =
+ UITexture.fullImage(MODID, "gui/overlay_slot/centrifuge_fluid");
+ public static final SteamTexture OVERLAY_SLOT_CENTRIFUGE_STEAM =
+ SteamTexture.fullImage(MODID, "gui/overlay_slot/centrifuge_%s");
+ public static final UITexture OVERLAY_SLOT_CHARGER = UITexture.fullImage(MODID, "gui/overlay_slot/charger");
+ public static final UITexture OVERLAY_SLOT_CHARGER_FLUID =
+ UITexture.fullImage(MODID, "gui/overlay_slot/charger_fluid");
+ public static final UITexture OVERLAY_SLOT_CIRCUIT = UITexture.fullImage(MODID, "gui/overlay_slot/circuit");
+ public static final SteamTexture OVERLAY_SLOT_COAL_STEAM =
+ SteamTexture.fullImage(MODID, "gui/overlay_slot/coal_%s");
+ public static final UITexture OVERLAY_SLOT_COMPRESSOR = UITexture.fullImage(MODID, "gui/overlay_slot/compressor");
+ public static final SteamTexture OVERLAY_SLOT_COMPRESSOR_STEAM =
+ SteamTexture.fullImage(MODID, "gui/overlay_slot/compressor_%s");
+ public static final UITexture OVERLAY_SLOT_CRUSHED_ORE = UITexture.fullImage(MODID, "gui/overlay_slot/crushed_ore");
+ public static final SteamTexture OVERLAY_SLOT_CRUSHED_ORE_STEAM =
+ SteamTexture.fullImage(MODID, "gui/overlay_slot/crushed_ore_%s");
+ public static final UITexture OVERLAY_SLOT_CUTTER_SLICED =
+ UITexture.fullImage(MODID, "gui/overlay_slot/cutter_sliced");
+ public static final UITexture OVERLAY_SLOT_DATA_ORB = UITexture.fullImage(MODID, "gui/overlay_slot/data_orb");
+ public static final UITexture OVERLAY_SLOT_DATA_STICK = UITexture.fullImage(MODID, "gui/overlay_slot/data_stick");
+ public static final UITexture OVERLAY_SLOT_DUST = UITexture.fullImage(MODID, "gui/overlay_slot/dust");
+ public static final SteamTexture OVERLAY_SLOT_DUST_STEAM =
+ SteamTexture.fullImage(MODID, "gui/overlay_slot/dust_%s");
+ public static final UITexture OVERLAY_SLOT_EXPLOSIVE = UITexture.fullImage(MODID, "gui/overlay_slot/explosive");
+ public static final UITexture OVERLAY_SLOT_EXTRUDER_SHAPE =
+ UITexture.fullImage(MODID, "gui/overlay_slot/extruder_shape");
+ public static final UITexture OVERLAY_SLOT_FURNACE = UITexture.fullImage(MODID, "gui/overlay_slot/furnace");
+ public static final SteamTexture OVERLAY_SLOT_FURNACE_STEAM =
+ SteamTexture.fullImage(MODID, "gui/overlay_slot/furnace_%s");
+ public static final UITexture OVERLAY_SLOT_GEM = UITexture.fullImage(MODID, "gui/overlay_slot/gem");
+ public static final UITexture OVERLAY_SLOT_HAMMER = UITexture.fullImage(MODID, "gui/overlay_slot/hammer");
+ public static final SteamTexture OVERLAY_SLOT_HAMMER_STEAM =
+ SteamTexture.fullImage(MODID, "gui/overlay_slot/hammer_%s");
+ public static final UITexture OVERLAY_SLOT_HEATER_1 = UITexture.fullImage(MODID, "gui/overlay_slot/heater_1");
+ public static final UITexture OVERLAY_SLOT_HEATER_2 = UITexture.fullImage(MODID, "gui/overlay_slot/heater_2");
+ public static final UITexture OVERLAY_SLOT_IMPLOSION = UITexture.fullImage(MODID, "gui/overlay_slot/implosion");
+ public static final UITexture OVERLAY_SLOT_IN = UITexture.fullImage(MODID, "gui/overlay_slot/in");
+ public static final SteamTexture OVERLAY_SLOT_IN_STEAM = SteamTexture.fullImage(MODID, "gui/overlay_slot/in_%s");
+ public static final SteamTexture OVERLAY_SLOT_INGOT_STEAM =
+ SteamTexture.fullImage(MODID, "gui/overlay_slot/ingot_%s");
+ public static final UITexture OVERLAY_SLOT_INT_CIRCUIT = UITexture.fullImage(MODID, "gui/overlay_slot/int_circuit");
+ public static final UITexture OVERLAY_SLOT_LENS = UITexture.fullImage(MODID, "gui/overlay_slot/lens");
+ public static final UITexture OVERLAY_SLOT_MICROSCOPE = UITexture.fullImage(MODID, "gui/overlay_slot/microscope");
+ public static final UITexture OVERLAY_SLOT_MOLD = UITexture.fullImage(MODID, "gui/overlay_slot/mold");
+ public static final UITexture OVERLAY_SLOT_MOLECULAR_1 = UITexture.fullImage(MODID, "gui/overlay_slot/molecular_1");
+ public static final UITexture OVERLAY_SLOT_MOLECULAR_2 = UITexture.fullImage(MODID, "gui/overlay_slot/molecular_2");
+ public static final UITexture OVERLAY_SLOT_MOLECULAR_3 = UITexture.fullImage(MODID, "gui/overlay_slot/molecular_3");
+ public static final UITexture OVERLAY_SLOT_OUT = UITexture.fullImage(MODID, "gui/overlay_slot/out");
+ public static final SteamTexture OVERLAY_SLOT_OUT_STEAM = SteamTexture.fullImage(MODID, "gui/overlay_slot/out_%s");
+ public static final UITexture OVERLAY_SLOT_PAGE_BLANK = UITexture.fullImage(MODID, "gui/overlay_slot/page_blank");
+ public static final UITexture OVERLAY_SLOT_PAGE_PRINTED =
+ UITexture.fullImage(MODID, "gui/overlay_slot/page_printed");
+ public static final UITexture OVERLAY_SLOT_PRESS_1 = UITexture.fullImage(MODID, "gui/overlay_slot/press_1");
+ public static final UITexture OVERLAY_SLOT_PRESS_2 = UITexture.fullImage(MODID, "gui/overlay_slot/press_2");
+ public static final UITexture OVERLAY_SLOT_PRESS_3 = UITexture.fullImage(MODID, "gui/overlay_slot/press_3");
+ public static final UITexture OVERLAY_SLOT_RECYCLE = UITexture.fullImage(MODID, "gui/overlay_slot/recycle");
+ public static final UITexture OVERLAY_SLOT_ROD_1 = UITexture.fullImage(MODID, "gui/overlay_slot/rod_1");
+ public static final UITexture OVERLAY_SLOT_ROD_2 = UITexture.fullImage(MODID, "gui/overlay_slot/rod_2");
+ public static final UITexture OVERLAY_SLOT_SLICE_SHAPE = UITexture.fullImage(MODID, "gui/overlay_slot/slice_shape");
+ public static final UITexture OVERLAY_SLOT_SLICER_SLICED =
+ UITexture.fullImage(MODID, "gui/overlay_slot/slicer_sliced");
+ public static final UITexture OVERLAY_SLOT_SQUARE = UITexture.fullImage(MODID, "gui/overlay_slot/square");
+ public static final UITexture OVERLAY_SLOT_UUA = UITexture.fullImage(MODID, "gui/overlay_slot/uua");
+ public static final UITexture OVERLAY_SLOT_UUM = UITexture.fullImage(MODID, "gui/overlay_slot/uum");
+ public static final UITexture OVERLAY_SLOT_VIAL_1 = UITexture.fullImage(MODID, "gui/overlay_slot/vial_1");
+ public static final UITexture OVERLAY_SLOT_VIAL_2 = UITexture.fullImage(MODID, "gui/overlay_slot/vial_2");
+ public static final UITexture OVERLAY_SLOT_WIREMILL = UITexture.fullImage(MODID, "gui/overlay_slot/wiremill");
+ public static final UITexture OVERLAY_SLOT_WRENCH = UITexture.fullImage(MODID, "gui/overlay_slot/wrench");
+ public static final UITexture[] OVERLAY_SLOTS_NUMBER = IntStream.range(0, 12)
+ .mapToObj(i -> UITexture.fullImage(MODID, "gui/overlay_slot/number_" + i))
+ .collect(Collectors.toList())
+ .toArray(new UITexture[0]);
+
+ public static final UITexture PROGRESSBAR_ARROW = UITexture.fullImage(MODID, "gui/progressbar/arrow");
+ public static final SteamTexture PROGRESSBAR_ARROW_STEAM =
+ SteamTexture.fullImage(MODID, "gui/progressbar/arrow_%s");
+ public static final SteamTexture PROGRESSBAR_ARROW_2_STEAM =
+ SteamTexture.fullImage(MODID, "gui/progressbar/arrow_2_%s");
+ public static final UITexture PROGRESSBAR_ARROW_MULTIPLE =
+ UITexture.fullImage(MODID, "gui/progressbar/arrow_multiple");
+ public static final UITexture PROGRESSBAR_ASSEMBLE = UITexture.fullImage(MODID, "gui/progressbar/assemble");
+ public static final UITexture PROGRESSBAR_ASSEMBLY_LINE_1 =
+ UITexture.fullImage(MODID, "gui/progressbar/assemblyline_1");
+ public static final UITexture PROGRESSBAR_ASSEMBLY_LINE_2 =
+ UITexture.fullImage(MODID, "gui/progressbar/assemblyline_2");
+ public static final UITexture PROGRESSBAR_ASSEMBLY_LINE_3 =
+ UITexture.fullImage(MODID, "gui/progressbar/assemblyline_3");
+ public static final UITexture PROGRESSBAR_BATH = UITexture.fullImage(MODID, "gui/progressbar/bath");
+ public static final UITexture PROGRESSBAR_BENDING = UITexture.fullImage(MODID, "gui/progressbar/bending");
+ public static final SteamTexture PROGRESSBAR_BOILER_EMPTY_STEAM =
+ SteamTexture.fullImage(MODID, "gui/progressbar/boiler_empty_%s");
+ public static final UITexture PROGRESSBAR_BOILER_HEAT = UITexture.fullImage(MODID, "gui/progressbar/boiler_heat");
+ public static final UITexture PROGRESSBAR_BOILER_STEAM = UITexture.fullImage(MODID, "gui/progressbar/boiler_steam");
+ public static final UITexture PROGRESSBAR_BOILER_WATER = UITexture.fullImage(MODID, "gui/progressbar/boiler_water");
+ public static final UITexture PROGRESSBAR_CANNER = UITexture.fullImage(MODID, "gui/progressbar/canner");
+ public static final UITexture PROGRESSBAR_CIRCUIT_ASSEMBLER =
+ UITexture.fullImage(MODID, "gui/progressbar/circuit_assembler");
+ public static final UITexture PROGRESSBAR_COMPRESS = UITexture.fullImage(MODID, "gui/progressbar/compress");
+ public static final SteamTexture PROGRESSBAR_COMPRESS_STEAM =
+ SteamTexture.fullImage(MODID, "gui/progressbar/compress_%s");
+ public static final UITexture PROGRESSBAR_CUT = UITexture.fullImage(MODID, "gui/progressbar/cut");
+ public static final UITexture PROGRESSBAR_EXTRACT = UITexture.fullImage(MODID, "gui/progressbar/extract");
+ public static final SteamTexture PROGRESSBAR_EXTRACT_STEAM =
+ SteamTexture.fullImage(MODID, "gui/progressbar/extract_%s");
+ public static final UITexture PROGRESSBAR_EXTRUDE = UITexture.fullImage(MODID, "gui/progressbar/extrude");
+ public static final SteamTexture PROGRESSBAR_FUEL_STEAM = SteamTexture.fullImage(MODID, "gui/progressbar/fuel_%s");
+ public static final UITexture PROGRESSBAR_HAMMER = UITexture.fullImage(MODID, "gui/progressbar/hammer");
+ public static final UITexture PROGRESSBAR_HAMMER_BASE = UITexture.fullImage(MODID, "gui/progressbar/hammer_base");
+ public static final SteamTexture PROGRESSBAR_HAMMER_STEAM =
+ SteamTexture.fullImage(MODID, "gui/progressbar/hammer_%s");
+ public static final SteamTexture PROGRESSBAR_HAMMER_BASE_STEAM =
+ SteamTexture.fullImage(MODID, "gui/progressbar/hammer_base_%s");
+ public static final UITexture PROGRESSBAR_LATHE = UITexture.fullImage(MODID, "gui/progressbar/lathe");
+ public static final UITexture PROGRESSBAR_LATHE_BASE = UITexture.fullImage(MODID, "gui/progressbar/lathe_base");
+ public static final UITexture PROGRESSBAR_MACERATE = UITexture.fullImage(MODID, "gui/progressbar/macerate");
+ public static final SteamTexture PROGRESSBAR_MACERATE_STEAM =
+ SteamTexture.fullImage(MODID, "gui/progressbar/macerate_%s");
+ public static final UITexture PROGRESSBAR_MAGNET = UITexture.fullImage(MODID, "gui/progressbar/magnet");
+ public static final UITexture PROGRESSBAR_MIXER = UITexture.fullImage(MODID, "gui/progressbar/mixer");
+ public static final UITexture PROGRESSBAR_RECYCLE = UITexture.fullImage(MODID, "gui/progressbar/recycle");
+ public static final UITexture PROGRESSBAR_SIFT = UITexture.fullImage(MODID, "gui/progressbar/sift");
+ public static final UITexture PROGRESSBAR_SLICE = UITexture.fullImage(MODID, "gui/progressbar/slice");
+ public static final UITexture PROGRESSBAR_STORED_EU = UITexture.fullImage(MODID, "gui/progressbar/stored_eu");
+ public static final UITexture PROGRESSBAR_WIREMILL = UITexture.fullImage(MODID, "gui/progressbar/wiremill");
+
+ public static final UITexture TAB_COVER_NORMAL = UITexture.fullImage(MODID, "gui/tab/cover_normal");
+ public static final UITexture TAB_COVER_HIGHLIGHT = UITexture.fullImage(MODID, "gui/tab/cover_highlight");
+ public static final UITexture TAB_COVER_DISABLED = UITexture.fullImage(MODID, "gui/tab/cover_disabled");
+ public static final SteamTexture TAB_COVER_STEAM_NORMAL = SteamTexture.fullImage(MODID, "gui/tab/cover_%s_normal");
+ public static final SteamTexture TAB_COVER_STEAM_HIGHLIGHT =
+ SteamTexture.fullImage(MODID, "gui/tab/cover_%s_highlight");
+ public static final SteamTexture TAB_COVER_STEAM_DISABLED =
+ SteamTexture.fullImage(MODID, "gui/tab/cover_%s_disabled");
+ public static final AdaptableUITexture TAB_TITLE = AdaptableUITexture.of(MODID, "gui/tab/title", 28, 28, 4);
+ public static final AdaptableUITexture TAB_TITLE_DARK =
+ AdaptableUITexture.of(MODID, "gui/tab/title_dark", 28, 28, 4);
+ public static final SteamTexture TAB_TITLE_STEAM =
+ SteamTexture.adaptableTexture(MODID, "gui/tab/title_%s", 28, 28, 4);
+ public static final SteamTexture TAB_TITLE_DARK_STEAM =
+ SteamTexture.adaptableTexture(MODID, "gui/tab/title_dark_%s", 28, 28, 4);
+ public static final AdaptableUITexture TAB_TITLE_ANGULAR =
+ AdaptableUITexture.of(MODID, "gui/tab/title_angular", 28, 28, 4);
+ public static final SteamTexture TAB_TITLE_ANGULAR_STEAM =
+ SteamTexture.adaptableTexture(MODID, "gui/tab/title_angular_%s", 28, 28, 4);
+
+ public static final UITexture BUTTON_STANDARD = UITexture.fullImage(MODID, "gui/button/standard");
+ public static final UITexture BUTTON_STANDARD_TOGGLE = UITexture.fullImage(MODID, "gui/button/standard_toggle");
+ public static final UITexture BUTTON_COVER_NORMAL = UITexture.fullImage(MODID, "gui/button/cover_normal");
+ public static final UITexture BUTTON_COVER_NORMAL_HOVERED =
+ UITexture.fullImage(MODID, "gui/button/cover_normal_hovered");
+ public static final UITexture BUTTON_COVER_NORMAL_DISABLED =
+ UITexture.fullImage(MODID, "gui/button/cover_normal_disabled");
+
+ public static final UITexture OVERLAY_BUTTON_DISABLE = UITexture.fullImage(MODID, "gui/overlay_button/disable");
+ public static final UITexture OVERLAY_BUTTON_REDSTONE_OFF =
+ UITexture.fullImage(MODID, "gui/overlay_button/redstone_off");
+ public static final UITexture OVERLAY_BUTTON_REDSTONE_ON =
+ UITexture.fullImage(MODID, "gui/overlay_button/redstone_on");
+ public static final UITexture OVERLAY_BUTTON_CHECKMARK = UITexture.fullImage(MODID, "gui/overlay_button/checkmark");
+ public static final UITexture OVERLAY_BUTTON_CROSS = UITexture.fullImage(MODID, "gui/overlay_button/cross");
+ public static final UITexture OVERLAY_BUTTON_WHITELIST = UITexture.fullImage(MODID, "gui/overlay_button/whitelist");
+ public static final UITexture OVERLAY_BUTTON_BLACKLIST = UITexture.fullImage(MODID, "gui/overlay_button/blacklist");
+ public static final UITexture OVERLAY_BUTTON_PROGRESS = UITexture.fullImage(MODID, "gui/overlay_button/progress");
+ public static final UITexture OVERLAY_BUTTON_EXPORT = UITexture.fullImage(MODID, "gui/overlay_button/export");
+ public static final UITexture OVERLAY_BUTTON_IMPORT = UITexture.fullImage(MODID, "gui/overlay_button/import");
+ public static final UITexture OVERLAY_BUTTON_AUTOOUTPUT_ITEM =
+ UITexture.fullImage(MODID, "gui/overlay_button/autooutput_item");
+ public static final UITexture OVERLAY_BUTTON_AUTOOUTPUT_FLUID =
+ UITexture.fullImage(MODID, "gui/overlay_button/autooutput_fluid");
+ public static final UITexture OVERLAY_BUTTON_ALLOW_INPUT =
+ UITexture.fullImage(MODID, "gui/overlay_button/allow_input");
+ public static final UITexture OVERLAY_BUTTON_BLOCK_INPUT =
+ UITexture.fullImage(MODID, "gui/overlay_button/block_input");
+ public static final UITexture OVERLAY_BUTTON_ARROW_GREEN_UP =
+ UITexture.fullImage(MODID, "gui/overlay_button/arrow_green_up");
+ public static final UITexture OVERLAY_BUTTON_ARROW_GREEN_DOWN =
+ UITexture.fullImage(MODID, "gui/overlay_button/arrow_green_down");
+ public static final UITexture OVERLAY_BUTTON_CYCLIC = UITexture.fullImage(MODID, "gui/overlay_button/cyclic");
+ public static final UITexture OVERLAY_BUTTON_EMIT_ENERGY =
+ UITexture.fullImage(MODID, "gui/overlay_button/emit_energy");
+ public static final UITexture OVERLAY_BUTTON_EMIT_REDSTONE =
+ UITexture.fullImage(MODID, "gui/overlay_button/emit_redstone");
+ public static final UITexture OVERLAY_BUTTON_INVERT_REDSTONE =
+ UITexture.fullImage(MODID, "gui/overlay_button/invert_redstone");
+ public static final UITexture OVERLAY_BUTTON_STOCKING_MODE =
+ UITexture.fullImage(MODID, "gui/overlay_button/stocking_mode");
+ public static final UITexture OVERLAY_BUTTON_INVERT_FILTER =
+ UITexture.fullImage(MODID, "gui/overlay_button/invert_filter");
+ public static final UITexture OVERLAY_BUTTON_NBT = UITexture.fullImage(MODID, "gui/overlay_button/nbt");
+ public static final UITexture OVERLAY_BUTTON_PRINT = UITexture.fullImage(MODID, "gui/overlay_button/print");
+ public static final UITexture OVERLAY_BUTTON_TRANSPOSE = UITexture.fullImage(MODID, "gui/overlay_button/transpose");
+ public static final UITexture OVERLAY_BUTTON_BOUNDING_BOX =
+ UITexture.fullImage(MODID, "gui/overlay_button/bounding_box");
+ public static final UITexture OVERLAY_BUTTON_MINUS_SMALL =
+ UITexture.fullImage(MODID, "gui/overlay_button/minus_small");
+ public static final UITexture OVERLAY_BUTTON_MINUS_LARGE =
+ UITexture.fullImage(MODID, "gui/overlay_button/minus_large");
+ public static final UITexture OVERLAY_BUTTON_PLUS_SMALL =
+ UITexture.fullImage(MODID, "gui/overlay_button/plus_small");
+ public static final UITexture OVERLAY_BUTTON_PLUS_LARGE =
+ UITexture.fullImage(MODID, "gui/overlay_button/plus_large");
+ public static final UITexture OVERLAY_BUTTON_GATE_AND = UITexture.fullImage(MODID, "gui/overlay_button/gate_and");
+ public static final UITexture OVERLAY_BUTTON_GATE_NAND = UITexture.fullImage(MODID, "gui/overlay_button/gate_nand");
+ public static final UITexture OVERLAY_BUTTON_GATE_OR = UITexture.fullImage(MODID, "gui/overlay_button/gate_or");
+ public static final UITexture OVERLAY_BUTTON_GATE_NOR = UITexture.fullImage(MODID, "gui/overlay_button/gate_nor");
+ public static final UITexture OVERLAY_BUTTON_ANALOG = UITexture.fullImage(MODID, "gui/overlay_button/analog");
+ public static final UITexture OVERLAY_BUTTON_LOCK = UITexture.fullImage(MODID, "gui/overlay_button/lock");
+ public static final UITexture OVERLAY_BUTTON_INPUT_FROM_OUTPUT_SIDE =
+ UITexture.fullImage(MODID, "gui/overlay_button/input_from_output_side");
+ public static final UITexture OVERLAY_BUTTON_VOID_EXCESS =
+ UITexture.fullImage(MODID, "gui/overlay_button/void_excess");
+ public static final UITexture OVERLAY_BUTTON_VOID_ALL = UITexture.fullImage(MODID, "gui/overlay_button/void_all");
+ public static final UITexture OVERLAY_BUTTON_NEI = UITexture.fullImage(MODID, "gui/overlay_button/nei");
+
+ /**
+ * Can adjust size as needed.
+ */
+ public static final AdaptableUITexture PICTURE_SCREEN_BLACK =
+ AdaptableUITexture.of(MODID, "gui/picture/screen_black", 16, 16, 2);
+
+ public static final UITexture PICTURE_GT_LOGO_17x17_TRANSPARENT =
+ UITexture.fullImage(MODID, "gui/picture/gt_logo_17x17_transparent");
+ public static final UITexture PICTURE_GT_LOGO_17x17_TRANSPARENT_GRAY =
+ UITexture.fullImage(MODID, "gui/picture/gt_logo_17x17_transparent_gray");
+ public static final SteamTexture PICTURE_GT_LOGO_17x17_TRANSPARENT_STEAM =
+ SteamTexture.fullImage(MODID, "gui/picture/gt_logo_17x17_transparent_%s");
+ public static final UITexture PICTURE_GT_LOGO_18x18 = UITexture.fullImage(MODID, "gui/picture/gt_logo_18x18");
+ public static final UITexture PICTURE_GT_LOGO_19x19 = UITexture.fullImage(MODID, "gui/picture/gt_logo_19x19");
+ public static final UITexture PICTURE_INFORMATION = UITexture.fullImage(MODID, "gui/picture/information");
+ public static final UITexture PICTURE_STALLED_ELECTRICITY =
+ UITexture.fullImage(MODID, "gui/picture/stalled_electricity");
+ public static final UITexture PICTURE_STALLED_STEAM = UITexture.fullImage(MODID, "gui/picture/stalled_steam");
+ public static final BiFunction<Integer, Boolean, UITexture> PICTURE_ARROW_22_RED =
+ (width, fromRight) -> UITexture.partly(
+ MODID,
+ "gui/picture/arrow_22_red",
+ 87,
+ 22,
+ fromRight ? 87 - width : 0,
+ 0,
+ fromRight ? 87 : width,
+ 22);
+ public static final BiFunction<Integer, Boolean, UITexture> PICTURE_ARROW_22_BLUE =
+ (width, fromRight) -> UITexture.partly(
+ MODID,
+ "gui/picture/arrow_22_blue",
+ 87,
+ 22,
+ fromRight ? 87 - width : 0,
+ 0,
+ fromRight ? 87 : width,
+ 22);
+ public static final BiFunction<Integer, Boolean, UITexture> PICTURE_ARROW_22_WHITE =
+ (width, fromRight) -> UITexture.partly(
+ MODID,
+ "gui/picture/arrow_22_white",
+ 87,
+ 22,
+ fromRight ? 87 - width : 0,
+ 0,
+ fromRight ? 87 : width,
+ 22);
+ public static final BiFunction<Integer, Boolean, UITexture> PICTURE_ARROW_24_RED =
+ (width, fromRight) -> UITexture.partly(
+ MODID,
+ "gui/picture/arrow_24_red",
+ 69,
+ 24,
+ fromRight ? 69 - width : 0,
+ 0,
+ fromRight ? 69 : width,
+ 24);
+ public static final BiFunction<Integer, Boolean, UITexture> PICTURE_ARROW_24_BLUE =
+ (width, fromRight) -> UITexture.partly(
+ MODID,
+ "gui/picture/arrow_24_blue",
+ 69,
+ 24,
+ fromRight ? 69 - width : 0,
+ 0,
+ fromRight ? 69 : width,
+ 24);
+ public static final BiFunction<Integer, Boolean, UITexture> PICTURE_ARROW_24_WHITE =
+ (width, fromRight) -> UITexture.partly(
+ MODID,
+ "gui/picture/arrow_24_white",
+ 69,
+ 24,
+ fromRight ? 69 - width : 0,
+ 0,
+ fromRight ? 69 : width,
+ 24);
+ public static final UITexture PICTURE_FLUID_WINDOW = UITexture.fullImage(MODID, "gui/picture/fluid_window");
+ public static final UITexture PICTURE_FLUID_TANK = UITexture.fullImage(MODID, "gui/picture/fluid_tank");
+ public static final UITexture PICTURE_SLOTS_HOLO_3BY3 = UITexture.fullImage(MODID, "gui/picture/slots_holo_3by3");
+ public static final UITexture PICTURE_ARROW_DOUBLE = UITexture.fullImage(MODID, "gui/picture/arrow_double");
+ public static final UITexture PICTURE_SUPER_BUFFER = UITexture.fullImage(MODID, "gui/picture/super_buffer");
+ public static final UITexture PICTURE_SQUARE_LIGHT_GRAY =
+ UITexture.fullImage(MODID, "gui/picture/square_light_gray");
+ public static final UITexture PICTURE_GAUGE = UITexture.fullImage(MODID, "gui/picture/gauge");
+}
diff --git a/src/main/java/gregtech/api/gui/modularui/GUITextureSet.java b/src/main/java/gregtech/api/gui/modularui/GUITextureSet.java
new file mode 100644
index 0000000000..13d7eadfee
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/modularui/GUITextureSet.java
@@ -0,0 +1,150 @@
+package gregtech.api.gui.modularui;
+
+import com.gtnewhorizons.modularui.api.ModularUITextures;
+import com.gtnewhorizons.modularui.api.drawable.AdaptableUITexture;
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
+import gregtech.api.enums.SteamVariant;
+import java.util.function.Function;
+
+/**
+ * Set of textures that is commonly used for GUI but can vary depending on "style" of machines,
+ * e.g. bronze steam or steel steam.
+ * <br> This has builder pattern; Textures you didn't specify will fall back to default ones.
+ */
+public class GUITextureSet {
+ private UITexture mainBackground;
+ private UITexture itemSlot;
+ private UITexture fluidSlot;
+ private UITexture coverTabNormal;
+ private UITexture coverTabHighlight;
+ private UITexture coverTabDisabled;
+ private UITexture coverTabNormalFlipped;
+ private UITexture coverTabHighlightFlipped;
+ private UITexture coverTabDisabledFlipped;
+ private AdaptableUITexture titleTabNormal;
+ private AdaptableUITexture titleTabDark;
+ private AdaptableUITexture titleTabAngular;
+ private UITexture gregtechLogo;
+
+ public static final GUITextureSet DEFAULT = new GUITextureSet()
+ .setMainBackground(GT_UITextures.BACKGROUND_SINGLEBLOCK_DEFAULT)
+ .setItemSlot(ModularUITextures.ITEM_SLOT)
+ .setFluidSlot(ModularUITextures.FLUID_SLOT)
+ .setCoverTab(
+ GT_UITextures.TAB_COVER_NORMAL, GT_UITextures.TAB_COVER_HIGHLIGHT, GT_UITextures.TAB_COVER_DISABLED)
+ .setTitleTab(GT_UITextures.TAB_TITLE, GT_UITextures.TAB_TITLE_DARK, GT_UITextures.TAB_TITLE_ANGULAR)
+ .setGregTechLogo(GT_UITextures.PICTURE_GT_LOGO_17x17_TRANSPARENT);
+
+ public static final Function<SteamVariant, GUITextureSet> STEAM = steamVariant -> new GUITextureSet()
+ .setMainBackground(GT_UITextures.BACKGROUND_STEAM.get(steamVariant))
+ .setItemSlot(GT_UITextures.SLOT_ITEM_STEAM.get(steamVariant))
+ .setCoverTab(
+ GT_UITextures.TAB_COVER_STEAM_NORMAL.get(steamVariant),
+ GT_UITextures.TAB_COVER_STEAM_HIGHLIGHT.get(steamVariant),
+ GT_UITextures.TAB_COVER_STEAM_DISABLED.get(steamVariant))
+ .setTitleTab(
+ GT_UITextures.TAB_TITLE_STEAM.getAdaptable(steamVariant),
+ GT_UITextures.TAB_TITLE_DARK_STEAM.getAdaptable(steamVariant),
+ GT_UITextures.TAB_TITLE_ANGULAR_STEAM.getAdaptable(steamVariant))
+ .setGregTechLogo(GT_UITextures.PICTURE_GT_LOGO_17x17_TRANSPARENT_STEAM.get(steamVariant));
+
+ public GUITextureSet() {}
+
+ // region setters
+
+ public GUITextureSet setMainBackground(UITexture mainBackground) {
+ this.mainBackground = mainBackground;
+ return this;
+ }
+
+ public GUITextureSet setItemSlot(UITexture itemSlot) {
+ this.itemSlot = itemSlot;
+ return this;
+ }
+
+ public GUITextureSet setFluidSlot(UITexture fluidSlot) {
+ this.fluidSlot = fluidSlot;
+ return this;
+ }
+
+ public GUITextureSet setCoverTab(UITexture coverNormal, UITexture coverHighlight, UITexture coverDisabled) {
+ this.coverTabNormal = coverNormal;
+ this.coverTabHighlight = coverHighlight;
+ this.coverTabDisabled = coverDisabled;
+ this.coverTabNormalFlipped = coverNormal.getFlipped(true, false);
+ this.coverTabHighlightFlipped = coverHighlight.getFlipped(true, false);
+ this.coverTabDisabledFlipped = coverDisabled.getFlipped(true, false);
+ return this;
+ }
+
+ public GUITextureSet setTitleTab(
+ AdaptableUITexture titleNormal, AdaptableUITexture titleDark, AdaptableUITexture titleTabAngular) {
+ this.titleTabNormal = titleNormal;
+ this.titleTabDark = titleDark;
+ this.titleTabAngular = titleTabAngular;
+ return this;
+ }
+
+ public GUITextureSet setGregTechLogo(UITexture gregtechLogo) {
+ this.gregtechLogo = gregtechLogo;
+ return this;
+ }
+
+ // endregion
+
+ // region getters
+
+ public UITexture getMainBackground() {
+ return mainBackground != null ? mainBackground : DEFAULT.mainBackground;
+ }
+
+ public UITexture getItemSlot() {
+ return itemSlot != null ? itemSlot : DEFAULT.itemSlot;
+ }
+
+ public UITexture getFluidSlot() {
+ return fluidSlot != null ? fluidSlot : DEFAULT.fluidSlot;
+ }
+
+ public UITexture getCoverTabNormal() {
+ return coverTabNormal != null ? coverTabNormal : DEFAULT.coverTabNormal;
+ }
+
+ public UITexture getCoverTabHighlight() {
+ return coverTabHighlight != null ? coverTabHighlight : DEFAULT.coverTabHighlight;
+ }
+
+ public UITexture getCoverTabDisabled() {
+ return coverTabDisabled != null ? coverTabDisabled : DEFAULT.coverTabDisabled;
+ }
+
+ public UITexture getCoverTabNormalFlipped() {
+ return coverTabNormalFlipped != null ? coverTabNormalFlipped : DEFAULT.coverTabNormalFlipped;
+ }
+
+ public UITexture getCoverTabHighlightFlipped() {
+ return coverTabHighlightFlipped != null ? coverTabHighlightFlipped : DEFAULT.coverTabHighlightFlipped;
+ }
+
+ public UITexture getCoverTabDisabledFlipped() {
+ return coverTabDisabledFlipped != null ? coverTabDisabledFlipped : DEFAULT.coverTabDisabledFlipped;
+ }
+
+ public AdaptableUITexture getTitleTabNormal() {
+ return titleTabNormal != null ? titleTabNormal : DEFAULT.titleTabNormal;
+ }
+
+ public AdaptableUITexture getTitleTabDark() {
+ return titleTabDark != null ? titleTabDark : DEFAULT.titleTabDark;
+ }
+
+ public AdaptableUITexture getTitleTabAngular() {
+ return titleTabAngular != null ? titleTabAngular : DEFAULT.titleTabAngular;
+ }
+
+ public UITexture getGregTechLogo() {
+ return gregtechLogo != null ? gregtechLogo : DEFAULT.gregtechLogo;
+ }
+
+ // endregion
+}
diff --git a/src/main/java/gregtech/api/gui/modularui/IDataFollowerWidget.java b/src/main/java/gregtech/api/gui/modularui/IDataFollowerWidget.java
new file mode 100644
index 0000000000..40ebcea0f4
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/modularui/IDataFollowerWidget.java
@@ -0,0 +1,48 @@
+package gregtech.api.gui.modularui;
+
+import com.gtnewhorizons.modularui.api.widget.Widget;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.util.ISerializableObject;
+import gregtech.common.gui.modularui.widget.DataControllerWidget;
+import java.util.function.Consumer;
+import java.util.function.Function;
+
+/**
+ * Widget whose state is controlled by specific data.
+ * Data can be anything, e.g. {@link ISerializableObject} or machine recipe mode.
+ * <br> No widgets implementing this interface should not sync;
+ * Instead, {@link DataControllerWidget} will sync data, either when this widget triggers update on client
+ * or data update is detected on server.
+ * @param <T> Data type stored in the parent widget
+ * @param <U> State type stored in this widget
+ * @see DataControllerWidget
+ */
+@SuppressWarnings("UnusedReturnValue")
+public interface IDataFollowerWidget<T, U> {
+
+ /**
+ * Sets function to get widget state from provided data. This function will be called when client receives data
+ * from server and {@link DataControllerWidget} updates all children, including this widget.
+ */
+ Widget setDataToStateGetter(Function<T, U> dataToStateGetter);
+
+ /**
+ * Sets setter called when this widget gets action from player.
+ * Basically the same functionality with widgets that have getter/setter.
+ */
+ Widget setStateSetter(Consumer<U> setter);
+
+ /**
+ * Updates state of this widget with provided data.
+ * On server {@link DataControllerWidget} won't propagate data update to this widget,
+ * so this method is client-only.
+ */
+ @SideOnly(Side.CLIENT)
+ void updateState(T data);
+
+ /**
+ * Called on {@link Widget#onPostInit}.
+ */
+ default void onPostInit() {}
+}
diff --git a/src/main/java/gregtech/api/gui/modularui/SteamTexture.java b/src/main/java/gregtech/api/gui/modularui/SteamTexture.java
new file mode 100644
index 0000000000..9e52c0f874
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/modularui/SteamTexture.java
@@ -0,0 +1,74 @@
+package gregtech.api.gui.modularui;
+
+import com.gtnewhorizons.modularui.api.drawable.AdaptableUITexture;
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
+import gregtech.api.enums.SteamVariant;
+
+/**
+ * Wrapper for {@link UITexture}s used to
+ * ease in choosing between Bronze, Steel and Primitive textures.
+ */
+public class SteamTexture {
+
+ private final UITexture bronzeTexture;
+ private final UITexture steelTexture;
+ private final UITexture primitiveTexture;
+
+ private SteamTexture(UITexture bronzeTexture, UITexture steelTexture, UITexture primitiveTexture) {
+ this.bronzeTexture = bronzeTexture;
+ this.steelTexture = steelTexture;
+ this.primitiveTexture = primitiveTexture;
+ }
+
+ public static SteamTexture fullImage(String mod, String location) {
+ return new SteamTexture(
+ UITexture.fullImage(mod, String.format(location, SteamVariant.BRONZE)),
+ UITexture.fullImage(mod, String.format(location, SteamVariant.STEEL)),
+ UITexture.fullImage(mod, String.format(location, SteamVariant.PRIMITIVE)));
+ }
+
+ public static SteamTexture adaptableTexture(
+ String mod, String location, int imageWidth, int imageHeight, int borderWidthPixel) {
+ return new SteamTexture(
+ AdaptableUITexture.of(
+ mod, String.format(location, SteamVariant.BRONZE), imageWidth, imageHeight, borderWidthPixel),
+ AdaptableUITexture.of(
+ mod, String.format(location, SteamVariant.STEEL), imageWidth, imageHeight, borderWidthPixel),
+ AdaptableUITexture.of(
+ mod,
+ String.format(location, SteamVariant.PRIMITIVE),
+ imageWidth,
+ imageHeight,
+ borderWidthPixel));
+ }
+
+ public UITexture get(SteamVariant variant) {
+ switch (variant) {
+ case BRONZE:
+ return bronzeTexture;
+ case STEEL:
+ return steelTexture;
+ case PRIMITIVE:
+ return primitiveTexture;
+ default:
+ return null;
+ }
+ }
+
+ public AdaptableUITexture getAdaptable(SteamVariant variant) {
+ switch (variant) {
+ case BRONZE:
+ return (AdaptableUITexture) bronzeTexture;
+ case STEEL:
+ return (AdaptableUITexture) steelTexture;
+ case PRIMITIVE:
+ return (AdaptableUITexture) primitiveTexture;
+ default:
+ return null;
+ }
+ }
+
+ public UITexture get(boolean isHighPressure) {
+ return isHighPressure ? steelTexture : bronzeTexture;
+ }
+}