From 16e0243f2814a7c07d8e2874ef0b5a4f55657cad Mon Sep 17 00:00:00 2001 From: GaLi <3096147684@qq.com> Date: Sat, 9 Aug 2025 02:35:35 +0800 Subject: [PATCH] Add pattern terminal slot toggle functionality --- .../mixin/GuiExPatternTerminalMixin.java | 124 ++++++++++++++++++ .../resources/extendedae_plus.mixins.json | 6 +- 2 files changed, 128 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/extendedae_plus/mixin/GuiExPatternTerminalMixin.java diff --git a/src/main/java/com/extendedae_plus/mixin/GuiExPatternTerminalMixin.java b/src/main/java/com/extendedae_plus/mixin/GuiExPatternTerminalMixin.java new file mode 100644 index 0000000..3bc539e --- /dev/null +++ b/src/main/java/com/extendedae_plus/mixin/GuiExPatternTerminalMixin.java @@ -0,0 +1,124 @@ +package com.extendedae_plus.mixin; + +import appeng.client.gui.Icon; +import appeng.client.gui.AEBaseScreen; +import appeng.client.gui.style.ScreenStyle; +import appeng.client.gui.widgets.IconButton; +import com.glodblock.github.extendedae.client.gui.GuiExPatternTerminal; +import com.glodblock.github.extendedae.client.gui.GuiWirelessExPAT; +import com.glodblock.github.extendedae.container.ContainerExPatternTerminal; +import net.minecraft.client.gui.components.Tooltip; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Inventory; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(GuiExPatternTerminal.class) +public abstract class GuiExPatternTerminalMixin extends AEBaseScreen { + + @Unique + private IconButton toggleSlotsButton; + + @Unique + private boolean showSlots = true; // 默认显示槽位 + + public GuiExPatternTerminalMixin(ContainerExPatternTerminal menu, Inventory playerInventory, Component title, ScreenStyle style) { + super(menu, playerInventory, title, style); + } + + @Inject(method = "", at = @At("TAIL"), remap = false) + private void injectConstructor(ContainerExPatternTerminal menu, Inventory playerInventory, Component title, ScreenStyle style, CallbackInfo ci) { + // 创建切换槽位显示的按钮 + this.toggleSlotsButton = new IconButton((b) -> { + System.out.println("ExtendedAE Plus: 按钮被点击,当前showSlots: " + this.showSlots); + this.showSlots = !this.showSlots; // 开关状态 + System.out.println("ExtendedAE Plus: 切换后showSlots: " + this.showSlots); + + // 通过反射调用refreshList方法 - 在GuiExPatternTerminal中 + try { + java.lang.reflect.Method refreshMethod = this.getClass().getDeclaredMethod("refreshList"); + refreshMethod.setAccessible(true); + refreshMethod.invoke(this); + System.out.println("ExtendedAE Plus: refreshList调用成功"); + } catch (Exception e) { + System.out.println("ExtendedAE Plus: 调用refreshList失败: " + e.getMessage()); + e.printStackTrace(); + } + }) { + @Override + protected Icon getIcon() { + return showSlots ? Icon.PATTERN_ACCESS_HIDE : Icon.PATTERN_ACCESS_SHOW; + } + }; + + // 设置按钮提示文本 + this.toggleSlotsButton.setTooltip(Tooltip.create(Component.translatable("gui.expatternprovider.toggle_slots"))); + + // 添加到左侧工具栏 + this.addToLeftToolbar(this.toggleSlotsButton); + + System.out.println("ExtendedAE Plus: 槽位切换按钮已添加到工具栏,默认显示模式: " + this.showSlots); + } + + @Inject(method = "refreshList", at = @At("HEAD"), remap = false) + private void onRefreshListStart(CallbackInfo ci) { + System.out.println("ExtendedAE Plus: refreshList开始执行 - 显示槽位: " + this.showSlots); + + // 更新按钮图标 + if (this.toggleSlotsButton != null) { + this.toggleSlotsButton.setTooltip(Tooltip.create(Component.translatable( + this.showSlots ? "gui.expatternprovider.hide_slots" : "gui.expatternprovider.show_slots" + ))); + } + } + + @Inject(method = "refreshList", at = @At("TAIL"), remap = false) + private void onRefreshListEnd(CallbackInfo ci) { + System.out.println("ExtendedAE Plus: refreshList结束 - showSlots状态: " + this.showSlots); + + // 在refreshList结束后,根据showSlots状态过滤SlotsRow + if (!this.showSlots) { + try { + // 通过反射访问rows字段 - 在GuiExPatternTerminal中 + java.lang.reflect.Field rowsField = this.getClass().getDeclaredField("rows"); + rowsField.setAccessible(true); + java.util.ArrayList rows = (java.util.ArrayList) rowsField.get(this); + + System.out.println("ExtendedAE Plus: 找到rows字段,当前行数: " + rows.size()); + + // 移除所有SlotsRow,只保留GroupHeaderRow + int removedCount = 0; + for (int i = rows.size() - 1; i >= 0; i--) { + Object row = rows.get(i); + String className = row.getClass().getSimpleName(); + System.out.println("ExtendedAE Plus: 检查行 " + i + ",类型: " + className); + if (className.equals("SlotsRow")) { + rows.remove(i); + removedCount++; + System.out.println("ExtendedAE Plus: 移除行 " + i); + } + } + + System.out.println("ExtendedAE Plus: 已隐藏 " + removedCount + " 个槽位行,剩余行数: " + rows.size()); + + // 强制刷新滚动条 + try { + java.lang.reflect.Method resetScrollbarMethod = this.getClass().getDeclaredMethod("resetScrollbar"); + resetScrollbarMethod.setAccessible(true); + resetScrollbarMethod.invoke(this); + System.out.println("ExtendedAE Plus: 滚动条已重置"); + } catch (Exception e) { + System.out.println("ExtendedAE Plus: 重置滚动条失败: " + e.getMessage()); + } + } catch (Exception e) { + System.out.println("ExtendedAE Plus: 访问rows字段失败: " + e.getMessage()); + e.printStackTrace(); + } + } else { + System.out.println("ExtendedAE Plus: showSlots为true,不隐藏槽位行"); + } + } +} \ No newline at end of file diff --git a/src/main/resources/extendedae_plus.mixins.json b/src/main/resources/extendedae_plus.mixins.json index e4f5e1a..a43546d 100644 --- a/src/main/resources/extendedae_plus.mixins.json +++ b/src/main/resources/extendedae_plus.mixins.json @@ -5,10 +5,12 @@ "minVersion": "0.8", "client": [ "GuiExPatternProviderMixin", - "SlotGridLayoutMixin" + "SlotGridLayoutMixin", + "GuiExPatternTerminalMixin" ], "mixins": [ - "ContainerExPatternProviderMixin" + "ContainerExPatternProviderMixin", + "ContainerExPatternTerminalMixin" ], "injectors": { "defaultRequire": 1