package gregtech.common.gui.modularui.widget; import com.gtnewhorizons.modularui.api.widget.Widget; import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils; import gregtech.api.gui.modularui.IDataFollowerWidget; import gregtech.api.util.GT_CoverBehaviorBase; import gregtech.api.util.ISerializableObject; import java.io.IOException; import java.util.function.BiFunction; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; import net.minecraft.network.PacketBuffer; public class CoverDataControllerWidget extends DataControllerWidget { protected final GT_CoverBehaviorBase coverBehavior; /** * @param dataGetter () -> cover data this widget handles * @param dataSetter data to set -> if setting cover data is successful * @param coverBehavior cover this widget handles data update */ public CoverDataControllerWidget( Supplier dataGetter, Function dataSetter, GT_CoverBehaviorBase coverBehavior) { super(dataGetter, dataSetter); this.coverBehavior = coverBehavior; } @Override public > CoverDataControllerWidget addFollower( W widget, Function dataToStateGetter, BiFunction dataUpdater, Consumer applyForWidget) { super.addFollower(widget, dataToStateGetter, dataUpdater, applyForWidget); return this; } @Override protected void writeToPacket(PacketBuffer buffer, T data) { try { NetworkUtils.writeNBTBase(buffer, data.saveDataToNBT()); } catch (IOException e) { e.printStackTrace(); } } @Override protected T readFromPacket(PacketBuffer buffer) throws IOException { return coverBehavior.createDataObject(NetworkUtils.readNBTBase(buffer)); } /** * Uses int index to determine toggle button behaviors. */ public static class CoverDataIndexedControllerWidget_ToggleButtons extends CoverDataControllerWidget { private final BiFunction dataToStateGetter; private final BiFunction dataUpdater; /** * @param coverDataGetter () -> cover data this widget handles * @param coverDataSetter data to set -> if setting cover data is successful * @param coverBehavior cover this widget handles data update * @param dataToStateGetter (index of button, given cover data) -> button state * @param dataUpdater (index of button, current cover data) -> new cover data */ public CoverDataIndexedControllerWidget_ToggleButtons( Supplier coverDataGetter, Function coverDataSetter, GT_CoverBehaviorBase coverBehavior, BiFunction dataToStateGetter, BiFunction dataUpdater) { super(coverDataGetter, coverDataSetter, coverBehavior); this.dataToStateGetter = dataToStateGetter; this.dataUpdater = dataUpdater; } /** * @param index index of widget to add * @param widget widget to add * @param applyForWidget methods to call for widget to add */ public > CoverDataIndexedControllerWidget_ToggleButtons addToggleButton( int index, W widget, Consumer> applyForWidget) { addFollower( widget, data -> dataToStateGetter.apply(index, data), (data, state) -> dataUpdater.apply(index, data), applyForWidget); return this; } } /** * Uses int index to determine cycle button behaviors. */ public static class CoverDataIndexedControllerWidget_CycleButtons extends CoverDataControllerWidget { private final BiFunction dataToStateGetter; private final BiFunction dataUpdater; /** * @param coverDataGetter () -> cover data this widget handles * @param coverDataSetter data to set -> if setting cover data is successful * @param coverBehavior cover this widget handles data update * @param dataToStateGetter (index of button, given cover data) -> button state * @param dataUpdater (index of button, current cover data) -> new cover data */ public CoverDataIndexedControllerWidget_CycleButtons( Supplier coverDataGetter, Function coverDataSetter, GT_CoverBehaviorBase coverBehavior, BiFunction dataToStateGetter, BiFunction dataUpdater) { super(coverDataGetter, coverDataSetter, coverBehavior); this.dataToStateGetter = dataToStateGetter; this.dataUpdater = dataUpdater; } /** * @param index index of widget to add * @param widget widget to add * @param applyForWidget methods to call for the widget to add */ public > CoverDataIndexedControllerWidget_CycleButtons addCycleButton( int index, W widget, Consumer> applyForWidget) { addFollower( widget, data -> dataToStateGetter.apply(index, data), (data, state) -> dataUpdater.apply(index, data), applyForWidget); return this; } } }