Skip to content
Merged
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.gregtechceu.gtceu.api.capability.recipe;

import com.gregtechceu.gtceu.api.gui.widget.EnumSelectorWidget;
import com.gregtechceu.gtceu.api.mui.drawable.UITexture;

import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture;
import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture;
Expand All @@ -21,10 +22,13 @@ public enum IO implements EnumSelectorWidget.SelectableEnum {
public final String tooltip;
@Getter
public final IGuiTexture icon;
@Getter
public final UITexture uiTexture;

IO(String tooltip, String textureName) {
this.tooltip = tooltip;
this.icon = new ResourceTexture("gtceu:textures/gui/icon/io_mode/" + textureName + ".png");
this.uiTexture = UITexture.fullImage("gtceu:textures/gui/icon/io_mode/" + textureName + ".png");
}

public boolean support(IO io) {
Expand Down
121 changes: 8 additions & 113 deletions src/main/java/com/gregtechceu/gtceu/api/cover/IMuiCover.java
Original file line number Diff line number Diff line change
@@ -1,28 +1,24 @@
package com.gregtechceu.gtceu.api.cover;

import com.gregtechceu.gtceu.api.mui.base.IUIHolder;
import com.gregtechceu.gtceu.api.mui.base.drawable.IDrawable;
import com.gregtechceu.gtceu.api.mui.base.drawable.IKey;
import com.gregtechceu.gtceu.api.mui.base.widget.IWidget;
import com.gregtechceu.gtceu.api.mui.drawable.ItemDrawable;
import com.gregtechceu.gtceu.api.mui.factory.SidedPosGuiData;
import com.gregtechceu.gtceu.api.mui.utils.Alignment;
import com.gregtechceu.gtceu.api.mui.utils.Color;
import com.gregtechceu.gtceu.api.mui.utils.MouseData;
import com.gregtechceu.gtceu.api.mui.value.BoolValue;
import com.gregtechceu.gtceu.api.mui.value.sync.EnumSyncValue;
import com.gregtechceu.gtceu.api.mui.value.sync.IntSyncValue;
import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager;
import com.gregtechceu.gtceu.api.mui.widget.ParentWidget;
import com.gregtechceu.gtceu.api.mui.widgets.ToggleButton;
import com.gregtechceu.gtceu.api.mui.widgets.SlotGroupWidget;
import com.gregtechceu.gtceu.api.mui.widgets.layout.Flow;
import com.gregtechceu.gtceu.client.mui.screen.ModularPanel;
import com.gregtechceu.gtceu.client.mui.screen.UISettings;
import com.gregtechceu.gtceu.common.data.mui.GTMuiWidgets;
import com.gregtechceu.gtceu.common.mui.GTGuiTextures;
import com.gregtechceu.gtceu.common.mui.GTGuiTheme;
import com.gregtechceu.gtceu.common.mui.GTGuis;

import net.minecraft.util.StringRepresentable;
import net.minecraft.world.item.ItemStack;

public interface IMuiCover extends IUIHolder<SidedPosGuiData> {
Expand All @@ -45,11 +41,12 @@ default GTGuiTheme getUITheme() {

@Override
default ModularPanel buildUI(SidedPosGuiData data, PanelSyncManager syncManager, UISettings settings) {
IWidget widget = createCoverUI(data, syncManager, settings);
return GTGuis.createPanel(this.self(), 176, 166)
.background(GTGuiTextures.BACKGROUND)
.child(widget)
.bindPlayerInventory();
ModularPanel panel = GTGuis.createPanel(this.self(), 176, 192 + 18);

panel.child(GTMuiWidgets.createTitleBar(this.self().getAttachItem(), 176, GTGuiTextures.BACKGROUND));

return panel.child(createCoverUI(data, syncManager, settings))
.child(SlotGroupWidget.playerInventory(false).left(7).bottom(7));
}

ParentWidget<?> createCoverUI(SidedPosGuiData data, PanelSyncManager syncManager, UISettings settings);
Expand Down Expand Up @@ -97,24 +94,6 @@ default int getIncrementValue(MouseData data) {
return adjust;
}

default IKey createAdjustOverlay(boolean increment) {
final StringBuilder builder = new StringBuilder();
builder.append(increment ? '+' : '-');
builder.append(getIncrementValue(MouseData.create(-1)));

float scale = 1f;
if (builder.length() == 3) {
scale = 0.8f;
} else if (builder.length() == 4) {
scale = 0.6f;
} else if (builder.length() > 4) {
scale = 0.5f;
}
return IKey.str(builder.toString())
.color(Color.WHITE.main)
.scale(scale);
}

/**
* Get a BoolValue for use with toggle buttons which are "linked together,"
* meaning only one of them can be pressed at a time.
Expand All @@ -130,88 +109,4 @@ default <T extends Enum<T>> BoolValue.Dynamic boolValueOf(EnumSyncValue<T> syncV
default BoolValue.Dynamic boolValueOf(IntSyncValue syncValue, int value) {
return new BoolValue.Dynamic(() -> syncValue.getValue() == value, $ -> syncValue.setValue(value));
}

class EnumRowBuilder<T extends Enum<T>> {

private EnumSyncValue<T> syncValue;
private final Class<T> enumValue;
private IKey lang;
private IDrawable[] background;
private IDrawable selectedBackground;
private IDrawable[] overlay;

public EnumRowBuilder(Class<T> enumValue) {
this.enumValue = enumValue;
}

public EnumRowBuilder<T> value(EnumSyncValue<T> syncValue) {
this.syncValue = syncValue;
return this;
}

public EnumRowBuilder<T> lang(IKey lang) {
this.lang = lang;
return this;
}

public EnumRowBuilder<T> background(IDrawable... background) {
this.background = background;
return this;
}

public EnumRowBuilder<T> selectedBackground(IDrawable selectedBackground) {
this.selectedBackground = selectedBackground;
return this;
}

public EnumRowBuilder<T> overlay(IDrawable... overlay) {
this.overlay = overlay;
return this;
}

public EnumRowBuilder<T> overlay(int size, IDrawable... overlay) {
this.overlay = new IDrawable[overlay.length];
for (int i = 0; i < overlay.length; i++) {
this.overlay[i] = overlay[i].asIcon().size(size);
}
return this;
}

private BoolValue.Dynamic boolValueOf(EnumSyncValue<T> syncValue, T value) {
return new BoolValue.Dynamic(() -> syncValue.getValue() == value, $ -> syncValue.setValue(value));
}

public Flow build() {
var row = Flow.row().marginBottom(2).coverChildrenHeight().widthRel(1f);
if (this.enumValue != null && this.syncValue != null) {
for (var enumVal : enumValue.getEnumConstants()) {
var button = new ToggleButton().size(18).marginRight(2)
.value(boolValueOf(this.syncValue, enumVal));

if (this.background != null && this.background.length > 0)
button.background(this.background);
else
button.background(GTGuiTextures.MC_BUTTON);

if (this.selectedBackground != null)
button.selectedBackground(this.selectedBackground);
else
button.selectedBackground(GTGuiTextures.MC_BUTTON_DISABLED);

if (this.overlay != null)
button.overlay(this.overlay[enumVal.ordinal()]);

if (enumVal instanceof StringRepresentable serializable) {
button.addTooltipLine(IKey.lang(serializable.getSerializedName()));
}
row.child(button);
}
}

if (this.lang != null)
row.child(this.lang.asWidget().align(Alignment.CenterRight).height(18));

return row;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@

public interface Filter<T, S extends Filter<T, S>> extends Predicate<T> {

WidgetGroup openConfigurator(int x, int y);
default WidgetGroup openConfigurator(int x, int y) {
return null;
}

/**
* @return Filter panel when opened by itself (including the player inventory)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@
import com.gregtechceu.gtceu.client.mui.screen.ModularPanel;
import com.gregtechceu.gtceu.client.mui.screen.UISettings;

import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup;

import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.ItemLike;
Expand Down Expand Up @@ -58,11 +56,6 @@ public int testFluidAmount(FluidStack fluidStack) {
return Integer.MAX_VALUE;
}

@Override
public WidgetGroup openConfigurator(int x, int y) {
throw new NotImplementedException("Not available for empty fluid filter");
}

@Override
public ModularPanel getPanel(GuiData data, PanelSyncManager syncManager, UISettings settings) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@
import com.gregtechceu.gtceu.client.mui.screen.ModularPanel;
import com.gregtechceu.gtceu.client.mui.screen.UISettings;

import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup;

import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.ItemLike;
Expand Down Expand Up @@ -57,11 +55,6 @@ public boolean test(ItemStack itemStack) {
return true;
}

@Override
public WidgetGroup openConfigurator(int x, int y) {
throw new NotImplementedException("Not available for empty item filter");
}

@Override
public ModularPanel getPanel(GuiData data, PanelSyncManager syncManager, UISettings settings) {
return null;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,21 @@
package com.gregtechceu.gtceu.api.cover.filter;

import com.gregtechceu.gtceu.api.gui.GuiTextures;
import com.gregtechceu.gtceu.api.gui.widget.ScrollablePhantomFluidWidget;
import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget;
import com.gregtechceu.gtceu.api.mui.factory.GuiData;
import com.gregtechceu.gtceu.api.mui.value.sync.BooleanSyncValue;
import com.gregtechceu.gtceu.api.mui.value.sync.FluidSlotSyncHandler;
import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager;
import com.gregtechceu.gtceu.api.mui.widgets.Dialog;
import com.gregtechceu.gtceu.api.mui.widgets.SlotGroupWidget;
import com.gregtechceu.gtceu.api.mui.widgets.ToggleButton;
import com.gregtechceu.gtceu.api.mui.widgets.layout.Flow;
import com.gregtechceu.gtceu.api.mui.widgets.layout.Grid;
import com.gregtechceu.gtceu.api.mui.widgets.slot.FluidSlot;
import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank;
import com.gregtechceu.gtceu.client.mui.screen.ModularPanel;
import com.gregtechceu.gtceu.client.mui.screen.UISettings;

import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup;
import com.gregtechceu.gtceu.common.data.GTItems;
import com.gregtechceu.gtceu.common.data.mui.GTMuiWidgets;
import com.gregtechceu.gtceu.common.mui.GTGuiTextures;

import net.minecraft.MethodsReturnNonnullByDefault;
import net.minecraft.nbt.CompoundTag;
Expand Down Expand Up @@ -42,9 +48,17 @@ public class SimpleFluidFilter implements FluidFilter {
@Getter
protected int maxStackSize = 1;

private CustomFluidTank[] fluidStorageSlots = new CustomFluidTank[9];
private final CustomFluidTank[] fluidStorageSlots = new CustomFluidTank[9];

protected SimpleFluidFilter() {
for (int i = 0; i < 9; i++) {
int finalI = i;
fluidStorageSlots[i] = new CustomFluidTank(64000);
fluidStorageSlots[i].setOnContentsChanged(() -> {
matches[finalI] = fluidStorageSlots[finalI].getFluid();
onUpdated.accept(this);
});
}
Arrays.fill(matches, FluidStack.EMPTY);
}

Expand All @@ -60,6 +74,7 @@ private static SimpleFluidFilter loadFilter(CompoundTag tag, Consumer<FluidFilte
var list = tag.getList("matches", Tag.TAG_COMPOUND);
for (int i = 0; i < list.size(); i++) {
handler.matches[i] = FluidStack.loadFluidStackFromNBT((CompoundTag) list.get(i));
handler.fluidStorageSlots[i].setFluid(handler.matches[i]);
}
return handler;
}
Expand Down Expand Up @@ -102,51 +117,39 @@ public void setIgnoreNbt(boolean ingoreNbt) {
onUpdated.accept(this);
}

public WidgetGroup openConfigurator(int x, int y) {
WidgetGroup group = new WidgetGroup(x, y, 18 * 3 + 25, 18 * 3); // 80 55
fluidStorageSlots = new CustomFluidTank[9];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
final int index = i * 3 + j;

fluidStorageSlots[index] = new CustomFluidTank(maxStackSize);
fluidStorageSlots[index].setFluid(matches[index]);

var tank = new ScrollablePhantomFluidWidget(fluidStorageSlots[index], 0, i * 18, j * 18, 18, 18,
() -> fluidStorageSlots[index].getFluid(),
(fluid) -> fluidStorageSlots[index].setFluid(fluid)) {

@Override
public void updateScreen() {
super.updateScreen();
setShowAmount(maxStackSize > 1L);
}

@Override
public void detectAndSendChanges() {
super.detectAndSendChanges();
setShowAmount(maxStackSize > 1L);
}
};

tank.setChangeListener(() -> {
matches[index] = fluidStorageSlots[index].getFluidInTank(0);
onUpdated.accept(this);
}).setBackground(GuiTextures.SLOT);

group.addWidget(tank);
}
}
group.addWidget(new ToggleButtonWidget(18 * 3 + 5, 0, 20, 20,
GuiTextures.BUTTON_BLACKLIST, this::isBlackList, this::setBlackList));
group.addWidget(new ToggleButtonWidget(18 * 3 + 5, 20, 20, 20,
GuiTextures.BUTTON_FILTER_NBT, this::isIgnoreNbt, this::setIgnoreNbt));
return group;
}

@Override
public ModularPanel getPanel(GuiData data, PanelSyncManager syncManager, UISettings settings) {
return null;
for (int i = 0; i < 9; i++) {
syncManager.syncValue("filter_slot_" + i,
new FluidSlotSyncHandler(fluidStorageSlots[i]).controlsAmount(true).phantom(true));
}

Grid filterGrid = new Grid()
.coverChildren()
.mapTo(3, 9, i -> new FluidSlot().syncHandler("filter_slot_" + i));

BooleanSyncValue blacklist = new BooleanSyncValue(this::isBlackList, this::setBlackList);
syncManager.syncValue("blacklist", blacklist);

BooleanSyncValue ignoreNBT = new BooleanSyncValue(this::isIgnoreNbt, this::setIgnoreNbt);
syncManager.syncValue("ignoreNBT", ignoreNBT);

Flow filterConfigButtons = Flow.col()
.coverChildren()
.child(new ToggleButton().stateBackground(GTGuiTextures.BUTTON_BLACKLIST).syncHandler("blacklist"))
.child(new ToggleButton().stateBackground(GTGuiTextures.BUTTON_IGNORE_NBT).syncHandler("ignoreNBT"));

return new Dialog<>("simple_fluid_filter")
.setDisablePanelsBelow(false)
.setDraggable(true)
.setCloseOnOutOfBoundsClick(true)
.child(GTMuiWidgets.createTitleBar(GTItems.FLUID_FILTER.asStack(), 176, GTGuiTextures.BACKGROUND))
.child(Flow.row()
.top(10)
.coverChildrenHeight()
.child(filterGrid.horizontalCenter())
.child(filterConfigButtons.marginLeft(118)))
.child(SlotGroupWidget.playerInventory(false).left(7).bottom(7));
}

@Override
Expand Down
Loading