From 545a845adda989c40cb25b0c36a4de86d3a91ce3 Mon Sep 17 00:00:00 2001 From: Martin Prokoph Date: Wed, 28 Aug 2024 12:28:51 +0200 Subject: [PATCH] Improved button injection --- .../eu/midnightdust/core/MidnightLib.java | 5 ++- .../core/config/MidnightLibConfig.java | 9 ++++- .../core/mixin/MixinOptionsScreen.java | 40 +++++++++---------- .../midnightdust/lib/config/AutoCommand.java | 3 +- 4 files changed, 32 insertions(+), 25 deletions(-) diff --git a/common/src/main/java/eu/midnightdust/core/MidnightLib.java b/common/src/main/java/eu/midnightdust/core/MidnightLib.java index ba6ae79..dd3561f 100755 --- a/common/src/main/java/eu/midnightdust/core/MidnightLib.java +++ b/common/src/main/java/eu/midnightdust/core/MidnightLib.java @@ -15,14 +15,15 @@ import java.util.List; public class MidnightLib { public static List hiddenMods = new ArrayList<>(); - public static final Logger LOGGER = LoggerFactory.getLogger("midnightlib"); + public static final String MOD_ID = "midnightlib"; + public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); @Environment(EnvType.CLIENT) public static void onInitializeClient() { System.setProperty("java.awt.headless", "false"); try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { LOGGER.error("Error setting system look and feel", e); } - MidnightLibConfig.init("midnightlib", MidnightLibConfig.class); + MidnightLibConfig.init(MOD_ID, MidnightLibConfig.class); } @Environment(EnvType.SERVER) public static void onInitializeServer() { diff --git a/common/src/main/java/eu/midnightdust/core/config/MidnightLibConfig.java b/common/src/main/java/eu/midnightdust/core/config/MidnightLibConfig.java index 393c1e3..8be89a8 100644 --- a/common/src/main/java/eu/midnightdust/core/config/MidnightLibConfig.java +++ b/common/src/main/java/eu/midnightdust/core/config/MidnightLibConfig.java @@ -6,10 +6,15 @@ import eu.midnightdust.lib.util.PlatformFunctions; import java.util.Objects; public class MidnightLibConfig extends MidnightConfig { - @Entry - public static ConfigButton config_screen_list = (PlatformFunctions.isModLoaded("modmenu") || Objects.equals(PlatformFunctions.getPlatformName(), "neoforge")) ? ConfigButton.MODMENU : ConfigButton.TRUE; + public static final boolean HAS_MODMENU = PlatformFunctions.isModLoaded("modmenu") || Objects.equals(PlatformFunctions.getPlatformName(), "neoforge"); + + @Entry public static ConfigButton config_screen_list = HAS_MODMENU ? ConfigButton.MODMENU : ConfigButton.TRUE; public enum ConfigButton { TRUE, FALSE, MODMENU } + + public static boolean shouldShowButton() { + return config_screen_list.equals(ConfigButton.TRUE) || (config_screen_list.equals(ConfigButton.MODMENU) && !HAS_MODMENU); + } } diff --git a/common/src/main/java/eu/midnightdust/core/mixin/MixinOptionsScreen.java b/common/src/main/java/eu/midnightdust/core/mixin/MixinOptionsScreen.java index 5fa9be6..3666193 100644 --- a/common/src/main/java/eu/midnightdust/core/mixin/MixinOptionsScreen.java +++ b/common/src/main/java/eu/midnightdust/core/mixin/MixinOptionsScreen.java @@ -1,9 +1,6 @@ package eu.midnightdust.core.mixin; -import eu.midnightdust.core.config.MidnightLibConfig; import eu.midnightdust.core.screen.MidnightConfigOverviewScreen; -import eu.midnightdust.lib.util.PlatformFunctions; -import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.option.OptionsScreen; import net.minecraft.client.gui.widget.TextIconButtonWidget; @@ -20,30 +17,33 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.Objects; -@Mixin(OptionsScreen.class) -public class MixinOptionsScreen extends Screen { - @Shadow @Final private ThreePartsLayoutWidget layout; - @Unique TextIconButtonWidget button = TextIconButtonWidget.builder(Text.translatable("midnightlib.overview.title"), ( - buttonWidget) -> Objects.requireNonNull(client).setScreen(new MidnightConfigOverviewScreen(this)), true) - .texture(Identifier.of("midnightlib","icon/midnightlib"), 16, 16).dimension(20, 20).build(); - @Unique boolean shouldShowButton = MidnightLibConfig.config_screen_list.equals(MidnightLibConfig.ConfigButton.TRUE) || (MidnightLibConfig.config_screen_list.equals(MidnightLibConfig.ConfigButton.MODMENU) && !PlatformFunctions.isModLoaded("modmenu") && PlatformFunctions.getPlatformName() != "neoforge"); +import static eu.midnightdust.core.MidnightLib.MOD_ID; +import static eu.midnightdust.core.config.MidnightLibConfig.shouldShowButton; + +@Mixin(OptionsScreen.class) +public abstract class MixinOptionsScreen extends Screen { + @Shadow @Final private ThreePartsLayoutWidget layout; + @Unique TextIconButtonWidget midnightlib$button = TextIconButtonWidget.builder(Text.translatable("midnightlib.overview.title"), ( + buttonWidget) -> Objects.requireNonNull(client).setScreen(new MidnightConfigOverviewScreen(this)), true) + .texture(Identifier.of(MOD_ID,"icon/"+MOD_ID), 16, 16).dimension(20, 20).build(); + + private MixinOptionsScreen(Text title) {super(title);} - protected MixinOptionsScreen(Text title) {super(title);} @Inject(at = @At("HEAD"), method = "init") public void midnightlib$onInit(CallbackInfo ci) { - if (shouldShowButton) { - this.midnightlib$setupButton(); - this.addDrawableChild(button); + if (shouldShowButton()) { + this.midnightlib$setButtonPos(); + this.addDrawableChild(midnightlib$button); } } - @Override - public void resize(MinecraftClient client, int width, int height) { - super.resize(client, width, height); - if (shouldShowButton) this.midnightlib$setupButton(); + @Inject(at = @At("TAIL"), method = "initTabNavigation") + public void midnightlib$onResize(CallbackInfo ci) { + if (shouldShowButton()) this.midnightlib$setButtonPos(); } + @Unique - public void midnightlib$setupButton() { - button.setPosition(layout.getWidth() / 2 + 158, layout.getY() + layout.getFooterHeight() - 4); + public void midnightlib$setButtonPos() { + midnightlib$button.setPosition(layout.getWidth() / 2 + 158, layout.getY() + layout.getFooterHeight() - 4); } } \ No newline at end of file diff --git a/common/src/main/java/eu/midnightdust/lib/config/AutoCommand.java b/common/src/main/java/eu/midnightdust/lib/config/AutoCommand.java index 93df235..45c8d4f 100644 --- a/common/src/main/java/eu/midnightdust/lib/config/AutoCommand.java +++ b/common/src/main/java/eu/midnightdust/lib/config/AutoCommand.java @@ -15,6 +15,7 @@ import java.util.Objects; public class AutoCommand { public static List> commands = new ArrayList<>(); + final static String BASE = "midnightconfig"; final static String VALUE = "value"; final Field field; final Class type; @@ -27,7 +28,7 @@ public class AutoCommand { this.type = field.getType(); this.isList = field.getType() == List.class; - LiteralArgumentBuilder command = CommandManager.literal("midnightconfig").requires(source -> source.hasPermissionLevel(2)).then( + LiteralArgumentBuilder command = CommandManager.literal(BASE).requires(source -> source.hasPermissionLevel(2)).then( CommandManager.literal(modid).then(CommandManager.literal(field.getName()).executes(this::getValue))); if (type.isEnum()) {