From 945692b33f12f141d7cc012fa1206ff4a5192597 Mon Sep 17 00:00:00 2001 From: C-H716 <1536152356@qq.com> Date: Wed, 29 Oct 2025 18:09:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=BD=E7=A6=BB=E6=8C=89=E9=92=AE=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=EF=BC=9B=E8=B0=83=E6=95=B4=E6=89=A9=E5=B1=95=E6=A0=B7?= =?UTF-8?q?=E6=9D=BF=E4=BE=9B=E5=BA=94=E5=99=A8=E6=A0=B7=E6=9D=BF=E7=BF=BB?= =?UTF-8?q?=E5=80=8D=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/gui/GuiExPatternProviderMixin.java | 217 +++++------------- .../util/ScaleButtonHelper.java | 97 ++++++++ 2 files changed, 152 insertions(+), 162 deletions(-) create mode 100644 src/main/java/com/extendedae_plus/util/ScaleButtonHelper.java diff --git a/src/main/java/com/extendedae_plus/mixin/extendedae/client/gui/GuiExPatternProviderMixin.java b/src/main/java/com/extendedae_plus/mixin/extendedae/client/gui/GuiExPatternProviderMixin.java index 6ee3485..6fb4f79 100644 --- a/src/main/java/com/extendedae_plus/mixin/extendedae/client/gui/GuiExPatternProviderMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/extendedae/client/gui/GuiExPatternProviderMixin.java @@ -4,10 +4,10 @@ import appeng.client.gui.Icon; import appeng.client.gui.implementations.PatternProviderScreen; import appeng.client.gui.style.ScreenStyle; import appeng.menu.SlotSemantics; -import com.extendedae_plus.ae.client.gui.NewIcon; import com.extendedae_plus.api.IExPatternButton; import com.extendedae_plus.api.IExPatternPage; import com.extendedae_plus.config.ModConfig; +import com.extendedae_plus.util.ScaleButtonHelper; import com.glodblock.github.extendedae.client.button.ActionEPPButton; import com.glodblock.github.extendedae.client.gui.GuiExPatternProvider; import com.glodblock.github.extendedae.container.ContainerExPatternProvider; @@ -21,17 +21,22 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import java.util.List; + +@SuppressWarnings({"AddedMixinMembersNamePattern"}) @Mixin(GuiExPatternProvider.class) public abstract class GuiExPatternProviderMixin extends PatternProviderScreen implements IExPatternButton, IExPatternPage { - // 跟踪上次屏幕尺寸,处理 GUI 缩放/窗口大小变化后按钮丢失问题 + // 翻页按钮 + @Unique public ActionEPPButton nextPage; + @Unique public ActionEPPButton prevPage; + // 屏幕尺寸跟踪,防止按钮丢失 @Unique private int eap$lastScreenWidth = -1; @Unique private int eap$lastScreenHeight = -1; - + @Unique private int eap$currentPage = 0; + @Unique private int eap$maxPageLocal = 1; + // 集合管理的倍增/除法按钮 @Unique - private int eap$currentPage = 0; - - @Unique - private int eap$maxPageLocal = 1; + private List scaleButtons; public GuiExPatternProviderMixin(ContainerExPatternProvider menu, Inventory playerInventory, Component title, ScreenStyle style) { super(menu, playerInventory, title, style); @@ -39,37 +44,23 @@ public abstract class GuiExPatternProviderMixin extends PatternProviderScreen 1) { this.prevPage = new ActionEPPButton((b) -> { int currentPage = eap$getCurrentPage(); int maxPage = Math.max(this.eap$maxPageLocal, eap$getMaxPageLocal()); - - // 同步到本地 GUI 页码 this.eap$currentPage = (currentPage - 1 + maxPage) % maxPage; // 强制重排(放在更新本地页码之后,确保布局读取到新页) @@ -81,8 +72,6 @@ public abstract class GuiExPatternProviderMixin extends PatternProviderScreen { int currentPage = eap$getCurrentPage(); int maxPage = Math.max(this.eap$maxPageLocal, eap$getMaxPageLocal()); - - // 同步到本地 GUI 页码 this.eap$currentPage = (currentPage + 1) % maxPage; // 强制重排(放在更新本地页码之后,确保布局读取到新页) @@ -91,160 +80,64 @@ public abstract class GuiExPatternProviderMixin extends PatternProviderScreen { - EPPNetworkHandler.INSTANCE.sendToServer(new CGenericPacket("multiply2")); - }, NewIcon.MULTIPLY2); - this.x2Button.setVisibility(true); + // 使用 ScaleButtonHelper 创建、布局并返回集合 + this.scaleButtons = ScaleButtonHelper.createAndLayout( + this.leftPos + this.imageWidth, // baseX 右侧外缘 + this.topPos + 50, // baseY + 22, // spacing + ScaleButtonHelper.Side.RIGHT, // 右侧布局 + (divide, factor) -> { // 点击事件回调 + String action = (divide ? "divide" : "multiply") + factor; + EPPNetworkHandler.INSTANCE.sendToServer(new CGenericPacket(action)); + } + ); - this.divideBy2Button = new ActionEPPButton((b) -> { - EPPNetworkHandler.INSTANCE.sendToServer(new CGenericPacket("divide2")); - }, NewIcon.DIVIDE2); - this.divideBy2Button.setVisibility(true); - - this.x10Button = new ActionEPPButton((b) -> { - EPPNetworkHandler.INSTANCE.sendToServer(new CGenericPacket("multiply10")); - }, NewIcon.MULTIPLY10); - this.x10Button.setVisibility(true); - - this.divideBy10Button = new ActionEPPButton((b) -> { - EPPNetworkHandler.INSTANCE.sendToServer(new CGenericPacket("divide10")); - }, NewIcon.DIVIDE10); - this.divideBy10Button.setVisibility(true); - - this.divideBy5Button = new ActionEPPButton((b) -> { - EPPNetworkHandler.INSTANCE.sendToServer(new CGenericPacket("divide5")); - }, NewIcon.DIVIDE5); - this.divideBy5Button.setVisibility(true); - - this.x5Button = new ActionEPPButton((b) -> { - EPPNetworkHandler.INSTANCE.sendToServer(new CGenericPacket("multiply5")); - }, NewIcon.MULTIPLY5); - this.x5Button.setVisibility(true); - - // 注册可渲染按钮 - this.addRenderableWidget(this.divideBy2Button); - this.addRenderableWidget(this.x2Button); - this.addRenderableWidget(this.divideBy5Button); - this.addRenderableWidget(this.x5Button); - this.addRenderableWidget(this.divideBy10Button); - this.addRenderableWidget(this.x10Button); + // 注册所有倍增/除法按钮 + this.scaleButtons.forEach(this::addRenderableWidget); } @Override public void eap$updateButtonsLayout() { - // 只处理按钮可见性与定位,不再强制 showPage 或挪动 Slot 坐标,避免与原布局/tooltip 冲突 - if (nextPage != null && prevPage != null) { - this.nextPage.setVisibility(true); - this.prevPage.setVisibility(true); - } - if (x2Button != null) { - this.x2Button.setVisibility(true); - } - if (divideBy2Button != null) { - this.divideBy2Button.setVisibility(true); - } - if (x10Button != null) { - this.x10Button.setVisibility(true); - } - if (divideBy10Button != null) { - this.divideBy10Button.setVisibility(true); - } - if (divideBy5Button != null) { - this.divideBy5Button.setVisibility(true); - } - if (x5Button != null) { - this.x5Button.setVisibility(true); + // 1. 设置倍增/除法按钮可见性,并确保在 renderables 中 + for (ActionEPPButton b : scaleButtons) { + if (b != null) { + b.setVisibility(true); + if (!this.renderables.contains(b)) this.addRenderableWidget(b); + } } - // 若从 JEI 配方界面返回后,Screen 的 renderables/children 可能被清空,导致按钮丢失 - // 这里在每帧保证这些按钮存在于渲染列表中(不存在则重新注册) - try { - if (this.divideBy2Button != null && !this.renderables.contains(this.divideBy2Button)) { - this.addRenderableWidget(this.divideBy2Button); - } - if (this.x2Button != null && !this.renderables.contains(this.x2Button)) { - this.addRenderableWidget(this.x2Button); - } - if (this.divideBy5Button != null && !this.renderables.contains(this.divideBy5Button)) { - this.addRenderableWidget(this.divideBy5Button); - } - if (this.x5Button != null && !this.renderables.contains(this.x5Button)) { - this.addRenderableWidget(this.x5Button); - } - if (this.divideBy10Button != null && !this.renderables.contains(this.divideBy10Button)) { - this.addRenderableWidget(this.divideBy10Button); - } - if (this.x10Button != null && !this.renderables.contains(this.x10Button)) { - this.addRenderableWidget(this.x10Button); - } - } catch (Throwable ignored) {} - - // 如果屏幕尺寸发生变化(窗口/GUI缩放),重新注册右侧外列的自定义按钮,翻页按钮由左侧工具栏托管 + // 2. 屏幕尺寸变化时重新注册按钮,防止丢失 if (this.width != eap$lastScreenWidth || this.height != eap$lastScreenHeight) { eap$lastScreenWidth = this.width; eap$lastScreenHeight = this.height; - try { - if (this.divideBy2Button != null) { - this.removeWidget(this.divideBy2Button); - this.addRenderableWidget(this.divideBy2Button); + for (ActionEPPButton b : scaleButtons) { + if (b != null) { + this.removeWidget(b); + this.addRenderableWidget(b); } - if (this.x2Button != null) { - this.removeWidget(this.x2Button); - this.addRenderableWidget(this.x2Button); - } - if (this.divideBy5Button != null) { - this.removeWidget(this.divideBy5Button); - this.addRenderableWidget(this.divideBy5Button); - } - if (this.x5Button != null) { - this.removeWidget(this.x5Button); - this.addRenderableWidget(this.x5Button); - } - if (this.divideBy10Button != null) { - this.removeWidget(this.divideBy10Button); - this.addRenderableWidget(this.divideBy10Button); - } - if (this.x10Button != null) { - this.removeWidget(this.x10Button); - this.addRenderableWidget(this.x10Button); - } - } catch (Throwable ignored) {} + } } - // 定位到 GUI 右缘外侧一点(使用绝对屏幕坐标) - int bx = this.leftPos + this.imageWidth + 1; // 向右平移 1px 到面板外侧 - int by = this.topPos + 50; // 向下偏移25px (从20改为45) - int spacing = 22; - // 翻页按钮交由左侧工具栏布局,无需手动定位 - if (this.divideBy2Button != null) { - this.divideBy2Button.setX(bx); - this.divideBy2Button.setY(by); - } - if (this.x2Button != null) { - this.x2Button.setX(bx); - this.x2Button.setY(by + spacing); - } - if (this.divideBy5Button != null) { - this.divideBy5Button.setX(bx); - this.divideBy5Button.setY(by + spacing * 2); - } - if (this.x5Button != null) { - this.x5Button.setX(bx); - this.x5Button.setY(by + spacing * 3); - } - if (this.divideBy10Button != null) { - this.divideBy10Button.setX(bx); - this.divideBy10Button.setY(by + spacing * 4); - } - if (this.x10Button != null) { - this.x10Button.setX(bx); - this.x10Button.setY(by + spacing * 5); + // 3. 使用工具类统一布局倍增/除法按钮 + if (!scaleButtons.isEmpty()) { + ScaleButtonHelper.layoutButtons( + new ScaleButtonHelper.ScaleButtonSet( + scaleButtons.get(1), // multiply2 + scaleButtons.get(0), // divide2 + scaleButtons.get(3), // multiply5 + scaleButtons.get(2), // divide5 + scaleButtons.get(5), // multiply10 + scaleButtons.get(4) // divide10 + ), + this.leftPos + this.imageWidth, + this.topPos + 50, + 22, + ScaleButtonHelper.Side.RIGHT + ); } } -} \ No newline at end of file +} diff --git a/src/main/java/com/extendedae_plus/util/ScaleButtonHelper.java b/src/main/java/com/extendedae_plus/util/ScaleButtonHelper.java new file mode 100644 index 0000000..6dbc9c1 --- /dev/null +++ b/src/main/java/com/extendedae_plus/util/ScaleButtonHelper.java @@ -0,0 +1,97 @@ +package com.extendedae_plus.util; + +import com.extendedae_plus.ae.client.gui.NewIcon; +import com.glodblock.github.extendedae.client.button.ActionEPPButton; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.BiConsumer; + +/** + * 工具类:统一管理“倍增/除法”按钮的创建、注册与布局 + */ +public final class ScaleButtonHelper { + private ScaleButtonHelper() {} + + /** + * 创建六个倍增/除法按钮 + * + * @param handler 回调:参数 (divide, factor) + * @return ScaleButtonSet + */ + public static ScaleButtonSet createButtons(BiConsumer handler) { + ActionEPPButton div2 = new ActionEPPButton(b -> handler.accept(true, 2), NewIcon.DIVIDE2); + ActionEPPButton x2 = new ActionEPPButton(b -> handler.accept(false, 2), NewIcon.MULTIPLY2); + ActionEPPButton div5 = new ActionEPPButton(b -> handler.accept(true, 5), NewIcon.DIVIDE5); + ActionEPPButton x5 = new ActionEPPButton(b -> handler.accept(false, 5), NewIcon.MULTIPLY5); + ActionEPPButton div10 = new ActionEPPButton(b -> handler.accept(true, 10), NewIcon.DIVIDE10); + ActionEPPButton x10 = new ActionEPPButton(b -> handler.accept(false, 10), NewIcon.MULTIPLY10); + + for (var b : List.of(x2, div2, x5, div5, x10, div10)) { + b.setVisibility(true); + b.setTooltip(null); + } + + return new ScaleButtonSet(x2, div2, x5, div5, x10, div10); + } + + /** + * 返回六个按钮的集合(便于注册/渲染) + */ + public static List all(ScaleButtonSet set) { + return new ArrayList<>(List.of( + set.divide2(), set.multiply2(), + set.divide5(), set.multiply5(), + set.divide10(), set.multiply10() + )); + } + + /** + * 在 GUI 外侧统一布局按钮 + */ + public static void layoutButtons(ScaleButtonSet set, int baseX, int baseY, int spacing, Side side) { + int bx = baseX + (side == Side.LEFT ? -1 : 1); + int by = baseY; + + set.divide2().setX(bx); + set.divide2().setY(by); + set.multiply2().setX(bx); + set.multiply2().setY(by + spacing); + set.divide5().setX(bx); + set.divide5().setY(by + spacing * 2); + set.multiply5().setX(bx); + set.multiply5().setY(by + spacing * 3); + set.divide10().setX(bx); + set.divide10().setY(by + spacing * 4); + set.multiply10().setX(bx); + set.multiply10().setY(by + spacing * 5); + } + + /** + * 创建并返回集合,同时直接布局 + * + * @param baseX 基准 X + * @param baseY 基准 Y + * @param spacing 间距 + * @param side 左侧/右侧 + * @param handler 点击回调 + * @return 按钮集合 + */ + public static List createAndLayout(int baseX, int baseY, int spacing, Side side, BiConsumer handler) { + ScaleButtonSet set = createButtons(handler); + layoutButtons(set, baseX, baseY, spacing, side); + return all(set); + } + + public enum Side {LEFT, RIGHT} + + public record ScaleButtonSet( + ActionEPPButton multiply2, + ActionEPPButton divide2, + ActionEPPButton multiply5, + ActionEPPButton divide5, + ActionEPPButton multiply10, + ActionEPPButton divide10 + ) { + } +}