diff options
Diffstat (limited to 'src/main/java/gregtech/api/gui/widgets')
3 files changed, 264 insertions, 0 deletions
diff --git a/src/main/java/gregtech/api/gui/widgets/GT_CoverTickRateButton.java b/src/main/java/gregtech/api/gui/widgets/GT_CoverTickRateButton.java new file mode 100644 index 0000000000..883ffb4079 --- /dev/null +++ b/src/main/java/gregtech/api/gui/widgets/GT_CoverTickRateButton.java @@ -0,0 +1,82 @@ +package gregtech.api.gui.widgets; + +import static gregtech.api.gui.modularui.GT_UITextures.OVERLAY_BUTTON_HOURGLASS; +import static gregtech.common.covers.CoverInfo.MAX_TICK_RATE_ADDITION; + +import java.util.List; + +import net.minecraft.util.StatCollector; + +import org.jetbrains.annotations.NotNull; + +import com.google.common.collect.ImmutableList; +import com.gtnewhorizons.modularui.api.drawable.UITexture; +import com.gtnewhorizons.modularui.api.widget.IWidgetBuilder; +import com.gtnewhorizons.modularui.api.widget.Widget; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; + +import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.common.covers.CoverInfo; + +public class GT_CoverTickRateButton extends ButtonWidget { + + private static final UITexture BACKGROUND = GT_UITextures.BUTTON_COVER_NORMAL.getSubArea(0, 0, 1, 0.5f); + + private final CoverInfo coverInfo; + private int clientTickRate; + private int tickRateAddition; + + public GT_CoverTickRateButton(@NotNull CoverInfo coverInfo, @NotNull IWidgetBuilder<?> builder) { + this.coverInfo = coverInfo; + this.clientTickRate = coverInfo.getTickRate(); + this.tickRateAddition = coverInfo.getTickRateAddition(); + + super.setBackground(BACKGROUND, OVERLAY_BUTTON_HOURGLASS); + super.setOnClick(this::onClick); + super.dynamicTooltip(this::dynamicTooltip); + super.attachSyncer( + new FakeSyncWidget.IntegerSyncer(this.coverInfo::getTickRate, integer -> clientTickRate = integer), + builder, + (widget, aInt) -> notifyTooltipChange()) + .attachSyncer( + new FakeSyncWidget.IntegerSyncer( + this.coverInfo::getTickRateAddition, + integer -> tickRateAddition = integer), + builder); + + } + + private void onClick(@NotNull ClickData clickData, @NotNull Widget widget) { + final int iterations = clickData.ctrl ? 5 : 1; + final boolean isDecreasing = clickData.mouseButton == 1; + + // Do five operations at once if Ctrl is held down. Since the actual increase granted by each invocation can be + // different on each call, just call the method several times rather than trying to do a bunch of weird math. + for (int i = 0; i < iterations; i++) { + coverInfo.adjustTickRateMultiplier(isDecreasing); + } + } + + private List<String> dynamicTooltip() { + final String boundsNotification; + + if (tickRateAddition == 0) { + boundsNotification = StatCollector.translateToLocal("gt.cover.info.button.bounds_notification.minimum"); + } else if (tickRateAddition >= MAX_TICK_RATE_ADDITION - 1) { + // Clamping can make tickRateAddition approach but never actually equal MAX_ADDITION, so we need this + // adjustment. + boundsNotification = StatCollector.translateToLocal("gt.cover.info.button.bounds_notification.maximum"); + } else { + boundsNotification = ""; + } + + return ImmutableList.of( + StatCollector.translateToLocalFormatted( + "gt.cover.info.button.tick_rate.1", + new CoverInfo.ClientTickRateFormatter(clientTickRate), + boundsNotification), + StatCollector.translateToLocal("gt.cover.info.button.tick_rate.2"), + StatCollector.translateToLocal("gt.cover.info.button.tick_rate.3")); + } +} diff --git a/src/main/java/gregtech/api/gui/widgets/GT_LockedWhileActiveButton.java b/src/main/java/gregtech/api/gui/widgets/GT_LockedWhileActiveButton.java new file mode 100644 index 0000000000..9a93a8fadf --- /dev/null +++ b/src/main/java/gregtech/api/gui/widgets/GT_LockedWhileActiveButton.java @@ -0,0 +1,90 @@ +package gregtech.api.gui.widgets; + +import java.util.Arrays; +import java.util.List; +import java.util.function.BiConsumer; +import java.util.function.Supplier; + +import net.minecraft.util.StatCollector; + +import org.jetbrains.annotations.NotNull; + +import com.google.common.collect.ImmutableList; +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.widget.Widget; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; + +import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.api.interfaces.tileentity.IMachineProgress; + +public class GT_LockedWhileActiveButton extends ButtonWidget { + + @NotNull + private final IMachineProgress machine; + + public GT_LockedWhileActiveButton(@NotNull IMachineProgress machine, @NotNull ModularWindow.Builder builder) { + super(); + this.machine = machine; + + super.attachSyncer( + new FakeSyncWidget.BooleanSyncer(machine::isActive, a -> {}), + builder, + (widget, aBoolean) -> widget.notifyTooltipChange()); + + super.dynamicTooltip(this::generateTooltip); + } + + @NotNull + @Override + public ButtonWidget setOnClick(@NotNull BiConsumer<ClickData, Widget> clickAction) { + return super.setOnClick((clickData, widget) -> { + if (!machine.isActive()) { + clickAction.accept(clickData, widget); + } + }); + } + + @NotNull + @Override + public Widget setBackground(@NotNull IDrawable... drawables) { + return super.setBackground(() -> appendLockedOverlay(drawables)); + } + + @NotNull + @Override + public Widget setBackground(@NotNull Supplier<IDrawable[]> drawablesSupplier) { + return super.setBackground(() -> appendLockedOverlay(drawablesSupplier.get())); + } + + @NotNull + @Override + public Widget dynamicTooltip(@NotNull Supplier<List<String>> dynamicTooltip) { + return super.dynamicTooltip(() -> { + ImmutableList.Builder<String> tooltips = ImmutableList.<String>builder() + .addAll(dynamicTooltip.get()); + tooltips.addAll(generateTooltip()); + + return tooltips.build(); + }); + } + + @NotNull + private IDrawable[] appendLockedOverlay(@NotNull IDrawable[] drawables) { + if (machine.isActive()) { + final IDrawable[] copy = Arrays.copyOf(drawables, drawables.length + 1); + copy[drawables.length] = GT_UITextures.OVERLAY_BUTTON_LOCKED; + return copy; + } + return drawables; + } + + @NotNull + private List<String> generateTooltip() { + if (machine.isActive()) { + return ImmutableList.of(StatCollector.translateToLocal("GT5U.gui.button.forbidden_while_running")); + } + return ImmutableList.of(); + } +} diff --git a/src/main/java/gregtech/api/gui/widgets/GT_PhantomItemButton.java b/src/main/java/gregtech/api/gui/widgets/GT_PhantomItemButton.java new file mode 100644 index 0000000000..4e2d144aa7 --- /dev/null +++ b/src/main/java/gregtech/api/gui/widgets/GT_PhantomItemButton.java @@ -0,0 +1,92 @@ +package gregtech.api.gui.widgets; + +import java.util.List; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; + +import org.apache.commons.lang3.NotImplementedException; +import org.jetbrains.annotations.Nullable; + +import com.google.common.collect.ImmutableList; +import com.gtnewhorizons.modularui.api.ModularUITextures; +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.drawable.Text; +import com.gtnewhorizons.modularui.api.forge.IItemHandlerModifiable; +import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; + +import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.api.interfaces.metatileentity.IItemLockable; + +/** + * Creates a phantom item in a GUI. Useful for filtering. + */ +public class GT_PhantomItemButton extends SlotWidget { + + public static final IDrawable[] FILTER_BACKGROUND = { ModularUITextures.ITEM_SLOT, + GT_UITextures.OVERLAY_SLOT_FILTER }; + + public GT_PhantomItemButton(final IItemLockable delegate) { + super(BaseSlot.phantom(new PhantomItemDelegate(delegate), 0)); + controlsAmount = false; + } + + @Override + public List<Text> getTooltip() { + return ImmutableList.of(new Text(StatCollector.translateToLocal("GT5U.bus.filterTooltip.empty"))); + } + + @Override + public List<String> getExtraTooltip() { + return ImmutableList.of(StatCollector.translateToLocal("GT5U.bus.filterTooltip.full")); + } + + @Override + public boolean onMouseScroll(int direction) { + return false; + } + + @SuppressWarnings("ClassCanBeRecord") + private static class PhantomItemDelegate implements IItemHandlerModifiable { + + private final IItemLockable delegate; + + public PhantomItemDelegate(final IItemLockable delegate) { + this.delegate = delegate; + } + + @Override + public void setStackInSlot(int slot, ItemStack itemStack) { + delegate.setLockedItem(itemStack); + } + + @Override + public int getSlots() { + return 1; + } + + @Override + public ItemStack getStackInSlot(int slot) { + return delegate.getLockedItem(); + } + + @Nullable + @Override + public ItemStack insertItem(int slot, ItemStack itemStack, boolean simulate) { + delegate.setLockedItem(itemStack); + return null; + } + + @Nullable + @Override + public ItemStack extractItem(int var1, int var2, boolean var3) { + throw new NotImplementedException("Extract item is disabled for GhostItemButtons."); + } + + @Override + public int getSlotLimit(int slot) { + return 1; + } + } +} |