diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/IMuiCover.java b/src/main/java/com/gregtechceu/gtceu/api/cover/IMuiCover.java index 8896f1cd874..d5d961d7b79 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/IMuiCover.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/IMuiCover.java @@ -3,7 +3,6 @@ import com.gregtechceu.gtceu.api.mui.GTGuiScreen; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.common.mui.GTGuiTheme; -import com.gregtechceu.gtceu.common.mui.GTGuis; import com.gregtechceu.gtceu.common.mui.GTMuiWidgets; import brachy.modularui.api.IUIHolder; diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/gui/GTRecipeTypeUILayout.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/gui/GTRecipeTypeUILayout.java index 41b9ad13f03..c914115b2f3 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/gui/GTRecipeTypeUILayout.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/gui/GTRecipeTypeUILayout.java @@ -1,6 +1,5 @@ package com.gregtechceu.gtceu.api.recipe.gui; -import brachy.modularui.screen.ModularPanel; import com.gregtechceu.gtceu.api.capability.recipe.*; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; @@ -9,6 +8,7 @@ import brachy.modularui.api.drawable.IDrawable; import brachy.modularui.drawable.UITexture; +import brachy.modularui.screen.ModularPanel; import brachy.modularui.theme.ThemeAPI; import brachy.modularui.value.sync.DoubleSyncValue; import brachy.modularui.value.sync.PanelSyncManager; diff --git a/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java b/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java index c60319cf363..bee68be921f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java @@ -1,6 +1,5 @@ package com.gregtechceu.gtceu.common; -import brachy.modularui.factory.GuiManager; import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTCEuAPI; import com.gregtechceu.gtceu.api.GTValues; @@ -81,6 +80,7 @@ import net.minecraftforge.fml.javafmlmod.FMLModContainer; import net.minecraftforge.registries.RegisterEvent; +import brachy.modularui.factory.GuiManager; import com.google.common.collect.Multimaps; import com.tterrag.registrate.providers.ProviderType; import com.tterrag.registrate.providers.RegistrateLangProvider; diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ItemMagnetBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ItemMagnetBehavior.java index c0af0800eec..5f9de4d8384 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ItemMagnetBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ItemMagnetBehavior.java @@ -5,23 +5,20 @@ import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; import com.gregtechceu.gtceu.api.capability.IElectricItem; import com.gregtechceu.gtceu.api.cover.filter.ItemFilter; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.UITemplate; +import com.gregtechceu.gtceu.api.cover.filter.SimpleItemFilter; +import com.gregtechceu.gtceu.api.cover.filter.TagItemFilter; import com.gregtechceu.gtceu.api.gui.widget.EnumSelectorWidget; import com.gregtechceu.gtceu.api.item.ComponentItem; import com.gregtechceu.gtceu.api.item.IComponentItem; import com.gregtechceu.gtceu.api.item.component.IAddInformation; import com.gregtechceu.gtceu.api.item.component.IInteractionItem; import com.gregtechceu.gtceu.api.item.component.IItemLifeCycle; -import com.gregtechceu.gtceu.api.item.component.IItemUIFactory; +import com.gregtechceu.gtceu.api.mui.IItemUIHolder; import com.gregtechceu.gtceu.common.data.GTItems; +import com.gregtechceu.gtceu.common.mui.GTGuiTextures; -import com.lowdragmc.lowdraglib.gui.factory.HeldItemUIFactory; -import com.lowdragmc.lowdraglib.gui.modular.ModularUI; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; -import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; -import com.lowdragmc.lowdraglib.gui.widget.Widget; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; @@ -44,15 +41,34 @@ import net.minecraftforge.event.entity.player.PlayerXpEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; +import brachy.modularui.api.drawable.IKey; +import brachy.modularui.drawable.ItemDrawable; +import brachy.modularui.factory.PlayerInventoryGuiData; +import brachy.modularui.factory.UIFactories; +import brachy.modularui.screen.ModularPanel; +import brachy.modularui.screen.RichTooltip; +import brachy.modularui.screen.UISettings; +import brachy.modularui.value.sync.*; +import brachy.modularui.widget.ParentWidget; +import brachy.modularui.widgets.CycleButtonWidget; +import brachy.modularui.widgets.PagedWidget; +import brachy.modularui.widgets.SlotGroupWidget; +import brachy.modularui.widgets.ToggleButton; +import brachy.modularui.widgets.layout.Flow; +import brachy.modularui.widgets.layout.Grid; +import brachy.modularui.widgets.slot.ModularSlot; +import brachy.modularui.widgets.slot.PhantomItemSlot; +import brachy.modularui.widgets.textfield.TextFieldWidget; import com.tterrag.registrate.util.entry.ItemEntry; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import oshi.util.tuples.Triplet; import top.theillusivec4.curios.api.CuriosApi; -import java.util.*; +import java.util.EnumMap; +import java.util.List; +import java.util.Map; -public class ItemMagnetBehavior implements IInteractionItem, IItemLifeCycle, IAddInformation, IItemUIFactory { +public class ItemMagnetBehavior implements IInteractionItem, IItemLifeCycle, IAddInformation, IItemUIHolder { public static final String FILTER_TAG = "MagnetFilter"; public static final String FILTER_ORDINAL_TAG = "FilterOrdinal"; @@ -67,56 +83,119 @@ public ItemMagnetBehavior(int range) { } @Override - public ModularUI createUI(HeldItemUIFactory.HeldItemHolder holder, Player entityPlayer) { - var held = holder.getHeld(); - var tag = held.getOrCreateTag(); - var selected = Filter.get(tag.getInt(FILTER_ORDINAL_TAG)); - var widgets = new HashSet>(); - var stacks = new HashMap(); - var ui = new ModularUI(176, 157, holder, entityPlayer) - .background(GuiTextures.BACKGROUND) - .widget(new EnumSelectorWidget<>(146, 5, 20, 20, - Filter.values(), selected, (val) -> updateSelection(tag, val, widgets))) - .widget(UITemplate.bindPlayerInventory(entityPlayer.getInventory(), GuiTextures.SLOT, 7, 75, true)); - for (var f : Filter.values()) { - var stack = f.getFilter(held); - stack.setTag(tag.getCompound(FILTER_TAG).copy()); - stacks.put(f, stack); - var description = new LabelWidget(5, 5, stack.getDescriptionId()); - var config = ItemFilter - .loadFilter(stack) - .openConfigurator((176 - 80) / 2, (60 - 55) / 2 + 15); - var visible = f == selected; - description.setVisible(visible); - config.setVisible(visible); - widgets.add(new Triplet<>(f, description, config)); - ui.widget(description); - ui.widget(config); + public ModularPanel buildUI(PlayerInventoryGuiData data, PanelSyncManager syncManager, UISettings settings) { + ItemStack held = data.getUsedItemStack(); + CompoundTag heldTag = held.getOrCreateTag(); + + Filter selectedFilter = Filter.get(heldTag.getInt(FILTER_ORDINAL_TAG)); + Map stacks = new EnumMap<>(Filter.class); + CompoundTag startFilterTag = heldTag.getCompound(FILTER_TAG).copy(); + for (Filter filter : Filter.values()) { + ItemStack stack = filter.getFilter(held); + stack.setTag(startFilterTag.copy()); + stacks.put(filter, stack); } - ui.registerCloseListener(() -> { - var selection = Filter.get(tag.getInt(FILTER_ORDINAL_TAG)); - tag.put(FILTER_TAG, stacks.get(selection).getOrCreateTag()); + + EnumSyncValue filterSync = new EnumSyncValue<>(Filter.class, + () -> Filter.get(data.getUsedItemStack().getOrCreateTag().getInt(FILTER_ORDINAL_TAG)), + filter -> data.getUsedItemStack().getOrCreateTag().putInt(FILTER_ORDINAL_TAG, filter.ordinal())); + + PagedWidget pages = new PagedWidget<>() + .left((176 - 80) / 2) + .top((60 - 55) / 2 + 15) + .size(80, 55) + .initialPage(selectedFilter.ordinal()) + .addPage(createSimpleFilterPage((SimpleItemFilter) ItemFilter.loadFilter(stacks.get(Filter.SIMPLE)))) + .addPage(createTagFilterPage((TagItemFilter) ItemFilter.loadFilter(stacks.get(Filter.TAG)))); + pages.onUpdateListener(widget -> { + int selected = filterSync.getIntValue(); + if (selected != widget.getCurrentPageIndex()) { + widget.setPage(selected); + } }); - return ui; - } - private void updateSelection(CompoundTag tag, Filter filter, Collection> widgets) { - tag.putInt(FILTER_ORDINAL_TAG, filter.ordinal()); - widgets.forEach(tri -> { - var visible = tri.getA() == filter; - tri.getB().setVisible(visible); - tri.getC().setVisible(visible); + syncManager.addCloseListener(player -> { + ItemStack stack = data.getUsedItemStack(); + CompoundTag tag = stack.getOrCreateTag(); + Filter selected = Filter.get(tag.getInt(FILTER_ORDINAL_TAG)); + tag.put(FILTER_TAG, stacks.get(selected).getOrCreateTag().copy()); }); + + return new ModularPanel<>("item_magnet") + .size(176, 157) + .background(GTGuiTextures.BACKGROUND) + .child(IKey.dynamic(() -> Component.translatable(filterSync.getValue().getTooltip())) + .asWidget() + .left(5) + .top(5)) + .child(new CycleButtonWidget() + .left(146) + .top(5) + .size(20) + .value(filterSync) + .stateCount(Filter.values().length) + .stateOverlay(Filter.SIMPLE, new ItemDrawable(GTItems.ITEM_FILTER.asItem())) + .stateOverlay(Filter.TAG, new ItemDrawable(GTItems.TAG_FILTER.asItem())) + .tooltipBuilder(r -> r.addLine(IKey.dynamic( + () -> Component.translatable(filterSync.getValue().getTooltip()))))) + .child(pages) + .child(SlotGroupWidget.playerInventory(false).left(7).top(75).disableSortButtons()); + } + + private ParentWidget createSimpleFilterPage(SimpleItemFilter filter) { + SimpleItemFilter.FilterItemStackHandler handler = new SimpleItemFilter.FilterItemStackHandler(filter); + + Grid filterGrid = new Grid() + .coverChildren() + .mapTo(3, 9, i -> new PhantomItemSlot() + .size(16) + .syncHandler(new PhantomItemSlotSyncHandler(new ModularSlot(handler, i) + .changeListener((stack, amount, client, init) -> handler.setStackInSlot(i, stack)) + .ignoreMaxStackSize(true).accessibility(true, false)))); + + BooleanSyncValue blacklist = new BooleanSyncValue(filter::isBlackList, filter::setBlackList); + + BooleanSyncValue ignoreNBT = new BooleanSyncValue(filter::isIgnoreNbt, filter::setIgnoreNbt); + + Flow filterButtons = Flow.col() + .coverChildren() + .child(new ToggleButton().stateBackground(GTGuiTextures.BUTTON_BLACKLIST).value(blacklist)) + .child(new ToggleButton().stateBackground(GTGuiTextures.BUTTON_IGNORE_NBT).value(ignoreNBT)); + + return new ParentWidget<>() + .size(80, 55) + .child(filterGrid.left(0).top(0)) + .child(filterButtons.left(58).top(0)); + } + + private ParentWidget createTagFilterPage(TagItemFilter filter) { + StringSyncValue filterString = new StringSyncValue(filter::getFilterString, filter::setFilterString); + RichTooltip infoTooltip = new RichTooltip().add("cover.tag_filter.info"); + + return new ParentWidget<>() + .size(80, 55) + .child(Flow.row() + .coverChildren() + .left(0) + .top(18) + .child(new TextFieldWidget() + .width(62) + .value(filterString)) + .child(GTGuiTextures.INFO.asWidget() + .size(16) + .tooltip(infoTooltip))); } @Override public InteractionResultHolder use(Item item, Level world, @NotNull Player player, InteractionHand hand) { - if (!player.level().isClientSide && player.isShiftKeyDown()) { - player.displayClientMessage(Component.translatable(toggleActive(player.getItemInHand(hand)) ? - "behavior.item_magnet.enabled" : "behavior.item_magnet.disabled"), true); - } else { - IItemUIFactory.super.use(item, world, player, hand); + if (!player.level().isClientSide) { + if (player.isShiftKeyDown()) { + player.displayClientMessage(Component.translatable(toggleActive(player.getItemInHand(hand)) ? + "behavior.item_magnet.enabled" : "behavior.item_magnet.disabled"), true); + } else { + UIFactories.playerInventory().openFromHand(player, hand); + } } return InteractionResultHolder.pass(player.getItemInHand(hand)); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/mui/GTGuis.java b/src/main/java/com/gregtechceu/gtceu/common/mui/GTGuis.java index d3170c65ccb..7e3eb4c4971 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/mui/GTGuis.java +++ b/src/main/java/com/gregtechceu/gtceu/common/mui/GTGuis.java @@ -9,5 +9,4 @@ public class GTGuis { public static ModularPanel createPanel(MetaMachine machine, int width, int height) { return ModularPanel.defaultPanel(machine.getDefinition().getId().getPath(), width, height); } - } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEStockingBusPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEStockingBusPartMachine.java index 592f5e8ebe1..18be34949c6 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEStockingBusPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEStockingBusPartMachine.java @@ -10,7 +10,6 @@ import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.common.item.behavior.IntCircuitBehaviour; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; -import com.gregtechceu.gtceu.common.mui.GTGuis; import com.gregtechceu.gtceu.common.mui.widgets.PopupPanel; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.integration.ae2.machine.feature.multiblock.IMEStockingPart; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEStockingHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEStockingHatchPartMachine.java index 2014d1693e4..5824cb69a7c 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEStockingHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEStockingHatchPartMachine.java @@ -10,7 +10,6 @@ import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.common.item.behavior.IntCircuitBehaviour; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; -import com.gregtechceu.gtceu.common.mui.GTGuis; import com.gregtechceu.gtceu.common.mui.widgets.PopupPanel; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.integration.ae2.machine.feature.multiblock.IMEStockingPart;