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 e2bcaf39d35..2ee8ac3ab2b 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 @@ -3,7 +3,6 @@ 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; @@ -18,8 +17,8 @@ default void tickInPlaceholder(ItemStack stack, PlaceholderContext context) {} IMonitorRenderer getRenderer(ItemStack stack, CentralMonitorMachine machine, MonitorGroup group); - ModularPanel createModularPanel(ItemStack stack, CentralMonitorMachine machine, MonitorGroup group, - PanelSyncManager syncManager, IPanelHandler panelHandler); + IPanelHandler createModularPanel(ItemStack stack, CentralMonitorMachine machine, MonitorGroup group, + PanelSyncManager syncManager); default String getType() { return "unknown"; diff --git a/src/main/java/com/gregtechceu/gtceu/api/mui/widgets/textfield/CodeEditorWidget.java b/src/main/java/com/gregtechceu/gtceu/api/mui/widgets/textfield/CodeEditorWidget.java index 3cfc7a2f6ff..2d532008c66 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/mui/widgets/textfield/CodeEditorWidget.java +++ b/src/main/java/com/gregtechceu/gtceu/api/mui/widgets/textfield/CodeEditorWidget.java @@ -1,7 +1,8 @@ package com.gregtechceu.gtceu.api.mui.widgets.textfield; +import com.gregtechceu.gtceu.api.mui.base.value.ISyncOrValue; import com.gregtechceu.gtceu.api.mui.value.sync.GenericListSyncHandler; -import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; +import com.gregtechceu.gtceu.api.mui.value.sync.StringSyncValue; import com.gregtechceu.gtceu.client.mui.screen.viewport.ModularGuiContext; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.utils.GTUtil; @@ -47,11 +48,17 @@ public class CodeEditorWidget, T> extends TextE public CodeEditorWidget() {} - public CodeEditorWidget(@Nullable LanguageDefinition language, PanelSyncManager panelSyncManager) { + public CodeEditorWidget(@Nullable LanguageDefinition language) { this.language = language; GenericListSyncHandler formattedTextSync = new GenericListSyncHandler<>( this::getTextAsComponents, this::formattedText, ByteBufAdapters.COMPONENT); - panelSyncManager.syncValue("formatted_code", formattedTextSync); + setSyncOrValue(formattedTextSync); + } + + @Override + public boolean isValidSyncOrValue(@NotNull ISyncOrValue syncOrValue) { + return syncOrValue.isTypeOrEmpty(GenericListSyncHandler.class) || + syncOrValue.isTypeOrEmpty(StringSyncValue.class); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/placeholder/PlaceholderHandler.java b/src/main/java/com/gregtechceu/gtceu/api/placeholder/PlaceholderHandler.java index 8ba28780c80..103e6c8734d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/placeholder/PlaceholderHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/placeholder/PlaceholderHandler.java @@ -10,10 +10,7 @@ import com.gregtechceu.gtceu.api.mui.drawable.BorderDrawable; import com.gregtechceu.gtceu.api.mui.utils.Alignment; import com.gregtechceu.gtceu.api.mui.value.StringValue; -import com.gregtechceu.gtceu.api.mui.value.sync.DoubleSyncValue; -import com.gregtechceu.gtceu.api.mui.value.sync.InteractionSyncHandler; -import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; -import com.gregtechceu.gtceu.api.mui.value.sync.SyncHandlers; +import com.gregtechceu.gtceu.api.mui.value.sync.*; import com.gregtechceu.gtceu.api.mui.widgets.ButtonWidget; import com.gregtechceu.gtceu.api.mui.widgets.SortableListWidget; import com.gregtechceu.gtceu.api.mui.widgets.TextWidget; @@ -283,108 +280,113 @@ public static Widget getPlaceholderHandlerUI(String filter) { return out; } - public static Flow createPlaceholderEditor(PanelSyncManager syncManager, - PlaceholderContext ctx, - IStringValue code, - @Nullable DoubleSyncValue scaleDouble, - @Nullable IIntValue updateInterval, - @Nullable IBoolValue pause, - @Nullable Runnable updateText) { + public static IPanelHandler createPlaceholderEditor(String name, PanelSyncManager syncManager, + PlaceholderContext ctx, + IStringValue code, + @Nullable DoubleSyncValue scaleDouble, + @Nullable IIntValue updateInterval, + @Nullable IBoolValue pause, + @Nullable Runnable updateText) { IPanelHandler helpPanel = syncManager.syncedPanel("placeholder_language_help", true, - (syncManager1, panelHandler1) -> createHelpPanel(syncManager1)); + (syncManager1, panelHandler1) -> createHelpPanel()); InteractionSyncHandler runCodeOnce = new InteractionSyncHandler(); if (updateText != null) runCodeOnce.setOnMousePressed(mouseData -> updateText.run()); syncManager.syncValue("run_code_sync_handler", runCodeOnce); // because the args are nullable, intellij complains about everything, even though childIf is used // noinspection DataFlowIssue - return Flow.row() - .childIf(ctx.itemStackHandler() != null, () -> Flow.column() - .coverChildren() - .paddingLeft(4) - .children( - ctx.itemStackHandler().getSlots(), - i -> new ItemSlot() - .slot(ctx.itemStackHandler(), i) - .addTooltipLine( - IKey.lang("gtceu.gui.computer_monitor_cover.slot_tooltip", i)))) - .child(Flow.column() - .widthRel(.8f) - .padding(5) - .child(Flow.row() - .height(20) - .childIf(scaleDouble != null, - () -> new TextWidget<>(IKey.lang("gtceu.gui.central_monitor.text_scale"))) - .childIf(scaleDouble != null, () -> new TextFieldWidget() - .setNumbersDouble(x -> Math.max(x, 0)) - .setDefaultNumber(1.0) - .value(scaleDouble) - .marginLeft(4)) - .childIf(updateInterval != null, - () -> new TextWidget<>( - IKey.lang("gtceu.gui.computer_monitor_cover.update_interval"))) - .childIf(updateInterval != null, () -> new TextFieldWidget() - .setNumbers(1, 1000) - .setDefaultNumber(1) - .value(SyncHandlers.string( - () -> String.valueOf(updateInterval.getIntValue()), - s -> updateInterval.setIntValue(Integer.parseInt(s)))) - .marginLeft(4)) - .childIf(pause != null, () -> new ToggleButton() - .value(pause) - .background(false, GTGuiTextures.PAUSE) - .background(true, GTGuiTextures.PLAY) - .addTooltip(false, IKey.lang("gtceu.gui.central_monitor.pause")) - .addTooltip(true, IKey.lang("gtceu.gui.central_monitor.resume")) - .margin(4)) - .childIf(updateText != null, () -> new ButtonWidget<>() - .background(GTGuiTextures.RIGHTLOAD) - .hoverBackground(GTGuiTextures.RIGHTLOAD, new BorderDrawable()) - .addTooltipLine(IKey.lang("gtceu.gui.central_monitor.update_once")) - .syncHandler("run_code_sync_handler")) - .child(new ButtonWidget<>() - .background(GTGuiTextures.HELP) - .hoverBackground(GTGuiTextures.HELP, new BorderDrawable()) - .margin(4) - .onMousePressed((mouseX, mouseY, button) -> { - helpPanel.openPanel(); - return true; - }))) - .child(new CodeEditorWidget<>(PlaceholderHandler.LANG_DEFINITION, syncManager) - .value(code) - .langContext(ctx) - .widthRel(.95f) - .heightRelOffset(() -> 1, -25))) - .child(new SortableListWidget() - .widthRel(.2f) - .paddingBottom(5) - .excludeAreaInRecipeViewer() - .children(PlaceholderHandler.getAllPlaceholderNames() - .stream() - .sorted() - .map(SortableListWidget.Item::new) - .map(w -> w - .child(new TextWidget<>(w.getWidgetValue()) - .sizeRel(1) - .alignment(Alignment.CENTER)) - .tooltip(new RichTooltip() - .addDrawableLines(LangHandler - .getSingleOrMultiLang( - "gtceu.placeholder_info." + w.getWidgetValue()) - .stream() - .map(IKey::lang) - .map(key -> (IDrawable) key) - .toList()))) - .toList())); + return syncManager.syncedPanel(name, true, (psm, handler) -> new ModularPanel(name) + .size(400, 250) + .resizeableOnDrag(true) + .excludeAreaInRecipeViewer() + .child(Flow.row() + .childIf(ctx.itemStackHandler() != null, () -> Flow.column() + .coverChildren() + .paddingLeft(4) + .children( + ctx.itemStackHandler().getSlots(), + i -> new ItemSlot() + .slot(ctx.itemStackHandler(), i) + .addTooltipLine( + IKey.lang("gtceu.gui.computer_monitor_cover.slot_tooltip", i)))) + .child(Flow.column() + .widthRel(.8f) + .padding(5) + .child(Flow.row() + .height(20) + .childIf(scaleDouble != null, + () -> new TextWidget<>( + IKey.lang("gtceu.gui.central_monitor.text_scale"))) + .childIf(scaleDouble != null, () -> new TextFieldWidget() + .setNumbersDouble(x -> Math.max(x, 0)) + .setDefaultNumber(1.0) + .value(scaleDouble) + .marginLeft(4)) + .childIf(updateInterval != null, + () -> new TextWidget<>( + IKey.lang("gtceu.gui.computer_monitor_cover.update_interval"))) + .childIf(updateInterval != null, () -> new TextFieldWidget() + .setNumbers(1, 1000) + .setDefaultNumber(1) + .value(SyncHandlers.string( + () -> String.valueOf(updateInterval.getIntValue()), + s -> updateInterval.setIntValue(Integer.parseInt(s)))) + .marginLeft(4)) + .childIf(pause != null, () -> new ToggleButton() + .value(pause) + .background(false, GTGuiTextures.PAUSE) + .background(true, GTGuiTextures.PLAY) + .addTooltip(false, IKey.lang("gtceu.gui.central_monitor.pause")) + .addTooltip(true, IKey.lang("gtceu.gui.central_monitor.resume")) + .margin(4)) + .childIf(updateText != null, () -> new ButtonWidget<>() + .background(GTGuiTextures.RIGHTLOAD) + .hoverBackground(GTGuiTextures.RIGHTLOAD, new BorderDrawable()) + .addTooltipLine(IKey.lang("gtceu.gui.central_monitor.update_once")) + .syncHandler("run_code_sync_handler")) + .child(new ButtonWidget<>() + .background(GTGuiTextures.HELP) + .hoverBackground(GTGuiTextures.HELP, new BorderDrawable()) + .margin(4) + .onMousePressed((mouseX, mouseY, button) -> { + helpPanel.openPanel(); + return true; + }))) + .child(new CodeEditorWidget<>(PlaceholderHandler.LANG_DEFINITION) + .value(code) + .langContext(ctx) + .widthRel(.95f) + .heightRelOffset(1, -25))) + .child(new SortableListWidget() + .widthRel(.2f) + .paddingBottom(5) + .excludeAreaInRecipeViewer() + .children(PlaceholderHandler.getAllPlaceholderNames() + .stream() + .sorted() + .map(SortableListWidget.Item::new) + .map(w -> w + .child(new TextWidget<>(w.getWidgetValue()) + .sizeRel(1) + .align(Alignment.CENTER)) + .tooltip(new RichTooltip() + .addDrawableLines(LangHandler + .getSingleOrMultiLang( + "gtceu.placeholder_info." + w.getWidgetValue()) + .stream() + .map(IKey::lang) + .map(key -> (IDrawable) key) + .toList()))) + .toList())))); } - public static ModularPanel createHelpPanel(PanelSyncManager syncManager) { + public static ModularPanel createHelpPanel() { return new ModularPanel("placeholder_language_help") .size(500, 250) .child(Flow.column() .padding(5) .child(new TextWidget<>(IKey.lang("gtceu.gui.central_monitor.text_module_help"))) - .child(new CodeEditorWidget<>(LANG_DEFINITION, syncManager) + .child(new CodeEditorWidget<>(LANG_DEFINITION) .padding(5) .widthRel(.95f) .height(100) diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTPlaceholders.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTPlaceholders.java index e86f887628c..4330822e328 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTPlaceholders.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTPlaceholders.java @@ -138,12 +138,10 @@ public boolean isView() { public MultiLineComponent apply(PlaceholderContext ctx, List args) throws PlaceholderException { String expression = args.stream().map(MultiLineComponent::toString).reduce("", (a, b) -> a + b); - ParseResult result = GTMath.parseExpression(expression, true); + ParseResult result = GTMath.parseExpression(expression, 0, true); if (result.isFailure()) throw new PlaceholderException(result.getError().toString()); - double res = (double) result.getResult().getValue(); - if ((int) res == res) return MultiLineComponent.literal((int) res); - return MultiLineComponent.literal(result.getResult().toString()); + return MultiLineComponent.literal(result.getResult().getNumberValue().toString()); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/modules/GuiModuleBehaviour.java b/src/main/java/com/gregtechceu/gtceu/common/item/modules/GuiModuleBehaviour.java index 908b241f6cd..7a8f39bfc6a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/modules/GuiModuleBehaviour.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/modules/GuiModuleBehaviour.java @@ -32,12 +32,13 @@ public IMonitorRenderer getRenderer(ItemStack stack, CentralMonitorMachine machi } @Override - public ModularPanel createModularPanel(ItemStack stack, CentralMonitorMachine machine, MonitorGroup group, - PanelSyncManager syncManager, IPanelHandler panelHandler) { - return new ModularPanel("gui_module_info") - .coverChildren() - .child(new TextWidget<>(IKey.lang("gtceu.gui.central_monitor.gui_module_info")) - .height(50) - .width(200)); + public IPanelHandler createModularPanel(ItemStack stack, CentralMonitorMachine machine, MonitorGroup group, + PanelSyncManager syncManager) { + return syncManager.syncedPanel("gui_module_" + group.getName(), true, + (psm, handler) -> new ModularPanel("gui_module_info") + .coverChildren() + .child(new TextWidget<>(IKey.lang("gtceu.gui.central_monitor.gui_module_info")) + .height(50) + .width(200))); } } 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 29cb2da6a53..c6c023844b6 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 @@ -34,19 +34,20 @@ public IMonitorRenderer getRenderer(ItemStack stack, CentralMonitorMachine machi } @Override - 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))) + public IPanelHandler createModularPanel(ItemStack stack, CentralMonitorMachine machine, MonitorGroup group, + PanelSyncManager syncManager) { + return syncManager.syncedPanel("image_module_" + group.getName(), true, + (psm, handler) -> new ModularPanel("image_module_editor") + .size(200, 50) + .child(Flow.column() + .marginTop(5) .align(Alignment.CENTER) - .widthRel(.8f))); + .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 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 82886fe97fe..e276c58534d 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 @@ -3,15 +3,10 @@ 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.mui.value.sync.*; 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; @@ -69,24 +64,21 @@ public IMonitorRenderer getRenderer(ItemStack stack, CentralMonitorMachine machi } @Override - public ModularPanel createModularPanel(ItemStack stack, CentralMonitorMachine machine, MonitorGroup group, - PanelSyncManager syncManager, IPanelHandler panelHandler) { + public IPanelHandler createModularPanel(ItemStack stack, CentralMonitorMachine machine, MonitorGroup group, + PanelSyncManager syncManager) { PlaceholderContext ctx = getContext(stack, machine, group); - IStringValue code = SyncHandlers.string( + StringSyncValue 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)); + BooleanSyncValue pause = SyncHandlers.bool(() -> isPaused(stack), p -> setPaused(stack, p)); Runnable updateText = () -> updateText(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)); + return PlaceholderHandler.createPlaceholderEditor("text_module_" + group.getName(), syncManager, ctx, code, + scale, null, pause, + updateText); } @Override 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 index 51b7a2a5e85..b984182c3cb 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/mui/factory/CentralMonitorUIFactory.java +++ b/src/main/java/com/gregtechceu/gtceu/common/mui/factory/CentralMonitorUIFactory.java @@ -18,9 +18,7 @@ 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.GenericListSyncHandler; -import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; -import com.gregtechceu.gtceu.api.mui.value.sync.SyncHandlers; +import com.gregtechceu.gtceu.api.mui.value.sync.*; 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; @@ -59,8 +57,7 @@ public ModularPanel buildUIFunction(PosGuiData data, PanelSyncManager syncManage GenericListSyncHandler groupSync = new GenericListSyncHandler<>(machine::getMonitorGroups, machine::setMonitorGroups, MONITOR_GROUPS); syncManager.syncValue("monitor_groups_sync", groupSync); - List groups = new ArrayList<>(groupSync.getValue()); - SortableListWidget listWidget = new SortableListWidget<>(); + List groups = new ArrayList<>(machine.getMonitorGroups()); IPanelHandler helpPanel = syncManager.syncedPanel( "help_panel", true, (syncManager1, panelHandler1) -> createHelpPanel()); @@ -93,18 +90,15 @@ public ModularPanel buildUIFunction(PosGuiData data, PanelSyncManager syncManage 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); - }); + DynamicSyncHandler listHandler = new DynamicSyncHandler() + .widgetProvider((psm, buf) -> new SortableListWidget() + .children(groups.stream() + .map(SortableListWidget.Item::new) + .map(processGroupItem) + .toList()) + .onChange(groupSync::setValue) + .widthRel(1)); + listHandler.notifyUpdate(buf -> {}); return new Dialog<>("main") .setDraggable(true) .padding(5) @@ -121,18 +115,20 @@ public ModularPanel buildUIFunction(PosGuiData data, PanelSyncManager syncManage .alignX(1) .background(GTGuiTextures.MC_BUTTON, GTGuiTextures.ADD) .hoverBackground(GTGuiTextures.MC_BUTTON_HOVERED, GTGuiTextures.ADD) - .onMousePressed((mouseX, mouseY, button) -> { - newGroupPanelHandler.openPanel(); - return true; - })) + .syncHandler(new InteractionSyncHandler() + .setOnMousePressed(mouseData -> { + MonitorGroup group = new MonitorGroup(getNewGroupName(groupSync)); + groups.add(group); + GTCEu.LOGGER.info("adding group: {} isClient = {}", groups, + syncManager.isClient()); + groupSync.setValue(groups, true, false); + listHandler.notifyUpdate(buf -> {}); + }))) .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(new DynamicSyncedWidget<>() + .syncHandler(listHandler) + .widthRel(1) + .heightRelOffset(() -> 1, -96)) .child(SlotGroupWidget.playerInventory(false))); } @@ -214,7 +210,7 @@ private ModularPanel createGroupEditorPanel(PanelSyncManager syncManager, IPanelHandler moduleEditor = createModulePanelHandler( syncManager, group.getItemStackHandler().getStackInSlot(0), - group, machine, groups.indexOf(group)); + group, machine); BoolValue moduleChanged = new BoolValue(false); return new ModularPanel("editor_" + groups.indexOf(group) + "_panel") .width(Math.max(matrixWidth, 150)) @@ -354,7 +350,7 @@ private ModularPanel createHelpPanel() { } private IPanelHandler createModulePanelHandler(PanelSyncManager syncManager, ItemStack stack, MonitorGroup group, - CentralMonitorMachine machine, int index) { + CentralMonitorMachine machine) { IMonitorModuleItem moduleItem = null; if (stack.getItem() instanceof IComponentItem componentItem) { for (IItemComponent component : componentItem.getComponents()) { @@ -365,10 +361,7 @@ private IPanelHandler createModulePanelHandler(PanelSyncManager syncManager, Ite } } IMonitorModuleItem finalModuleItem = moduleItem; - return moduleItem == null ? null : syncManager.syncedPanel( - "module_editor_" + index, true, - (syncManager1, panelHandler1) -> finalModuleItem.createModularPanel(stack, machine, group, syncManager1, - panelHandler1)); + return moduleItem == null ? null : finalModuleItem.createModularPanel(stack, machine, group, syncManager); } private String getNewGroupName(IValue> groupSync) {