diff --git a/src/main/java/gregtech/api/items/metaitem/MetaItem.java b/src/main/java/gregtech/api/items/metaitem/MetaItem.java index 235e97214e9..f5661c444b9 100644 --- a/src/main/java/gregtech/api/items/metaitem/MetaItem.java +++ b/src/main/java/gregtech/api/items/metaitem/MetaItem.java @@ -22,7 +22,7 @@ import gregtech.api.util.Mods; import gregtech.client.utils.ToolChargeBarRenderer; import gregtech.common.ConfigHolder; -import gregtech.common.covers.filter.IFilter; +import gregtech.common.covers.filter.BaseFilter; import gregtech.common.creativetab.GTCreativeTabs; import net.minecraft.client.Minecraft; @@ -770,7 +770,7 @@ public MetaItem getMetaItem() { private final List behaviours = new ArrayList<>(); private IItemUseManager useManager; private ItemUIFactory uiManager; - private IFilter.Factory filterBehavior; + private BaseFilter filterBehavior; private IItemColorProvider colorProvider; private IItemDurabilityManager durabilityManager; private IEnchantabilityHelper enchantabilityHelper; @@ -902,8 +902,8 @@ protected void addItemComponentsInternal(IItemComponent... stats) { if (itemComponent instanceof ItemUIFactory) { this.uiManager = (ItemUIFactory) itemComponent; } - if (itemComponent instanceof IFilter.Factory) { - this.filterBehavior = (IFilter.Factory) itemComponent; + if (itemComponent instanceof BaseFilter) { + this.filterBehavior = (BaseFilter) itemComponent; } if (itemComponent instanceof IItemColorProvider) { this.colorProvider = (IItemColorProvider) itemComponent; @@ -954,7 +954,7 @@ public ItemUIFactory getUIManager() { } @Nullable - public IFilter.Factory getFilterFactory() { + public BaseFilter getFilterBehavior() { return filterBehavior; } diff --git a/src/main/java/gregtech/common/covers/CoverFluidFilter.java b/src/main/java/gregtech/common/covers/CoverFluidFilter.java index c0d9ff4c375..0de8dabb9fb 100644 --- a/src/main/java/gregtech/common/covers/CoverFluidFilter.java +++ b/src/main/java/gregtech/common/covers/CoverFluidFilter.java @@ -113,10 +113,7 @@ public FluidFilterMode getFilterMode() { } public @NotNull BaseFilter getFilter() { - var filter = getFilterContainer().getFilter(); - if (filter == null) return BaseFilter.ERROR_FILTER; - - return filter; + return getFilterContainer().getFilter(); } public @NotNull BaseFilterContainer getFilterContainer() { @@ -148,9 +145,9 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan guiSyncManager.syncValue("filtering_mode", filteringMode); this.fluidFilterContainer.setMaxTransferSize(1); - return getFilter().createPanel(guiSyncManager) + return getFilter().getUI().createPanel(getPickItem(), guiSyncManager) .size(176, 212).padding(7) - .child(CoverWithUI.createTitleRow(getFilterContainer().getFilterStack())) + .child(CoverWithUI.createTitleRow(getPickItem())) .child(Flow.column().widthRel(1f).align(Alignment.TopLeft).top(22).coverChildrenHeight() .child(new EnumRowBuilder<>(FluidFilterMode.class) .value(filteringMode) @@ -176,7 +173,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan .alignX(1f))) .child(new Rectangle().setColor(UI_TEXT_COLOR).asWidget() .height(1).widthRel(0.95f).margin(0, 4)) - .child(getFilter().createWidgets(guiSyncManager))) + .child(getFilter().getUI().createWidgets(getPickItem(), guiSyncManager))) .child(SlotGroupWidget.playerInventory(false).bottom(7).left(7)); } diff --git a/src/main/java/gregtech/common/covers/CoverItemFilter.java b/src/main/java/gregtech/common/covers/CoverItemFilter.java index b64c75a5ee1..d6a60446e30 100644 --- a/src/main/java/gregtech/common/covers/CoverItemFilter.java +++ b/src/main/java/gregtech/common/covers/CoverItemFilter.java @@ -111,10 +111,7 @@ public ItemFilterMode getFilterMode() { } public @NotNull BaseFilter getFilter() { - var filter = getFilterContainer().getFilter(); - if (filter == null) return BaseFilter.ERROR_FILTER; - - return filter; + return getFilterContainer().getFilter(); } public @NotNull BaseFilterContainer getFilterContainer() { @@ -150,9 +147,10 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan guiSyncManager.syncValue("filtering_mode", filteringMode); - return getFilter().createPanel(guiSyncManager) + return getFilter().getUI() + .createPanel(getPickItem(), guiSyncManager) .size(176, 212).padding(7) - .child(CoverWithUI.createTitleRow(getFilterContainer().getFilterStack()).left(4)) + .child(CoverWithUI.createTitleRow(getPickItem()).left(4)) .child(Flow.column().widthRel(1f).align(Alignment.TopLeft).top(22).coverChildrenHeight() .child(new EnumRowBuilder<>(ItemFilterMode.class) .value(filteringMode) @@ -178,7 +176,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan .alignX(1f))) .child(new Rectangle().setColor(UI_TEXT_COLOR).asWidget() .height(1).widthRel(0.95f).margin(0, 4)) - .child(getFilter().createWidgets(guiSyncManager).left(0))) + .child(getFilter().getUI().createWidgets(getPickItem(), guiSyncManager).left(0))) .child(SlotGroupWidget.playerInventory(false).bottom(7).left(7)); } diff --git a/src/main/java/gregtech/common/covers/filter/BaseFilter.java b/src/main/java/gregtech/common/covers/filter/BaseFilter.java index c5591a5021b..6978b6483e9 100644 --- a/src/main/java/gregtech/common/covers/filter/BaseFilter.java +++ b/src/main/java/gregtech/common/covers/filter/BaseFilter.java @@ -1,84 +1,77 @@ package gregtech.common.covers.filter; import gregtech.api.items.metaitem.MetaItem; -import gregtech.api.mui.GTGuiTextures; -import gregtech.api.mui.GTGuis; +import gregtech.api.items.metaitem.stats.IItemComponent; import gregtech.api.util.IDirtyNotifiable; import gregtech.common.covers.filter.readers.BaseFilterReader; +import gregtech.common.items.behaviors.filter.BaseFilterUIManager; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.PacketBuffer; import net.minecraftforge.fluids.FluidStack; -import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.api.widget.IWidget; -import com.cleanroommc.modularui.screen.ModularPanel; -import com.cleanroommc.modularui.utils.Alignment; -import com.cleanroommc.modularui.value.sync.BooleanSyncValue; -import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import com.cleanroommc.modularui.widget.ParentWidget; -import com.cleanroommc.modularui.widget.Widget; -import com.cleanroommc.modularui.widgets.CycleButtonWidget; import org.jetbrains.annotations.NotNull; -public abstract class BaseFilter implements IFilter { +import java.util.Optional; + +public abstract class BaseFilter implements IItemComponent { public static final BaseFilter ERROR_FILTER = new BaseFilter() { - private final BaseFilterReader filterReader = new BaseFilterReader(ItemStack.EMPTY, 0); + private final BaseFilterReader reader = new BaseFilterReader(0); @Override public BaseFilterReader getFilterReader() { - return this.filterReader; - } - - @Override - public @NotNull ModularPanel createPopupPanel(PanelSyncManager syncManager, String panelName) { - return GTGuis.createPopupPanel(panelName, 100, 100) - .child(createWidgets(syncManager)); + return reader; } @Override - public @NotNull ModularPanel createPanel(PanelSyncManager syncManager) { - return GTGuis.createPanel("error", 100, 100) - .child(createWidgets(syncManager)); - } - - @Override - public @NotNull Widget createWidgets(PanelSyncManager syncManager) { - return IKey.lang("INVALID FILTER").alignment(Alignment.Center).asWidget(); + public BaseFilter copy() { + return this; } @Override public FilterType getType() { - return FilterType.ITEM; + return FilterType.ERROR; } }; - protected IDirtyNotifiable dirtyNotifiable; public abstract BaseFilterReader getFilterReader(); + public abstract BaseFilter copy(); + + public final void updateFilterReader(ItemStack stack) { + getFilterReader().readStack(stack); + } + + public BaseFilterUIManager getUI() { + if (getContainerStack().getItem() instanceof MetaItemmetaItem) { + return Optional.ofNullable(metaItem.getItem(getContainerStack())) + .map(o -> (BaseFilterUIManager) o.getUIManager()) + .orElseThrow(IllegalStateException::new); + } + throw new IllegalStateException(); + } + public final ItemStack getContainerStack() { return this.getFilterReader().getContainer(); } public static @NotNull BaseFilter getFilterFromStack(ItemStack stack) { if (stack.getItem() instanceof MetaItemmetaItem) { - var metaValueItem = metaItem.getItem(stack); - var factory = metaValueItem == null ? null : metaValueItem.getFilterFactory(); - if (factory != null) - return factory.create(stack); + return Optional.ofNullable(metaItem.getItem(stack)) + .map(MetaItem.MetaValueItem::getFilterBehavior) + .map(BaseFilter::copy) + .orElse(ERROR_FILTER); } return ERROR_FILTER; } public final void setBlacklistFilter(boolean blacklistFilter) { this.getFilterReader().setBlacklistFilter(blacklistFilter); - markDirty(); } - @Override public final MatchResult match(Object toMatch) { if (toMatch instanceof ItemStack stack) { return matchItem(stack); @@ -96,7 +89,6 @@ public MatchResult matchItem(ItemStack itemStack) { return MatchResult.NONE; } - @Override public final boolean test(Object toTest) { boolean b = false; if (toTest instanceof ItemStack stack) { @@ -115,7 +107,6 @@ public boolean testItem(ItemStack toTest) { return false; } - @Override public final int getTransferLimit(Object o, int transferSize) { if (o instanceof ItemStack stack) { return getTransferLimit(stack, transferSize); @@ -125,6 +116,10 @@ public final int getTransferLimit(Object o, int transferSize) { return 0; } + public int getTransferLimit(int slot, int transferSize) { + return transferSize; + } + public int getTransferLimit(FluidStack stack, int transferSize) { return 0; } @@ -137,18 +132,6 @@ public final boolean isBlacklistFilter() { return getFilterReader().isBlacklistFilter(); } - public IWidget createBlacklistUI() { - return new ParentWidget<>().coverChildren() - .child(new CycleButtonWidget() - .value(new BooleanSyncValue( - this::isBlacklistFilter, - this::setBlacklistFilter)) - .stateBackground(0, GTGuiTextures.BUTTON_BLACKLIST[0]) - .stateBackground(1, GTGuiTextures.BUTTON_BLACKLIST[1]) - .addTooltip(0, IKey.lang("cover.filter.blacklist.disabled")) - .addTooltip(1, IKey.lang("cover.filter.blacklist.enabled"))); - } - public final int getMaxTransferSize() { return this.getFilterReader().getMaxTransferRate(); } @@ -162,22 +145,34 @@ public boolean showGlobalTransferLimitSlider() { } public final void setDirtyNotifiable(IDirtyNotifiable dirtyNotifiable) { - this.dirtyNotifiable = dirtyNotifiable; this.getFilterReader().setDirtyNotifiable(dirtyNotifiable); } - public final void markDirty() { - if (dirtyNotifiable != null) { - dirtyNotifiable.markAsDirty(); - } - } - public void readFromNBT(NBTTagCompound tag) { this.getFilterReader().deserializeNBT(tag); - markDirty(); } public void writeInitialSyncData(PacketBuffer packetBuffer) {} public void readInitialSyncData(@NotNull PacketBuffer packetBuffer) {} + + public abstract FilterType getType(); + + public boolean isItem() { + return getType() == FilterType.ITEM; + } + + public boolean isFluid() { + return getType() == FilterType.FLUID; + } + + public boolean isError() { + return getType() == FilterType.ERROR; + } + + public enum FilterType { + ITEM, + FLUID, + ERROR + } } diff --git a/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java b/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java index 8c050a2e394..3c65b2df061 100644 --- a/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java +++ b/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java @@ -33,7 +33,7 @@ public abstract class BaseFilterContainer extends ItemStackHandler { private int maxTransferSize = 1; private int transferSize; - private @Nullable BaseFilter currentFilter; + private @NotNull BaseFilter currentFilter = BaseFilter.ERROR_FILTER; private @Nullable Runnable onFilterInstanceChange; private final IDirtyNotifiable dirtyNotifiable; @@ -85,7 +85,7 @@ public void setStackInSlot(int slot, @NotNull ItemStack stack) { if (ItemStack.areItemStacksEqual(stack, getFilterStack())) return; - setFilter(BaseFilter.getFilterFromStack(stack)); + setFilter(stack); super.setStackInSlot(slot, stack); } @@ -103,7 +103,7 @@ public boolean isItemValid(int slot, @NotNull ItemStack stack) { public @NotNull ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate) { if (!isItemValid(stack)) return stack; var remainder = super.insertItem(slot, stack, simulate); - if (!simulate) setFilter(BaseFilter.getFilterFromStack(stack)); + if (!simulate) setFilter(stack); return remainder; } @@ -111,7 +111,7 @@ public boolean isItemValid(int slot, @NotNull ItemStack stack) { public @NotNull ItemStack extractItem(int slot, int amount, boolean simulate) { var extracted = super.extractItem(slot, amount, simulate); if (!extracted.isEmpty()) { - setFilter(null); + clearFilter(); } return extracted; } @@ -132,15 +132,26 @@ public void setMaxTransferSize(int maxTransferSize) { } public final boolean hasFilter() { - return currentFilter != null; + return !currentFilter.isError(); } - public final @Nullable BaseFilter getFilter() { + public final @NotNull BaseFilter getFilter() { return currentFilter; } - public final void setFilter(@Nullable BaseFilter newFilter) { - this.currentFilter = BaseFilter.ERROR_FILTER == newFilter ? null : newFilter; + public final void clearFilter() { + setFilter(BaseFilter.ERROR_FILTER); + } + + public final void setFilter(ItemStack stack) { + setFilter(BaseFilter.getFilterFromStack(stack)); + if (hasFilter()) { + getFilter().updateFilterReader(stack); + } + } + + public final void setFilter(@NotNull BaseFilter newFilter) { + this.currentFilter = newFilter; if (hasFilter()) { this.currentFilter.setDirtyNotifiable(this.dirtyNotifiable); this.currentFilter.setMaxTransferSize(this.maxTransferSize); @@ -219,11 +230,15 @@ public IWidget initUI(GuiData data, PanelSyncManager manager) { AtomicReference filterPanel = new AtomicReference<>(); AtomicReference oldStack = new AtomicReference<>(getFilterStack()); AtomicInteger counter = new AtomicInteger(); - if (hasFilter()) filterPanel.set(getFilter().createPanelHandler(manager, counter.getAndIncrement())); + if (hasFilter()) { + filterPanel.set(getFilter().getUI() + .createPanelHandler(getFilterStack(), manager, counter.getAndIncrement())); + } manager.registerSyncedAction("update_filter_panel", packet -> { if (hasFilter()) { // make new panel handler only when we have a filter - filterPanel.set(getFilter().createPanelHandler(manager, counter.getAndIncrement())); + filterPanel.set(getFilter().getUI() + .createPanelHandler(getFilterStack(), manager, counter.getAndIncrement())); } }); ItemStackHashStrategy strategy = ItemStackHashStrategy.comparingItemDamageCount(); diff --git a/src/main/java/gregtech/common/covers/filter/FluidFilterContainer.java b/src/main/java/gregtech/common/covers/filter/FluidFilterContainer.java index df2bc6d54de..a949713a41a 100644 --- a/src/main/java/gregtech/common/covers/filter/FluidFilterContainer.java +++ b/src/main/java/gregtech/common/covers/filter/FluidFilterContainer.java @@ -16,7 +16,7 @@ public FluidFilterContainer(IDirtyNotifiable dirtyNotifiable) { @Override protected boolean isItemValid(ItemStack stack) { var filter = BaseFilter.getFilterFromStack(stack); - return filter != BaseFilter.ERROR_FILTER && filter.getType() == IFilter.FilterType.FLUID; + return filter.isFluid(); } @Override diff --git a/src/main/java/gregtech/common/covers/filter/IFilter.java b/src/main/java/gregtech/common/covers/filter/IFilter.java deleted file mode 100644 index 1bbde04af5d..00000000000 --- a/src/main/java/gregtech/common/covers/filter/IFilter.java +++ /dev/null @@ -1,82 +0,0 @@ -package gregtech.common.covers.filter; - -import gregtech.api.items.metaitem.stats.IItemComponent; -import gregtech.api.util.IDirtyNotifiable; - -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; - -import com.cleanroommc.modularui.api.IPanelHandler; -import com.cleanroommc.modularui.screen.ModularPanel; -import com.cleanroommc.modularui.value.sync.PanelSyncHandler; -import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import com.cleanroommc.modularui.widget.Widget; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -public interface IFilter { - - /** Uses Cleanroom MUI */ - @NotNull - ModularPanel createPopupPanel(PanelSyncManager syncManager, String panelName); - - /** Uses Cleanroom MUI */ - @NotNull - ModularPanel createPanel(PanelSyncManager syncManager); - - /** Uses Cleanroom MUI - Creates the widgets standalone so that they can be put into their own panel */ - - @NotNull - Widget createWidgets(PanelSyncManager syncManager); - - default IPanelHandler createPanelHandler(PanelSyncManager syncManager, int id) { - String translationKey = getContainerStack().getTranslationKey(); - return syncManager.getOrCreateSyncHandler(translationKey, id, PanelSyncHandler.class, () -> { - String key = PanelSyncManager.makeSyncKey(translationKey, id); - return (PanelSyncHandler) syncManager.panel(key, (psm, $) -> createPopupPanel(psm, key), true); - }); - } - - ItemStack getContainerStack(); - - void setDirtyNotifiable(@Nullable IDirtyNotifiable dirtyNotifiable); - - void markDirty(); - - int getMaxTransferSize(); - - void setMaxTransferSize(int maxTransferSize); - - boolean showGlobalTransferLimitSlider(); - - MatchResult match(Object toMatch); - - boolean test(Object toTest); - - int getTransferLimit(Object stack, int transferSize); - - default int getTransferLimit(int slot, int transferSize) { - return transferSize; - } - - void readFromNBT(NBTTagCompound tagCompound); - - FilterType getType(); - - enum FilterType { - ITEM, - FLUID - } - - // this only exists so i can pass in the constructor reference as a metaitem componant - static Factory factory(Factory factory) { - return factory; - } - - @FunctionalInterface - interface Factory extends IItemComponent { - - @NotNull - BaseFilter create(@NotNull ItemStack stack); - } -} diff --git a/src/main/java/gregtech/common/covers/filter/ItemFilterContainer.java b/src/main/java/gregtech/common/covers/filter/ItemFilterContainer.java index 6d1705edf86..45d53961bcf 100644 --- a/src/main/java/gregtech/common/covers/filter/ItemFilterContainer.java +++ b/src/main/java/gregtech/common/covers/filter/ItemFilterContainer.java @@ -16,7 +16,7 @@ public ItemFilterContainer(IDirtyNotifiable dirtyNotifiable) { @Override protected boolean isItemValid(ItemStack stack) { var filter = BaseFilter.getFilterFromStack(stack); - return filter != BaseFilter.ERROR_FILTER && filter.getType() == IFilter.FilterType.ITEM; + return filter.isItem(); } @Override diff --git a/src/main/java/gregtech/common/covers/filter/OreDictionaryItemFilter.java b/src/main/java/gregtech/common/covers/filter/OreDictionaryItemFilter.java index 75f2ed81afd..921a43efab1 100644 --- a/src/main/java/gregtech/common/covers/filter/OreDictionaryItemFilter.java +++ b/src/main/java/gregtech/common/covers/filter/OreDictionaryItemFilter.java @@ -1,40 +1,17 @@ package gregtech.common.covers.filter; -import gregtech.api.cover.CoverWithUI; -import gregtech.api.mui.GTGuiTextures; -import gregtech.api.mui.GTGuis; import gregtech.api.unification.OreDictUnifier; import gregtech.api.unification.stack.ItemVariantMap; import gregtech.api.unification.stack.MultiItemVariantMap; import gregtech.api.unification.stack.SingleItemVariantMap; -import gregtech.api.util.oreglob.OreGlobCompileResult; import gregtech.common.covers.filter.readers.OreDictFilterReader; -import gregtech.common.mui.widget.HighlightedTextField; -import gregtech.common.mui.widget.orefilter.OreFilterTestSlot; -import net.minecraft.client.resources.I18n; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.util.text.TextFormatting; -import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.drawable.UITexture; -import com.cleanroommc.modularui.screen.ModularPanel; -import com.cleanroommc.modularui.screen.RichTooltip; -import com.cleanroommc.modularui.utils.BooleanConsumer; -import com.cleanroommc.modularui.utils.Color; -import com.cleanroommc.modularui.value.sync.BooleanSyncValue; -import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import com.cleanroommc.modularui.value.sync.StringSyncValue; -import com.cleanroommc.modularui.widget.Widget; -import com.cleanroommc.modularui.widgets.CycleButtonWidget; -import com.cleanroommc.modularui.widgets.SlotGroupWidget; -import com.cleanroommc.modularui.widgets.layout.Flow; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; -import java.util.List; import java.util.Map; import java.util.Set; @@ -42,10 +19,9 @@ public class OreDictionaryItemFilter extends BaseFilter { private final Map> matchCache = new Object2ObjectOpenHashMap<>(); private final SingleItemVariantMap noOreDictMatch = new SingleItemVariantMap<>(); - private final OreDictFilterReader filterReader; + private final OreDictFilterReader filterReader = new OreDictFilterReader(); - public OreDictionaryItemFilter(ItemStack stack) { - this.filterReader = new OreDictFilterReader(stack); + public OreDictionaryItemFilter() { recompile(); } @@ -64,179 +40,11 @@ protected void recompile() { this.filterReader.recompile(); } - protected void clearCache() { + public void clearCache() { this.matchCache.clear(); this.noOreDictMatch.clear(); } - @Override - public @NotNull ModularPanel createPopupPanel(PanelSyncManager syncManager, String panelName) { - return GTGuis.createPopupPanel(panelName, 188, 76, false) - .padding(7) - .child(CoverWithUI.createTitleRow(getContainerStack())) - .child(createWidgets(syncManager).top(22)); - } - - @Override - public @NotNull ModularPanel createPanel(PanelSyncManager syncManager) { - return GTGuis.createPanel("ore_dict_filter", 100, 100); - } - - @Override - public @NotNull Widget createWidgets(PanelSyncManager syncManager) { - List oreSlots = new ArrayList<>(); - var expression = new StringSyncValue(this.filterReader::getExpression, this.filterReader::setExpression); - - BooleanConsumer setCaseSensitive = b -> { - this.filterReader.setCaseSensitive(b); - if (!syncManager.isClient()) return; - for (var slot : oreSlots) { - slot.updatePreview(); - } - }; - - BooleanConsumer setMatchAll = b -> { - this.clearCache(); - this.filterReader.setMatchAll(b); - if (!syncManager.isClient()) return; - for (var slot : oreSlots) { - slot.setMatchAll(b); - } - }; - - var caseSensitive = new BooleanSyncValue(this.filterReader::isCaseSensitive, setCaseSensitive); - var matchAll = new BooleanSyncValue(this.filterReader::shouldMatchAll, setMatchAll); - - return Flow.column().widthRel(1f).coverChildrenHeight() - .child(new HighlightedTextField() - .setHighlightRule(this::highlightRule) - .onUnfocus(() -> { - for (var slot : oreSlots) { - slot.updatePreview(); - } - }) - .setTextColor(Color.WHITE.darker(1)) - .value(expression).marginBottom(4) - .height(18).widthRel(1f)) - .child(Flow.row().coverChildrenHeight() - .widthRel(1f) - .child(Flow.column().height(18) - .coverChildrenWidth().marginRight(2) - .child(GTGuiTextures.OREDICT_INFO.asWidget() - .size(8).top(0) - .addTooltipLine(IKey.lang("cover.ore_dictionary_filter.info"))) - .child(new Widget<>() - .size(8).bottom(0) - .onUpdateListener(this::getStatusIcon) - .tooltipBuilder(this::createStatusTooltip) - .tooltip(tooltip -> tooltip.setAutoUpdate(true)))) - .child(SlotGroupWidget.builder() - .row("XXXXX") - .key('X', i -> { - var slot = new OreFilterTestSlot() - .setGlobSupplier(this.filterReader::getGlob); - slot.setMatchAll(this.filterReader.shouldMatchAll()); - oreSlots.add(slot); - return slot; - }) - .build().marginRight(2)) - .child(new CycleButtonWidget() - .size(18).value(caseSensitive) - .marginRight(2) - .stateBackground(0, GTGuiTextures.BUTTON_CASE_SENSITIVE[0]) - .stateBackground(1, GTGuiTextures.BUTTON_CASE_SENSITIVE[1]) - .addTooltip(0, - IKey.lang("cover.ore_dictionary_filter.button.case_sensitive.disabled")) - .addTooltip(1, - IKey.lang("cover.ore_dictionary_filter.button.case_sensitive.enabled"))) - .child(new CycleButtonWidget() - .size(18).value(matchAll) - .marginRight(2) - .stateBackground(0, GTGuiTextures.BUTTON_MATCH_ALL[0]) - .stateBackground(1, GTGuiTextures.BUTTON_MATCH_ALL[1]) - .addTooltip(0, - IKey.lang("cover.ore_dictionary_filter.button.match_all.disabled")) - .addTooltip(1, - IKey.lang("cover.ore_dictionary_filter.button.match_all.enabled"))) - .child(createBlacklistUI())); - } - - protected void getStatusIcon(Widget widget) { - UITexture texture; - var result = this.filterReader.getResult(); - - if (result == null) { - texture = GTGuiTextures.OREDICT_WAITING; - } else if (result.getReports().length == 0) { - texture = GTGuiTextures.OREDICT_SUCCESS; - } else if (result.hasError()) { - texture = GTGuiTextures.OREDICT_ERROR; - } else { - texture = GTGuiTextures.OREDICT_WARN; - } - widget.background(texture); - } - - protected void createStatusTooltip(RichTooltip tooltip) { - var result = this.filterReader.getResult(); - if (result == null) return; - List list = new ArrayList<>(); - - int error = 0, warn = 0; - for (OreGlobCompileResult.Report report : result.getReports()) { - if (report.isError()) error++; - else warn++; - list.add((report.isError() ? TextFormatting.RED : TextFormatting.GOLD) + report.toString()); - } - if (error > 0) { - if (warn > 0) { - list.add(0, I18n.format("cover.ore_dictionary_filter.status.err_warn", error, warn)); - } else { - list.add(0, I18n.format("cover.ore_dictionary_filter.status.err", error)); - } - } else { - if (warn > 0) { - list.add(0, I18n.format("cover.ore_dictionary_filter.status.warn", warn)); - } else { - list.add(I18n.format("cover.ore_dictionary_filter.status.no_issues")); - } - list.add(""); - list.add(I18n.format("cover.ore_dictionary_filter.status.explain")); - list.add(""); - list.addAll(result.getInstance().toFormattedString()); - } - tooltip.addStringLines(list); - } - - protected String highlightRule(String text) { - StringBuilder builder = new StringBuilder(text); - for (int i = 0; i < builder.length(); i++) { - switch (builder.charAt(i)) { - case '|', '&', '^', '(', ')' -> { - builder.insert(i, TextFormatting.GOLD); - i += 2; - } - case '*', '?' -> { - builder.insert(i, TextFormatting.GREEN); - i += 2; - } - case '!' -> { - builder.insert(i, TextFormatting.RED); - i += 2; - } - case '\\' -> { - builder.insert(i++, TextFormatting.YELLOW); - i += 2; - } - default -> { - continue; - } - } - builder.insert(i + 1, TextFormatting.RESET); - } - return builder.toString(); - } - @Override public MatchResult matchItem(ItemStack itemStack) { // "wtf is this system?? i can put any non null object here and it i will work??? $arch" @@ -305,4 +113,9 @@ public boolean matchesItemStack(@NotNull ItemStack itemStack) { public boolean showGlobalTransferLimitSlider() { return true; } + + @Override + public BaseFilter copy() { + return new OreDictionaryItemFilter(); + } } diff --git a/src/main/java/gregtech/common/covers/filter/SimpleFluidFilter.java b/src/main/java/gregtech/common/covers/filter/SimpleFluidFilter.java index f7b276a8f59..ca2f39bb13b 100644 --- a/src/main/java/gregtech/common/covers/filter/SimpleFluidFilter.java +++ b/src/main/java/gregtech/common/covers/filter/SimpleFluidFilter.java @@ -1,29 +1,14 @@ package gregtech.common.covers.filter; -import gregtech.api.cover.CoverWithUI; -import gregtech.api.mui.GTGuis; import gregtech.common.covers.filter.readers.SimpleFluidFilterReader; -import gregtech.common.mui.widget.GTFluidSlot; -import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.FluidStack; -import com.cleanroommc.modularui.screen.ModularPanel; -import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import com.cleanroommc.modularui.widget.Widget; -import com.cleanroommc.modularui.widgets.SlotGroupWidget; -import com.cleanroommc.modularui.widgets.layout.Flow; -import org.jetbrains.annotations.NotNull; - public class SimpleFluidFilter extends BaseFilter { private static final int MAX_FLUID_SLOTS = 9; - private final SimpleFluidFilterReader filterReader; - - public SimpleFluidFilter(ItemStack stack) { - filterReader = new SimpleFluidFilterReader(stack, MAX_FLUID_SLOTS); - } + private final SimpleFluidFilterReader filterReader = new SimpleFluidFilterReader(MAX_FLUID_SLOTS); @Override public SimpleFluidFilterReader getFilterReader() { @@ -32,36 +17,6 @@ public SimpleFluidFilterReader getFilterReader() { public void configureFilterTanks(int amount) { this.filterReader.setFluidAmounts(amount); - this.markDirty(); - } - - @Override - public @NotNull ModularPanel createPopupPanel(PanelSyncManager syncManager, String panelName) { - return GTGuis.createPopupPanel(panelName, 98, 81, false) - .padding(4) - .child(CoverWithUI.createTitleRow(getContainerStack())) - .child(createWidgets(syncManager).top(22)); - } - - @Override - public @NotNull ModularPanel createPanel(PanelSyncManager syncManager) { - return GTGuis.createPanel(getContainerStack(), 176, 168); - } - - @Override - public @NotNull Widget createWidgets(PanelSyncManager syncManager) { - return Flow.row().coverChildrenHeight().widthRel(1f) - .child(SlotGroupWidget.builder() - .matrix("FFF", - "FFF", - "FFF") - .key('F', i -> new GTFluidSlot() - .syncHandler(GTFluidSlot.sync(filterReader.getFluidTank(i)) - .phantom(true) - .showAmountOnSlot(getFilterReader()::shouldShowAmount) - .showAmountInTooltip(getFilterReader()::shouldShowAmount))) - .build().marginRight(4)) - .child(createBlacklistUI()); } @Override @@ -107,4 +62,9 @@ public int getTransferLimit(FluidStack fluidStack, int transferSize) { public FilterType getType() { return FilterType.FLUID; } + + @Override + public BaseFilter copy() { + return new SimpleFluidFilter(); + } } diff --git a/src/main/java/gregtech/common/covers/filter/SimpleItemFilter.java b/src/main/java/gregtech/common/covers/filter/SimpleItemFilter.java index d4eb282053b..247ce93b581 100644 --- a/src/main/java/gregtech/common/covers/filter/SimpleItemFilter.java +++ b/src/main/java/gregtech/common/covers/filter/SimpleItemFilter.java @@ -1,40 +1,14 @@ package gregtech.common.covers.filter; -import gregtech.api.cover.CoverWithUI; -import gregtech.api.mui.GTGuiTextures; -import gregtech.api.mui.GTGuis; -import gregtech.api.util.TextFormattingUtil; -import gregtech.common.covers.CoverItemVoidingAdvanced; -import gregtech.common.covers.CoverRoboticArm; -import gregtech.common.covers.TransferMode; -import gregtech.common.covers.VoidingMode; import gregtech.common.covers.filter.readers.SimpleItemFilterReader; import net.minecraft.item.ItemStack; import net.minecraftforge.items.IItemHandler; -import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.screen.ModularPanel; -import com.cleanroommc.modularui.utils.Color; -import com.cleanroommc.modularui.value.sync.BooleanSyncValue; -import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import com.cleanroommc.modularui.value.sync.SyncHandlers; -import com.cleanroommc.modularui.widget.Widget; -import com.cleanroommc.modularui.widgets.CycleButtonWidget; -import com.cleanroommc.modularui.widgets.SlotGroupWidget; -import com.cleanroommc.modularui.widgets.layout.Flow; -import com.cleanroommc.modularui.widgets.slot.PhantomItemSlot; -import com.cleanroommc.modularui.widgets.slot.SlotGroup; -import org.jetbrains.annotations.NotNull; - public class SimpleItemFilter extends BaseFilter { private static final int MAX_MATCH_SLOTS = 9; - private final SimpleItemFilterReader filterReader; - - public SimpleItemFilter(ItemStack stack) { - filterReader = new SimpleItemFilterReader(stack, MAX_MATCH_SLOTS); - } + private final SimpleItemFilterReader filterReader = new SimpleItemFilterReader(MAX_MATCH_SLOTS); @Override public SimpleItemFilterReader getFilterReader() { @@ -75,71 +49,8 @@ public int getTransferLimit(ItemStack stack, int transferSize) { } @Override - public @NotNull ModularPanel createPopupPanel(PanelSyncManager syncManager, String panelName) { - return GTGuis.createPopupPanel(panelName, 98, 81, false) - .child(CoverWithUI.createTitleRow(getContainerStack())) - .child(createWidgets(syncManager).top(22).left(4)); - } - - @Override - public @NotNull ModularPanel createPanel(PanelSyncManager syncManager) { - return GTGuis.createPanel("simple_item_filter", 176, 166); - } - - @SuppressWarnings("UnstableApiUsage") - @Override - public @NotNull Widget createWidgets(PanelSyncManager syncManager) { - SlotGroup filterInventory = new SlotGroup("filter_inv", 3, 1000, true); - var ignoreDamage = new BooleanSyncValue(this.filterReader::isIgnoreDamage, this.filterReader::setIgnoreDamage); - var ignoreNBT = new BooleanSyncValue(this.filterReader::isIgnoreNBT, this.filterReader::setIgnoreNBT); - - syncManager.registerSlotGroup(filterInventory); - - return Flow.row().coverChildren() - .child(SlotGroupWidget.builder() - .matrix("XXX", - "XXX", - "XXX") - .key('X', index -> new PhantomItemSlot() - .slot(SyncHandlers.itemSlot(this.filterReader, index) - .ignoreMaxStackSize(true) - .slotGroup(filterInventory) - .changeListener((newItem, onlyAmountChanged, client, init) -> { - if (onlyAmountChanged && !init) { - markDirty(); - } - })) - .tooltipAutoUpdate(true) - .tooltipTextColor(Color.GREY.main) - .tooltipBuilder(tooltip -> { - if (dirtyNotifiable instanceof CoverRoboticArm coverArm && - coverArm.getTransferMode() != TransferMode.TRANSFER_ANY || - dirtyNotifiable instanceof CoverItemVoidingAdvanced coverItem && - coverItem.getVoidingMode() != VoidingMode.VOID_ANY) { - int count = this.filterReader.getTagAt(index) - .getInteger(SimpleItemFilterReader.COUNT); - if (count > 0) { - tooltip.addLine(IKey.lang("cover.item_filter.config_amount")); - tooltip.addLine( - IKey.str("Count: %s", TextFormattingUtil.formatNumbers(count))); - } - } - })) - .build().marginRight(4)) - .child(Flow.column().width(18).coverChildren() - .child(createBlacklistUI()) - .child(new CycleButtonWidget() - .value(ignoreDamage) - .stateBackground(0, GTGuiTextures.BUTTON_IGNORE_DAMAGE[0]) - .stateBackground(1, GTGuiTextures.BUTTON_IGNORE_DAMAGE[1]) - .addTooltip(0, IKey.lang("cover.item_filter.ignore_damage.disabled")) - .addTooltip(1, IKey.lang("cover.item_filter.ignore_damage.enabled"))) - .child(new CycleButtonWidget() - .value(ignoreNBT) - .stateBackground(0, GTGuiTextures.BUTTON_IGNORE_NBT[0]) - .stateBackground(1, GTGuiTextures.BUTTON_IGNORE_NBT[1]) - .addTooltip(0, IKey.lang("cover.item_filter.ignore_nbt.disabled")) - .addTooltip(1, IKey.lang("cover.item_filter.ignore_nbt.enabled")))); + public BaseFilter copy() { + return new SimpleItemFilter(); } public static int itemFilterMatch(IItemHandler filterSlots, boolean ignoreDamage, diff --git a/src/main/java/gregtech/common/covers/filter/SmartItemFilter.java b/src/main/java/gregtech/common/covers/filter/SmartItemFilter.java index f35becde25d..e9957f011e1 100644 --- a/src/main/java/gregtech/common/covers/filter/SmartItemFilter.java +++ b/src/main/java/gregtech/common/covers/filter/SmartItemFilter.java @@ -1,8 +1,5 @@ package gregtech.common.covers.filter; -import gregtech.api.cover.CoverWithUI; -import gregtech.api.mui.GTGuiTextures; -import gregtech.api.mui.GTGuis; import gregtech.api.recipes.Recipe; import gregtech.api.recipes.RecipeMap; import gregtech.api.recipes.RecipeMaps; @@ -13,15 +10,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.IStringSerializable; -import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.screen.ModularPanel; -import com.cleanroommc.modularui.utils.Color; -import com.cleanroommc.modularui.value.BoolValue; -import com.cleanroommc.modularui.value.sync.EnumSyncValue; -import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import com.cleanroommc.modularui.widget.Widget; -import com.cleanroommc.modularui.widgets.ToggleButton; -import com.cleanroommc.modularui.widgets.layout.Flow; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import org.jetbrains.annotations.NotNull; @@ -29,11 +17,7 @@ public class SmartItemFilter extends BaseFilter { - private final SmartItemFilterReader filterReader; - - public SmartItemFilter(ItemStack stack) { - filterReader = new SmartItemFilterReader(stack); - } + private final SmartItemFilterReader filterReader = new SmartItemFilterReader(); @Override public SmartItemFilterReader getFilterReader() { @@ -87,72 +71,14 @@ public FilterType getType() { return FilterType.ITEM; } - @Override - public @NotNull ModularPanel createPopupPanel(PanelSyncManager syncManager, String panelName) { - return GTGuis.createPopupPanel(panelName, 98 + 27, 81, false) - .child(CoverWithUI.createTitleRow(getContainerStack())) - .child(createWidgets(syncManager).top(22).left(4)); - } - - @Override - public @NotNull ModularPanel createPanel(PanelSyncManager syncManager) { - return GTGuis.createPanel("smart_item_filter", 100, 100).padding(7); - } - - @Override - public @NotNull Widget createWidgets(PanelSyncManager syncManager) { - var filterMode = new EnumSyncValue<>(SmartFilteringMode.class, filterReader::getFilteringMode, - filterReader::setFilteringMode); - syncManager.syncValue("filter_mode", filterMode); - - return Flow.row().coverChildren() - .child(Flow.column().coverChildren().marginRight(4) - .child(createFilterModeButton(filterMode, SmartFilteringMode.ELECTROLYZER)) - .child(createFilterModeButton(filterMode, SmartFilteringMode.CENTRIFUGE)) - .child(createFilterModeButton(filterMode, SmartFilteringMode.SIFTER))) - .child(createBlacklistUI()); - } - - private Widget createFilterModeButton(EnumSyncValue value, - SmartFilteringMode mode) { - return new ToggleButton().height(18).width(18 * 5) - .value(boolValueOf(value, mode)) - .background(GTGuiTextures.MC_BUTTON) - .selectedBackground(GTGuiTextures.MC_BUTTON_DISABLED) - .overlay(IKey.lang(mode.getName()).color(Color.WHITE.darker(1))); - } - - protected > BoolValue.Dynamic boolValueOf(EnumSyncValue syncValue, T value) { - return new BoolValue.Dynamic(() -> syncValue.getValue() == value, $ -> syncValue.setValue(value)); - } - @Override public boolean showGlobalTransferLimitSlider() { return true; } - private static class ItemAndMetadataAndStackSize { - - public final ItemAndMetadata itemAndMetadata; - public final int transferStackSize; - - public ItemAndMetadataAndStackSize(ItemAndMetadata itemAndMetadata, int transferStackSize) { - this.itemAndMetadata = itemAndMetadata; - this.transferStackSize = transferStackSize; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof ItemAndMetadataAndStackSize)) return false; - ItemAndMetadataAndStackSize that = (ItemAndMetadataAndStackSize) o; - return itemAndMetadata.equals(that.itemAndMetadata); - } - - @Override - public int hashCode() { - return itemAndMetadata.hashCode(); - } + @Override + public BaseFilter copy() { + return new SmartItemFilter(); } public enum SmartFilteringMode implements IStringSerializable { diff --git a/src/main/java/gregtech/common/covers/filter/readers/BaseFilterReader.java b/src/main/java/gregtech/common/covers/filter/readers/BaseFilterReader.java index eee6a16a52a..b6c0c36aae6 100644 --- a/src/main/java/gregtech/common/covers/filter/readers/BaseFilterReader.java +++ b/src/main/java/gregtech/common/covers/filter/readers/BaseFilterReader.java @@ -2,6 +2,7 @@ import gregtech.api.util.IDirtyNotifiable; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; @@ -11,27 +12,24 @@ import org.jetbrains.annotations.NotNull; -public class BaseFilterReader implements FilterReader, INBTSerializable { +public class BaseFilterReader implements INBTSerializable { - protected ItemStack container; - private IDirtyNotifiable dirtyNotifiable; + protected @NotNull ItemStack container = new ItemStack((Item) null); // do not touch EMPTY directly + protected IDirtyNotifiable dirtyNotifiable; private final int size; private int maxTransferRate = 1; protected static final String BLACKLIST = "IsBlacklist"; protected static final String FILTER_CONTENTS = "FilterSlots"; protected static final String KEY_LEGACY_FILTER = "Filter"; - public BaseFilterReader(ItemStack container, int slots) { - this.container = container; - this.size = slots; + public BaseFilterReader(int size) { + this.size = size; } - @Override - public ItemStack getContainer() { + public @NotNull ItemStack getContainer() { return this.container; } - @Override public void readStack(@NotNull ItemStack stack) { this.container = stack; } @@ -57,7 +55,6 @@ public void readStack(@NotNull ItemStack stack) { return nbt; } - @Override public int getSize() { return this.size; } @@ -101,7 +98,6 @@ public int getMaxTransferRate() { return isBlacklistFilter() ? 1 : this.maxTransferRate; } - @Override public boolean validateSlotIndex(int slot) { return slot >= 0 && slot < getSize(); } @@ -115,10 +111,19 @@ public NBTTagCompound serializeNBT() { public void deserializeNBT(NBTTagCompound nbt) { if (nbt.hasKey(BLACKLIST)) setBlacklistFilter(nbt.getBoolean(BLACKLIST)); + markDirty(); } public void handleLegacyNBT(NBTTagCompound tag) { if (tag.hasKey(BLACKLIST)) setBlacklistFilter(tag.getBoolean(BLACKLIST)); } + + @NotNull + public NBTTagCompound getTagAt(int i) { + if (validateSlotIndex(i)) { + return getInventoryNbt().getCompoundTagAt(i); + } + return new NBTTagCompound(); + } } diff --git a/src/main/java/gregtech/common/covers/filter/readers/FilterReader.java b/src/main/java/gregtech/common/covers/filter/readers/FilterReader.java deleted file mode 100644 index 34efe945268..00000000000 --- a/src/main/java/gregtech/common/covers/filter/readers/FilterReader.java +++ /dev/null @@ -1,32 +0,0 @@ -package gregtech.common.covers.filter.readers; - -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; - -import org.jetbrains.annotations.NotNull; - -public interface FilterReader { - - ItemStack getContainer(); - - void readStack(ItemStack stack); - - @NotNull - NBTTagList getInventoryNbt(); - - @NotNull - NBTTagCompound getStackTag(); - - int getSize(); - - boolean validateSlotIndex(int slot); - - @NotNull - default NBTTagCompound getTagAt(int i) { - if (validateSlotIndex(i)) { - return getInventoryNbt().getCompoundTagAt(i); - } - return new NBTTagCompound(); - } -} diff --git a/src/main/java/gregtech/common/covers/filter/readers/OreDictFilterReader.java b/src/main/java/gregtech/common/covers/filter/readers/OreDictFilterReader.java index 070ec7fe764..cd739031926 100644 --- a/src/main/java/gregtech/common/covers/filter/readers/OreDictFilterReader.java +++ b/src/main/java/gregtech/common/covers/filter/readers/OreDictFilterReader.java @@ -4,7 +4,6 @@ import gregtech.api.util.oreglob.OreGlobCompileResult; import gregtech.common.covers.filter.oreglob.impl.ImpossibleOreGlob; -import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import org.jetbrains.annotations.NotNull; @@ -18,8 +17,8 @@ public class OreDictFilterReader extends SimpleItemFilterReader { private OreGlob glob = ImpossibleOreGlob.getInstance(); private OreGlobCompileResult result; - public OreDictFilterReader(ItemStack container) { - super(container, 0); + public OreDictFilterReader() { + super(0); } public void setExpression(String expression) { diff --git a/src/main/java/gregtech/common/covers/filter/readers/SimpleFluidFilterReader.java b/src/main/java/gregtech/common/covers/filter/readers/SimpleFluidFilterReader.java index c9ea2a4032a..13dba2ee4ec 100644 --- a/src/main/java/gregtech/common/covers/filter/readers/SimpleFluidFilterReader.java +++ b/src/main/java/gregtech/common/covers/filter/readers/SimpleFluidFilterReader.java @@ -1,6 +1,5 @@ package gregtech.common.covers.filter.readers; -import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraftforge.common.util.Constants; @@ -17,8 +16,8 @@ public class SimpleFluidFilterReader extends BaseFilterReader { protected static final String LEGACY_FLUIDFILTER_KEY = "FluidFilter"; - public SimpleFluidFilterReader(ItemStack container, int slots) { - super(container, slots); + public SimpleFluidFilterReader(int slots) { + super(slots); fluidTanks = new WritableFluidTank[slots]; } @@ -53,6 +52,7 @@ public void setFluidAmounts(int amount) { for (int i = 0; i < getSize(); i++) { getFluidTank(i).setFluidAmount(amount); } + markDirty(); } @Override diff --git a/src/main/java/gregtech/common/covers/filter/readers/SimpleItemFilterReader.java b/src/main/java/gregtech/common/covers/filter/readers/SimpleItemFilterReader.java index 84a66fe90b2..062a261437a 100644 --- a/src/main/java/gregtech/common/covers/filter/readers/SimpleItemFilterReader.java +++ b/src/main/java/gregtech/common/covers/filter/readers/SimpleItemFilterReader.java @@ -1,6 +1,10 @@ package gregtech.common.covers.filter.readers; import gregtech.api.util.GTUtility; +import gregtech.common.covers.CoverItemVoidingAdvanced; +import gregtech.common.covers.CoverRoboticArm; +import gregtech.common.covers.TransferMode; +import gregtech.common.covers.VoidingMode; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -19,8 +23,8 @@ public class SimpleItemFilterReader extends BaseFilterReader implements IItemHan public static final String RESPECT_NBT = "IgnoreNBT"; public static final String RESPECT_DAMAGE = "IgnoreDamage"; - public SimpleItemFilterReader(ItemStack container, int slots) { - super(container, slots); + public SimpleItemFilterReader(int slots) { + super(slots); } public void setIgnoreDamage(boolean ignoreDamage) { @@ -144,6 +148,17 @@ protected int getStackLimit(int slot, @NotNull ItemStack stack) { return Math.min(getSlotLimit(slot), stack.getMaxStackSize()); } + public boolean shouldShowCount() { + return dirtyNotifiable instanceof CoverRoboticArm coverArm && + coverArm.getTransferMode() != TransferMode.TRANSFER_ANY || + dirtyNotifiable instanceof CoverItemVoidingAdvanced coverItem && + coverItem.getVoidingMode() != VoidingMode.VOID_ANY; + } + + public int getStackCountInSlot(int slot) { + return getTagAt(slot).getInteger(COUNT); + } + @Override public void onTransferRateChange() { for (int i = 0; i < getSlots(); i++) { diff --git a/src/main/java/gregtech/common/covers/filter/readers/SmartItemFilterReader.java b/src/main/java/gregtech/common/covers/filter/readers/SmartItemFilterReader.java index ca96ed549c2..8c4bd711312 100644 --- a/src/main/java/gregtech/common/covers/filter/readers/SmartItemFilterReader.java +++ b/src/main/java/gregtech/common/covers/filter/readers/SmartItemFilterReader.java @@ -2,15 +2,14 @@ import gregtech.common.covers.filter.SmartItemFilter; -import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -public class SmartItemFilterReader extends SimpleItemFilterReader { +public class SmartItemFilterReader extends BaseFilterReader { private static final String FILTER_MODE = "FilterMode"; - public SmartItemFilterReader(ItemStack container) { - super(container, 0); + public SmartItemFilterReader() { + super(0); } public SmartItemFilter.SmartFilteringMode getFilteringMode() { diff --git a/src/main/java/gregtech/common/items/MetaItem1.java b/src/main/java/gregtech/common/items/MetaItem1.java index b528f3c1041..4e7b6cee638 100644 --- a/src/main/java/gregtech/common/items/MetaItem1.java +++ b/src/main/java/gregtech/common/items/MetaItem1.java @@ -26,7 +26,6 @@ import gregtech.api.util.RandomPotionEffect; import gregtech.common.ConfigHolder; import gregtech.common.blocks.MetaBlocks; -import gregtech.common.covers.filter.IFilter; import gregtech.common.covers.filter.OreDictionaryItemFilter; import gregtech.common.covers.filter.SimpleFluidFilter; import gregtech.common.covers.filter.SimpleItemFilter; @@ -52,8 +51,8 @@ import gregtech.common.items.behaviors.TricorderBehavior; import gregtech.common.items.behaviors.TurbineRotorBehavior; import gregtech.common.items.behaviors.filter.OreDictFilterUIManager; -import gregtech.common.items.behaviors.filter.SimpleFilterUIManager; import gregtech.common.items.behaviors.filter.SimpleFluidFilterUIManager; +import gregtech.common.items.behaviors.filter.SimpleItemFilterUIManager; import gregtech.common.items.behaviors.filter.SmartFilterUIManager; import gregtech.common.items.behaviors.monitorplugin.AdvancedMonitorPluginBehavior; import gregtech.common.items.behaviors.monitorplugin.FakeGuiPluginBehavior; @@ -629,17 +628,17 @@ public void registerSubItems() { // Filters: ID 290-300 FLUID_FILTER = addItem(290, "fluid_filter") .setRecyclingData(new RecyclingData(new MaterialStack(Materials.Zinc, M * 2))) - .addComponents(new SimpleFluidFilterUIManager(), IFilter.factory(SimpleFluidFilter::new)); + .addComponents(new SimpleFluidFilterUIManager(), new SimpleFluidFilter()); ITEM_FILTER = addItem(291, "item_filter") .setRecyclingData(new RecyclingData(new MaterialStack(Materials.Zinc, M * 2), new MaterialStack(Materials.Steel, M))) - .addComponents(new SimpleFilterUIManager(), IFilter.factory(SimpleItemFilter::new)); + .addComponents(new SimpleItemFilterUIManager(), new SimpleItemFilter()); ORE_DICTIONARY_FILTER = addItem(292, "ore_dictionary_filter") .setRecyclingData(new RecyclingData(new MaterialStack(Materials.Zinc, M * 2))) - .addComponents(new OreDictFilterUIManager(), IFilter.factory(OreDictionaryItemFilter::new)); + .addComponents(new OreDictFilterUIManager(), new OreDictionaryItemFilter()); SMART_FILTER = addItem(293, "smart_item_filter") .setRecyclingData(new RecyclingData(new MaterialStack(Materials.Zinc, M * 3 / 2))) - .addComponents(new SmartFilterUIManager(), IFilter.factory(SmartItemFilter::new)); + .addComponents(new SmartFilterUIManager(), new SmartItemFilter()); // Functional Covers: ID 301-330 COVER_MACHINE_CONTROLLER = addItem(301, "cover.controller"); diff --git a/src/main/java/gregtech/common/items/behaviors/filter/BaseFilterUIManager.java b/src/main/java/gregtech/common/items/behaviors/filter/BaseFilterUIManager.java index 91161663700..3be029e1042 100644 --- a/src/main/java/gregtech/common/items/behaviors/filter/BaseFilterUIManager.java +++ b/src/main/java/gregtech/common/items/behaviors/filter/BaseFilterUIManager.java @@ -3,9 +3,12 @@ import gregtech.api.cover.CoverWithUI; import gregtech.api.items.gui.ItemUIFactory; import gregtech.api.items.metaitem.stats.IItemBehaviour; +import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuiTheme; import gregtech.api.mui.GTGuis; import gregtech.api.mui.factory.MetaItemGuiFactory; +import gregtech.common.covers.filter.BaseFilter; +import gregtech.common.covers.filter.readers.BaseFilterReader; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.EntityPlayer; @@ -15,10 +18,19 @@ import net.minecraft.util.EnumHand; import net.minecraft.world.World; +import com.cleanroommc.modularui.api.IPanelHandler; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.api.widget.IWidget; import com.cleanroommc.modularui.factory.HandGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.screen.UISettings; +import com.cleanroommc.modularui.value.sync.BooleanSyncValue; +import com.cleanroommc.modularui.value.sync.PanelSyncHandler; import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widget.ParentWidget; +import com.cleanroommc.modularui.widget.Widget; +import com.cleanroommc.modularui.widgets.CycleButtonWidget; +import org.jetbrains.annotations.NotNull; import java.util.List; @@ -37,11 +49,29 @@ public final ActionResult onItemRightClick(World world, EntityPlayer } @Override - public abstract ModularPanel buildUI(HandGuiData guiData, PanelSyncManager guiSyncManager, UISettings settings); + public ModularPanel buildUI(HandGuiData guiData, PanelSyncManager guiSyncManager, UISettings settings) { + return buildUI(guiData.getUsedItemStack(), guiData, guiSyncManager, settings); + } + + public ModularPanel buildUI(ItemStack stack, HandGuiData guiData, PanelSyncManager syncManager, + UISettings settings) { + return createBasePanel(stack) + .child(CoverWithUI.createTitleRow(stack)) + .child(createWidgets(stack, syncManager) + .marginTop(18)) + .bindPlayerInventory(); + } - protected final ModularPanel createBasePanel(ItemStack stack) { - return GTGuis.createPanel(stack, 176, 188) - .child(CoverWithUI.createTitleRow(stack)); + /** + * Called when opening the filter panel from the hand + * + * @param stack filter stack + * @return the sized panel + */ + // panel when opening ui in hand + protected ModularPanel createBasePanel(ItemStack stack) { + return GTGuis.createPanel(stack, 176, 166) + .padding(7); } @Override @@ -53,4 +83,50 @@ public GTGuiTheme getUITheme() { public void addInformation(ItemStack itemStack, List lines) { lines.add(I18n.format("behaviour.filter_ui_manager")); } + + public IPanelHandler createPanelHandler(ItemStack stack, PanelSyncManager syncManager, int id) { + String translationKey = stack.getTranslationKey(); + return syncManager.getOrCreateSyncHandler(translationKey, id, PanelSyncHandler.class, () -> { + String key = PanelSyncManager.makeSyncKey(translationKey, id); + return (PanelSyncHandler) syncManager.panel(key, + (psm, $) -> createPopupPanel(stack, psm, key) + .child(CoverWithUI.createTitleRow(stack)) + .child(createWidgets(stack, syncManager) + .marginTop(18)), + true); + }); + } + + // panel when opening ui in another ui + public @NotNull ModularPanel createPopupPanel(ItemStack stack, PanelSyncManager syncManager, String panelName) { + return GTGuis.createPopupPanel(panelName, 98, 81); + } + + // panel when opening as a cover + @NotNull + public abstract ModularPanel createPanel(ItemStack stack, PanelSyncManager syncManager); + + /** Creates the widgets standalone so that they can be put into their own panel */ + + @NotNull + public abstract Widget createWidgets(ItemStack stack, PanelSyncManager syncManager); + + public BaseFilterReader getFilterReader(ItemStack stack) { + BaseFilterReader filterReader = BaseFilter.getFilterFromStack(stack).getFilterReader(); + filterReader.readStack(stack); + return filterReader; + } + + public IWidget createBlacklistUI(ItemStack filterStack) { + BaseFilterReader filterReader = getFilterReader(filterStack); + return new ParentWidget<>().coverChildren() + .child(new CycleButtonWidget() + .value(new BooleanSyncValue( + filterReader::isBlacklistFilter, + filterReader::setBlacklistFilter)) + .stateBackground(0, GTGuiTextures.BUTTON_BLACKLIST[0]) + .stateBackground(1, GTGuiTextures.BUTTON_BLACKLIST[1]) + .addTooltip(0, IKey.lang("cover.filter.blacklist.disabled")) + .addTooltip(1, IKey.lang("cover.filter.blacklist.enabled"))); + } } diff --git a/src/main/java/gregtech/common/items/behaviors/filter/OreDictFilterUIManager.java b/src/main/java/gregtech/common/items/behaviors/filter/OreDictFilterUIManager.java index 08e19f607cf..d8af056d6ba 100644 --- a/src/main/java/gregtech/common/items/behaviors/filter/OreDictFilterUIManager.java +++ b/src/main/java/gregtech/common/items/behaviors/filter/OreDictFilterUIManager.java @@ -1,20 +1,219 @@ package gregtech.common.items.behaviors.filter; +import gregtech.api.mui.GTGuiTextures; +import gregtech.api.mui.GTGuis; +import gregtech.api.util.oreglob.OreGlobCompileResult; import gregtech.common.covers.filter.BaseFilter; +import gregtech.common.covers.filter.OreDictionaryItemFilter; +import gregtech.common.covers.filter.readers.OreDictFilterReader; +import gregtech.common.mui.widget.HighlightedTextField; +import gregtech.common.mui.widget.orefilter.OreFilterTestSlot; -import com.cleanroommc.modularui.factory.HandGuiData; +import net.minecraft.client.resources.I18n; +import net.minecraft.item.ItemStack; +import net.minecraft.util.text.TextFormatting; + +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.drawable.UITexture; import com.cleanroommc.modularui.screen.ModularPanel; -import com.cleanroommc.modularui.screen.UISettings; +import com.cleanroommc.modularui.screen.RichTooltip; +import com.cleanroommc.modularui.utils.BooleanConsumer; +import com.cleanroommc.modularui.utils.Color; +import com.cleanroommc.modularui.value.sync.BooleanSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.value.sync.StringSyncValue; +import com.cleanroommc.modularui.widget.Widget; +import com.cleanroommc.modularui.widgets.CycleButtonWidget; import com.cleanroommc.modularui.widgets.SlotGroupWidget; +import com.cleanroommc.modularui.widgets.layout.Flow; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; public class OreDictFilterUIManager extends BaseFilterUIManager { @Override - public ModularPanel buildUI(HandGuiData guiData, PanelSyncManager guiSyncManager, UISettings settings) { - var filter = BaseFilter.getFilterFromStack(guiData.getUsedItemStack()); - return createBasePanel(filter.getContainerStack()).height(160) - .child(filter.createWidgets(guiSyncManager).top(22).margin(7, 0)) - .child(SlotGroupWidget.playerInventory(true)); + protected ModularPanel createBasePanel(ItemStack stack) { + return super.createBasePanel(stack) + .height(160); + } + + @Override + public @NotNull ModularPanel createPopupPanel(ItemStack stack, PanelSyncManager syncManager, String panelName) { + return super.createPopupPanel(stack, syncManager, panelName) + .size(188, 76) + .padding(7); + } + + @Override + public @NotNull ModularPanel createPanel(ItemStack stack, PanelSyncManager syncManager) { + return GTGuis.createPanel("ore_dict_filter", 100, 100); + } + + @Override + public @NotNull Widget createWidgets(ItemStack stack, PanelSyncManager syncManager) { + OreDictionaryItemFilter filter = (OreDictionaryItemFilter) BaseFilter.getFilterFromStack(stack); + OreDictFilterReader filterReader = filter.getFilterReader(); + filterReader.readStack(stack); + + List oreSlots = new ArrayList<>(); + var expression = new StringSyncValue(filterReader::getExpression, filterReader::setExpression); + + BooleanConsumer setCaseSensitive = b -> { + filterReader.setCaseSensitive(b); + if (!syncManager.isClient()) return; + for (var slot : oreSlots) { + slot.updatePreview(); + } + }; + + BooleanConsumer setMatchAll = b -> { + filter.clearCache(); + filterReader.setMatchAll(b); + if (!syncManager.isClient()) return; + for (var slot : oreSlots) { + slot.setMatchAll(b); + } + }; + + var caseSensitive = new BooleanSyncValue(filterReader::isCaseSensitive, setCaseSensitive); + var matchAll = new BooleanSyncValue(filterReader::shouldMatchAll, setMatchAll); + + return Flow.column().coverChildren() + .name("root.widget.col") + .child(new HighlightedTextField() + .setHighlightRule(this::highlightRule) + .onUnfocus(() -> { + for (var slot : oreSlots) { + slot.updatePreview(); + } + }) + .name("oredict.text_field") + .setTextColor(Color.WHITE.darker(1)) + .value(expression).marginBottom(4) + .height(18).widthRel(1f)) + .child(Flow.row().coverChildrenHeight() + .name("oredict.info.row") + .widthRel(1f) + .child(Flow.column().height(18) + .name("oredict.info.status.col") + .coverChildrenWidth().marginRight(2) + .child(GTGuiTextures.OREDICT_INFO.asWidget() + .name("oredict.info.icon") + .size(8).top(0) + .addTooltipLine(IKey.lang("cover.ore_dictionary_filter.info"))) + .child(new Widget<>() + .name("oredict.status.icon") + .size(8).bottom(0) + .onUpdateListener(widget -> getStatusIcon(filterReader.getResult(), widget)) + .tooltipBuilder(richTooltip -> createStatusTooltip(filterReader.getResult(), + richTooltip)) + .tooltip(tooltip -> tooltip.setAutoUpdate(true)))) + .child(SlotGroupWidget.builder() + .row("XXXXX") + .key('X', i -> { + var slot = new OreFilterTestSlot() + .setGlobSupplier(filterReader::getGlob); + slot.setMatchAll(filterReader.shouldMatchAll()); + oreSlots.add(slot); + return slot.name("oredict.test_slot." + i); + }) + .build().name("oredict.test.slot_group").marginRight(2)) + .child(new CycleButtonWidget() + .name("oredict.button.case_sensitive") + .size(18).value(caseSensitive) + .marginRight(2) + .stateBackground(0, GTGuiTextures.BUTTON_CASE_SENSITIVE[0]) + .stateBackground(1, GTGuiTextures.BUTTON_CASE_SENSITIVE[1]) + .addTooltip(0, + IKey.lang("cover.ore_dictionary_filter.button.case_sensitive.disabled")) + .addTooltip(1, + IKey.lang("cover.ore_dictionary_filter.button.case_sensitive.enabled"))) + .child(new CycleButtonWidget() + .name("oredict.button.match_all") + .size(18).value(matchAll) + .marginRight(2) + .stateBackground(0, GTGuiTextures.BUTTON_MATCH_ALL[0]) + .stateBackground(1, GTGuiTextures.BUTTON_MATCH_ALL[1]) + .addTooltip(0, + IKey.lang("cover.ore_dictionary_filter.button.match_all.disabled")) + .addTooltip(1, + IKey.lang("cover.ore_dictionary_filter.button.match_all.enabled"))) + .child(createBlacklistUI(stack))); + } + + protected void getStatusIcon(OreGlobCompileResult result, Widget widget) { + UITexture texture; + + if (result == null) { + texture = GTGuiTextures.OREDICT_WAITING; + } else if (result.getReports().length == 0) { + texture = GTGuiTextures.OREDICT_SUCCESS; + } else if (result.hasError()) { + texture = GTGuiTextures.OREDICT_ERROR; + } else { + texture = GTGuiTextures.OREDICT_WARN; + } + widget.background(texture); + } + + protected void createStatusTooltip(OreGlobCompileResult result, RichTooltip tooltip) { + if (result == null) return; + List list = new ArrayList<>(); + + int error = 0, warn = 0; + for (OreGlobCompileResult.Report report : result.getReports()) { + if (report.isError()) error++; + else warn++; + list.add((report.isError() ? TextFormatting.RED : TextFormatting.GOLD) + report.toString()); + } + if (error > 0) { + if (warn > 0) { + list.add(0, I18n.format("cover.ore_dictionary_filter.status.err_warn", error, warn)); + } else { + list.add(0, I18n.format("cover.ore_dictionary_filter.status.err", error)); + } + } else { + if (warn > 0) { + list.add(0, I18n.format("cover.ore_dictionary_filter.status.warn", warn)); + } else { + list.add(I18n.format("cover.ore_dictionary_filter.status.no_issues")); + } + list.add(""); + list.add(I18n.format("cover.ore_dictionary_filter.status.explain")); + list.add(""); + list.addAll(result.getInstance().toFormattedString()); + } + tooltip.addStringLines(list); + } + + protected String highlightRule(String text) { + StringBuilder builder = new StringBuilder(text); + for (int i = 0; i < builder.length(); i++) { + switch (builder.charAt(i)) { + case '|', '&', '^', '(', ')' -> { + builder.insert(i, TextFormatting.GOLD); + i += 2; + } + case '*', '?' -> { + builder.insert(i, TextFormatting.GREEN); + i += 2; + } + case '!' -> { + builder.insert(i, TextFormatting.RED); + i += 2; + } + case '\\' -> { + builder.insert(i++, TextFormatting.YELLOW); + i += 2; + } + default -> { + continue; + } + } + builder.insert(i + 1, TextFormatting.RESET); + } + return builder.toString(); } } diff --git a/src/main/java/gregtech/common/items/behaviors/filter/SimpleFilterUIManager.java b/src/main/java/gregtech/common/items/behaviors/filter/SimpleFilterUIManager.java deleted file mode 100644 index eb33ca66fcb..00000000000 --- a/src/main/java/gregtech/common/items/behaviors/filter/SimpleFilterUIManager.java +++ /dev/null @@ -1,23 +0,0 @@ -package gregtech.common.items.behaviors.filter; - -import gregtech.common.covers.filter.BaseFilter; - -import com.cleanroommc.modularui.factory.HandGuiData; -import com.cleanroommc.modularui.screen.ModularPanel; -import com.cleanroommc.modularui.screen.UISettings; -import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import com.cleanroommc.modularui.widgets.SlotGroupWidget; - -public class SimpleFilterUIManager extends BaseFilterUIManager { - - @Override - public ModularPanel buildUI(HandGuiData guiData, PanelSyncManager guiSyncManager, UISettings settings) { - var filter = BaseFilter.getFilterFromStack(guiData.getUsedItemStack()); - return createBasePanel(filter.getContainerStack()) - .height(166) - .child(filter.createWidgets(guiSyncManager) - .top(22) - .left(7)) - .child(SlotGroupWidget.playerInventory(true)); - } -} diff --git a/src/main/java/gregtech/common/items/behaviors/filter/SimpleFluidFilterUIManager.java b/src/main/java/gregtech/common/items/behaviors/filter/SimpleFluidFilterUIManager.java index 915746faacd..6197212370b 100644 --- a/src/main/java/gregtech/common/items/behaviors/filter/SimpleFluidFilterUIManager.java +++ b/src/main/java/gregtech/common/items/behaviors/filter/SimpleFluidFilterUIManager.java @@ -1,23 +1,46 @@ package gregtech.common.items.behaviors.filter; -import gregtech.common.covers.filter.BaseFilter; +import gregtech.api.mui.GTGuis; +import gregtech.common.covers.filter.readers.SimpleFluidFilterReader; +import gregtech.common.mui.widget.GTFluidSlot; + +import net.minecraft.item.ItemStack; -import com.cleanroommc.modularui.factory.HandGuiData; import com.cleanroommc.modularui.screen.ModularPanel; -import com.cleanroommc.modularui.screen.UISettings; import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widget.Widget; import com.cleanroommc.modularui.widgets.SlotGroupWidget; +import com.cleanroommc.modularui.widgets.layout.Flow; +import org.jetbrains.annotations.NotNull; public class SimpleFluidFilterUIManager extends BaseFilterUIManager { @Override - public ModularPanel buildUI(HandGuiData guiData, PanelSyncManager guiSyncManager, UISettings settings) { - var filter = BaseFilter.getFilterFromStack(guiData.getUsedItemStack()); - return createBasePanel(filter.getContainerStack()) - .height(166) - .child(filter.createWidgets(guiSyncManager) - .top(22) - .left(7)) - .child(SlotGroupWidget.playerInventory(true)); + public @NotNull ModularPanel createPopupPanel(ItemStack stack, PanelSyncManager syncManager, String panelName) { + return super.createPopupPanel(stack, syncManager, panelName) + .padding(4); + } + + @Override + public @NotNull ModularPanel createPanel(ItemStack stack, PanelSyncManager syncManager) { + return GTGuis.createPanel(stack, 176, 168); + } + + @Override + public @NotNull Widget createWidgets(ItemStack stack, PanelSyncManager syncManager) { + SimpleFluidFilterReader filterReader = (SimpleFluidFilterReader) getFilterReader(stack); + return Flow.row().coverChildren() + .alignX(0f) + .child(SlotGroupWidget.builder() + .matrix("FFF", + "FFF", + "FFF") + .key('F', i -> new GTFluidSlot() + .syncHandler(GTFluidSlot.sync(filterReader.getFluidTank(i)) + .phantom(true) + .showAmountOnSlot(filterReader::shouldShowAmount) + .showAmountInTooltip(filterReader::shouldShowAmount))) + .build().marginRight(4)) + .child(createBlacklistUI(stack)); } } diff --git a/src/main/java/gregtech/common/items/behaviors/filter/SimpleItemFilterUIManager.java b/src/main/java/gregtech/common/items/behaviors/filter/SimpleItemFilterUIManager.java new file mode 100644 index 00000000000..dcdf19f934d --- /dev/null +++ b/src/main/java/gregtech/common/items/behaviors/filter/SimpleItemFilterUIManager.java @@ -0,0 +1,90 @@ +package gregtech.common.items.behaviors.filter; + +import gregtech.api.mui.GTGuiTextures; +import gregtech.api.mui.GTGuis; +import gregtech.api.util.TextFormattingUtil; +import gregtech.common.covers.filter.readers.SimpleItemFilterReader; + +import net.minecraft.item.ItemStack; + +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.utils.Color; +import com.cleanroommc.modularui.value.sync.BooleanSyncValue; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.value.sync.SyncHandlers; +import com.cleanroommc.modularui.widget.Widget; +import com.cleanroommc.modularui.widgets.CycleButtonWidget; +import com.cleanroommc.modularui.widgets.SlotGroupWidget; +import com.cleanroommc.modularui.widgets.layout.Flow; +import com.cleanroommc.modularui.widgets.slot.PhantomItemSlot; +import com.cleanroommc.modularui.widgets.slot.SlotGroup; +import org.jetbrains.annotations.NotNull; + +public class SimpleItemFilterUIManager extends BaseFilterUIManager { + + @Override + public @NotNull ModularPanel createPopupPanel(ItemStack stack, PanelSyncManager syncManager, String panelName) { + return super.createPopupPanel(stack, syncManager, panelName) + .padding(4); + } + + @Override + public @NotNull ModularPanel createPanel(ItemStack stack, PanelSyncManager syncManager) { + return GTGuis.createPanel("simple_item_filter", 176, 166); + } + + @SuppressWarnings("UnstableApiUsage") + @Override + public @NotNull Widget createWidgets(ItemStack stack, PanelSyncManager syncManager) { + SimpleItemFilterReader filterReader = (SimpleItemFilterReader) getFilterReader(stack); + SlotGroup filterInventory = new SlotGroup("filter_inv", 3, 1000, true); + var ignoreDamage = new BooleanSyncValue(filterReader::isIgnoreDamage, filterReader::setIgnoreDamage); + var ignoreNBT = new BooleanSyncValue(filterReader::isIgnoreNBT, filterReader::setIgnoreNBT); + + syncManager.registerSlotGroup(filterInventory); + + return Flow.row().coverChildren() + .alignX(0f) + .child(SlotGroupWidget.builder() + .matrix("XXX", + "XXX", + "XXX") + .key('X', index -> new PhantomItemSlot() + .slot(SyncHandlers.itemSlot(filterReader, index) + .ignoreMaxStackSize(true) + .slotGroup(filterInventory) + .changeListener((newItem, onlyAmountChanged, client, init) -> { + if (onlyAmountChanged && !init) { + filterReader.markDirty(); + } + })) + .tooltipAutoUpdate(true) + .tooltipTextColor(Color.GREY.main) + .tooltipBuilder(tooltip -> { + if (filterReader.shouldShowCount()) { + int count = filterReader.getStackCountInSlot(index); + if (count > 0) { + tooltip.addLine(IKey.lang("cover.item_filter.config_amount")); + tooltip.addLine( + IKey.str("Count: %s", TextFormattingUtil.formatNumbers(count))); + } + } + })) + .build().marginRight(4)) + .child(Flow.column().width(18).coverChildren() + .child(createBlacklistUI(stack)) + .child(new CycleButtonWidget() + .value(ignoreDamage) + .stateBackground(0, GTGuiTextures.BUTTON_IGNORE_DAMAGE[0]) + .stateBackground(1, GTGuiTextures.BUTTON_IGNORE_DAMAGE[1]) + .addTooltip(0, IKey.lang("cover.item_filter.ignore_damage.disabled")) + .addTooltip(1, IKey.lang("cover.item_filter.ignore_damage.enabled"))) + .child(new CycleButtonWidget() + .value(ignoreNBT) + .stateBackground(0, GTGuiTextures.BUTTON_IGNORE_NBT[0]) + .stateBackground(1, GTGuiTextures.BUTTON_IGNORE_NBT[1]) + .addTooltip(0, IKey.lang("cover.item_filter.ignore_nbt.disabled")) + .addTooltip(1, IKey.lang("cover.item_filter.ignore_nbt.enabled")))); + } +} diff --git a/src/main/java/gregtech/common/items/behaviors/filter/SmartFilterUIManager.java b/src/main/java/gregtech/common/items/behaviors/filter/SmartFilterUIManager.java index 0f8f96ed76a..63d6c7ac008 100644 --- a/src/main/java/gregtech/common/items/behaviors/filter/SmartFilterUIManager.java +++ b/src/main/java/gregtech/common/items/behaviors/filter/SmartFilterUIManager.java @@ -1,20 +1,63 @@ package gregtech.common.items.behaviors.filter; -import gregtech.common.covers.filter.BaseFilter; +import gregtech.api.mui.GTGuiTextures; +import gregtech.api.mui.GTGuis; +import gregtech.common.covers.filter.SmartItemFilter; +import gregtech.common.covers.filter.readers.SmartItemFilterReader; -import com.cleanroommc.modularui.factory.HandGuiData; +import net.minecraft.item.ItemStack; + +import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.screen.ModularPanel; -import com.cleanroommc.modularui.screen.UISettings; +import com.cleanroommc.modularui.utils.Color; +import com.cleanroommc.modularui.value.BoolValue; +import com.cleanroommc.modularui.value.sync.EnumSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import com.cleanroommc.modularui.widgets.SlotGroupWidget; +import com.cleanroommc.modularui.widget.Widget; +import com.cleanroommc.modularui.widgets.ToggleButton; +import com.cleanroommc.modularui.widgets.layout.Flow; +import org.jetbrains.annotations.NotNull; public class SmartFilterUIManager extends BaseFilterUIManager { @Override - public ModularPanel buildUI(HandGuiData guiData, PanelSyncManager guiSyncManager, UISettings settings) { - var filter = BaseFilter.getFilterFromStack(guiData.getUsedItemStack()); - return createBasePanel(filter.getContainerStack()).height(166) - .child(filter.createWidgets(guiSyncManager).left(7).top(22)) - .child(SlotGroupWidget.playerInventory(true)); + public @NotNull ModularPanel createPopupPanel(ItemStack stack, PanelSyncManager syncManager, String panelName) { + return super.createPopupPanel(stack, syncManager, panelName) + .width(98 + 27); + } + + @Override + public @NotNull ModularPanel createPanel(ItemStack stack, PanelSyncManager syncManager) { + return GTGuis.createPanel("smart_item_filter", 100, 100) + .padding(7); + } + + @Override + public @NotNull Widget createWidgets(ItemStack stack, PanelSyncManager syncManager) { + SmartItemFilterReader filterReader = (SmartItemFilterReader) getFilterReader(stack); + var filterMode = new EnumSyncValue<>(SmartItemFilter.SmartFilteringMode.class, filterReader::getFilteringMode, + filterReader::setFilteringMode); + syncManager.syncValue("filter_mode", filterMode); + + return Flow.row().coverChildren() + .alignX(0f) + .child(Flow.column().coverChildren().marginRight(4) + .child(createFilterModeButton(filterMode, SmartItemFilter.SmartFilteringMode.ELECTROLYZER)) + .child(createFilterModeButton(filterMode, SmartItemFilter.SmartFilteringMode.CENTRIFUGE)) + .child(createFilterModeButton(filterMode, SmartItemFilter.SmartFilteringMode.SIFTER))) + .child(createBlacklistUI(stack)); + } + + private Widget createFilterModeButton(EnumSyncValue value, + SmartItemFilter.SmartFilteringMode mode) { + return new ToggleButton().height(18).width(18 * 5) + .value(boolValueOf(value, mode)) + .background(GTGuiTextures.MC_BUTTON) + .selectedBackground(GTGuiTextures.MC_BUTTON_DISABLED) + .overlay(IKey.lang(mode.getName()).color(Color.WHITE.darker(1))); + } + + protected > BoolValue.Dynamic boolValueOf(EnumSyncValue syncValue, T value) { + return new BoolValue.Dynamic(() -> syncValue.getValue() == value, $ -> syncValue.setValue(value)); } }