diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/IMonitorComponent.java b/src/main/java/com/gregtechceu/gtceu/api/capability/IMonitorComponent.java index 002c650a187..89289292be3 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/IMonitorComponent.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/IMonitorComponent.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.api.capability; -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; +import com.gregtechceu.gtceu.api.mui.base.drawable.IDrawable; import net.minecraft.core.BlockPos; import net.minecraftforge.items.IItemHandler; @@ -13,7 +13,7 @@ default boolean isMonitor() { return false; } - IGuiTexture getComponentIcon(); + IDrawable getIcon(); BlockPos getBlockPos(); diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/component/IMonitorModuleItem.java b/src/main/java/com/gregtechceu/gtceu/api/item/component/IMonitorModuleItem.java index 91a12e74343..b234b1195df 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/component/IMonitorModuleItem.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/component/IMonitorModuleItem.java @@ -1,12 +1,13 @@ package com.gregtechceu.gtceu.api.item.component; +import com.gregtechceu.gtceu.api.mui.base.IPanelHandler; +import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; import com.gregtechceu.gtceu.api.placeholder.PlaceholderContext; +import com.gregtechceu.gtceu.client.mui.screen.ModularPanel; import com.gregtechceu.gtceu.client.renderer.monitor.IMonitorRenderer; import com.gregtechceu.gtceu.common.machine.multiblock.electric.CentralMonitorMachine; import com.gregtechceu.gtceu.common.machine.multiblock.electric.monitor.MonitorGroup; -import com.lowdragmc.lowdraglib.gui.widget.Widget; - import net.minecraft.world.item.ItemStack; public interface IMonitorModuleItem extends IItemComponent { @@ -17,7 +18,8 @@ default void tickInPlaceholder(ItemStack stack, PlaceholderContext context) {} IMonitorRenderer getRenderer(ItemStack stack); - Widget createUIWidget(ItemStack stack, CentralMonitorMachine machine, MonitorGroup group); + ModularPanel createModularPanel(ItemStack stack, CentralMonitorMachine machine, MonitorGroup group, + PanelSyncManager syncManager, IPanelHandler panelHandler); default String getType() { return "unknown"; diff --git a/src/main/java/com/gregtechceu/gtceu/api/mui/base/drawable/IDrawable.java b/src/main/java/com/gregtechceu/gtceu/api/mui/base/drawable/IDrawable.java index 772e0e6141f..052c7ebce4d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/mui/base/drawable/IDrawable.java +++ b/src/main/java/com/gregtechceu/gtceu/api/mui/base/drawable/IDrawable.java @@ -194,4 +194,26 @@ public void draw(ModularGuiContext context, WidgetThemeEntry widgetTheme) { this.drawable.drawAtZero(context, getArea(), getActiveWidgetTheme(widgetTheme, isHovering())); } } + + /** + * A widget wrapping multiple drawables + */ + class MultiDrawableWidget extends Widget { + + private final IDrawable[] drawables; + + public MultiDrawableWidget(IDrawable... drawables) { + this.drawables = drawables; + } + + @OnlyIn(Dist.CLIENT) + @Override + public void draw(ModularGuiContext context, WidgetThemeEntry widgetTheme) { + for (IDrawable drawable : this.drawables) { + drawable.draw(context, getArea().getPadding().left(), getArea().getPadding().top(), + getArea().paddedWidth(), getArea().paddedHeight(), + getActiveWidgetTheme(widgetTheme, isHovering())); + } + } + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/mui/widgets/SimpleDialog.java b/src/main/java/com/gregtechceu/gtceu/api/mui/widgets/SimpleDialog.java new file mode 100644 index 00000000000..a8c404449a1 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/mui/widgets/SimpleDialog.java @@ -0,0 +1,34 @@ +package com.gregtechceu.gtceu.api.mui.widgets; + +import com.gregtechceu.gtceu.api.mui.base.drawable.IKey; +import com.gregtechceu.gtceu.api.mui.utils.Alignment; +import com.gregtechceu.gtceu.api.mui.widget.Widget; +import com.gregtechceu.gtceu.common.mui.GTGuiTextures; + +import java.util.function.Consumer; +import java.util.function.Function; + +public class SimpleDialog> extends Dialog { + + public SimpleDialog(String name, Consumer valueConsumer, W widget, Function valueGetter, IKey title) { + super(name, valueConsumer); + child(new TextWidget<>(title).align(Alignment.TopCenter).marginTop(4)); + child(widget.align(Alignment.CENTER)); + child(new ButtonWidget<>() + .background(GTGuiTextures.CLOSE) + .hoverBackground(GTGuiTextures.CLOSE) + .align(Alignment.TopRight) + .onMousePressed((mouseX, mouseY, button) -> { + closeIfOpen(); + return true; + })); + child(new ButtonWidget<>() + .background(GTGuiTextures.RIGHTLOAD) + .hoverBackground(GTGuiTextures.RIGHTLOAD) + .align(Alignment.BottomCenter) + .onMousePressed((mouseX, mouseY, button) -> { + closeWith(valueGetter.apply(widget)); + return true; + })); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/CentralMonitorRender.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/CentralMonitorRender.java index 68719e58cba..b5684978e42 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/CentralMonitorRender.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/CentralMonitorRender.java @@ -43,7 +43,7 @@ public void render(CentralMonitorMachine machine, float partialTick, PoseStack p RenderUtil.rotateToFace(poseStack, machine.getFrontFacing(), machine.getUpwardsFacing()); poseStack.translate(-machine.getRightDist() - 0.5f, -machine.getUpDist() - 0.5f, SCREEN_OFFSET_Z); - if (machine.getRecipeLogic().isActive()) { + if (machine.getRecipeLogic().isWorking()) { for (MonitorGroup group : machine.getMonitorGroups()) { ItemStack itemStack = group.getItemStackHandler().getStackInSlot(0); if (!(itemStack.getItem() instanceof ComponentItem item)) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMultiMachines.java b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMultiMachines.java index cdaa7a8e87a..0f783694b61 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMultiMachines.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMultiMachines.java @@ -30,6 +30,7 @@ import com.gregtechceu.gtceu.common.machine.multiblock.primitive.PrimitivePumpMachine; import com.gregtechceu.gtceu.common.machine.multiblock.steam.SteamParallelMultiblockMachine; import com.gregtechceu.gtceu.common.mui.GTGuiTheme; +import com.gregtechceu.gtceu.common.mui.factory.CentralMonitorUIFactory; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTUtil; @@ -1165,6 +1166,7 @@ public class GTMultiMachines { GTCEu.id("block/multiblock/central_monitor")) .andThen(b -> b.addDynamicRenderer(DynamicRenderHelper::createCentralMonitorRender))) .hasBER(true) + .ui(CentralMonitorUIFactory.INSTANCE) .register(); public static void init() {} diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMuiWidgets.java b/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMuiWidgets.java index 3fe21b5f736..f9f1ee60555 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMuiWidgets.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMuiWidgets.java @@ -36,7 +36,7 @@ import com.gregtechceu.gtceu.client.mui.screen.ModularPanel; import com.gregtechceu.gtceu.client.mui.screen.UISettings; import com.gregtechceu.gtceu.common.cover.data.BucketMode; -import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; +import com.gregtechceu.gtceu.common.item.behavior.IntCircuitBehaviour; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.utils.GTMath; diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/modules/ImageModuleBehaviour.java b/src/main/java/com/gregtechceu/gtceu/common/item/modules/ImageModuleBehaviour.java index b21ee3a4750..55a9799f1e1 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/modules/ImageModuleBehaviour.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/modules/ImageModuleBehaviour.java @@ -1,22 +1,32 @@ package com.gregtechceu.gtceu.common.item.modules; -import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.item.component.IAddInformation; import com.gregtechceu.gtceu.api.item.component.IMonitorModuleItem; +import com.gregtechceu.gtceu.api.mui.base.IPanelHandler; +import com.gregtechceu.gtceu.api.mui.base.drawable.IKey; +import com.gregtechceu.gtceu.api.mui.utils.Alignment; +import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; +import com.gregtechceu.gtceu.api.mui.value.sync.SyncHandlers; +import com.gregtechceu.gtceu.api.mui.widgets.TextWidget; +import com.gregtechceu.gtceu.api.mui.widgets.layout.Flow; +import com.gregtechceu.gtceu.api.mui.widgets.textfield.TextFieldWidget; +import com.gregtechceu.gtceu.client.mui.screen.ModularPanel; import com.gregtechceu.gtceu.client.renderer.monitor.IMonitorRenderer; import com.gregtechceu.gtceu.client.renderer.monitor.MonitorImageRenderer; import com.gregtechceu.gtceu.common.machine.multiblock.electric.CentralMonitorMachine; import com.gregtechceu.gtceu.common.machine.multiblock.electric.monitor.MonitorGroup; -import com.gregtechceu.gtceu.common.network.GTNetwork; -import com.gregtechceu.gtceu.common.network.packets.SCPacketMonitorGroupNBTChange; - -import com.lowdragmc.lowdraglib.gui.widget.ButtonWidget; -import com.lowdragmc.lowdraglib.gui.widget.TextFieldWidget; -import com.lowdragmc.lowdraglib.gui.widget.Widget; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; + +import org.jetbrains.annotations.Nullable; + +import java.util.List; -public class ImageModuleBehaviour implements IMonitorModuleItem { +public class ImageModuleBehaviour implements IMonitorModuleItem, IAddInformation { @Override public IMonitorRenderer getRenderer(ItemStack stack) { @@ -24,21 +34,19 @@ public IMonitorRenderer getRenderer(ItemStack stack) { } @Override - public Widget createUIWidget(ItemStack stack, CentralMonitorMachine machine, MonitorGroup group) { - WidgetGroup builder = new WidgetGroup(); - TextFieldWidget textField = new TextFieldWidget(0, 0, 100, 10, null, null); - textField.setCurrentString(getUrl(stack)); - - ButtonWidget saveButton = new ButtonWidget(-40, 22, 20, 20, click -> { - if (!click.isRemote) return; - - setUrl(stack, textField.getCurrentString()); - GTNetwork.sendToServer(new SCPacketMonitorGroupNBTChange(stack, group, machine)); - }); - saveButton.setButtonTexture(GuiTextures.BUTTON_CHECK); - builder.addWidget(textField); - builder.addWidget(saveButton); - return builder; + public ModularPanel createModularPanel(ItemStack stack, CentralMonitorMachine machine, MonitorGroup group, + PanelSyncManager syncManager, IPanelHandler panelHandler) { + return new ModularPanel("image_module_editor") + .size(200, 50) + .child(Flow.column() + .marginTop(5) + .align(Alignment.CENTER) + .widthRel(1) + .child(new TextWidget<>(IKey.lang("gtceu.gui.central_monitor.url"))) + .child(new TextFieldWidget() + .value(SyncHandlers.string(() -> getUrl(stack), s -> setUrl(stack, s))) + .align(Alignment.CENTER) + .widthRel(.8f))); } @Override @@ -53,4 +61,11 @@ public String getUrl(ItemStack stack) { public void setUrl(ItemStack stack, String url) { stack.getOrCreateTag().putString("url", url); } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltipComponents, + TooltipFlag isAdvanced) { + tooltipComponents.add(Component.translatable("gtceu.item.tooltip.image_url", getUrl(stack)) + .withStyle(ChatFormatting.DARK_AQUA)); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/modules/TextModuleBehaviour.java b/src/main/java/com/gregtechceu/gtceu/common/item/modules/TextModuleBehaviour.java index beb0f1289f3..358b461c5db 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/modules/TextModuleBehaviour.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/modules/TextModuleBehaviour.java @@ -1,55 +1,40 @@ package com.gregtechceu.gtceu.common.item.modules; -import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.item.component.IAddInformation; import com.gregtechceu.gtceu.api.item.component.IMonitorModuleItem; +import com.gregtechceu.gtceu.api.mui.base.IPanelHandler; +import com.gregtechceu.gtceu.api.mui.base.value.IBoolValue; +import com.gregtechceu.gtceu.api.mui.base.value.IStringValue; +import com.gregtechceu.gtceu.api.mui.value.sync.DoubleSyncValue; +import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; +import com.gregtechceu.gtceu.api.mui.value.sync.SyncHandlers; import com.gregtechceu.gtceu.api.placeholder.MultiLineComponent; import com.gregtechceu.gtceu.api.placeholder.PlaceholderContext; import com.gregtechceu.gtceu.api.placeholder.PlaceholderHandler; +import com.gregtechceu.gtceu.client.mui.screen.ModularPanel; import com.gregtechceu.gtceu.client.renderer.monitor.IMonitorRenderer; import com.gregtechceu.gtceu.client.renderer.monitor.MonitorTextRenderer; import com.gregtechceu.gtceu.common.machine.multiblock.electric.CentralMonitorMachine; import com.gregtechceu.gtceu.common.machine.multiblock.electric.monitor.MonitorGroup; -import com.gregtechceu.gtceu.common.network.GTNetwork; -import com.gregtechceu.gtceu.common.network.packets.SCPacketMonitorGroupNBTChange; - -import com.lowdragmc.lowdraglib.gui.widget.ButtonWidget; -import com.lowdragmc.lowdraglib.gui.widget.TextFieldWidget; -import com.lowdragmc.lowdraglib.gui.widget.Widget; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.gui.widget.codeeditor.CodeEditorWidget; +import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import net.minecraft.ChatFormatting; -import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.StringTag; import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; -import net.minecraft.util.Mth; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; import java.util.List; import java.util.UUID; -import java.util.function.Supplier; public class TextModuleBehaviour implements IMonitorModuleItem, IAddInformation { - private void updateText(ItemStack stack, PlaceholderContext ctx) { - if (!stack.getOrCreateTag().contains("placeholderUUID")) { - stack.getOrCreateTag().putUUID("placeholderUUID", UUID.randomUUID()); - } - MultiLineComponent text = PlaceholderHandler.processPlaceholders( - getPlaceholderText(stack), - ctx); - stack.getOrCreateTag().put("text", text.toTag()); - } - - private PlaceholderContext makeContext(ItemStack stack, CentralMonitorMachine machine, MonitorGroup group) { + private PlaceholderContext getContext(ItemStack stack, CentralMonitorMachine machine, MonitorGroup group) { return new PlaceholderContext( group.getTargetLevel(machine.getLevel()), group.getTarget(machine.getLevel()), @@ -57,13 +42,23 @@ private PlaceholderContext makeContext(ItemStack stack, CentralMonitorMachine ma group.getPlaceholderSlotsHandler(), group.getTargetCover(machine.getLevel()), null, - stack.getOrCreateTag().contains("placeholderUUID") ? stack.getOrCreateTag().getUUID("placeholderUUID") : - null); + stack.getOrCreateTag().getUUID("placeholderUUID")); + } + + private void updateText(ItemStack stack, PlaceholderContext context) { + if (!stack.getOrCreateTag().contains("placeholderUUID")) { + stack.getOrCreateTag().putUUID("placeholderUUID", UUID.randomUUID()); + } + MultiLineComponent text = PlaceholderHandler.processPlaceholders( + getPlaceholderText(stack), context); + stack.getOrCreateTag().put("text", + text.withStyle(style -> style.withFont(GTGuiTextures.MONOCRAFT_FONT)).toTag()); } @Override public void tick(ItemStack stack, CentralMonitorMachine machine, MonitorGroup group) { - this.updateText(stack, makeContext(stack, machine, group)); + if (!isPaused(stack)) + this.updateText(stack, getContext(stack, machine, group)); } @Override @@ -79,52 +74,24 @@ public IMonitorRenderer getRenderer(ItemStack stack) { } @Override - public Widget createUIWidget(ItemStack stack, CentralMonitorMachine machine, MonitorGroup group) { - WidgetGroup builder = new WidgetGroup(); - CodeEditorWidget editor = new CodeEditorWidget(0, 0, 120, 80); - // editor.codeEditor.setLanguageDefinition(PlaceholderHandler.LANG_DEFINITION); - TextFieldWidget scaleInput = new TextFieldWidget( - -50, 47, - 40, 10, - null, - null); - ButtonWidget saveButton = new ButtonWidget(-40, 22, 20, 20, click -> { - if (!click.isRemote) return; - ListTag listTag = new ListTag(); - editor.getLines().forEach(line -> listTag.add(StringTag.valueOf(line.replaceAll("\r", "")))); - CompoundTag tag2 = stack.getOrCreateTag(); - tag2.put("formatStringLines", listTag); - try { - tag2.putDouble("scale", Double.parseDouble(scaleInput.getCurrentString())); - } catch (NumberFormatException ignored) {} - stack.setTag(tag2); - GTNetwork.sendToServer(new SCPacketMonitorGroupNBTChange(stack, group, machine)); - }); - saveButton.setButtonTexture(GuiTextures.BUTTON_CHECK); - List tmp = new ArrayList<>(); - Supplier scaleInputSupplier = () -> { - if (tmp.isEmpty()) tmp.add(true); - else scaleInput.setTextSupplier(null); - if (!stack.getOrCreateTag().contains("scale")) { - stack.getOrCreateTag().putDouble("scale", 1); - GTNetwork.sendToServer(new SCPacketMonitorGroupNBTChange(stack, group, machine)); - return "1"; - } - return String.valueOf(Mth.clamp(stack.getOrCreateTag().getDouble("scale"), .0001, 1000)); - }; - scaleInput.setTextSupplier(scaleInputSupplier); - scaleInput.setHoverTooltips(Component.translatable("gtceu.gui.central_monitor.text_scale")); - ListTag tag = stack.getOrCreateTag().getList("formatStringLines", Tag.TAG_STRING); - List formatStringLines = new ArrayList<>(); - for (Tag line : tag) formatStringLines.add(line.getAsString()); - editor.setLines(formatStringLines); - builder.addWidget(editor); - builder.addWidget(saveButton); - Widget placeholderReference = PlaceholderHandler.getPlaceholderHandlerUI(""); - builder.addWidget(scaleInput); - placeholderReference.setSelfPosition(-100, -50); - builder.addWidget(placeholderReference); - return builder; + public ModularPanel createModularPanel(ItemStack stack, CentralMonitorMachine machine, MonitorGroup group, + PanelSyncManager syncManager, IPanelHandler panelHandler) { + PlaceholderContext ctx = getContext(stack, machine, group); + IStringValue code = SyncHandlers.string( + () -> getPlaceholderText(stack), + s -> setPlaceholderText(stack, s)); + DoubleSyncValue scale = SyncHandlers.doubleNumber( + () -> getScale(stack), + s -> setScale(stack, s)); + IBoolValue pause = SyncHandlers.bool(() -> isPaused(stack), p -> setPaused(stack, p)); + Runnable updateText = () -> updateText(stack, getContext(stack, machine, group)); + assert ctx.itemStackHandler() != null; + return new ModularPanel("placeholder_editor") + .size(400, 250) + .resizeableOnDrag(true) + .excludeAreaInRecipeViewer() + .child(PlaceholderHandler.createPlaceholderEditor(syncManager, ctx, code, scale, null, pause, + updateText)); } @Override @@ -137,6 +104,8 @@ public MultiLineComponent getText(ItemStack stack) { } public double getScale(ItemStack stack) { + if (!stack.getOrCreateTag().contains("scale")) + return 1; return Math.max(stack.getOrCreateTag().getDouble("scale"), .0001); } @@ -144,6 +113,16 @@ public void setScale(ItemStack stack, double scale) { stack.getOrCreateTag().putDouble("scale", scale); } + public void setPaused(ItemStack stack, boolean paused) { + stack.getOrCreateTag().putBoolean("paused", paused); + } + + public boolean isPaused(ItemStack stack) { + if (stack.getOrCreateTag().contains("paused")) + return stack.getOrCreateTag().getBoolean("paused"); + else return false; + } + public void setPlaceholderText(ItemStack stack, String text) { ListTag listTag = new ListTag(); for (String line : text.split("\n")) listTag.add(StringTag.valueOf(line.replaceAll("\r", ""))); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BatteryBufferMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BatteryBufferMachine.java index 146d63eb81c..58de690b620 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BatteryBufferMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BatteryBufferMachine.java @@ -7,10 +7,10 @@ import com.gregtechceu.gtceu.api.capability.IElectricItem; import com.gregtechceu.gtceu.api.capability.IMonitorComponent; import com.gregtechceu.gtceu.api.capability.compat.FeCompat; -import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; import com.gregtechceu.gtceu.api.machine.feature.IMuiMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; +import com.gregtechceu.gtceu.api.mui.base.drawable.IDrawable; import com.gregtechceu.gtceu.api.mui.base.drawable.IKey; import com.gregtechceu.gtceu.api.mui.factory.PosGuiData; import com.gregtechceu.gtceu.api.mui.value.sync.DoubleSyncValue; @@ -29,8 +29,6 @@ import com.gregtechceu.gtceu.utils.GTStringUtils; import com.gregtechceu.gtceu.utils.GTUtil; -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; - import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; @@ -224,8 +222,8 @@ public void onMachineDestroyed() { } @Override - public IGuiTexture getComponentIcon() { - return GuiTextures.BUTTON_CHECK; // temporary + public IDrawable getIcon() { + return GTGuiTextures.BATTERY_OVERLAY; } protected static class EnergyBatteryTrait extends NotifiableEnergyContainer { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/HullMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/HullMachine.java index 5eac4c89cb2..090339f3950 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/HullMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/HullMachine.java @@ -4,16 +4,15 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.IMonitorComponent; -import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; +import com.gregtechceu.gtceu.api.mui.base.drawable.IDrawable; import com.gregtechceu.gtceu.api.sync_system.ClassSyncData; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformer; +import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.integration.ae2.machine.trait.GridNodeHostTrait; -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; - import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -121,7 +120,7 @@ public int tintColor(int index) { } @Override - public IGuiTexture getComponentIcon() { - return GuiTextures.BUTTON_CHECK; // temporary (until there's a texture that is not fully 16x16 for this) + public IDrawable getIcon() { + return GTGuiTextures.CROSS; } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java index 932fb7aaf0d..6d9fffe5dd4 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java @@ -1,11 +1,9 @@ package com.gregtechceu.gtceu.common.machine.multiblock.electric; -import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; import com.gregtechceu.gtceu.api.capability.IMonitorComponent; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.item.IComponentItem; import com.gregtechceu.gtceu.api.item.component.IItemComponent; import com.gregtechceu.gtceu.api.item.component.IMonitorModuleItem; @@ -13,6 +11,7 @@ import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; +import com.gregtechceu.gtceu.api.mui.base.drawable.IDrawable; import com.gregtechceu.gtceu.api.pattern.*; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; @@ -23,12 +22,10 @@ import com.gregtechceu.gtceu.common.item.behavior.PortableScannerBehavior; import com.gregtechceu.gtceu.common.machine.multiblock.electric.monitor.MonitorGroup; import com.gregtechceu.gtceu.common.machine.trait.CentralMonitorLogic; +import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.common.network.GTNetwork; import com.gregtechceu.gtceu.common.network.packets.SCPacketMonitorGroupNBTChange; -import com.lowdragmc.lowdraglib.gui.texture.*; -import com.lowdragmc.lowdraglib.gui.widget.*; - import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -38,10 +35,8 @@ import net.minecraft.world.level.Level; import lombok.Getter; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.awt.*; import java.util.*; import java.util.List; import java.util.stream.Stream; @@ -59,11 +54,9 @@ public class CentralMonitorMachine extends WorkableElectricMultiblockMachine private int leftDist = 0, rightDist = 0, upDist = 0, downDist = 0; @SaveField @SyncToClient - @Getter @RerenderOnChanged + @Getter private List monitorGroups = new ArrayList<>(); - private final Set selectedComponents = new HashSet<>(); - private final List selectedTargets = new ArrayList<>(); private MultiblockState patternFindingState; @@ -125,6 +118,8 @@ public void tick() { new SCPacketMonitorGroupNBTChange(stack, group, this)); } } + getSyncDataHolder().markClientSyncFieldDirty("monitorGroups"); + recipeLogic.getSyncDataHolder().markClientSyncFieldDirty("status"); } @Override @@ -196,6 +191,10 @@ public void updateStructureDimensions() { posDown.move(down); downDist++; } + getSyncDataHolder().markClientSyncFieldDirty("leftDist"); + getSyncDataHolder().markClientSyncFieldDirty("rightDist"); + getSyncDataHolder().markClientSyncFieldDirty("upDist"); + getSyncDataHolder().markClientSyncFieldDirty("downDist"); } private boolean isValidMonitorBlockRow(Level level, BlockPos pos, int leftDist, int rightDist, Direction left, @@ -274,383 +273,26 @@ public IMonitorComponent getComponent(int row, int col) { return GTCapabilityHelper.getMonitorComponent(level, pos, null); } - public boolean isMonitor(int row, int col) { - IMonitorComponent component = this.getComponent(row, col); - if (component == null) return false; - return component.isMonitor(); - } - - private IGuiTexture getComponentTexture(int row, int col) { - if (row < 0 || col < 0 || row > downDist + upDist + 1 || col > leftDist + rightDist + 1) - return GuiTextures.BLANK_TRANSPARENT; - IMonitorComponent component = getComponent(row, col); - if (component == null) return GuiTextures.BLANK_TRANSPARENT; - return component.getComponentIcon(); - } - - private boolean isInAnyGroup(IMonitorComponent component) { - return monitorGroups.stream().anyMatch(group -> group.contains(component.getBlockPos())); + public void setMonitorGroups(List groups) { + if (!(monitorGroups instanceof ArrayList)) monitorGroups = new ArrayList<>(monitorGroups); + monitorGroups.clear(); + monitorGroups.addAll(groups); + getSyncDataHolder().markClientSyncFieldDirty("monitorGroups"); } - // @Override - // public void addDisplayText(List textList) { - // MultiblockDisplayText.builder(textList, isFormed()) - // .addWorkingStatusLine(); - // getDefinition().getAdditionalDisplay().accept(this, textList); - // } - // - // @Override - // public Widget createUIWidget() { - // updateStructureDimensions(); - // selectedComponents.clear(); - // WidgetGroup builder = (WidgetGroup) super.createUIWidget(); - // - // WidgetGroup main = new WidgetGroup(); - // DraggableScrollableWidgetGroup componentSelection = new DraggableScrollableWidgetGroup(0, 10, 200, 110); - // main.addWidget(componentSelection); - // WidgetGroup options = new WidgetGroup(-100, 20, 60, 20); - // WidgetGroup groupConfig = new WidgetGroup(10, 30, 100, 100); - // groupConfig.setVisible(false); - // - // ButtonWidget infoWidget = new ButtonWidget(200, 10, 20, 20, null); - // infoWidget.setButtonTexture(GuiTextures.INFO_ICON); - // infoWidget.setHoverTooltips( - // GTStringUtils.toImmutable(LangHandler.getSingleOrMultiLang("gtceu.central_monitor.info_tooltip"))); - // builder.addWidget(infoWidget); - // List configGroup = new ArrayList<>(); - // configGroup.add(null); - // - // Consumer openGroupConfig = (group) -> { - // configGroup.set(0, group); - // if (group == null) { - // main.setVisible(true); - // groupConfig.setVisible(false); - // return; - // } - // groupConfig.clearAllWidgets(); - // groupConfig.addWidget(new LabelWidget(0, 5, () -> { - // String currentName = ""; - // if (configGroup.get(0) != null) { - // currentName = configGroup.get(0).getName(); - // } - // return Component.translatable("gtceu.central_monitor.gui.currently_editing", currentName).getString(); - // })); - // for (int i = 0; i < 8; i++) { - // SlotWidget slot = new SlotWidget(group.getPlaceholderSlotsHandler(), i, -38, 16 * i + 46); - // slot.setHoverTooltips(GTStringUtils - // .toImmutable(LangHandler.getMultiLang("gtceu.gui.computer_monitor_cover.slot_tooltip", i + 1))); - // groupConfig.addWidget(slot); - // } - // SlotWidget slot = new SlotWidget( - // group.getItemStackHandler(), 0, - // 0, 20); - // WidgetGroup itemUI = new WidgetGroup(40, 20, 100, 100); - // Runnable changeListener = () -> { - // if (slot.getLastItem().is(slot.getItem().getItem())) return; - // itemUI.clearAllWidgets(); - // if (slot.getItem().getItem() instanceof IComponentItem item) { - // for (IItemComponent component : item.getComponents()) { - // if (component instanceof IMonitorModuleItem module) { - // itemUI.addWidget(module.createUIWidget(slot.getItem(), this, group)); - // } - // } - // } - // }; - // slot.setChangeListener(changeListener); - // changeListener.run(); - // groupConfig.addWidget(itemUI); - // groupConfig.addWidget(slot); - // main.setVisible(false); - // groupConfig.setVisible(true); - // }; - // builder.addWidget(groupConfig); - // DraggableScrollableWidgetGroup groupList = new DraggableScrollableWidgetGroup(-100, 50, 70, 80); - // - // List>>> imageButtons = new ArrayList<>(); - // Map rightClickCallbacks = new HashMap<>(); - // int[] dataSlot = new int[2]; // list to be able to modify it in lambdas - // dataSlot[0] = 1; // the slot (index starts from 1) - // dataSlot[1] = 9; // amount of slots - // IntInputWidget dataSlotInput = new IntInputWidget(120, 20, 60, -20, () -> dataSlot[0], - // n -> dataSlot[0] = Mth.clamp(n, 1, dataSlot[1])); - // dataSlotInput.setVisible(false); - // builder.addWidget(dataSlotInput); - // - // Consumer addGroupToList = group -> { - // ButtonWidget label = new ButtonWidget(20, groupList.widgets.size() * 15 + 5, 60, 10, null); - // TextTexture text = new TextTexture(group.getName()); - // text.setType(TextTexture.TextType.LEFT); - // label.setButtonTexture(text); - // label.setOnPressCallback(click -> { - // group.getRelativePositions().forEach(pos -> { - // BlockPos rel = toRelative(pos); - // if (imageButtons.size() - 1 < rel.getY()) return; - // if (imageButtons.get(rel.getY()).size() - 1 < rel.getX()) return; - // imageButtons.get(rel.getY()).get(rel.getX()).accept(null); - // }); - // if (group.getTargetRaw() != null) { - // rightClickCallbacks.getOrDefault(group.getTargetRaw(), () -> {}).run(); - // } - // }); - // groupList.addWidget(label); - // - // ButtonWidget configButton = new ButtonWidget( - // 0, label.getSelfPositionY() - 3, - // 16, 16, - // GuiTextures.IO_CONFIG_COVER_SETTINGS, - // click -> { - // if (configGroup.get(0) == null) { - // openGroupConfig.accept(group); - // } else { - // openGroupConfig.accept(null); - // } - // }); - // groupList.addWidget(configButton); - // }; - // - // monitorGroups.forEach(addGroupToList); - // builder.addWidget(groupList); - // main.addWidget(options); - // ButtonWidget removeFromGroupButton = new ButtonWidget(0, 0, 60, 20, null); - // removeFromGroupButton.setButtonTexture(new TextTexture("gtceu.central_monitor.gui.remove_from_group")); - // removeFromGroupButton.setVisible(false); - // ButtonWidget setTargetButton = new ButtonWidget(0, 15, 60, 20, null); - // setTargetButton.setButtonTexture(new TextTexture("gtceu.central_monitor.gui.set_target")); - // setTargetButton.setVisible(false); - // ButtonWidget createGroupButton = new ButtonWidget(0, 0, 60, 20, null); - // createGroupButton.setOnPressCallback(click -> { - // MonitorGroup group = new MonitorGroup( - // Component.translatable("gtceu.gui.central_monitor.group_default_name", monitorGroups.size() + 1) - // .getString()); - // for (IMonitorComponent component : selectedComponents) { - // if (isInAnyGroup(component)) return; - // group.add(component.getPos()); - // } - // monitorGroups.add(group); - // addGroupToList.accept(group); - // - // createGroupButton.setVisible(false); - // removeFromGroupButton.setVisible(true); - // Iterator it = selectedComponents.iterator(); - // while (it.hasNext()) { - // IMonitorComponent c = it.next(); - // BlockPos rel = toRelative(c.getPos()); - // imageButtons.get(rel.getY()).get(rel.getX()).accept(it); - // } - // if (!selectedTargets.isEmpty()) { - // rightClickCallbacks.getOrDefault(selectedTargets.get(0).getPos(), () -> {}).run(); - // } - // }); - // setTargetButton.setOnPressCallback(click -> { - // MonitorGroup group = null; - // for (MonitorGroup group2 : monitorGroups) { - // for (IMonitorComponent component : selectedComponents) { - // if (group2.contains(component.getPos())) { - // group = group2; - // break; - // } - // } - // if (group != null) break; - // } - // if (group == null) return; - // if (selectedTargets.isEmpty()) group.setTarget(null); - // else { - // group.setTarget(selectedTargets.get(0).getPos()); - // group.setDataSlot(dataSlot[0] - 1); - // } - // }); - // removeFromGroupButton.setOnPressCallback(click -> { - // for (MonitorGroup group : monitorGroups) { - // for (IMonitorComponent component : selectedComponents) group.remove(component.getPos()); - // } - // Iterator itg = monitorGroups.iterator(); - // while (itg.hasNext()) { - // MonitorGroup group = itg.next(); - // if (group.isEmpty()) { - // clearInventory(group.getItemStackHandler()); - // clearInventory(group.getPlaceholderSlotsHandler()); - // itg.remove(); - // } - // } - // groupList.clearAllWidgets(); - // monitorGroups.forEach(addGroupToList); - // - // removeFromGroupButton.setVisible(false); - // createGroupButton.setVisible(true); - // Iterator it = selectedComponents.iterator(); - // while (it.hasNext()) { - // IMonitorComponent c = it.next(); - // BlockPos rel = toRelative(c.getPos()); - // if (imageButtons.size() - 1 < rel.getY()) continue; - // if (imageButtons.get(rel.getY()).size() - 1 < rel.getX()) continue; - // imageButtons.get(rel.getY()).get(rel.getX()).accept(it); - // } - // if (!selectedTargets.isEmpty()) { - // rightClickCallbacks.getOrDefault(selectedTargets.get(0).getPos(), () -> {}).run(); - // } - // }); - // createGroupButton.setButtonTexture(new TextTexture("gtceu.central_monitor.gui.create_group")); - // createGroupButton.setVisible(false); - // options.addWidget(removeFromGroupButton); - // options.addWidget(createGroupButton); - // options.addWidget(setTargetButton); - // int startX = 20; - // int startY = 30; - // for (int row = 0; row <= downDist + upDist; row++) { - // imageButtons.add(new ArrayList<>()); - // for (int col = 0; col <= leftDist + rightDist; col++) { - // IGuiTexture texture = getComponentTexture(row, col); - // GuiTextureGroup textures = new GuiTextureGroup(texture, new ColorBorderTexture(2, 0xFFFFFF)); - // IMonitorComponent component = getComponent(row, col); - // if (component == null) { - // GTUtil.getLast(imageButtons).add(it -> {}); - // continue; - // } - // ButtonWidget img = new ButtonWidget(startX + (16 * col), startY + (16 * row), 16, 16, textures, null); - // Consumer> callback = (it) -> { - // if (!component.isMonitor()) return; - // if (selectedComponents.contains(component)) { - // if (it == null) { - // selectedComponents.remove(component); - // } else { - // it.remove(); - // } - // - // if (!selectedTargets.isEmpty() && selectedTargets.get(0) == component) { - // ColorRectTexture rect = new ColorRectTexture(Color.BLUE); - // textures.setTextures(rect, texture); - // } else { - // textures.setTextures(texture); - // } - // - // createGroupButton.setVisible(selectedComponents.stream().noneMatch(this::isInAnyGroup)); - // removeFromGroupButton.setVisible(selectedComponents.stream().allMatch(this::isInAnyGroup)); - // setTargetButton.setVisible(removeFromGroupButton.isVisible()); - // - // if (selectedComponents.isEmpty()) { - // createGroupButton.setVisible(false); - // removeFromGroupButton.setVisible(false); - // setTargetButton.setVisible(false); - // } - // } else { - // boolean inAnyGroup = isInAnyGroup(component); - // // yes I know this is terrible but if it works don't touch it :) - // if (selectedComponents.isEmpty() && !inAnyGroup) createGroupButton.setVisible(true); - // if (inAnyGroup) createGroupButton.setVisible(false); - // if (selectedComponents.isEmpty() && inAnyGroup) { - // removeFromGroupButton.setVisible(true); - // setTargetButton.setVisible(true); - // } - // if (!inAnyGroup) { - // removeFromGroupButton.setVisible(false); - // setTargetButton.setVisible(false); - // } - // selectedComponents.add(component); - // ColorRectTexture rect = new ColorRectTexture( - // (selectedTargets.isEmpty() || selectedTargets.get(0) != component) ? Color.RED : - // Color.PINK); - // textures.setTextures(rect, texture); - // } - // if (isInAnyGroup(component)) { - // monitorGroups.forEach(group -> { - // if (group.contains(component.getPos())) { - // img.setHoverTooltips( - // Component.translatable("gtceu.gui.central_monitor.group", group.getName())); - // } - // }); - // } else { - // img.setHoverTooltips(Component.translatable("gtceu.gui.central_monitor.group", - // Component.translatable("gtceu.gui.central_monitor.none"))); - // } - // }; - // Runnable rightClickCallback = () -> { - // if (!selectedTargets.isEmpty()) { - // if (selectedTargets.get(0).getPos() == component.getPos()) { - // selectedTargets.clear(); - // if (selectedComponents.contains(component)) { - // ColorRectTexture rect = new ColorRectTexture(Color.RED); - // textures.setTextures(rect, texture); - // } else { - // textures.setTextures(texture); - // } - // dataSlotInput.setVisible(false); - // return; - // } else { - // try { - // rightClickCallbacks.get(selectedTargets.get(0).getPos()).run(); - // } catch (StackOverflowError e) { - // GTCEu.LOGGER.error( - // "Stack overflow when right-clicking monitor component {} at {} (selectedTarget is {} at {})", - // component, component.getPos(), selectedTargets.get(0), - // selectedTargets.get(0).getPos()); - // } - // } - // } - // selectedTargets.add(component); - // ColorRectTexture rect; - // if (selectedComponents.contains(component)) { - // rect = new ColorRectTexture(Color.PINK); - // } else { - // rect = new ColorRectTexture(Color.BLUE); - // } - // textures.setTextures(rect, texture); - // if (component.getDataItems() != null) { - // IItemHandler dataItems = component.getDataItems(); - // MonitorGroup selectedGroup = null; - // for (MonitorGroup group : monitorGroups) { - // for (IMonitorComponent c : selectedComponents) { - // if (group.contains(c.getPos())) { - // if (selectedGroup == null || selectedGroup == group) { - // selectedGroup = group; - // } else { - // selectedGroup = null; - // break; - // } - // } - // } - // } - // if (selectedGroup != null) { - // dataSlot[0] = selectedGroup.getDataSlot() + 1; - // } - // dataSlot[1] = dataItems.getSlots(); - // dataSlotInput.setVisible(true); - // } - // }; - // if (isInAnyGroup(component)) { - // monitorGroups.forEach(group -> { - // if (group.contains(component.getPos())) img.setHoverTooltips( - // Component.translatable("gtceu.gui.central_monitor.group", group.getName())); - // }); - // } else { - // img.setHoverTooltips(Component.translatable("gtceu.gui.central_monitor.group", - // Component.translatable("gtceu.gui.central_monitor.none"))); - // } - // img.setOnPressCallback(click -> { - // if (click.button == 0) callback.accept(null); - // else if (click.button == 1) rightClickCallback.run(); - // }); - // componentSelection.addWidget(img); - // GTUtil.getLast(imageButtons).add(callback); - // rightClickCallbacks.put(component.getPos(), rightClickCallback); - // } - // } - // builder.addWidget(main); - // return builder; - // } - @Override - public IGuiTexture getComponentIcon() { - return ResourceTexture.fromSpirit(GTCEu.id("block/multiblock/network_switch/overlay_front_active")); + public IDrawable getIcon() { + return GTGuiTextures.GREGTECH_LOGO; } @Override - public @NotNull List getDebugInfo(Player player, int logLevel, - PortableScannerBehavior.DisplayMode mode) { + public List getDebugInfo(Player player, int logLevel, + PortableScannerBehavior.DisplayMode mode) { return List.of(Component.translatable("gtceu.central_monitor.size", leftDist, rightDist, upDist, downDist)); } @Override - public @NotNull List getDataInfo(PortableScannerBehavior.DisplayMode mode) { + public List getDataInfo(PortableScannerBehavior.DisplayMode mode) { return List.of(Component.translatable("gtceu.central_monitor.size", leftDist, rightDist, upDist, downDist)); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DataAccessHatchMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DataAccessHatchMachine.java index 88caec537f4..7b0573b1758 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DataAccessHatchMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DataAccessHatchMachine.java @@ -1,6 +1,5 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part; -import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.IDataAccessHatch; @@ -11,6 +10,7 @@ import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.mui.base.drawable.IDrawable; import com.gregtechceu.gtceu.api.mui.factory.PosGuiData; import com.gregtechceu.gtceu.api.mui.utils.Alignment; import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; @@ -19,6 +19,7 @@ import com.gregtechceu.gtceu.api.mui.widgets.layout.Flow; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.client.mui.screen.ModularPanel; import com.gregtechceu.gtceu.client.mui.screen.UISettings; import com.gregtechceu.gtceu.common.data.GTRecipeTypes; @@ -31,9 +32,6 @@ import com.gregtechceu.gtceu.utils.ItemStackHashStrategy; import com.gregtechceu.gtceu.utils.ResearchManager; -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; - import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; @@ -59,6 +57,7 @@ public class DataAccessHatchMachine extends TieredPartMachine private final Set recipes; @Getter private final boolean isCreative; + @SyncToClient @SaveField public final NotifiableItemStackHandler importItems; @@ -79,9 +78,8 @@ public void onContentsChanged() { rebuildData(isFormed() && getControllers().first() instanceof DataBankMachine); } - @NotNull @Override - public ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate) { + public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { boolean isDataBank = isFormed() && getControllers().first() instanceof DataBankMachine; if (ResearchManager.isStackDataItem(stack, isDataBank)) { return super.insertItem(slot, stack, simulate); @@ -93,8 +91,8 @@ public ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate // TODO MUI: Might need EIO widget? Not sure @Override - public @NotNull ModularPanel buildUI(@NotNull PosGuiData data, @NotNull PanelSyncManager syncManager, - @NotNull UISettings settings) { + public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, + UISettings settings) { int size = (int) Math.sqrt(getInventorySize()); var grid = GTMuiMachineUtil.createSlotGroupFromInventory(importItems, "data_inventory", getInventorySize(), 'I', @@ -156,12 +154,11 @@ private void rebuildData(boolean isDataBank) { } @Override - public boolean isRecipeAvailable(@NotNull GTRecipe recipe, @NotNull Collection seen) { + public boolean isRecipeAvailable(GTRecipe recipe, @NotNull Collection seen) { seen.add(this); return recipe.conditions.stream().noneMatch(ResearchCondition.class::isInstance) || recipes.contains(recipe); } - @NotNull @Override public List getDataInfo(PortableScannerBehavior.DisplayMode mode) { if (mode == PortableScannerBehavior.DisplayMode.SHOW_ALL || @@ -204,8 +201,8 @@ public GTRecipe modifyRecipe(GTRecipe recipe) { } @Override - public IGuiTexture getComponentIcon() { - return new ResourceTexture(GTCEu.id("textures/item/data_module.png")).getSubTexture(0, 0, 1, 1 / 13f); + public IDrawable getIcon() { + return GTGuiTextures.DATA_HATCH; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/AdvancedMonitorPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/AdvancedMonitorPartMachine.java index cd451b26b1d..abc8a92bb14 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/AdvancedMonitorPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/AdvancedMonitorPartMachine.java @@ -2,12 +2,10 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.machine.TickableSubscription; -import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; @@ -16,7 +14,9 @@ import net.minecraft.world.phys.BlockHitResult; import lombok.Getter; +import lombok.Setter; import org.jetbrains.annotations.Nullable; +import org.joml.Vector2d; import javax.annotation.ParametersAreNonnullByDefault; @@ -36,6 +36,10 @@ public class AdvancedMonitorPartMachine extends MonitorPartMachine { @SaveField private boolean resetClickedNextTick = false; + @Getter + @Setter + private boolean clickedThisFrame = false; + @Nullable private TickableSubscription clickResetSubscription; @@ -48,14 +52,10 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play BlockHitResult hit) { if (hit.getDirection() != getFrontFacing()) return super.onUse(state, world, pos, player, hand, hit); clicked = true; - clickPosX = hit.getLocation() - .get(RelativeDirection.RIGHT.getRelative(getFrontFacing(), getUpwardsFacing(), false).getAxis()); - clickPosY = hit.getLocation() - .get(getFrontFacing().getAxis().isVertical() ? Direction.Axis.X : Direction.Axis.Y); - clickPosX -= Math.floor(clickPosX); - if (clickPosX < 0) clickPosX++; - clickPosY -= Math.floor(clickPosY); - if (clickPosY < 0) clickPosY++; + clickedThisFrame = true; + Vector2d clickPos = getMousePos(hit); + clickPosX = clickPos.x(); + clickPosY = clickPos.y(); return InteractionResult.SUCCESS; } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/MonitorPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/MonitorPartMachine.java index 6053638864f..c0dca272b49 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/MonitorPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/MonitorPartMachine.java @@ -1,14 +1,17 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part.monitor; -import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.mui.base.drawable.IDrawable; +import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; +import com.gregtechceu.gtceu.common.mui.GTGuiTextures; -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; - +import net.minecraft.core.Direction; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; + +import org.joml.Vector2d; public class MonitorPartMachine extends MonitorComponentPartMachine { @@ -22,12 +25,29 @@ public boolean isMonitor() { } @Override - public IGuiTexture getComponentIcon() { - return ResourceTexture.fromSpirit(GTCEu.id("item/computer_monitor_cover")); + public IDrawable getIcon() { + return GTGuiTextures.MONITOR; } @Override public boolean shouldOpenUI(Player player, InteractionHand hand, BlockHitResult hit) { return false; } + + public Vector2d getMousePos(HitResult hitResult) { + if (hitResult instanceof BlockHitResult hit) { + Direction direction = RelativeDirection.RIGHT.getRelative(getFrontFacing(), getUpwardsFacing(), false); + double x = hit.getLocation().get(direction.getAxis()); + if (direction.getAxisDirection().getStep() == 1) { + x = 1 - x; + } + double y = hit.getLocation() + .get(getFrontFacing().getAxis().isVertical() ? Direction.Axis.X : Direction.Axis.Y); + x -= Math.floor(x); + if (x < 0) x++; + y -= Math.floor(y); + if (y < 0) y++; + return new Vector2d(x, y); + } else return new Vector2d(); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/CentralMonitorLogic.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/CentralMonitorLogic.java index 0d4b9cec954..57636fa2525 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/CentralMonitorLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/CentralMonitorLogic.java @@ -9,6 +9,8 @@ import net.minecraft.util.Mth; +import org.jetbrains.annotations.NotNull; + public class CentralMonitorLogic extends RecipeLogic implements IWorkable { private static final int BASE_UPDATE_INTERVAL = 8 * 20; @@ -17,7 +19,7 @@ public CentralMonitorLogic(IRecipeLogicMachine machine) { super(machine); } - public CentralMonitorMachine getMachine() { + public @NotNull CentralMonitorMachine getMachine() { return (CentralMonitorMachine) machine; } diff --git a/src/main/java/com/gregtechceu/gtceu/common/mui/factory/CentralMonitorUIFactory.java b/src/main/java/com/gregtechceu/gtceu/common/mui/factory/CentralMonitorUIFactory.java new file mode 100644 index 00000000000..91688ae88af --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/mui/factory/CentralMonitorUIFactory.java @@ -0,0 +1,380 @@ +package com.gregtechceu.gtceu.common.mui.factory; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.capability.IMonitorComponent; +import com.gregtechceu.gtceu.api.item.IComponentItem; +import com.gregtechceu.gtceu.api.item.component.IItemComponent; +import com.gregtechceu.gtceu.api.item.component.IMonitorModuleItem; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.mui.base.GuiAxis; +import com.gregtechceu.gtceu.api.mui.base.IPanelHandler; +import com.gregtechceu.gtceu.api.mui.base.drawable.IDrawable; +import com.gregtechceu.gtceu.api.mui.base.drawable.IKey; +import com.gregtechceu.gtceu.api.mui.base.value.IValue; +import com.gregtechceu.gtceu.api.mui.base.widget.IWidget; +import com.gregtechceu.gtceu.api.mui.drawable.BorderDrawable; +import com.gregtechceu.gtceu.api.mui.drawable.DynamicDrawable; +import com.gregtechceu.gtceu.api.mui.factory.PanelFactory; +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.GenericSyncValue; +import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; +import com.gregtechceu.gtceu.api.mui.value.sync.SyncHandlers; +import com.gregtechceu.gtceu.api.mui.widgets.*; +import com.gregtechceu.gtceu.api.mui.widgets.layout.Flow; +import com.gregtechceu.gtceu.api.mui.widgets.layout.Grid; +import com.gregtechceu.gtceu.api.mui.widgets.slot.ItemSlot; +import com.gregtechceu.gtceu.api.mui.widgets.slot.ModularSlot; +import com.gregtechceu.gtceu.api.mui.widgets.textfield.TextFieldWidget; +import com.gregtechceu.gtceu.client.mui.screen.ModularPanel; +import com.gregtechceu.gtceu.client.mui.screen.UISettings; +import com.gregtechceu.gtceu.common.data.machines.GTMultiMachines; +import com.gregtechceu.gtceu.common.data.mui.GTMuiWidgets; +import com.gregtechceu.gtceu.common.machine.multiblock.electric.CentralMonitorMachine; +import com.gregtechceu.gtceu.common.machine.multiblock.electric.monitor.MonitorGroup; +import com.gregtechceu.gtceu.common.mui.GTGuiTextures; +import com.gregtechceu.gtceu.utils.serialization.network.ByteBufAdapters; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; + +import com.mojang.blaze3d.platform.InputConstants; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Function; +import java.util.function.IntSupplier; + +public class CentralMonitorUIFactory implements PanelFactory { + + public static final CentralMonitorUIFactory INSTANCE = new CentralMonitorUIFactory(); + + @Override + public ModularPanel buildUIFunction(PosGuiData data, PanelSyncManager syncManager, UISettings settings, + MetaMachine metaMachine) { + if (!(metaMachine instanceof CentralMonitorMachine machine)) return new ModularPanel("main"); + GenericSyncValue> groupSync = new GenericSyncValue.Builder>(null) + .adapter(ByteBufAdapters.MONITOR_GROUPS) + .setter(machine::setMonitorGroups) + .getter(machine::getMonitorGroups) + .build(); + syncManager.syncValue("monitor_groups_sync", groupSync); + List groups = new ArrayList<>(groupSync.getValue()); + SortableListWidget listWidget = new SortableListWidget<>(); + IPanelHandler helpPanel = syncManager.syncedPanel( + "help_panel", true, + (syncManager1, panelHandler1) -> createHelpPanel()); + Function, SortableListWidget.Item> processGroupItem = item -> { + IPanelHandler panelHandler = syncManager.syncedPanel( + "editor_" + groups.indexOf(item.getWidgetValue()), true, + (syncManager1, panelHandler1) -> this.createGroupEditorPanel( + syncManager1, groupSync, + machine, item.getWidgetValue(), + groups, helpPanel)); + return item.child(Flow.row() + .height(20) + .child(new TextWidget<>(IKey.dynamic(() -> Component.literal(item.getWidgetValue().getName()))) + .paddingLeft(5) + .widthRelOffset(1, -38)) + .child(new ButtonWidget<>() + .background(GTGuiTextures.EDIT) + .hoverBackground(GTGuiTextures.EDIT, new BorderDrawable()) + .onMousePressed((mouseX, mouseY, button) -> { + panelHandler.openPanel(); + return true; + })) + .child(new ButtonWidget<>() + .background(GTGuiTextures.CLOSE) + .hoverBackground(GTGuiTextures.CLOSE, new BorderDrawable()) + .onMousePressed((mouseX, mouseY, button) -> { + groups.remove(item.getWidgetValue()); + groupSync.setValue(groups); + item.removeSelfFromList(); + return true; + }))); + }; + IPanelHandler newGroupPanelHandler = syncManager.syncedPanel( + "editor_" + groups.size(), true, + (syncManager1, panelHandler1) -> { + MonitorGroup group = new MonitorGroup(getNewGroupName(groupSync)); + groups.add(group); + listWidget.child(processGroupItem.apply(new SortableListWidget.Item<>(group))); + GTCEu.LOGGER.info("adding group: {} isClient = {}", groups, syncManager1.isClient()); + groupSync.setValue(groups, true, false); + return this.createGroupEditorPanel( + syncManager1, groupSync, + machine, group, groups, helpPanel); + }); + return new Dialog<>("main") + .setDraggable(true) + .padding(5) + .excludeAreaInRecipeViewer() + .child(GTMuiWidgets.createTitleBar(GTMultiMachines.CENTRAL_MONITOR, 176)) + .child(new Flow(GuiAxis.Y) + .heightRel(1) + .widthRel(1) + .padding(2) + .child(new Flow(GuiAxis.X) + .child(new TextWidget<>(IKey.lang("gtceu.central_monitor.gui.monitor_groups")) + .alignX(0)) + .child(new ButtonWidget<>() + .alignX(1) + .background(GTGuiTextures.MC_BUTTON, GTGuiTextures.ADD) + .hoverBackground(GTGuiTextures.MC_BUTTON_HOVERED, GTGuiTextures.ADD) + .onMousePressed((mouseX, mouseY, button) -> { + newGroupPanelHandler.openPanel(); + return true; + })) + .widthRel(1).height(20)) + .child(listWidget.children( + groups.stream() + .map(SortableListWidget.Item::new) + .map(processGroupItem) + .toList()) + .onChange(groupSync::setValue) + .widthRel(1).heightRelOffset(() -> 1, -96)) + .child(SlotGroupWidget.playerInventory(false))); + } + + private ModularPanel createGroupEditorPanel(PanelSyncManager syncManager, + GenericSyncValue> groupSync, + CentralMonitorMachine machine, MonitorGroup group, + List groups, + IPanelHandler helpPanel) { + List> matrix = new ArrayList<>(); + int matrixWidth = 0; + for (int row = 0; row <= machine.getDownDist() + machine.getUpDist(); row++) { + List curRow = new ArrayList<>(); + matrix.add(curRow); + for (int col = 0; col <= machine.getLeftDist() + machine.getRightDist(); col++) { + IMonitorComponent component = machine.getComponent(row, col); + IDrawable texture = component == null ? GTGuiTextures.CROSS : component.getIcon(); + int finalCol = col; + int finalRow = row; + IPanelHandler slotDialogHandler = component == null || component.getDataItems() == null ? + null : + syncManager.syncedPanel( + "slot_dialog_" + finalCol + "_" + finalRow + "_" + groups.indexOf(group), + true, + (syncManager1, panelHandler1) -> new SimpleDialog<>( + "slot_number_dialog_" + finalCol + "_" + finalRow + "_" + groups.indexOf(group), + slot -> { + group.setTarget(component.getBlockPos()); + group.setDataSlot(slot - 1); + groupSync.setValue(groups); + }, + new TextFieldWidget().setNumbers(1, component.getDataItems().getSlots()), + w -> { + w.validateText(); + return Integer.parseInt(w.getText()); + }, + IKey.lang("gtceu.central_monitor.gui.data_slot")).setDraggable(true) + .size(160, 80)); + IntSupplier colorSupplier = () -> { + if (component == null) return 0; + boolean inGroup = group.contains(component.getBlockPos()); + BlockPos target = group.getTargetRaw(); + boolean isTarget = target != null && target.asLong() == component.getBlockPos().asLong(); + if (inGroup && isTarget) return 0xFFFF00FF; + else if (inGroup) return 0xFFFF0000; + else if (isTarget) return 0xFF0000FF; + else return 0; + }; + curRow.add(new ButtonWidget<>() + .margin(1) + .background(texture, new BorderDrawable(colorSupplier, 1), IKey.dynamic(() -> { + if (component == null || component.getDataItems() == null) return Component.empty(); + BlockPos target = group.getTargetRaw(); + boolean isTarget = target != null && target.asLong() == component.getBlockPos().asLong(); + if (isTarget) return Component.literal(String.valueOf(group.getDataSlot() + 1)); + else return Component.empty(); + })) + .hoverBackground(texture, new BorderDrawable(() -> colorSupplier.getAsInt() | 0x222222, 1)) + .onMousePressed((mouseX, mouseY, button) -> { + if (component == null) return true; + if (button == InputConstants.MOUSE_BUTTON_LEFT) { + if (!component.isMonitor()) return true; + if (group.contains(component.getBlockPos())) { + group.remove(component.getBlockPos()); + } else { + group.add(component.getBlockPos()); + } + } else if (button == InputConstants.MOUSE_BUTTON_RIGHT) { + if (slotDialogHandler != null) { + slotDialogHandler.openPanel(); + } else group.setTarget(component.getBlockPos()); + } + groupSync.setValue(groups); + return true; + })); + } + matrixWidth = Math.max(matrixWidth, curRow.size() * 20); + } + int matrixHeight = matrix.size() * 20; + IPanelHandler moduleEditor = createModulePanelHandler( + syncManager, + group.getItemStackHandler().getStackInSlot(0), + group, machine, groups.indexOf(group)); + BoolValue moduleChanged = new BoolValue(false); + return new ModularPanel("editor_" + groups.indexOf(group) + "_panel") + .width(Math.max(matrixWidth, 150)) + .height(matrixHeight + 60) + .excludeAreaInRecipeViewer() + .child(Flow.column() + .padding(10) + .child(new TextWidget<>(IKey.lang("gtceu.central_monitor.gui.group_editor"))) + .child(Flow.row() + .height(20) + .child(new TextWidget<>(IKey.lang("gtceu.central_monitor.gui.group_name")) + .paddingRight(4)) + .child(new TextFieldWidget() + .value(SyncHandlers.string(group::getName, group::setName))) + .child(new ItemSlot() + .slot(group.getItemStackHandler(), 0) + .name("module_slot") + .slot(new ModularSlot(group.getItemStackHandler(), 0) + .changeListener((item, amount, client, init) -> { + if (!amount && !init) + moduleChanged.setValue(true); + }))) + .child(new ButtonWidget<>() + .background( + new DynamicDrawable(() -> moduleChanged.getValue() ? + GTGuiTextures.MC_BUTTON_DISABLED : + GTGuiTextures.MC_BUTTON), + GTGuiTextures.EDIT) + .hoverBackground( + new DynamicDrawable(() -> moduleChanged.getValue() ? + GTGuiTextures.MC_BUTTON_DISABLED : + GTGuiTextures.MC_BUTTON_HOVERED), + GTGuiTextures.EDIT) + .setEnabledIf(w -> !group.getItemStackHandler().getStackInSlot(0).isEmpty()) + .addTooltipLine(IKey.lang(() -> moduleChanged.getValue() ? + "gtceu.gui.central_monitor.module_editor_disabled" : + "gtceu.gui.central_monitor.module_editor_button")) + .onMousePressed((mouseX, mouseY, button) -> { + if (moduleEditor != null && !moduleChanged.getValue()) + moduleEditor.openPanel(); + return true; + }))) + .child(new Grid().matrix(matrix).alignX(Alignment.CENTER).size(matrixWidth, matrixHeight))) + .child(new ButtonWidget<>() + .align(Alignment.TopRight) + .background(GTGuiTextures.HELP) + .hoverBackground(GTGuiTextures.HELP, new BorderDrawable()) + .onMousePressed((mouseX, mouseY, button) -> { + helpPanel.openPanel(); + return true; + })); + } + + private ModularPanel createHelpPanel() { + return new ModularPanel("help_panel") + .excludeAreaInRecipeViewer() + .width(500) + .height(300) + .resizeableOnDrag(true) + .child(Flow.column() + .margin(5) + .child(new TextWidget<>(IKey.lang("gtceu.gui.central_monitor.help"))) + .child(Flow.row() + .marginTop(10) + .height(40) + .widthRel(1) + .child(new IDrawable.MultiDrawableWidget(new BorderDrawable(0xFFFF0000, 1), + GTGuiTextures.MONITOR) + .heightRel(1) + .width(40) + .padding(11) + .background(new BorderDrawable(0xFF888888, 1)) + .disableHoverBackground()) + .child(new TextWidget<>(IKey.lang("gtceu.gui.central_monitor.in_group")) + .widthRel(.5f) + .heightRel(1) + .padding(5) + .background(new BorderDrawable(0xFF888888, 1)) + .disableHoverBackground()) + .child(new TextWidget<>(IKey.lang("gtceu.gui.central_monitor.left_click")) + .padding(5) + .widthRelOffset(.5f, -40) + .heightRel(1) + .background(new BorderDrawable(0xFF888888, 1)) + .disableHoverBackground())) + .child(Flow.row() + .height(40) + .widthRel(1) + .child(new IDrawable.DrawableWidget(new BorderDrawable(0xFF0000FF, 1)) + .heightRel(1) + .width(40) + .padding(11) + .background(new BorderDrawable(0xFF888888, 1)) + .disableHoverBackground()) + .child(new TextWidget<>(IKey.lang("gtceu.gui.central_monitor.target")) + .widthRel(.5f) + .heightRel(1) + .padding(5) + .background(new BorderDrawable(0xFF888888, 1)) + .disableHoverBackground()) + .child(new TextWidget<>(IKey.lang("gtceu.gui.central_monitor.right_click")) + .padding(5) + .widthRelOffset(.5f, -40) + .heightRel(1) + .background(new BorderDrawable(0xFF888888, 1)) + .disableHoverBackground())) + .child(Flow.row() + .height(40) + .widthRel(1) + .child(new IDrawable.MultiDrawableWidget(new BorderDrawable(0xFFFF00FF, 1), + GTGuiTextures.MONITOR) + .heightRel(1) + .width(40) + .padding(11) + .background(new BorderDrawable(0xFF888888, 1)) + .disableHoverBackground()) + .child(new TextWidget<>(IKey.lang("gtceu.gui.central_monitor.in_group_and_target")) + .widthRelOffset(1, -40) + .heightRel(1) + .padding(5) + .background(new BorderDrawable(0xFF888888, 1)))) + .child(Flow.row() + .height(40) + .widthRel(1) + .child(new IDrawable.MultiDrawableWidget(new BorderDrawable(0xFF0000FF, 1), + GTGuiTextures.DATA_HATCH, IKey.str("7").color(0xFFFFFFFF)) + .heightRel(1) + .width(40) + .padding(11) + .background(new BorderDrawable(0xFF888888, 1)) + .disableHoverBackground()) + .child(new TextWidget<>(IKey.lang("gtceu.gui.central_monitor.data_hatch_target")) + .widthRelOffset(1, -40) + .heightRel(1) + .padding(5) + .background(new BorderDrawable(0xFF888888, 1))))); + } + + private IPanelHandler createModulePanelHandler(PanelSyncManager syncManager, ItemStack stack, MonitorGroup group, + CentralMonitorMachine machine, int index) { + IMonitorModuleItem moduleItem = null; + if (stack.getItem() instanceof IComponentItem componentItem) { + for (IItemComponent component : componentItem.getComponents()) { + if (component instanceof IMonitorModuleItem monitorModuleItem) { + moduleItem = monitorModuleItem; + break; + } + } + } + IMonitorModuleItem finalModuleItem = moduleItem; + return moduleItem == null ? null : syncManager.syncedPanel( + "module_editor_" + index, true, + (syncManager1, panelHandler1) -> finalModuleItem.createModularPanel(stack, machine, group, syncManager1, + panelHandler1)); + } + + private String getNewGroupName(IValue> groupSync) { + return Component.translatable("gtceu.gui.central_monitor.group_default_name", groupSync.getValue().size() + 1) + .getString(); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/mui/factory/CoverUIFactory.java b/src/main/java/com/gregtechceu/gtceu/common/mui/factory/CoverUIFactory.java index 6b1f9d214d5..9dedbd4eeda 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/mui/factory/CoverUIFactory.java +++ b/src/main/java/com/gregtechceu/gtceu/common/mui/factory/CoverUIFactory.java @@ -1,8 +1,8 @@ package com.gregtechceu.gtceu.common.mui.factory; import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.capability.GTCapability; import com.gregtechceu.gtceu.api.capability.ICoverable; -import com.gregtechceu.gtceu.api.capability.forge.GTCapability; import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.cover.IMuiCover; import com.gregtechceu.gtceu.api.mui.base.IUIHolder;