From 46b79cd1a987a90026667c796c70f01019b0f576 Mon Sep 17 00:00:00 2001 From: zetrock1 Date: Sun, 21 Dec 2025 15:20:38 +0300 Subject: [PATCH 1/7] mui without phantom slot and importItems --- .../machine/storage/CreativeChestMachine.java | 65 +++++----- .../machine/storage/QuantumChestMachine.java | 114 +++++++++++++++++- 2 files changed, 140 insertions(+), 39 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeChestMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeChestMachine.java index 18fedcda324..28ca2952d7d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeChestMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeChestMachine.java @@ -1,14 +1,9 @@ package com.gregtechceu.gtceu.common.machine.storage; import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.widget.PhantomSlotWidget; import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; -import com.lowdragmc.lowdraglib.gui.texture.ResourceBorderTexture; -import com.lowdragmc.lowdraglib.gui.texture.TextTexture; import com.lowdragmc.lowdraglib.gui.widget.*; import com.lowdragmc.lowdraglib.syncdata.annotation.DropSaved; import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; @@ -103,35 +98,37 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play return InteractionResult.PASS; } - @Override - public Widget createUIWidget() { - var group = new WidgetGroup(0, 0, 176, 131); - group.addWidget(new PhantomSlotWidget(cache, 0, 36, 6) - .setClearSlotOnRightClick(true) - .setMaxStackSize(1) - .setBackgroundTexture(GuiTextures.SLOT) - .setChangeListener(this::markDirty)); - group.addWidget(new LabelWidget(7, 9, "gtceu.creative.chest.item")); - group.addWidget(new ImageWidget(7, 48, 154, 14, GuiTextures.DISPLAY)); - group.addWidget(new TextFieldWidget(9, 50, 152, 10, () -> String.valueOf(itemsPerCycle), this::setItemsPerCycle) - .setMaxStringLength(11) - .setNumbersOnly(1, Integer.MAX_VALUE)); - group.addWidget(new LabelWidget(7, 28, "gtceu.creative.chest.ipc")); - group.addWidget(new ImageWidget(7, 85, 154, 14, GuiTextures.DISPLAY)); - group.addWidget(new TextFieldWidget(9, 87, 152, 10, () -> String.valueOf(ticksPerCycle), this::setTicksPerCycle) - .setMaxStringLength(11) - .setNumbersOnly(1, Integer.MAX_VALUE)); - group.addWidget(new LabelWidget(7, 65, "gtceu.creative.chest.tpc")); - group.addWidget(new SwitchWidget(7, 101, 162, 20, (clickData, value) -> setWorkingEnabled(value)) - .setTexture( - new GuiTextureGroup(ResourceBorderTexture.BUTTON_COMMON, - new TextTexture("gtceu.creative.activity.off")), - new GuiTextureGroup(ResourceBorderTexture.BUTTON_COMMON, - new TextTexture("gtceu.creative.activity.on"))) - .setPressed(isWorkingEnabled())); - - return group; - } + /* + * @Override + * public Widget createUIWidget() { + * var group = new WidgetGroup(0, 0, 176, 131); + * group.addWidget(new PhantomSlotWidget(cache, 0, 36, 6) + * .setClearSlotOnRightClick(true) + * .setMaxStackSize(1) + * .setBackgroundTexture(GuiTextures.SLOT) + * .setChangeListener(this::markDirty)); + * group.addWidget(new LabelWidget(7, 9, "gtceu.creative.chest.item")); + * group.addWidget(new ImageWidget(7, 48, 154, 14, GuiTextures.DISPLAY)); + * group.addWidget(new TextFieldWidget(9, 50, 152, 10, () -> String.valueOf(itemsPerCycle), this::setItemsPerCycle) + * .setMaxStringLength(11) + * .setNumbersOnly(1, Integer.MAX_VALUE)); + * group.addWidget(new LabelWidget(7, 28, "gtceu.creative.chest.ipc")); + * group.addWidget(new ImageWidget(7, 85, 154, 14, GuiTextures.DISPLAY)); + * group.addWidget(new TextFieldWidget(9, 87, 152, 10, () -> String.valueOf(ticksPerCycle), this::setTicksPerCycle) + * .setMaxStringLength(11) + * .setNumbersOnly(1, Integer.MAX_VALUE)); + * group.addWidget(new LabelWidget(7, 65, "gtceu.creative.chest.tpc")); + * group.addWidget(new SwitchWidget(7, 101, 162, 20, (clickData, value) -> setWorkingEnabled(value)) + * .setTexture( + * new GuiTextureGroup(ResourceBorderTexture.BUTTON_COMMON, + * new TextTexture("gtceu.creative.activity.off")), + * new GuiTextureGroup(ResourceBorderTexture.BUTTON_COMMON, + * new TextTexture("gtceu.creative.activity.on"))) + * .setPressed(isWorkingEnabled())); + * + * return group; + * } + */ @Override public ManagedFieldHolder getFieldHolder() { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java index 266c2e3c0e2..9c9df7e1b89 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java @@ -11,13 +11,26 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredMachine; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; -import com.gregtechceu.gtceu.api.machine.feature.IDropSaveMachine; -import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; -import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; +import com.gregtechceu.gtceu.api.machine.feature.*; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; +import com.gregtechceu.gtceu.api.mui.base.drawable.IKey; +import com.gregtechceu.gtceu.api.mui.base.widget.IWidget; +import com.gregtechceu.gtceu.api.mui.factory.PosGuiData; +import com.gregtechceu.gtceu.api.mui.utils.Alignment; +import com.gregtechceu.gtceu.api.mui.value.BoolValue; +import com.gregtechceu.gtceu.api.mui.value.sync.*; +import com.gregtechceu.gtceu.api.mui.widget.ParentWidget; +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.slot.ItemSlot; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; +import com.gregtechceu.gtceu.client.mui.screen.ModularPanel; +import com.gregtechceu.gtceu.client.mui.screen.UISettings; +import com.gregtechceu.gtceu.common.data.mui.GTMuiMachineUtil; +import com.gregtechceu.gtceu.common.data.mui.GTMuiWidgets; +import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTMath; import com.gregtechceu.gtceu.utils.GTTransferUtils; @@ -66,7 +79,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class QuantumChestMachine extends TieredMachine implements IAutoOutputItem, IInteractedMachine, IControllable, - IDropSaveMachine, IFancyUIMachine { + IDropSaveMachine, IMuiMachine { public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(QuantumChestMachine.class, MetaMachine.MANAGED_FIELD_HOLDER); @@ -362,6 +375,97 @@ public ItemStack getLockedItem() { // *********** GUI ***********// ////////////////////////////////////// + @Override + public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { + LongSyncValue itemSyncer = new LongSyncValue(this::getStoredAmount, (ignored) -> {}); + syncManager.syncValue("item_amount", itemSyncer); + + return new ModularPanel(this.getDefinition().getName()) + .child( + // Top half of the screen + new ParentWidget<>() + .widthRel(1) + .height(20 + 60) + // Box that has the display texture BG + + // the buttons / text / etc + .child(new ParentWidget<>() + .background(GTGuiTextures.DISPLAY) + .size(90, 63) + .align(Alignment.CENTER) + .child(IKey.lang("gtceu.machine.quantum_chest.items_stored").asWidget() + .color(0xffffff) + .margin(8, 0, 8, 0)) + .child(IKey.dynamic( + () -> Component.literal( + FormattingUtil.formatNumbers(itemSyncer.getLongValue()))) + .asWidget() + .color(0xffffff) + .margin(8, 0, 18, 0)) + .child(Flow.row() + .margin(4, 0, 41, 0) + .coverChildren() + .child(createAutoOutputItemButton(syncManager)) + .child(createItemLockButton(syncManager)) + .child(createVoidButton(syncManager))) + .child(Flow.column() + .margin(68, 0, 23, 0) + .coverChildren() + .child(GTMuiMachineUtil.createSquareSlotGroupFromInventory( + cache, "stored", + syncManager))) + // .child(createitemSlot(syncManager)) + // .child(createPhantomLockeditemSlot(syncManager)) + )) + .child(GTMuiWidgets.createTitleBar(getDefinition(), 176, GTGuiTextures.BACKGROUND)) + .child(SlotGroupWidget.playerInventory(false).left(7).bottom(7)); + } + + private ToggleButton createAutoOutputItemButton(PanelSyncManager syncManager) { + BooleanSyncValue itemOutputs = new BooleanSyncValue(this::isAutoOutputItems, + this::setAutoOutputItems); + syncManager.syncValue("auto_output_items", itemOutputs); + return new ToggleButton() + .value(new BoolValue.Dynamic(itemOutputs::getBoolValue, itemOutputs::setBoolValue)) + .overlay(GTGuiTextures.BUTTON_ITEM_OUTPUT) + .tooltipAutoUpdate(true) + .tooltipBuilder( + (r) -> r.addLine(IKey.lang(Component.translatable("gtceu.machine.quantum_chest.items_stored", + Component.translatable(itemOutputs.getBoolValue() ? "cover.voiding.label.enabled" : + "cover.voiding.label.disabled"))))); + } + + private ToggleButton createItemLockButton(PanelSyncManager syncManager) { + BooleanSyncValue itemLocked = new BooleanSyncValue(this::isLocked, + this::setLocked); + syncManager.syncValue("item_locked", itemLocked); + return new ToggleButton() + .value(new BoolValue.Dynamic(itemLocked::getBoolValue, itemLocked::setBoolValue)) + .overlay(GTGuiTextures.BUTTON_LOCK) + .tooltipAutoUpdate(true) + .tooltipBuilder((r) -> r.addLine(IKey.lang(itemLocked.getBoolValue() ? + "gtceu.gui.item_lock.tooltip.enabled" : + "gtceu.gui.item_lock.tooltip.disabled"))); + } + + private ToggleButton createVoidButton(PanelSyncManager syncManager) { + BooleanSyncValue voiding = new BooleanSyncValue(() -> this.isVoiding, + (voidingBool) -> { this.isVoiding = voidingBool; }); + syncManager.syncValue("is_voiding", voiding); + return new ToggleButton() + .value(new BoolValue.Dynamic(voiding::getBoolValue, voiding::setBoolValue)) + .overlay(GTGuiTextures.BUTTON_VOID) + .tooltipAutoUpdate(true) + .tooltipBuilder((r) -> r.addLine(IKey.lang(voiding.getBoolValue() ? + "gtceu.gui.item_voiding_partial.tooltip.enabled" : + "gtceu.gui.item_voiding_partial.tooltip.disabled"))); + } + + private IWidget createItemSlot(PanelSyncManager syncManager) { + syncManager.syncValue("item_slot", + SyncHandlers.itemSlot(cache, 0).getSyncHandler()); + return new ItemSlot().syncHandler("item_slot", 0).background(GTGuiTextures.SLOT); + } + public Widget createUIWidget() { var group = new WidgetGroup(0, 0, 109, 63); var importItems = createImportItems(); From 0530ba9a78b73719ec0663635cf260eb603b8337 Mon Sep 17 00:00:00 2001 From: zetrock1 Date: Sun, 21 Dec 2025 18:56:46 +0300 Subject: [PATCH 2/7] import slot --- .../machine/storage/QuantumChestMachine.java | 68 +++++++++++++++---- 1 file changed, 56 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java index 9c9df7e1b89..7e4235a61a5 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java @@ -28,7 +28,6 @@ import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.client.mui.screen.ModularPanel; import com.gregtechceu.gtceu.client.mui.screen.UISettings; -import com.gregtechceu.gtceu.common.data.mui.GTMuiMachineUtil; import com.gregtechceu.gtceu.common.data.mui.GTMuiWidgets; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.utils.FormattingUtil; @@ -379,6 +378,7 @@ public ItemStack getLockedItem() { public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { LongSyncValue itemSyncer = new LongSyncValue(this::getStoredAmount, (ignored) -> {}); syncManager.syncValue("item_amount", itemSyncer); + // SlotGroup group = new SlotGroup("item_inv", 1, 0, true); return new ModularPanel(this.getDefinition().getName()) .child( @@ -410,12 +410,23 @@ public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISet .child(Flow.column() .margin(68, 0, 23, 0) .coverChildren() - .child(GTMuiMachineUtil.createSquareSlotGroupFromInventory( - cache, "stored", - syncManager))) - // .child(createitemSlot(syncManager)) - // .child(createPhantomLockeditemSlot(syncManager)) - )) + // .child(GTMuiMachineUtil.createSquareSlotGroupFromInventory( + // cache, "stored", + // syncManager)) + /* + * .child(GTMuiMachineUtil.createSlotGroupFromInventory( + * cache, "stored", + * 1, 'B', + * slot -> slot.background(GTGuiTextures.SLOT, GTGuiTextures.SLOT), + * syncManager, + * "B")) + */ + .child(createImportItemSlot(syncManager)) + .child(createOutputItemSlot(syncManager)) + // .child(createPhantomLockeditemSlot(syncManager)) + )) + + ) .child(GTMuiWidgets.createTitleBar(getDefinition(), 176, GTGuiTextures.BACKGROUND)) .child(SlotGroupWidget.playerInventory(false).left(7).bottom(7)); } @@ -460,11 +471,44 @@ private ToggleButton createVoidButton(PanelSyncManager syncManager) { "gtceu.gui.item_voiding_partial.tooltip.disabled"))); } - private IWidget createItemSlot(PanelSyncManager syncManager) { - syncManager.syncValue("item_slot", - SyncHandlers.itemSlot(cache, 0).getSyncHandler()); - return new ItemSlot().syncHandler("item_slot", 0).background(GTGuiTextures.SLOT); - } + private IWidget createImportItemSlot(PanelSyncManager syncManager) { + var importItems = createImportItems(); + ItemSlot slot = new ItemSlot() + .slot(SyncHandlers.itemSlot(importItems, 0) + // .slotGroup(group) + .changeListener((newItem, amount, client, init) -> { + if (amount) { + importItems.onContentsChanged(0); + } + }) + // .ignoreMaxStackSize(true) + .accessibility(true, false)); + // slot.getSlot().isPhantom() + // syncManager.syncValue("item_slot",SyncHandlers.itemSlot(slot)); + return slot; + } + + private IWidget createOutputItemSlot(PanelSyncManager syncManager) { + ItemSlot slot = new ItemSlot() + .slot(SyncHandlers.itemSlot(cache, 0) + // .slotGroup(group) + .changeListener((newItem, amount, client, init) -> { + if (amount) { + cache.onChanged(); + } + }).ignoreMaxStackSize(true) + .accessibility(false, true)); + // slot.getSlot().isPhantom() + // syncManager.syncValue("item_slot",SyncHandlers.itemSlot(slot)); + return slot; + } + /* + * private IWidget createPhantomLockedFluidSlot(PanelSyncManager syncManager) { + * syncManager.syncValue("locked_fluid_slot", + * new ItemSlot(lockedItem).controlsAmount(false).phantom(true)); + * return new FluidSlot().syncHandler("locked_fluid_slot", 0).background(GTGuiTextures.FLUID_SLOT); + * } + */ public Widget createUIWidget() { var group = new WidgetGroup(0, 0, 109, 63); From 0a60678d130773908eaf1a1b1aafb7a590a162a6 Mon Sep 17 00:00:00 2001 From: zetrock1 Date: Sun, 21 Dec 2025 18:58:34 +0300 Subject: [PATCH 3/7] some fix --- .../machine/storage/QuantumChestMachine.java | 97 +++++++++---------- 1 file changed, 46 insertions(+), 51 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java index 7e4235a61a5..52d95c937db 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java @@ -3,9 +3,6 @@ import com.gregtechceu.gtceu.api.capability.IControllable; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.widget.PhantomSlotWidget; -import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; -import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MetaMachine; @@ -34,9 +31,6 @@ import com.gregtechceu.gtceu.utils.GTMath; import com.gregtechceu.gtceu.utils.GTTransferUtils; -import com.lowdragmc.lowdraglib.gui.editor.Icons; -import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; -import com.lowdragmc.lowdraglib.gui.texture.ResourceBorderTexture; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; import com.lowdragmc.lowdraglib.gui.widget.*; import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; @@ -510,51 +504,52 @@ private IWidget createOutputItemSlot(PanelSyncManager syncManager) { * } */ - public Widget createUIWidget() { - var group = new WidgetGroup(0, 0, 109, 63); - var importItems = createImportItems(); - group.addWidget(new ImageWidget(4, 4, 81, 55, GuiTextures.DISPLAY)) - .addWidget(new LabelWidget(8, 8, "gtceu.machine.quantum_chest.items_stored")) - .addWidget(new LabelWidget(8, 18, () -> FormattingUtil.formatNumbers(storedAmount)) - .setTextColor(-1) - .setDropShadow(true)) - .addWidget(new SlotWidget(importItems, 0, 87, 5, false, true) - .setBackgroundTexture(new GuiTextureGroup(GuiTextures.SLOT, GuiTextures.IN_SLOT_OVERLAY))) - .addWidget(new SlotWidget(cache, 0, 87, 23, false, false) - .setItemHook(s -> s.copyWithCount((int) Math.min(storedAmount, s.getMaxStackSize()))) - .setBackgroundTexture(GuiTextures.SLOT)) - .addWidget(new ButtonWidget(87, 42, 18, 18, - new GuiTextureGroup(ResourceBorderTexture.BUTTON_COMMON, Icons.DOWN.scale(0.7f)), cd -> { - if (!cd.isRemote) { - if (!stored.isEmpty()) { - var extracted = cache.extractItem(0, - (int) Math.min(storedAmount, stored.getMaxStackSize()), false); - if (!group.getGui().entityPlayer.addItem(extracted)) { - Block.popResource(group.getGui().entityPlayer.level(), - group.getGui().entityPlayer.getOnPos(), extracted); - } - } - } - })) - .addWidget(new PhantomSlotWidget(lockedItem, 0, 58, 41, - stack -> stored.isEmpty() || ItemStack.isSameItemSameTags(stack, stored)) - .setMaxStackSize(1)) - .addWidget(new ToggleButtonWidget(4, 41, 18, 18, - GuiTextures.BUTTON_ITEM_OUTPUT, this::isAutoOutputItems, this::setAutoOutputItems) - .setShouldUseBaseBackground() - .setTooltipText("gtceu.gui.item_auto_output.tooltip")) - .addWidget(new ToggleButtonWidget(22, 41, 18, 18, - GuiTextures.BUTTON_LOCK, this::isLocked, this::setLocked) - .setShouldUseBaseBackground() - .setTooltipText("gtceu.gui.item_lock.tooltip")) - .addWidget(new ToggleButtonWidget(40, 41, 18, 18, - GuiTextures.BUTTON_VOID, () -> isVoiding, (b) -> isVoiding = b) - .setShouldUseBaseBackground() - .setTooltipText("gtceu.gui.item_voiding_partial.tooltip")); - group.setBackground(GuiTextures.BACKGROUND_INVERSE); - return group; - } - + /* + * public Widget createUIWidget() { + * var group = new WidgetGroup(0, 0, 109, 63); + * var importItems = createImportItems(); + * group.addWidget(new ImageWidget(4, 4, 81, 55, GuiTextures.DISPLAY)) + * .addWidget(new LabelWidget(8, 8, "gtceu.machine.quantum_chest.items_stored")) + * .addWidget(new LabelWidget(8, 18, () -> FormattingUtil.formatNumbers(storedAmount)) + * .setTextColor(-1) + * .setDropShadow(true)) + * .addWidget(new SlotWidget(importItems, 0, 87, 5, false, true) + * .setBackgroundTexture(new GuiTextureGroup(GuiTextures.SLOT, GuiTextures.IN_SLOT_OVERLAY))) + * .addWidget(new SlotWidget(cache, 0, 87, 23, false, false) + * .setItemHook(s -> s.copyWithCount((int) Math.min(storedAmount, s.getMaxStackSize()))) + * .setBackgroundTexture(GuiTextures.SLOT)) + * .addWidget(new ButtonWidget(87, 42, 18, 18, + * new GuiTextureGroup(ResourceBorderTexture.BUTTON_COMMON, Icons.DOWN.scale(0.7f)), cd -> { + * if (!cd.isRemote) { + * if (!stored.isEmpty()) { + * var extracted = cache.extractItem(0, + * (int) Math.min(storedAmount, stored.getMaxStackSize()), false); + * if (!group.getGui().entityPlayer.addItem(extracted)) { + * Block.popResource(group.getGui().entityPlayer.level(), + * group.getGui().entityPlayer.getOnPos(), extracted); + * } + * } + * } + * })) + * .addWidget(new PhantomSlotWidget(lockedItem, 0, 58, 41, + * stack -> stored.isEmpty() || ItemStack.isSameItemSameTags(stack, stored)) + * .setMaxStackSize(1)) + * .addWidget(new ToggleButtonWidget(4, 41, 18, 18, + * GuiTextures.BUTTON_ITEM_OUTPUT, this::isAutoOutputItems, this::setAutoOutputItems) + * .setShouldUseBaseBackground() + * .setTooltipText("gtceu.gui.item_auto_output.tooltip")) + * .addWidget(new ToggleButtonWidget(22, 41, 18, 18, + * GuiTextures.BUTTON_LOCK, this::isLocked, this::setLocked) + * .setShouldUseBaseBackground() + * .setTooltipText("gtceu.gui.item_lock.tooltip")) + * .addWidget(new ToggleButtonWidget(40, 41, 18, 18, + * GuiTextures.BUTTON_VOID, () -> isVoiding, (b) -> isVoiding = b) + * .setShouldUseBaseBackground() + * .setTooltipText("gtceu.gui.item_voiding_partial.tooltip")); + * group.setBackground(GuiTextures.BACKGROUND_INVERSE); + * return group; + * } + */ private @NotNull CustomItemStackHandler createImportItems() { var importItems = new CustomItemStackHandler(); importItems.setFilter(cache::canInsert); From 67a5771c05611498eeca618b4d512c974ded6fbe Mon Sep 17 00:00:00 2001 From: zetrock1 Date: Sun, 21 Dec 2025 19:15:43 +0300 Subject: [PATCH 4/7] add lockedItem slot --- .../machine/storage/QuantumChestMachine.java | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java index 52d95c937db..f4adfb134db 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java @@ -20,7 +20,7 @@ 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.slot.ItemSlot; +import com.gregtechceu.gtceu.api.mui.widgets.slot.*; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.client.mui.screen.ModularPanel; @@ -417,8 +417,7 @@ public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISet */ .child(createImportItemSlot(syncManager)) .child(createOutputItemSlot(syncManager)) - // .child(createPhantomLockeditemSlot(syncManager)) - )) + .child(createPhantomLockeditemSlot(syncManager)))) ) .child(GTMuiWidgets.createTitleBar(getDefinition(), 176, GTGuiTextures.BACKGROUND)) @@ -477,8 +476,6 @@ private IWidget createImportItemSlot(PanelSyncManager syncManager) { }) // .ignoreMaxStackSize(true) .accessibility(true, false)); - // slot.getSlot().isPhantom() - // syncManager.syncValue("item_slot",SyncHandlers.itemSlot(slot)); return slot; } @@ -496,6 +493,22 @@ private IWidget createOutputItemSlot(PanelSyncManager syncManager) { // syncManager.syncValue("item_slot",SyncHandlers.itemSlot(slot)); return slot; } + + private IWidget createPhantomLockeditemSlot(PanelSyncManager syncManager) { + PhantomItemSlot slot = new PhantomItemSlot() + .slot(SyncHandlers.itemSlot(lockedItem, 0) + // .slotGroup(group) + .changeListener((newItem, amount, client, init) -> { + if (amount) { + lockedItem.onContentsChanged(0); + } + }).ignoreMaxStackSize(true) + .accessibility(true, false)); + + // slot.getSlot().isPhantom() + // syncManager.syncValue("item_slot",SyncHandlers.itemSlot(slot)); + return slot; + } /* * private IWidget createPhantomLockedFluidSlot(PanelSyncManager syncManager) { * syncManager.syncValue("locked_fluid_slot", From 30e3c250ee4f55851ffb66fda76a7965295e268d Mon Sep 17 00:00:00 2001 From: zetrock1 Date: Sun, 21 Dec 2025 19:37:03 +0300 Subject: [PATCH 5/7] phantom slot will be fixed later --- .../gtceu/common/machine/storage/QuantumChestMachine.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java index f4adfb134db..3a35196c811 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java @@ -402,7 +402,7 @@ public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISet .child(createItemLockButton(syncManager)) .child(createVoidButton(syncManager))) .child(Flow.column() - .margin(68, 0, 23, 0) + .margin(68, 0, 15, 0) .coverChildren() // .child(GTMuiMachineUtil.createSquareSlotGroupFromInventory( // cache, "stored", @@ -500,11 +500,12 @@ private IWidget createPhantomLockeditemSlot(PanelSyncManager syncManager) { // .slotGroup(group) .changeListener((newItem, amount, client, init) -> { if (amount) { + lockedItem.setOnContentsChanged(() -> { lockedItem.getStackInSlot(0).setCount(1); }); lockedItem.onContentsChanged(0); + lockedItem.getStackInSlot(0).setCount(1); } - }).ignoreMaxStackSize(true) + }) .accessibility(true, false)); - // slot.getSlot().isPhantom() // syncManager.syncValue("item_slot",SyncHandlers.itemSlot(slot)); return slot; From 7cba6714d31ca7f3571490c40636aa29a7709027 Mon Sep 17 00:00:00 2001 From: zetrock1 Date: Mon, 22 Dec 2025 09:51:31 +0300 Subject: [PATCH 6/7] Now it works fine --- .../machine/storage/QuantumChestMachine.java | 134 ++---------------- 1 file changed, 13 insertions(+), 121 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java index 3a35196c811..6325d5c51f5 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java @@ -404,19 +404,7 @@ public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISet .child(Flow.column() .margin(68, 0, 15, 0) .coverChildren() - // .child(GTMuiMachineUtil.createSquareSlotGroupFromInventory( - // cache, "stored", - // syncManager)) - /* - * .child(GTMuiMachineUtil.createSlotGroupFromInventory( - * cache, "stored", - * 1, 'B', - * slot -> slot.background(GTGuiTextures.SLOT, GTGuiTextures.SLOT), - * syncManager, - * "B")) - */ - .child(createImportItemSlot(syncManager)) - .child(createOutputItemSlot(syncManager)) + .child(createItemSlot(syncManager)) .child(createPhantomLockeditemSlot(syncManager)))) ) @@ -464,118 +452,22 @@ private ToggleButton createVoidButton(PanelSyncManager syncManager) { "gtceu.gui.item_voiding_partial.tooltip.disabled"))); } - private IWidget createImportItemSlot(PanelSyncManager syncManager) { - var importItems = createImportItems(); - ItemSlot slot = new ItemSlot() - .slot(SyncHandlers.itemSlot(importItems, 0) - // .slotGroup(group) - .changeListener((newItem, amount, client, init) -> { - if (amount) { - importItems.onContentsChanged(0); - } - }) - // .ignoreMaxStackSize(true) - .accessibility(true, false)); - return slot; - } - - private IWidget createOutputItemSlot(PanelSyncManager syncManager) { - ItemSlot slot = new ItemSlot() - .slot(SyncHandlers.itemSlot(cache, 0) - // .slotGroup(group) - .changeListener((newItem, amount, client, init) -> { - if (amount) { - cache.onChanged(); - } - }).ignoreMaxStackSize(true) - .accessibility(false, true)); - // slot.getSlot().isPhantom() - // syncManager.syncValue("item_slot",SyncHandlers.itemSlot(slot)); - return slot; + private IWidget createItemSlot(PanelSyncManager syncManager) { + ItemSlotSH slot = new ItemSlotSH(new ModularSlot(cache, 0) + .ignoreMaxStackSize(true) + .slotGroup(new SlotGroup("stored", 1, true))); + syncManager.syncValue("stored", 1, slot); + + return new ItemSlot().syncHandler("stored", 1); } private IWidget createPhantomLockeditemSlot(PanelSyncManager syncManager) { - PhantomItemSlot slot = new PhantomItemSlot() - .slot(SyncHandlers.itemSlot(lockedItem, 0) - // .slotGroup(group) - .changeListener((newItem, amount, client, init) -> { - if (amount) { - lockedItem.setOnContentsChanged(() -> { lockedItem.getStackInSlot(0).setCount(1); }); - lockedItem.onContentsChanged(0); - lockedItem.getStackInSlot(0).setCount(1); - } - }) - .accessibility(true, false)); - // slot.getSlot().isPhantom() - // syncManager.syncValue("item_slot",SyncHandlers.itemSlot(slot)); - return slot; - } - /* - * private IWidget createPhantomLockedFluidSlot(PanelSyncManager syncManager) { - * syncManager.syncValue("locked_fluid_slot", - * new ItemSlot(lockedItem).controlsAmount(false).phantom(true)); - * return new FluidSlot().syncHandler("locked_fluid_slot", 0).background(GTGuiTextures.FLUID_SLOT); - * } - */ + lockedItem.setOnContentsChanged(() -> lockedItem.getStackInSlot(0).setCount(1)); + PhantomItemSlotSH lockSlot = new PhantomItemSlotSH(new ModularSlot(lockedItem, 0).filter( + stack -> stored.isEmpty() || ItemStack.isSameItemSameTags(stack, stored))); - /* - * public Widget createUIWidget() { - * var group = new WidgetGroup(0, 0, 109, 63); - * var importItems = createImportItems(); - * group.addWidget(new ImageWidget(4, 4, 81, 55, GuiTextures.DISPLAY)) - * .addWidget(new LabelWidget(8, 8, "gtceu.machine.quantum_chest.items_stored")) - * .addWidget(new LabelWidget(8, 18, () -> FormattingUtil.formatNumbers(storedAmount)) - * .setTextColor(-1) - * .setDropShadow(true)) - * .addWidget(new SlotWidget(importItems, 0, 87, 5, false, true) - * .setBackgroundTexture(new GuiTextureGroup(GuiTextures.SLOT, GuiTextures.IN_SLOT_OVERLAY))) - * .addWidget(new SlotWidget(cache, 0, 87, 23, false, false) - * .setItemHook(s -> s.copyWithCount((int) Math.min(storedAmount, s.getMaxStackSize()))) - * .setBackgroundTexture(GuiTextures.SLOT)) - * .addWidget(new ButtonWidget(87, 42, 18, 18, - * new GuiTextureGroup(ResourceBorderTexture.BUTTON_COMMON, Icons.DOWN.scale(0.7f)), cd -> { - * if (!cd.isRemote) { - * if (!stored.isEmpty()) { - * var extracted = cache.extractItem(0, - * (int) Math.min(storedAmount, stored.getMaxStackSize()), false); - * if (!group.getGui().entityPlayer.addItem(extracted)) { - * Block.popResource(group.getGui().entityPlayer.level(), - * group.getGui().entityPlayer.getOnPos(), extracted); - * } - * } - * } - * })) - * .addWidget(new PhantomSlotWidget(lockedItem, 0, 58, 41, - * stack -> stored.isEmpty() || ItemStack.isSameItemSameTags(stack, stored)) - * .setMaxStackSize(1)) - * .addWidget(new ToggleButtonWidget(4, 41, 18, 18, - * GuiTextures.BUTTON_ITEM_OUTPUT, this::isAutoOutputItems, this::setAutoOutputItems) - * .setShouldUseBaseBackground() - * .setTooltipText("gtceu.gui.item_auto_output.tooltip")) - * .addWidget(new ToggleButtonWidget(22, 41, 18, 18, - * GuiTextures.BUTTON_LOCK, this::isLocked, this::setLocked) - * .setShouldUseBaseBackground() - * .setTooltipText("gtceu.gui.item_lock.tooltip")) - * .addWidget(new ToggleButtonWidget(40, 41, 18, 18, - * GuiTextures.BUTTON_VOID, () -> isVoiding, (b) -> isVoiding = b) - * .setShouldUseBaseBackground() - * .setTooltipText("gtceu.gui.item_voiding_partial.tooltip")); - * group.setBackground(GuiTextures.BACKGROUND_INVERSE); - * return group; - * } - */ - private @NotNull CustomItemStackHandler createImportItems() { - var importItems = new CustomItemStackHandler(); - importItems.setFilter(cache::canInsert); - importItems.setOnContentsChanged(() -> { - var item = importItems.getStackInSlot(0).copy(); - if (!item.isEmpty()) { - importItems.setStackInSlot(0, ItemStack.EMPTY); - importItems.onContentsChanged(0); - cache.insertItem(0, item.copy(), false); - } - }); - return importItems; + syncManager.syncValue("lock", lockSlot); + return new PhantomItemSlot().syncHandler("lock"); } ////////////////////////////////////// From cccba0400c71aeff2d485ca958c429f724686763 Mon Sep 17 00:00:00 2001 From: zetrock1 Date: Wed, 14 Jan 2026 20:31:37 +0300 Subject: [PATCH 7/7] resolve conflicts --- .../machine/storage/CreativeChestMachine.java | 64 +++---- .../machine/storage/QuantumChestMachine.java | 174 ++++++++++++------ 2 files changed, 150 insertions(+), 88 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeChestMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeChestMachine.java index 3bc46471d5f..1bdb7334e99 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeChestMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeChestMachine.java @@ -2,15 +2,10 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.widget.PhantomSlotWidget; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.utils.GTUtil; -import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; -import com.lowdragmc.lowdraglib.gui.texture.ResourceBorderTexture; -import com.lowdragmc.lowdraglib.gui.texture.TextTexture; import com.lowdragmc.lowdraglib.gui.widget.*; import net.minecraft.MethodsReturnNonnullByDefault; @@ -107,35 +102,36 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play return InteractionResult.PASS; } - @Override - public Widget createUIWidget() { - var group = new WidgetGroup(0, 0, 176, 131); - group.addWidget(new PhantomSlotWidget(cache, 0, 36, 6) - .setClearSlotOnRightClick(true) - .setMaxStackSize(1) - .setBackgroundTexture(GuiTextures.SLOT)); - group.addWidget(new LabelWidget(7, 9, "gtceu.creative.chest.item")); - group.addWidget(new ImageWidget(7, 48, 154, 14, GuiTextures.DISPLAY)); - group.addWidget(new TextFieldWidget(9, 50, 152, 10, () -> String.valueOf(itemsPerCycle), this::setItemsPerCycle) - .setMaxStringLength(11) - .setNumbersOnly(1, Integer.MAX_VALUE)); - group.addWidget(new LabelWidget(7, 28, "gtceu.creative.chest.ipc")); - group.addWidget(new ImageWidget(7, 85, 154, 14, GuiTextures.DISPLAY)); - group.addWidget(new TextFieldWidget(9, 87, 152, 10, () -> String.valueOf(ticksPerCycle), this::setTicksPerCycle) - .setMaxStringLength(11) - .setNumbersOnly(1, Integer.MAX_VALUE)); - group.addWidget(new LabelWidget(7, 65, "gtceu.creative.chest.tpc")); - group.addWidget(new SwitchWidget(7, 101, 162, 20, (clickData, value) -> setWorkingEnabled(value)) - .setTexture( - new GuiTextureGroup(ResourceBorderTexture.BUTTON_COMMON, - new TextTexture("gtceu.creative.activity.off")), - new GuiTextureGroup(ResourceBorderTexture.BUTTON_COMMON, - new TextTexture("gtceu.creative.activity.on"))) - .setPressed(isWorkingEnabled())); - - return group; - } - + /* + * @Override + * public Widget createUIWidget() { + * var group = new WidgetGroup(0, 0, 176, 131); + * group.addWidget(new PhantomSlotWidget(cache, 0, 36, 6) + * .setClearSlotOnRightClick(true) + * .setMaxStackSize(1) + * .setBackgroundTexture(GuiTextures.SLOT)); + * group.addWidget(new LabelWidget(7, 9, "gtceu.creative.chest.item")); + * group.addWidget(new ImageWidget(7, 48, 154, 14, GuiTextures.DISPLAY)); + * group.addWidget(new TextFieldWidget(9, 50, 152, 10, () -> String.valueOf(itemsPerCycle), this::setItemsPerCycle) + * .setMaxStringLength(11) + * .setNumbersOnly(1, Integer.MAX_VALUE)); + * group.addWidget(new LabelWidget(7, 28, "gtceu.creative.chest.ipc")); + * group.addWidget(new ImageWidget(7, 85, 154, 14, GuiTextures.DISPLAY)); + * group.addWidget(new TextFieldWidget(9, 87, 152, 10, () -> String.valueOf(ticksPerCycle), this::setTicksPerCycle) + * .setMaxStringLength(11) + * .setNumbersOnly(1, Integer.MAX_VALUE)); + * group.addWidget(new LabelWidget(7, 65, "gtceu.creative.chest.tpc")); + * group.addWidget(new SwitchWidget(7, 101, 162, 20, (clickData, value) -> setWorkingEnabled(value)) + * .setTexture( + * new GuiTextureGroup(ResourceBorderTexture.BUTTON_COMMON, + * new TextTexture("gtceu.creative.activity.off")), + * new GuiTextureGroup(ResourceBorderTexture.BUTTON_COMMON, + * new TextTexture("gtceu.creative.activity.on"))) + * .setPressed(isWorkingEnabled())); + * + * return group; + * } + */ private class InfiniteCache extends ItemCache { public InfiniteCache(MetaMachine holder) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java index 6c8169ce664..ed063f98006 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java @@ -4,20 +4,32 @@ import com.gregtechceu.gtceu.api.capability.IControllable; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.widget.PhantomSlotWidget; -import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; -import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredMachine; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; -import com.gregtechceu.gtceu.api.machine.feature.IDropSaveMachine; -import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; -import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; +import com.gregtechceu.gtceu.api.machine.feature.*; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; +import com.gregtechceu.gtceu.api.mui.base.drawable.IKey; +import com.gregtechceu.gtceu.api.mui.base.widget.IWidget; +import com.gregtechceu.gtceu.api.mui.factory.PosGuiData; +import com.gregtechceu.gtceu.api.mui.utils.Alignment; +import com.gregtechceu.gtceu.api.mui.value.BoolValue; +import com.gregtechceu.gtceu.api.mui.value.sync.*; +import com.gregtechceu.gtceu.api.mui.widget.ParentWidget; +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.slot.ItemSlot; +import com.gregtechceu.gtceu.api.mui.widgets.slot.ModularSlot; +import com.gregtechceu.gtceu.api.mui.widgets.slot.PhantomItemSlot; +import com.gregtechceu.gtceu.api.mui.widgets.slot.SlotGroup; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; +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.syncsystem.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; @@ -26,9 +38,6 @@ import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.GTUtil; -import com.lowdragmc.lowdraglib.gui.editor.Icons; -import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; -import com.lowdragmc.lowdraglib.gui.texture.ResourceBorderTexture; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; import com.lowdragmc.lowdraglib.gui.widget.*; @@ -66,7 +75,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class QuantumChestMachine extends TieredMachine implements IAutoOutputItem, IInteractedMachine, IControllable, - IDropSaveMachine, IFancyUIMachine { + IDropSaveMachine, IMuiMachine { /** * Sourced from FunctionalStorage's @@ -358,49 +367,106 @@ public ItemStack getLockedItem() { // *********** GUI ***********// ////////////////////////////////////// - public Widget createUIWidget() { - var group = new WidgetGroup(0, 0, 109, 63); - var importItems = createImportItems(); - group.addWidget(new ImageWidget(4, 4, 81, 55, GuiTextures.DISPLAY)) - .addWidget(new LabelWidget(8, 8, "gtceu.machine.quantum_chest.items_stored")) - .addWidget(new LabelWidget(8, 18, () -> FormattingUtil.formatNumbers(storedAmount)) - .setTextColor(-1) - .setDropShadow(true)) - .addWidget(new SlotWidget(importItems, 0, 87, 5, false, true) - .setBackgroundTexture(new GuiTextureGroup(GuiTextures.SLOT, GuiTextures.IN_SLOT_OVERLAY))) - .addWidget(new SlotWidget(cache, 0, 87, 23, false, false) - .setItemHook(s -> s.copyWithCount((int) Math.min(storedAmount, s.getMaxStackSize()))) - .setBackgroundTexture(GuiTextures.SLOT)) - .addWidget(new ButtonWidget(87, 42, 18, 18, - new GuiTextureGroup(ResourceBorderTexture.BUTTON_COMMON, Icons.DOWN.scale(0.7f)), cd -> { - if (!cd.isRemote) { - if (!stored.isEmpty()) { - var extracted = cache.extractItem(0, - (int) Math.min(storedAmount, stored.getMaxStackSize()), false); - if (!group.getGui().entityPlayer.addItem(extracted)) { - Block.popResource(group.getGui().entityPlayer.level(), - group.getGui().entityPlayer.getOnPos(), extracted); - } - } - } - })) - .addWidget(new PhantomSlotWidget(lockedItem, 0, 58, 41, - stack -> stored.isEmpty() || GTUtil.isSameItemSameTags(stack, stored)) - .setMaxStackSize(1)) - .addWidget(new ToggleButtonWidget(4, 41, 18, 18, - GuiTextures.BUTTON_ITEM_OUTPUT, this::isAutoOutputItems, this::setAutoOutputItems) - .setShouldUseBaseBackground() - .setTooltipText("gtceu.gui.item_auto_output.tooltip")) - .addWidget(new ToggleButtonWidget(22, 41, 18, 18, - GuiTextures.BUTTON_LOCK, this::isLocked, this::setLocked) - .setShouldUseBaseBackground() - .setTooltipText("gtceu.gui.item_lock.tooltip")) - .addWidget(new ToggleButtonWidget(40, 41, 18, 18, - GuiTextures.BUTTON_VOID, () -> isVoiding, (b) -> isVoiding = b) - .setShouldUseBaseBackground() - .setTooltipText("gtceu.gui.item_voiding_partial.tooltip")); - group.setBackground(GuiTextures.BACKGROUND_INVERSE); - return group; + @Override + public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { + LongSyncValue itemSyncer = new LongSyncValue(this::getStoredAmount, (ignored) -> {}); + syncManager.syncValue("item_amount", itemSyncer); + // SlotGroup group = new SlotGroup("item_inv", 1, 0, true); + + return new ModularPanel(this.getDefinition().getName()) + .child( + // Top half of the screen + new ParentWidget<>() + .widthRel(1) + .height(20 + 60) + // Box that has the display texture BG + + // the buttons / text / etc + .child(new ParentWidget<>() + .background(GTGuiTextures.DISPLAY) + .size(90, 63) + .align(Alignment.CENTER) + .child(IKey.lang("gtceu.machine.quantum_chest.items_stored").asWidget() + .color(0xffffff) + .margin(8, 0, 8, 0)) + .child(IKey.dynamic( + () -> Component.literal( + FormattingUtil.formatNumbers(itemSyncer.getLongValue()))) + .asWidget() + .color(0xffffff) + .margin(8, 0, 18, 0)) + .child(Flow.row() + .margin(4, 0, 41, 0) + .coverChildren() + .child(createAutoOutputItemButton(syncManager)) + .child(createItemLockButton(syncManager)) + .child(createVoidButton(syncManager))) + .child(Flow.column() + .margin(68, 0, 15, 0) + .coverChildren() + .child(createItemSlot(syncManager)) + .child(createPhantomLockeditemSlot(syncManager)))) + + ) + .child(GTMuiWidgets.createTitleBar(getDefinition(), 176, GTGuiTextures.BACKGROUND)) + .child(SlotGroupWidget.playerInventory(false).left(7).bottom(7)); + } + + private ToggleButton createAutoOutputItemButton(PanelSyncManager syncManager) { + BooleanSyncValue itemOutputs = new BooleanSyncValue(this::isAutoOutputItems, + this::setAutoOutputItems); + syncManager.syncValue("auto_output_items", itemOutputs); + return new ToggleButton() + .value(new BoolValue.Dynamic(itemOutputs::getBoolValue, itemOutputs::setBoolValue)) + .overlay(GTGuiTextures.BUTTON_ITEM_OUTPUT) + .tooltipAutoUpdate(true) + .tooltipBuilder( + (r) -> r.addLine(IKey.lang(Component.translatable("gtceu.machine.quantum_chest.items_stored", + Component.translatable(itemOutputs.getBoolValue() ? "cover.voiding.label.enabled" : + "cover.voiding.label.disabled"))))); + } + + private ToggleButton createItemLockButton(PanelSyncManager syncManager) { + BooleanSyncValue itemLocked = new BooleanSyncValue(this::isLocked, + this::setLocked); + syncManager.syncValue("item_locked", itemLocked); + return new ToggleButton() + .value(new BoolValue.Dynamic(itemLocked::getBoolValue, itemLocked::setBoolValue)) + .overlay(GTGuiTextures.BUTTON_LOCK) + .tooltipAutoUpdate(true) + .tooltipBuilder((r) -> r.addLine(IKey.lang(itemLocked.getBoolValue() ? + "gtceu.gui.item_lock.tooltip.enabled" : + "gtceu.gui.item_lock.tooltip.disabled"))); + } + + private ToggleButton createVoidButton(PanelSyncManager syncManager) { + BooleanSyncValue voiding = new BooleanSyncValue(() -> this.isVoiding, + (voidingBool) -> { this.isVoiding = voidingBool; }); + syncManager.syncValue("is_voiding", voiding); + return new ToggleButton() + .value(new BoolValue.Dynamic(voiding::getBoolValue, voiding::setBoolValue)) + .overlay(GTGuiTextures.BUTTON_VOID) + .tooltipAutoUpdate(true) + .tooltipBuilder((r) -> r.addLine(IKey.lang(voiding.getBoolValue() ? + "gtceu.gui.item_voiding_partial.tooltip.enabled" : + "gtceu.gui.item_voiding_partial.tooltip.disabled"))); + } + + private IWidget createItemSlot(PanelSyncManager syncManager) { + ItemSlotSyncHandler slot = new ItemSlotSyncHandler(new ModularSlot(cache, 0) + .ignoreMaxStackSize(true) + .slotGroup(new SlotGroup("stored", 1, true))); + syncManager.syncValue("stored", 1, slot); + + return new ItemSlot().syncHandler("stored", 1); + } + + private IWidget createPhantomLockeditemSlot(PanelSyncManager syncManager) { + lockedItem.setOnContentsChanged(() -> lockedItem.getStackInSlot(0).setCount(1)); + PhantomItemSlotSyncHandler lockSlot = new PhantomItemSlotSyncHandler(new ModularSlot(lockedItem, 0).filter( + stack -> stored.isEmpty() || ItemStack.isSameItemSameTags(stack, stored))); + + syncManager.syncValue("lock", lockSlot); + return new PhantomItemSlot().syncHandler("lock"); } private @NotNull CustomItemStackHandler createImportItems() {