From 6b89dbf8e531efa49c61ac36ead106ed78f09441 Mon Sep 17 00:00:00 2001 From: Martin Prokoph Date: Fri, 3 Oct 2025 18:47:27 +0200 Subject: [PATCH] feat: back to SpruceUI! - SpruceUI is now also available for NeoForge, so I can ditch ObsidianUI and move back to an actively maintained UI library :) --- build.gradle | 4 + common/build.gradle | 2 +- .../midnightcontrols/ControlsMode.java | 3 - .../MidnightControlsFeature.java | 2 +- .../client/MidnightControlsClient.java | 6 +- .../client/MidnightControlsConfig.java | 42 ++++-- .../client/MidnightControlsModMenu.java | 28 ---- .../client/MidnightInput.java | 25 ++-- .../client/gui/MappingsStringInputWidget.java | 18 +-- .../client/gui/MidnightControlsHud.java | 29 ++-- .../gui/MidnightControlsSettingsScreen.java | 129 +++++++++--------- .../gui/ReloadControllerMappingsOption.java | 7 +- .../gui/config/ControllerBindingButton.java | 2 +- .../gui/config/ControllerSelectionButton.java | 2 +- .../gui/config/MappingsStringInputWidget.java | 57 ++++++++ .../gui/config/MultilineTextFieldWidget.java | 13 ++ .../gui/widget/ControllerButtonWidget.java | 11 +- .../gui/widget/ControllerControlsWidget.java | 13 +- .../client/gui/widget/ControlsListWidget.java | 66 ++++----- .../client/mixin/InGameHudMixin.java | 30 ++++ .../client/mixin/ScreenMixin.java | 2 +- .../client/touch/gui/ItemUseButtonWidget.java | 4 +- .../touch/gui/SilentTexturedButtonWidget.java | 4 +- .../client/touch/gui/TouchscreenOverlay.java | 40 +++--- .../clickhandler/TextFieldWrapper.java | 2 +- .../gui/VirtualKeyboardScreen.java | 13 +- .../resources/midnightcontrols.mixins.json | 1 + fabric/build.gradle | 3 +- fabric/src/main/resources/fabric.mod.json | 3 - gradle.properties | 6 +- 30 files changed, 328 insertions(+), 239 deletions(-) delete mode 100644 common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsModMenu.java create mode 100644 common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/config/MappingsStringInputWidget.java create mode 100644 common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/config/MultilineTextFieldWidget.java create mode 100644 common/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/InGameHudMixin.java diff --git a/build.gradle b/build.gradle index 1cb5e2e..77b9f0c 100644 --- a/build.gradle +++ b/build.gradle @@ -24,6 +24,10 @@ subprojects { maven { url = "https://api.modrinth.com/maven" } + maven { + name 'Gegy' + url 'https://maven.gegy.dev' + } maven { url 'https://jitpack.io' } flatDir { dirs("../localMaven") diff --git a/common/build.gradle b/common/build.gradle index b8b160e..6563eb6 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -29,7 +29,7 @@ dependencies { // Using the Fabric version of midnightlib here to create a common config and get useful utilities // Just make sure NOT to use classes from the .fabric classpath modCompileOnlyApi "maven.modrinth:midnightlib:${rootProject.midnightlib_version}-fabric" - modCompileOnlyApi "maven.modrinth:obsidianui:${rootProject.obsidianui_version}-fabric" + modCompileOnlyApi "dev.lambdaurora:spruceui:${project.spruceui_version}" modCompileOnlyApi ("com.terraformersmc:modmenu:${project.modmenu_version}") { exclude(group: "net.fabricmc.fabric-api") } diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/ControlsMode.java b/common/src/main/java/eu/midnightdust/midnightcontrols/ControlsMode.java index baeee58..17a6bc0 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/ControlsMode.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/ControlsMode.java @@ -11,12 +11,9 @@ package eu.midnightdust.midnightcontrols; import net.minecraft.text.Text; import net.minecraft.text.object.AtlasTextObjectContents; -import net.minecraft.text.object.TextObjectContents; import net.minecraft.util.Atlases; -import net.minecraft.util.Identifier; import net.minecraft.util.TranslatableOption; import org.jetbrains.annotations.NotNull; -import org.thinkingstudio.obsidianui.util.Nameable; import java.util.Arrays; import java.util.Optional; diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/MidnightControlsFeature.java b/common/src/main/java/eu/midnightdust/midnightcontrols/MidnightControlsFeature.java index ef5fd01..685b72b 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/MidnightControlsFeature.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/MidnightControlsFeature.java @@ -9,8 +9,8 @@ package eu.midnightdust.midnightcontrols; -import org.thinkingstudio.obsidianui.util.Nameable; import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig; +import org.aperlambda.lambdacommon.utils.Nameable; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java index e027ff9..9279c32 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java @@ -28,7 +28,6 @@ import eu.midnightdust.midnightcontrols.client.ring.MidnightRing; import eu.midnightdust.midnightcontrols.client.util.platform.NetworkUtil; import eu.midnightdust.midnightcontrols.client.virtualkeyboard.MouseClickInterceptor; import net.minecraft.client.gui.screen.Screen; -import org.thinkingstudio.obsidianui.hud.HudManager; import eu.midnightdust.midnightcontrols.client.touch.TouchInput; import eu.midnightdust.midnightcontrols.client.util.RainbowColor; import eu.midnightdust.midnightcontrols.packet.ControlsModePayload; @@ -102,7 +101,6 @@ public class MidnightControlsClient extends MidnightControls { } }, delay, period); - HudManager.register(hud = new MidnightControlsHud()); isWayland = GLFW.glfwGetVersionString().contains("Wayland"); } @@ -120,7 +118,7 @@ public class MidnightControlsClient extends MidnightControls { MidnightControlsConfig.configVersion = 2; MidnightControlsConfig.write(MidnightControlsConstants.NAMESPACE); } - hud.setVisible(MidnightControlsConfig.hudEnable); + MidnightControlsHud.isVisible = MidnightControlsConfig.hudEnable; Controller.updateMappings(); try { GLFW.glfwSetJoystickCallback((jid, event) -> { @@ -247,7 +245,7 @@ public class MidnightControlsClient extends MidnightControls { */ public static void setHudEnabled(boolean enabled) { MidnightControlsConfig.hudEnable = enabled; - hud.setVisible(enabled); + MidnightControlsHud.isVisible = enabled; } private static final MidnightControlsClient INSTANCE = new MidnightControlsClient(); diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java index afcaa50..5ee1f98 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java @@ -29,10 +29,12 @@ import eu.midnightdust.midnightcontrols.client.enums.CameraMode; import eu.midnightdust.midnightcontrols.client.enums.ControllerType; import eu.midnightdust.midnightcontrols.client.enums.HudSide; import eu.midnightdust.midnightcontrols.client.enums.VirtualMouseSkin; +import eu.midnightdust.midnightcontrols.client.gui.MidnightControlsSettingsScreen; import eu.midnightdust.midnightcontrols.client.gui.RingScreen; import eu.midnightdust.midnightcontrols.client.enums.TouchMode; import eu.midnightdust.midnightcontrols.client.gui.config.ControllerBindingButton; import eu.midnightdust.midnightcontrols.client.gui.config.ControllerSelectionButton; +import eu.midnightdust.midnightcontrols.client.gui.config.MappingsStringInputWidget; import eu.midnightdust.midnightcontrols.client.virtualkeyboard.KeyboardLayoutManager; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.ChatScreen; @@ -49,6 +51,7 @@ import java.lang.annotation.Annotation; import java.util.*; import java.util.regex.Pattern; +import static eu.midnightdust.midnightcontrols.client.MidnightControlsClient.client; import static org.lwjgl.glfw.GLFW.*; /** @@ -62,6 +65,7 @@ public class MidnightControlsConfig extends MidnightConfig { public static final String VISUAL = "visual"; public static final String MISC = "misc"; public static final String BUTTONS = "buttons"; + public static final String MAPPING = "mapping"; public static boolean isEditing = false; @Hidden @Entry public static int configVersion = 2; @@ -186,7 +190,12 @@ public class MidnightControlsConfig extends MidnightConfig { @Comment(category = MISC, centered = true, name="☆ Other Options") public static Comment _otherOptions; @Entry(category = MISC, name = "Trigger button fix") public static boolean triggerFix = true; @Entry(category = MISC, name = "Excluded Controllers (Name Regex)") public static List excludedControllers = Lists.newArrayList(".*(Keyboard)$", ".*(Touchpad)$", ".*(Pen)$", ".*(Finger)$"); + + // Init mapping tab (see #onTabInit()) + @Comment(category = MAPPING) @Condition(requiredModId = "thisModDoesNotExist") public static Comment this_spacer_will_never_be_visible_as_well; + @Entry @Hidden public static Map> controllerBindingProfiles = new HashMap<>(); + private static Map currentBindingProfile = new HashMap<>(); private static Controller prevController; @@ -236,6 +245,15 @@ public class MidnightControlsConfig extends MidnightConfig { list.addButton(List.of(), Text.of("\uD83C\uDFAE General"), centeredComment); ControllerSelectionButton.add(list, screen, false); ControllerSelectionButton.add(list, screen, true); + + ButtonWidget editButton = ButtonWidget.builder(Text.of("OPEN"), + button -> { + client.setScreen(new MidnightControlsSettingsScreen(client.currentScreen, false)); + }).dimensions(screen.width - 185, 0, 175, 20).build(); + list.addButton(List.of(editButton), Text.of("Legacy Config UI"), new EntryInfo(null, screen.modid)); + } + if (MAPPING.equals(tabName)) { + MappingsStringInputWidget.add(centeredComment, list, screen); } } @@ -507,17 +525,23 @@ public class MidnightControlsConfig extends MidnightConfig { * @return the controller name matches a type, else empty */ public static @NotNull ControllerType matchControllerToType() { - String controller = getController().getName().toLowerCase(); - if (controller.contains("xbox 360")) return ControllerType.XBOX_360; - else if (controller.contains("xbox") || controller.contains("afterglow")) return ControllerType.XBOX; - else if (controller.contains("steam") && GLX._getCpuInfo().contains("AMD Custom APU")) return ControllerType.STEAM_DECK; - else if (controller.contains("steam")) return ControllerType.STEAM_CONTROLLER; - else if (controller.contains("dualsense") || controller.contains("ps5")) return ControllerType.DUALSENSE; - else if (controller.contains("dualshock") || controller.contains("ps4") || controller.contains("sony")) return ControllerType.DUALSHOCK; - else if (controller.contains("switch") || controller.contains("joy-con") || controller.contains("wii") || controller.contains("nintendo")) return ControllerType.SWITCH; - else if (controller.contains("ouya")) return ControllerType.OUYA; + String name = getController().getName().toLowerCase(); + if (containsAny(name, "xbox 360")) return ControllerType.XBOX_360; + else if (containsAny(name, "xbox") || name.contains("afterglow")) return ControllerType.XBOX; + else if (containsAny(name, "steam") && GLX._getCpuInfo().contains("AMD Custom APU")) return ControllerType.STEAM_DECK; + else if (containsAny(name, "steam")) return ControllerType.STEAM_CONTROLLER; + else if (containsAny(name, "dualsense", "ps5")) return ControllerType.DUALSENSE; + else if (containsAny(name, "dualshock", "ps4", "sony")) return ControllerType.DUALSHOCK; + else if (containsAny(name, "switch", "joy-con", "wii", "nintendo")) return ControllerType.SWITCH; + else if (containsAny(name, "ouya")) return ControllerType.OUYA; else return ControllerType.DEFAULT; } + + private static boolean containsAny(String controller, String... substring) { + for (String s : substring) if (controller.contains(s)) return true; + return false; + } + public static boolean doMixedInput() { return touchInControllerMode && controlsMode == ControlsMode.CONTROLLER; } diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsModMenu.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsModMenu.java deleted file mode 100644 index a603608..0000000 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsModMenu.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright © 2021 LambdAurora - * - * This file is part of midnightcontrols. - * - * Licensed under the MIT license. For more information, - * see the LICENSE file. - */ - -package eu.midnightdust.midnightcontrols.client; - -import com.terraformersmc.modmenu.api.ConfigScreenFactory; -import com.terraformersmc.modmenu.api.ModMenuApi; -import eu.midnightdust.midnightcontrols.client.gui.MidnightControlsSettingsScreen; - -/** - * Represents the API implementation of ModMenu for midnightcontrols. - * - * @author LambdAurora - * @version 1.7.0 - * @since 1.1.0 - */ -public class MidnightControlsModMenu implements ModMenuApi { -// @Override -// public ConfigScreenFactory getModConfigScreenFactory() { -// return parent -> new MidnightControlsSettingsScreen(parent, false); -// } -} diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java index ca75d1c..f4f7e27 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java @@ -10,6 +10,14 @@ package eu.midnightdust.midnightcontrols.client; import com.google.common.collect.ImmutableSet; +import dev.lambdaurora.spruceui.navigation.NavigationEvent; +import dev.lambdaurora.spruceui.screen.SpruceScreen; +import dev.lambdaurora.spruceui.widget.AbstractSprucePressableButtonWidget; +import dev.lambdaurora.spruceui.widget.AbstractSpruceWidget; +import dev.lambdaurora.spruceui.widget.SpruceElement; +import dev.lambdaurora.spruceui.widget.SpruceLabelWidget; +import dev.lambdaurora.spruceui.widget.container.SpruceEntryListWidget; +import dev.lambdaurora.spruceui.widget.container.SpruceParentWidget; import eu.midnightdust.lib.util.PlatformFunctions; import eu.midnightdust.midnightcontrols.client.compat.EmotecraftCompat; import eu.midnightdust.midnightcontrols.client.compat.LibGuiCompat; @@ -24,6 +32,7 @@ import eu.midnightdust.midnightcontrols.client.util.InventoryUtil; import eu.midnightdust.midnightcontrols.client.util.storage.AxisStorage; import eu.midnightdust.midnightcontrols.client.util.storage.ButtonStorage; import net.minecraft.client.gui.Click; +import net.minecraft.client.gui.navigation.NavigationDirection; import net.minecraft.client.gui.screen.option.KeybindsScreen; import net.minecraft.client.gui.widget.EntryListWidget; import net.minecraft.client.gui.widget.PressableWidget; @@ -31,8 +40,6 @@ import net.minecraft.client.gui.widget.SliderWidget; import net.minecraft.client.input.KeyInput; import net.minecraft.client.input.MouseInput; import net.minecraft.entity.vehicle.BoatEntity; -import org.thinkingstudio.obsidianui.widget.AbstractSpruceWidget; -import org.thinkingstudio.obsidianui.widget.container.SpruceEntryListWidget; import eu.midnightdust.midnightcontrols.MidnightControls; import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding; import eu.midnightdust.midnightcontrols.client.controller.Controller; @@ -43,12 +50,6 @@ import eu.midnightdust.midnightcontrols.client.touch.gui.TouchscreenOverlay; import eu.midnightdust.midnightcontrols.client.ring.RingPage; import eu.midnightdust.midnightcontrols.client.util.HandledScreenAccessor; import eu.midnightdust.midnightcontrols.client.util.MathUtil; -import org.thinkingstudio.obsidianui.navigation.NavigationDirection; -import org.thinkingstudio.obsidianui.screen.SpruceScreen; -import org.thinkingstudio.obsidianui.widget.AbstractSprucePressableButtonWidget; -import org.thinkingstudio.obsidianui.widget.SpruceElement; -import org.thinkingstudio.obsidianui.widget.SpruceLabelWidget; -import org.thinkingstudio.obsidianui.widget.container.SpruceParentWidget; import eu.midnightdust.midnightcontrols.client.enums.ButtonState; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.Element; @@ -603,7 +604,7 @@ public class MidnightInput { .map(element -> (EntryListWidget) element) .filter(element -> element.getType().isFocused()) .anyMatch(element -> { - element.mouseScrolled(0.0, 0.0, 0, -value); + element.mouseScrolled(0.0, 0.0, 0, -value / 30); return true; }); } @@ -652,7 +653,7 @@ public class MidnightInput { */ private boolean handleLeftRight(@NotNull Screen screen, boolean right) { if (screen instanceof SpruceScreen spruceScreen) { - spruceScreen.onNavigation(right ? NavigationDirection.RIGHT : NavigationDirection.LEFT, false); + spruceScreen.onNavigation(new NavigationEvent(right ? NavigationDirection.RIGHT : NavigationDirection.LEFT, false, false)); this.actionGuiCooldown = 5; return false; } @@ -672,7 +673,7 @@ public class MidnightInput { case SpruceElement spruceElement -> { if (spruceElement.requiresCursor()) return true; - return !spruceElement.onNavigation(right ? NavigationDirection.RIGHT : NavigationDirection.LEFT, false); + return !spruceElement.onNavigation(new NavigationEvent(right ? NavigationDirection.RIGHT : NavigationDirection.LEFT, false, false)); } case SliderWidget slider -> { if (slider.active) { @@ -767,7 +768,7 @@ public class MidnightInput { if (!isScreenInteractive(screen) && !screen.getClass().getCanonicalName().contains("me.jellysquid.mods.sodium.client.gui")) return false; try { if (screen instanceof SpruceScreen spruceScreen) { - if (spruceScreen.onNavigation(direction, false)) { + if (spruceScreen.onNavigation(new NavigationEvent(direction, false, false))) { this.actionGuiCooldown = 5; } return true; diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MappingsStringInputWidget.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MappingsStringInputWidget.java index b332cd0..aa4a166 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MappingsStringInputWidget.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MappingsStringInputWidget.java @@ -9,16 +9,16 @@ package eu.midnightdust.midnightcontrols.client.gui; +import dev.lambdaurora.spruceui.Position; +import dev.lambdaurora.spruceui.option.SpruceOption; +import dev.lambdaurora.spruceui.option.SpruceSimpleActionOption; +import dev.lambdaurora.spruceui.render.SpruceGuiGraphics; +import dev.lambdaurora.spruceui.widget.container.SpruceContainerWidget; +import dev.lambdaurora.spruceui.widget.text.SpruceTextAreaWidget; import eu.midnightdust.midnightcontrols.client.MidnightControlsClient; import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig; import eu.midnightdust.midnightcontrols.client.controller.Controller; import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.util.math.MatrixStack; -import org.thinkingstudio.obsidianui.Position; -import org.thinkingstudio.obsidianui.option.SpruceOption; -import org.thinkingstudio.obsidianui.option.SpruceSimpleActionOption; -import org.thinkingstudio.obsidianui.widget.container.SpruceContainerWidget; -import org.thinkingstudio.obsidianui.widget.text.SpruceTextAreaWidget; import net.minecraft.client.toast.SystemToast; import net.minecraft.text.Text; @@ -105,9 +105,9 @@ public class MappingsStringInputWidget extends SpruceContainerWidget { } @Override - public void renderWidget(DrawContext context, int mouseX, int mouseY, float delta) { + public void renderWidget(SpruceGuiGraphics context, int mouseX, int mouseY, float delta) { super.renderWidget(context, mouseX, mouseY, delta); - context.drawCenteredTextWithShadow(this.client.textRenderer, Text.translatable("midnightcontrols.menu.multiple_mapping_tip"), this.textArea.getX() + this.textArea.getWidth() / 2, this.textArea.getY() + this.textArea.getHeight() - 12, 0xFF888888); - context.drawCenteredTextWithShadow(this.client.textRenderer, Text.translatable("midnightcontrols.menu.current_controller_guid", MidnightControlsConfig.getController().getGuid()), this.textArea.getX() + this.textArea.getWidth() / 2, this.height - 21, 0xFFFFFFFF); + context.vanilla().drawCenteredTextWithShadow(this.client.textRenderer, Text.translatable("midnightcontrols.menu.multiple_mapping_tip"), this.textArea.getX() + this.textArea.getWidth() / 2, this.textArea.getY() + this.textArea.getHeight() - 12, 0xFF888888); + context.vanilla().drawCenteredTextWithShadow(this.client.textRenderer, Text.translatable("midnightcontrols.menu.current_controller_guid", MidnightControlsConfig.getController().getGuid()), this.textArea.getX() + this.textArea.getWidth() / 2, this.height - 21, 0xFFFFFFFF); } } diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsHud.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsHud.java index 20340e5..35319f3 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsHud.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsHud.java @@ -17,7 +17,6 @@ import eu.midnightdust.midnightcontrols.client.compat.MidnightControlsCompat; import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding; import net.minecraft.client.render.RenderTickCounter; import org.joml.Matrix3x2fStack; -import org.thinkingstudio.obsidianui.hud.Hud; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.resource.language.I18n; @@ -28,8 +27,6 @@ import net.minecraft.util.hit.HitResult; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import static eu.midnightdust.midnightcontrols.MidnightControls.id; - /** * Represents the midnightcontrols HUD. * @@ -37,7 +34,7 @@ import static eu.midnightdust.midnightcontrols.MidnightControls.id; * @version 1.7.0 * @since 1.0.0 */ -public class MidnightControlsHud extends Hud { +public class MidnightControlsHud { private MinecraftClient client = MinecraftClient.getInstance(); private int attackWidth = 0; private int attackButtonWidth = 0; @@ -54,15 +51,15 @@ public class MidnightControlsHud extends Hud { private String placeAction = ""; private int ticksDisplayedCrosshair = 0; private static boolean isCrammed = false; + public static boolean isVisible = false; + private static final MidnightControlsHud INSTANCE = new MidnightControlsHud(); - public MidnightControlsHud() { - super(id("hud/button_indicator")); + public static MidnightControlsHud getInstance() { + return INSTANCE; } - @Override - public void init(@NotNull MinecraftClient client, int screenWidth, int screenHeight) { - this.client = MinecraftClient.getInstance(); - super.init(client, screenWidth, screenHeight); + public void init() { + this.client = MidnightControlsClient.client; this.inventoryWidth = this.width(ButtonBinding.INVENTORY); this.inventoryButtonWidth = MidnightControlsRenderer.getBindingIconWidth(ButtonBinding.INVENTORY); this.swapHandsWidth = this.width(ButtonBinding.SWAP_HANDS); @@ -77,9 +74,8 @@ public class MidnightControlsHud extends Hud { /** * Renders the MidnightControls HUD. */ - @Override public void render(DrawContext context, RenderTickCounter tickCounter) { - if (this.client == null) return; + if (this.client == null || !isVisible) return; if (MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER && this.client.currentScreen == null) { isCrammed = client.getWindow().getScaledWidth() < 520; int y = bottom(2); @@ -195,10 +191,8 @@ public class MidnightControlsHud extends Hud { if (!ButtonBinding.ATTACK.isNotBound()) this.drawTip(context, currentX, y, this.attackAction, this.attackWidth != 0); } - @Override public void tick() { if (this.client == null) return; - super.tick(); if (MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER) { if (this.client.crosshairTarget == null) return; @@ -255,7 +249,7 @@ public class MidnightControlsHud extends Hud { placeAction = customUseAction; this.placeAction = placeAction; - this.showSwapHandsAction = !this.client.player.getMainHandStack().isEmpty() || !this.client.player.getOffHandStack().isEmpty(); + this.showSwapHandsAction = this.client.player != null && (!this.client.player.getMainHandStack().isEmpty() || !this.client.player.getOffHandStack().isEmpty()); // Cache the "Use" tip width. if (this.placeAction.isEmpty()) @@ -265,11 +259,6 @@ public class MidnightControlsHud extends Hud { } } - @Override - public boolean hasTicks() { - return true; - } - private int bottom(int y) { return (this.client.getWindow().getScaledHeight() - y - MidnightControlsRenderer.ICON_SIZE); } diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsSettingsScreen.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsSettingsScreen.java index 7f63220..7b71ad1 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsSettingsScreen.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsSettingsScreen.java @@ -9,26 +9,28 @@ package eu.midnightdust.midnightcontrols.client.gui; +import dev.lambdaurora.spruceui.Position; +import dev.lambdaurora.spruceui.SpruceTexts; +import dev.lambdaurora.spruceui.background.Background; +import dev.lambdaurora.spruceui.option.*; +import dev.lambdaurora.spruceui.render.SpruceGuiGraphics; +import dev.lambdaurora.spruceui.screen.SpruceScreen; +import dev.lambdaurora.spruceui.tooltip.TooltipData; +import dev.lambdaurora.spruceui.widget.AbstractSpruceWidget; +import dev.lambdaurora.spruceui.widget.SpruceLabelWidget; +import dev.lambdaurora.spruceui.widget.SpruceWidget; +import dev.lambdaurora.spruceui.widget.container.SpruceContainerWidget; +import dev.lambdaurora.spruceui.widget.container.SpruceOptionListWidget; +import dev.lambdaurora.spruceui.widget.container.tabbed.SpruceTabbedWidget; import eu.midnightdust.midnightcontrols.MidnightControlsConstants; import eu.midnightdust.midnightcontrols.client.MidnightControlsClient; import eu.midnightdust.midnightcontrols.client.util.platform.NetworkUtil; import eu.midnightdust.midnightcontrols.client.virtualkeyboard.KeyboardLayoutManager; import net.minecraft.util.math.ColorHelper; -import org.thinkingstudio.obsidianui.background.Background; -import org.thinkingstudio.obsidianui.widget.SpruceWidget; import eu.midnightdust.midnightcontrols.MidnightControls; import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig; import eu.midnightdust.midnightcontrols.client.controller.Controller; import eu.midnightdust.midnightcontrols.client.gui.widget.ControllerControlsWidget; -import org.thinkingstudio.obsidianui.Position; -import org.thinkingstudio.obsidianui.SpruceTexts; -import org.thinkingstudio.obsidianui.option.*; -import org.thinkingstudio.obsidianui.screen.SpruceScreen; -import org.thinkingstudio.obsidianui.widget.AbstractSpruceWidget; -import org.thinkingstudio.obsidianui.widget.SpruceLabelWidget; -import org.thinkingstudio.obsidianui.widget.container.SpruceContainerWidget; -import org.thinkingstudio.obsidianui.widget.container.SpruceOptionListWidget; -import org.thinkingstudio.obsidianui.widget.container.tabbed.SpruceTabbedWidget; import eu.midnightdust.midnightcontrols.packet.ControlsModePayload; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; @@ -99,7 +101,7 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { return option.getDisplayText(Text.literal(controllerName).formatted(Formatting.GOLD)); else return option.getDisplayText(Text.literal(controllerName)); - }, null); + }, TooltipData.EMPTY); private final SpruceOption secondControllerOption = new SpruceCyclingOption("midnightcontrols.menu.controller2", amount -> { int id = MidnightControlsConfig.getSecondController().map(Controller::id).orElse(-1); @@ -118,7 +120,7 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { else return option.getDisplayText(Text.literal(controllerName)); }).orElse(option.getDisplayText(SpruceTexts.OPTIONS_OFF.copyContentOnly().formatted(Formatting.RED))), - Text.translatable("midnightcontrols.menu.controller2.tooltip")); + TooltipData.builder().text(Text.translatable("midnightcontrols.menu.controller2.tooltip")).build()); private final SpruceOption unfocusedInputOption; private final SpruceOption invertsRightXAxis; private final SpruceOption invertsRightYAxis; @@ -140,14 +142,14 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { }, option -> { return option.getDisplayText(Text.translatable(KeyboardLayoutManager.getById(MidnightControlsConfig.keyboardLayout).getTranslationKey())); - }, null); + }, TooltipData.EMPTY); private static SpruceOption maxAnalogValueOption(String key, int axis) { return new SpruceDoubleOption(key, .25f, 1.f, 0.05f, () -> MidnightControlsConfig.getAxisMaxValue(axis), newValue -> MidnightControlsConfig.setAxisMaxValue(axis, newValue), option -> option.getDisplayText(Text.literal(String.format("%.2f", option.get()))), - Text.translatable(key.concat(".tooltip")) + TooltipData.builder().text(Text.translatable(key.concat(".tooltip"))).build() ); } // Touch options @@ -193,30 +195,30 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { NetworkUtil.sendPayloadC2S(new ControlsModePayload(next.getName())); } }, option -> option.getDisplayText(Text.translatable(MidnightControlsConfig.controlsMode.getTranslationKey())), - Text.translatable("midnightcontrols.menu.controls_mode.tooltip")); + TooltipData.builder().text(Text.translatable("midnightcontrols.menu.controls_mode.tooltip")).build()); this.autoSwitchModeOption = new SpruceToggleBooleanOption("midnightcontrols.menu.auto_switch_mode", () -> MidnightControlsConfig.autoSwitchMode, - value -> MidnightControlsConfig.autoSwitchMode = value, Text.translatable("midnightcontrols.menu.auto_switch_mode.tooltip")); + value -> MidnightControlsConfig.autoSwitchMode = value, TooltipData.builder().text(Text.translatable("midnightcontrols.menu.auto_switch_mode.tooltip")).build()); this.rotationSpeedOption = new SpruceDoubleOption("midnightcontrols.menu.rotation_speed", 0.0, 100.0, .5f, () -> MidnightControlsConfig.rotationSpeed, value -> MidnightControlsConfig.rotationSpeed = value, option -> option.getDisplayText(Text.literal(String.valueOf(option.get()))), - Text.translatable("midnightcontrols.menu.rotation_speed.tooltip")); + TooltipData.builder().text(Text.translatable("midnightcontrols.menu.rotation_speed.tooltip")).build()); this.yAxisRotationSpeedOption = new SpruceDoubleOption("midnightcontrols.menu.y_axis_rotation_speed", 0.0, 100.0, .5f, () -> MidnightControlsConfig.yAxisRotationSpeed, value -> MidnightControlsConfig.yAxisRotationSpeed = value, option -> option.getDisplayText(Text.literal(String.valueOf(option.get()))), - Text.translatable("midnightcontrols.menu.y_axis_rotation_speed.tooltip")); + TooltipData.builder().text(Text.translatable("midnightcontrols.menu.y_axis_rotation_speed.tooltip")).build()); this.mouseSpeedOption = new SpruceDoubleOption("midnightcontrols.menu.mouse_speed", 0.0, 150.0, .5f, () -> MidnightControlsConfig.mouseSpeed, value -> MidnightControlsConfig.mouseSpeed = value, option -> option.getDisplayText(Text.literal(String.valueOf(option.get()))), - Text.translatable("midnightcontrols.menu.mouse_speed.tooltip")); + TooltipData.builder().text(Text.translatable("midnightcontrols.menu.mouse_speed.tooltip")).build()); this.joystickAsMouseOption = new SpruceToggleBooleanOption("midnightcontrols.menu.joystick_as_mouse", () -> MidnightControlsConfig.joystickAsMouse, value -> MidnightControlsConfig.joystickAsMouse = value, - Text.translatable("midnightcontrols.menu.joystick_as_mouse.tooltip")); + TooltipData.builder().text(Text.translatable("midnightcontrols.menu.joystick_as_mouse.tooltip")).build()); this.eyeTrackingAsMouseOption = new SpruceToggleBooleanOption("midnightcontrols.menu.eye_tracker_as_mouse", () -> MidnightControlsConfig.eyeTrackerAsMouse, value -> MidnightControlsConfig.eyeTrackerAsMouse = value, - Text.translatable("midnightcontrols.menu.eye_tracker_as_mouse.tooltip")); + TooltipData.builder().text(Text.translatable("midnightcontrols.menu.eye_tracker_as_mouse.tooltip")).build()); this.eyeTrackingDeadzone = new SpruceDoubleInputOption("midnightcontrols.menu.eye_tracker_deadzone", () -> MidnightControlsConfig.eyeTrackerDeadzone, value -> MidnightControlsConfig.eyeTrackerDeadzone = value, - Text.translatable("midnightcontrols.menu.eye_tracker_deadzone.tooltip")); + TooltipData.builder().text(Text.translatable("midnightcontrols.menu.eye_tracker_deadzone.tooltip")).build()); this.resetOption = SpruceSimpleActionOption.reset(btn -> { MidnightControlsConfig.reset(); var client = MinecraftClient.getInstance(); @@ -226,44 +228,44 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { // Gameplay options this.analogMovementOption = new SpruceToggleBooleanOption("midnightcontrols.menu.analog_movement", () -> MidnightControlsConfig.analogMovement, value -> MidnightControlsConfig.analogMovement = value, - Text.translatable("midnightcontrols.menu.analog_movement.tooltip")); + TooltipData.builder().text(Text.translatable("midnightcontrols.menu.analog_movement.tooltip")).build()); this.autoJumpOption = new SpruceToggleBooleanOption("options.autoJump", () -> this.client.options.getAutoJump().getValue(), newValue -> this.client.options.getAutoJump().setValue(newValue), - null); + TooltipData.EMPTY); this.controllerToggleSneakOption = new SpruceToggleBooleanOption("midnightcontrols.menu.controller_toggle_sneak", () -> MidnightControlsConfig.controllerToggleSneak, value -> MidnightControlsConfig.controllerToggleSneak = value, - null); + TooltipData.EMPTY); this.controllerToggleSprintOption = new SpruceToggleBooleanOption("midnightcontrols.menu.controller_toggle_sprint", () -> MidnightControlsConfig.controllerToggleSprint, value -> MidnightControlsConfig.controllerToggleSprint = value, - null); + TooltipData.EMPTY); this.fastBlockPlacingOption = new SpruceToggleBooleanOption("midnightcontrols.menu.fast_block_placing", () -> MidnightControlsConfig.fastBlockPlacing, - value -> MidnightControlsConfig.fastBlockPlacing = value, Text.translatable("midnightcontrols.menu.fast_block_placing.tooltip")); + value -> MidnightControlsConfig.fastBlockPlacing = value, TooltipData.builder().text(Text.translatable("midnightcontrols.menu.fast_block_placing.tooltip")).build()); this.frontBlockPlacingOption = new SpruceToggleBooleanOption("midnightcontrols.menu.reacharound.horizontal", () -> MidnightControlsConfig.horizontalReacharound, - value -> MidnightControlsConfig.horizontalReacharound = value, Text.translatable("midnightcontrols.menu.reacharound.horizontal.tooltip")); + value -> MidnightControlsConfig.horizontalReacharound = value, TooltipData.builder().text(Text.translatable("midnightcontrols.menu.reacharound.horizontal.tooltip")).build()); this.verticalReacharoundOption = new SpruceToggleBooleanOption("midnightcontrols.menu.reacharound.vertical", () -> MidnightControlsConfig.verticalReacharound, - value -> MidnightControlsConfig.verticalReacharound = value, Text.translatable("midnightcontrols.menu.reacharound.vertical.tooltip")); + value -> MidnightControlsConfig.verticalReacharound = value, TooltipData.builder().text(Text.translatable("midnightcontrols.menu.reacharound.vertical.tooltip")).build()); this.flyDriftingOption = new SpruceToggleBooleanOption("midnightcontrols.menu.fly_drifting", () -> MidnightControlsConfig.flyDrifting, - value -> MidnightControlsConfig.flyDrifting = value, Text.translatable("midnightcontrols.menu.fly_drifting.tooltip")); + value -> MidnightControlsConfig.flyDrifting = value, TooltipData.builder().text(Text.translatable("midnightcontrols.menu.fly_drifting.tooltip")).build()); this.flyVerticalDriftingOption = new SpruceToggleBooleanOption("midnightcontrols.menu.fly_drifting_vertical", () -> MidnightControlsConfig.verticalFlyDrifting, - value -> MidnightControlsConfig.verticalFlyDrifting = value, Text.translatable("midnightcontrols.menu.fly_drifting_vertical.tooltip")); + value -> MidnightControlsConfig.verticalFlyDrifting = value, TooltipData.builder().text(Text.translatable("midnightcontrols.menu.fly_drifting_vertical.tooltip")).build()); // Appearance options this.controllerTypeOption = new SpruceCyclingOption("midnightcontrols.menu.controller_type", amount -> MidnightControlsConfig.controllerType = MidnightControlsConfig.controllerType.next(), option -> option.getDisplayText(MidnightControlsConfig.controllerType.getTranslatedText()), - Text.translatable("midnightcontrols.menu.controller_type.tooltip")); + TooltipData.builder().text(Text.translatable("midnightcontrols.menu.controller_type.tooltip")).build()); this.virtualMouseSkinOption = new SpruceCyclingOption("midnightcontrols.menu.virtual_mouse.skin", amount -> MidnightControlsConfig.virtualMouseSkin = MidnightControlsConfig.virtualMouseSkin.next(), option -> option.getDisplayText(MidnightControlsConfig.virtualMouseSkin.getTranslatedText()), - null); + TooltipData.EMPTY); this.hudEnableOption = new SpruceToggleBooleanOption("midnightcontrols.menu.hud_enable", () -> MidnightControlsConfig.hudEnable, - MidnightControlsClient::setHudEnabled, Text.translatable("midnightcontrols.menu.hud_enable.tooltip")); + MidnightControlsClient::setHudEnabled, TooltipData.builder().text(Text.translatable("midnightcontrols.menu.hud_enable.tooltip")).build()); this.hudSideOption = new SpruceCyclingOption("midnightcontrols.menu.hud_side", amount -> MidnightControlsConfig.hudSide = MidnightControlsConfig.hudSide.next(), option -> option.getDisplayText(MidnightControlsConfig.hudSide.getTranslatedText()), - Text.translatable("midnightcontrols.menu.hud_side.tooltip")); + TooltipData.builder().text(Text.translatable("midnightcontrols.menu.hud_side.tooltip")).build()); this.moveChatOption = new SpruceToggleBooleanOption("midnightcontrols.menu.move_chat", () -> MidnightControlsConfig.moveChat, - value -> MidnightControlsConfig.moveChat = value, Text.translatable("midnightcontrols.menu.move_chat.tooltip")); + value -> MidnightControlsConfig.moveChat = value, TooltipData.builder().text(Text.translatable("midnightcontrols.menu.move_chat.tooltip")).build()); // Controller options this.toggleControllerProfileOption = new SpruceToggleBooleanOption("midnightcontrols.menu.separate_controller_profile", () -> MidnightControlsConfig.controllerBindingProfiles.containsKey(MidnightControlsConfig.getController().getGuid()), value -> { if (value) { @@ -274,56 +276,56 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { MidnightControlsConfig.updateBindingsForController(MidnightControlsConfig.getController()); } - }, Text.empty()); + }, TooltipData.EMPTY); this.cameraModeOption = new SpruceCyclingOption("midnightcontrols.menu.camera_mode", amount -> MidnightControlsConfig.cameraMode = MidnightControlsConfig.cameraMode.next(), option -> option.getDisplayText(MidnightControlsConfig.cameraMode.getTranslatedText()), - Text.translatable("midnightcontrols.menu.camera_mode.tooltip")); + TooltipData.builder().text(Text.translatable("midnightcontrols.menu.camera_mode.tooltip")).build()); this.rightDeadZoneOption = new SpruceDoubleOption("midnightcontrols.menu.right_dead_zone", 0.05, 1.0, .05f, () -> MidnightControlsConfig.rightDeadZone, value -> MidnightControlsConfig.rightDeadZone = value, option -> { var value = String.valueOf(option.get()); return option.getDisplayText(Text.literal(value.substring(0, Math.min(value.length(), 5)))); - }, Text.translatable("midnightcontrols.menu.right_dead_zone.tooltip")); + }, TooltipData.builder().text(Text.translatable("midnightcontrols.menu.right_dead_zone.tooltip")).build()); this.leftDeadZoneOption = new SpruceDoubleOption("midnightcontrols.menu.left_dead_zone", 0.05, 1.0, .05f, () -> MidnightControlsConfig.leftDeadZone, value -> MidnightControlsConfig.leftDeadZone = value, option -> { var value = String.valueOf(option.get()); return option.getDisplayText(Text.literal(value.substring(0, Math.min(value.length(), 5)))); - }, Text.translatable("midnightcontrols.menu.left_dead_zone.tooltip")); + }, TooltipData.builder().text(Text.translatable("midnightcontrols.menu.left_dead_zone.tooltip")).build()); this.invertsRightXAxis = new SpruceToggleBooleanOption("midnightcontrols.menu.invert_right_x_axis", () -> MidnightControlsConfig.invertRightXAxis, - value -> MidnightControlsConfig.invertRightXAxis = value, null); + value -> MidnightControlsConfig.invertRightXAxis = value, TooltipData.EMPTY); this.invertsRightYAxis = new SpruceToggleBooleanOption("midnightcontrols.menu.invert_right_y_axis", () -> MidnightControlsConfig.invertRightYAxis, - value -> MidnightControlsConfig.invertRightYAxis = value, null); + value -> MidnightControlsConfig.invertRightYAxis = value, TooltipData.EMPTY); this.unfocusedInputOption = new SpruceToggleBooleanOption("midnightcontrols.menu.unfocused_input", () -> MidnightControlsConfig.unfocusedInput, - value -> MidnightControlsConfig.unfocusedInput = value, Text.translatable("midnightcontrols.menu.unfocused_input.tooltip")); + value -> MidnightControlsConfig.unfocusedInput = value, TooltipData.builder().text(Text.translatable("midnightcontrols.menu.unfocused_input.tooltip")).build()); this.virtualMouseOption = new SpruceToggleBooleanOption("midnightcontrols.menu.virtual_mouse", () -> MidnightControlsConfig.virtualMouse, - value -> MidnightControlsConfig.virtualMouse = value, Text.translatable("midnightcontrols.menu.virtual_mouse.tooltip")); + value -> MidnightControlsConfig.virtualMouse = value, TooltipData.builder().text(Text.translatable("midnightcontrols.menu.virtual_mouse.tooltip")).build()); this.virtualKeyboardOption = new SpruceToggleBooleanOption("midnightcontrols.menu.virtual_keyboard", () -> MidnightControlsConfig.virtualMouse, - value -> MidnightControlsConfig.virtualKeyboard = value, Text.translatable("midnightcontrols.menu.virtual_keyboard.tooltip")); + value -> MidnightControlsConfig.virtualKeyboard = value, TooltipData.builder().text(Text.translatable("midnightcontrols.menu.virtual_keyboard.tooltip")).build()); this.hideCursorOption = new SpruceToggleBooleanOption("midnightcontrols.menu.hide_cursor", () -> MidnightControlsConfig.hideNormalMouse, - value -> MidnightControlsConfig.hideNormalMouse = value, Text.translatable("midnightcontrols.menu.hide_cursor.tooltip")); + value -> MidnightControlsConfig.hideNormalMouse = value, TooltipData.builder().text(Text.translatable("midnightcontrols.menu.hide_cursor.tooltip")).build()); // Touch options this.touchModeOption = new SpruceCyclingOption("midnightcontrols.menu.touch_mode", amount -> MidnightControlsConfig.touchMode = MidnightControlsConfig.touchMode.next(), option -> option.getDisplayText(MidnightControlsConfig.touchMode.getTranslatedText()), - Text.translatable("midnightcontrols.menu.touch_mode.tooltip")); + TooltipData.builder().text(Text.translatable("midnightcontrols.menu.touch_mode.tooltip")).build()); this.touchWithControllerOption = new SpruceToggleBooleanOption("midnightcontrols.menu.touch_with_controller", () -> MidnightControlsConfig.touchInControllerMode, - value -> MidnightControlsConfig.touchInControllerMode = value, Text.translatable("midnightcontrols.menu.touch_with_controller.tooltip")); + value -> MidnightControlsConfig.touchInControllerMode = value, TooltipData.builder().text(Text.translatable("midnightcontrols.menu.touch_with_controller.tooltip")).build()); this.touchSpeedOption = new SpruceDoubleOption("midnightcontrols.menu.touch_speed", 0.0, 150.0, .5f, () -> MidnightControlsConfig.touchSpeed, value -> MidnightControlsConfig.touchSpeed = value, option -> option.getDisplayText(Text.literal(String.valueOf(option.get()))), - Text.translatable("midnightcontrols.menu.touch_speed.tooltip")); + TooltipData.builder().text(Text.translatable("midnightcontrols.menu.touch_speed.tooltip")).build()); this.touchBreakDelayOption = new SpruceDoubleOption("midnightcontrols.menu.touch_break_delay", 50, 500, 1f, () -> (double) MidnightControlsConfig.touchBreakDelay, value -> MidnightControlsConfig.touchBreakDelay = value.intValue(), option -> option.getDisplayText(Text.literal(String.valueOf(option.get()))), - Text.translatable("midnightcontrols.menu.touch_break_delay.tooltip")); + TooltipData.builder().text(Text.translatable("midnightcontrols.menu.touch_break_delay.tooltip")).build()); this.touchTransparencyOption = new SpruceDoubleOption("midnightcontrols.menu.touch_transparency", 0, 100, 1f, () -> (double) MidnightControlsConfig.touchTransparency, value -> MidnightControlsConfig.touchTransparency = value.intValue(), option -> option.getDisplayText(Text.literal(String.valueOf(option.get()))), - Text.translatable("midnightcontrols.menu.touch_break_delay.tooltip")); + TooltipData.builder().text(Text.translatable("midnightcontrols.menu.touch_break_delay.tooltip")).build()); this.invertTouchOption = new SpruceToggleBooleanOption("midnightcontrols.menu.invert_touch", () -> MidnightControlsConfig.invertTouch, - value -> MidnightControlsConfig.invertTouch = value, Text.translatable("midnightcontrols.menu.invert_touch.tooltip")); + value -> MidnightControlsConfig.invertTouch = value, TooltipData.builder().text(Text.translatable("midnightcontrols.menu.invert_touch.tooltip")).build()); } @Override @@ -421,7 +423,7 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { list.setBackground(new MidnightControlsBackground(130)); list.addSingleOptionEntry(this.controllerTypeOption); list.addSingleOptionEntry(this.virtualMouseSkinOption); - list.addSingleOptionEntry(new SpruceSeparatorOption("midnightcontrols.menu.title.hud", true, null)); + list.addSingleOptionEntry(new SpruceSeparatorOption("midnightcontrols.menu.title.hud", true, TooltipData.EMPTY)); list.addSingleOptionEntry(this.hudEnableOption); list.addSingleOptionEntry(this.hudSideOption); list.addSingleOptionEntry(this.moveChatOption); @@ -437,17 +439,17 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { var aboutMappings1 = new SpruceLabelWidget(Position.of(0, 2), Text.translatable("midnightcontrols.controller.mappings.1", SDL2_GAMEPAD_TOOL), - width, true); + width); var gamepadToolUrlLabel = new SpruceLabelWidget(Position.of(0, aboutMappings1.getHeight() + 4), this.controllerMappingsUrlText, width, - label -> Util.getOperatingSystem().open(GAMEPAD_TOOL_URL), true); + label -> Util.getOperatingSystem().open(GAMEPAD_TOOL_URL)); gamepadToolUrlLabel.setTooltip(Text.translatable("chat.link.open")); var aboutMappings3 = new SpruceLabelWidget(Position.of(0, aboutMappings1.getHeight() + gamepadToolUrlLabel.getHeight() + 6), Text.translatable("midnightcontrols.controller.mappings.3", Formatting.GREEN.toString(), Formatting.RESET.toString()), - width, true); + width); int listHeight = height - 8 - aboutMappings1.getHeight() - aboutMappings3.getHeight() - gamepadToolUrlLabel.getHeight(); var labels = new SpruceContainerWidget(Position.of(0, @@ -481,7 +483,7 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { list.addSingleOptionEntry(this.touchSpeedOption); list.addSingleOptionEntry(this.touchWithControllerOption); list.addSingleOptionEntry(this.invertTouchOption); - list.addSingleOptionEntry(new SpruceSeparatorOption("midnightcontrols.menu.title.hud", true, null)); + list.addSingleOptionEntry(new SpruceSeparatorOption("midnightcontrols.menu.title.hud", true, TooltipData.EMPTY)); list.addSingleOptionEntry(this.touchModeOption); list.addSingleOptionEntry(this.touchBreakDelayOption); list.addSingleOptionEntry(this.touchTransparencyOption); @@ -493,18 +495,19 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { } @Override - public void renderTitle(DrawContext context, int mouseX, int mouseY, float delta) { - context.drawCenteredTextWithShadow(this.textRenderer, I18n.translate("midnightcontrols.menu.title"), this.width / 2, 8, 0xFFFFFFFF); + public void render(SpruceGuiGraphics context, int mouseX, int mouseY, float delta) { + super.render(context, mouseX, mouseY, delta); + context.vanilla().drawCenteredTextWithShadow(this.textRenderer, I18n.translate("midnightcontrols.menu.title"), this.width / 2, 8, 0xFFFFFFFF); } public static class MidnightControlsBackground implements Background { - private static int transparency = 160; + private int transparency = 160; public MidnightControlsBackground() {} public MidnightControlsBackground(int transparency) { - MidnightControlsBackground.transparency = transparency; + this.transparency = transparency; } @Override - public void render(DrawContext context, SpruceWidget widget, int vOffset, int mouseX, int mouseY, float delta) { + public void render(SpruceGuiGraphics context, SpruceWidget widget, int vOffset, int mouseX, int mouseY, float delta) { context.fill(widget.getX(), widget.getY(), widget.getX() + widget.getWidth(), widget.getY() + widget.getHeight(), ColorHelper.getArgb(transparency, 0, 0, 0)); } } diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/ReloadControllerMappingsOption.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/ReloadControllerMappingsOption.java index 3e847a8..4dc538c 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/ReloadControllerMappingsOption.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/ReloadControllerMappingsOption.java @@ -9,9 +9,10 @@ package eu.midnightdust.midnightcontrols.client.gui; +import dev.lambdaurora.spruceui.option.SpruceSimpleActionOption; +import dev.lambdaurora.spruceui.tooltip.TooltipData; +import dev.lambdaurora.spruceui.widget.SpruceButtonWidget; import eu.midnightdust.midnightcontrols.client.controller.Controller; -import org.thinkingstudio.obsidianui.option.SpruceSimpleActionOption; -import org.thinkingstudio.obsidianui.widget.SpruceButtonWidget; import net.minecraft.client.MinecraftClient; import net.minecraft.client.toast.SystemToast; import net.minecraft.text.Text; @@ -35,6 +36,6 @@ public class ReloadControllerMappingsOption { client.currentScreen.init(client, client.getWindow().getScaledWidth(), client.getWindow().getScaledHeight()); client.getToastManager().add(SystemToast.create(client, SystemToast.Type.PERIODIC_NOTIFICATION, Text.translatable("midnightcontrols.controller.mappings.updated"), Text.empty())); - }, Text.translatable("midnightcontrols.tooltip.reload_controller_mappings")); + }, TooltipData.builder().text(Text.translatable("midnightcontrols.tooltip.reload_controller_mappings")).build()); } } diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/config/ControllerBindingButton.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/config/ControllerBindingButton.java index 2220f6b..46d2071 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/config/ControllerBindingButton.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/config/ControllerBindingButton.java @@ -1,6 +1,7 @@ package eu.midnightdust.midnightcontrols.client.gui.config; import com.google.common.collect.Lists; +import dev.lambdaurora.spruceui.SpruceTexts; import eu.midnightdust.lib.config.EntryInfo; import eu.midnightdust.lib.config.MidnightConfigListWidget; import eu.midnightdust.lib.config.MidnightConfigScreen; @@ -22,7 +23,6 @@ import net.minecraft.text.Text; import net.minecraft.util.Formatting; import net.minecraft.util.Identifier; import org.jetbrains.annotations.Nullable; -import org.thinkingstudio.obsidianui.SpruceTexts; import java.util.ArrayList; import java.util.List; diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/config/ControllerSelectionButton.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/config/ControllerSelectionButton.java index c468842..33c9793 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/config/ControllerSelectionButton.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/config/ControllerSelectionButton.java @@ -1,5 +1,6 @@ package eu.midnightdust.midnightcontrols.client.gui.config; +import dev.lambdaurora.spruceui.SpruceTexts; import eu.midnightdust.lib.config.EntryInfo; import eu.midnightdust.lib.config.MidnightConfigListWidget; import eu.midnightdust.lib.config.MidnightConfigScreen; @@ -12,7 +13,6 @@ import net.minecraft.text.Text; import net.minecraft.util.Formatting; import net.minecraft.util.Identifier; import org.lwjgl.glfw.GLFW; -import org.thinkingstudio.obsidianui.SpruceTexts; import java.util.List; diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/config/MappingsStringInputWidget.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/config/MappingsStringInputWidget.java new file mode 100644 index 0000000..75b0b7e --- /dev/null +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/config/MappingsStringInputWidget.java @@ -0,0 +1,57 @@ +/* + * Copyright © 2021 LambdAurora + * + * This file is part of midnightcontrols. + * + * Licensed under the MIT license. For more information, + * see the LICENSE file. + */ + +package eu.midnightdust.midnightcontrols.client.gui.config; + +import com.google.common.collect.Lists; +import eu.midnightdust.lib.config.EntryInfo; +import eu.midnightdust.lib.config.MidnightConfigListWidget; +import eu.midnightdust.lib.config.MidnightConfigScreen; +import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig; +import net.minecraft.client.gui.widget.*; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; + +import java.util.List; + +import static eu.midnightdust.midnightcontrols.client.MidnightControlsClient.client; + +/** + * Represents the controller mappings file editor screen. + * + * @author LambdAurora + * @version 1.7.0 + * @since 1.4.3 + */ +public class MappingsStringInputWidget { + + public static void add(EntryInfo centered, MidnightConfigListWidget list, MidnightConfigScreen screen) { + MultilineTextFieldWidget editButton = new MultilineTextFieldWidget(screen.getTextRenderer(), screen.width / 2 - 128, 0, 256, 60, Text.of("TESTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT\nnew line!")); + TextIconButtonWidget resetButton = TextIconButtonWidget.builder(Text.translatable("controls.reset"), (button -> { + screen.updateList(); + }), true).texture(Identifier.of("midnightlib","icon/reset"), 12, 12).dimension(20, 60).build(); + resetButton.setPosition(screen.width / 2 - 128 + 256 + 4, 0); + editButton.setChangedListener(string -> { + resetButton.active = !string.isEmpty(); + }); + + list.addButton(List.of(), Text.translatable("midnightcontrols.menu.title.mappings.string"), centered); + list.addButton(Lists.newArrayList(editButton, resetButton), Text.empty(), centered); + list.addButton(List.of(), Text.empty(), centered); + list.addButton(List.of(), Text.empty(), centered); + list.addButton(List.of(), Text.translatable("midnightcontrols.menu.multiple_mapping_tip"), centered); + //list.addButton(); + + ButtonWidget copyButton = TextIconButtonWidget.builder(Text.of("Copy GUID"), widget -> { + client.keyboard.setClipboard(MidnightControlsConfig.getController().getGuid()); + }).dimensions(screen.width - 185, 0, 150, 20).build(); + + list.addButton(List.of(copyButton), Text.translatable("midnightcontrols.menu.current_controller_guid", MidnightControlsConfig.getController().getGuid()), new EntryInfo(null, screen.modid)); + } +} diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/config/MultilineTextFieldWidget.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/config/MultilineTextFieldWidget.java new file mode 100644 index 0000000..df378b0 --- /dev/null +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/config/MultilineTextFieldWidget.java @@ -0,0 +1,13 @@ +package eu.midnightdust.midnightcontrols.client.gui.config; + +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.widget.ScrollableTextWidget; +import net.minecraft.client.gui.widget.TextFieldWidget; +import net.minecraft.text.Text; + +public class MultilineTextFieldWidget extends TextFieldWidget { + public MultilineTextFieldWidget(TextRenderer textRenderer, int x, int y, int width, int height, Text text) { + super(textRenderer, x, y, width, height, text); + } + // TODO +} diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/widget/ControllerButtonWidget.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/widget/ControllerButtonWidget.java index 34c00e4..f1faa54 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/widget/ControllerButtonWidget.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/widget/ControllerButtonWidget.java @@ -9,11 +9,12 @@ package eu.midnightdust.midnightcontrols.client.gui.widget; +import dev.lambdaurora.spruceui.Position; +import dev.lambdaurora.spruceui.SpruceTexts; +import dev.lambdaurora.spruceui.render.SpruceGuiGraphics; +import dev.lambdaurora.spruceui.widget.AbstractSpruceIconButtonWidget; import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding; import eu.midnightdust.midnightcontrols.client.gui.MidnightControlsRenderer; -import org.thinkingstudio.obsidianui.Position; -import org.thinkingstudio.obsidianui.SpruceTexts; -import org.thinkingstudio.obsidianui.widget.AbstractSpruceIconButtonWidget; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; import net.minecraft.text.Text; @@ -45,12 +46,12 @@ public class ControllerButtonWidget extends AbstractSpruceIconButtonWidget { } @Override - protected int renderIcon(DrawContext context, int mouseX, int mouseY, float delta) { + protected int renderIcon(SpruceGuiGraphics spruceGuiGraphics, int mouseX, int mouseY, float delta) { int x = this.getX(); if (this.binding.getButton().length > 1) { x += (this.width / 2 - this.iconWidth / 2) - 4; } - var size = MidnightControlsRenderer.drawButton(context, x, this.getY(), this.binding, MinecraftClient.getInstance()); + var size = MidnightControlsRenderer.drawButton(spruceGuiGraphics.vanilla(), x, this.getY(), this.binding, MinecraftClient.getInstance()); this.iconWidth = size.length(); return size.height(); } diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/widget/ControllerControlsWidget.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/widget/ControllerControlsWidget.java index 9657e81..c5086dc 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/widget/ControllerControlsWidget.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/widget/ControllerControlsWidget.java @@ -9,14 +9,15 @@ package eu.midnightdust.midnightcontrols.client.gui.widget; +import dev.lambdaurora.spruceui.Position; +import dev.lambdaurora.spruceui.SpruceTexts; +import dev.lambdaurora.spruceui.render.SpruceGuiGraphics; +import dev.lambdaurora.spruceui.widget.SpruceButtonWidget; +import dev.lambdaurora.spruceui.widget.container.SpruceContainerWidget; import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig; import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding; import eu.midnightdust.midnightcontrols.client.controller.InputManager; import eu.midnightdust.midnightcontrols.client.gui.config.ControlsInput; -import org.thinkingstudio.obsidianui.Position; -import org.thinkingstudio.obsidianui.SpruceTexts; -import org.thinkingstudio.obsidianui.widget.SpruceButtonWidget; -import org.thinkingstudio.obsidianui.widget.container.SpruceContainerWidget; import eu.midnightdust.midnightcontrols.client.gui.MidnightControlsSettingsScreen; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.option.ControlsOptionsScreen; @@ -55,8 +56,8 @@ public class ControllerControlsWidget extends SpruceContainerWidget implements C } @Override - public void renderWidget(DrawContext context, int mouseX, int mouseY, float delta) { - context.drawCenteredTextWithShadow(this.client.textRenderer, Text.translatable("midnightcontrols.menu.title.controller_controls"), + public void renderWidget(SpruceGuiGraphics context, int mouseX, int mouseY, float delta) { + context.vanilla().drawCenteredTextWithShadow(this.client.textRenderer, Text.translatable("midnightcontrols.menu.title.controller_controls"), this.getX() + this.width / 2, this.getY() + 4, 0xFFFFFFFF); this.resetButton.setActive(InputManager.streamBindings().anyMatch(Predicates.not(ButtonBinding::isDefault))); super.renderWidget(context, mouseX, mouseY, delta); diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/widget/ControlsListWidget.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/widget/ControlsListWidget.java index c2586e6..448c2d4 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/widget/ControlsListWidget.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/widget/ControlsListWidget.java @@ -9,6 +9,17 @@ package eu.midnightdust.midnightcontrols.client.gui.widget; +import dev.lambdaurora.spruceui.Position; +import dev.lambdaurora.spruceui.SpruceTexts; +import dev.lambdaurora.spruceui.navigation.NavigationEvent; +import dev.lambdaurora.spruceui.navigation.NavigationUtils; +import dev.lambdaurora.spruceui.render.SpruceGuiGraphics; +import dev.lambdaurora.spruceui.widget.SpruceButtonWidget; +import dev.lambdaurora.spruceui.widget.SpruceIconButtonWidget; +import dev.lambdaurora.spruceui.widget.SpruceSeparatorWidget; +import dev.lambdaurora.spruceui.widget.SpruceWidget; +import dev.lambdaurora.spruceui.widget.container.SpruceEntryListWidget; +import dev.lambdaurora.spruceui.widget.container.SpruceParentWidget; import eu.midnightdust.midnightcontrols.client.MidnightControlsClient; import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig; import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding; @@ -16,20 +27,11 @@ import eu.midnightdust.midnightcontrols.client.controller.ButtonCategory; import eu.midnightdust.midnightcontrols.client.controller.InputManager; import net.minecraft.client.gl.RenderPipelines; import net.minecraft.client.gui.Click; +import net.minecraft.client.gui.navigation.NavigationAxis; +import net.minecraft.client.gui.navigation.NavigationDirection; import net.minecraft.client.input.KeyInput; import net.minecraft.client.input.MouseInput; -import net.minecraft.client.render.RenderLayer; import net.minecraft.util.Identifier; -import org.thinkingstudio.obsidianui.Position; -import org.thinkingstudio.obsidianui.SpruceTexts; -import org.thinkingstudio.obsidianui.navigation.NavigationDirection; -import org.thinkingstudio.obsidianui.navigation.NavigationUtils; -import org.thinkingstudio.obsidianui.widget.SpruceButtonWidget; -import org.thinkingstudio.obsidianui.widget.SpruceIconButtonWidget; -import org.thinkingstudio.obsidianui.widget.SpruceSeparatorWidget; -import org.thinkingstudio.obsidianui.widget.SpruceWidget; -import org.thinkingstudio.obsidianui.widget.container.SpruceEntryListWidget; -import org.thinkingstudio.obsidianui.widget.container.SpruceParentWidget; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.gui.DrawContext; @@ -114,11 +116,11 @@ public class ControlsListWidget extends SpruceEntryListWidget element.mouseReleased(new Click(mouseX, mouseY, new MouseInput(button, 0)))).isPresent(); + return this.hoveredElement(click.x(), click.y()).filter(element -> element.mouseReleased(click)).isPresent(); } @Override - protected boolean onMouseDrag(double mouseX, double mouseY, int button, double deltaX, double deltaY) { - return this.getFocused() != null && this.dragging && button == GLFW.GLFW_MOUSE_BUTTON_1 - && this.getFocused().mouseDragged(new Click(mouseX, mouseY, new MouseInput(button, 0)), deltaX, deltaY); + protected boolean onMouseDrag(@NotNull Click click, double deltaX, double deltaY) { + return this.getFocused() != null && this.dragging && click.button() == GLFW.GLFW_MOUSE_BUTTON_1 + && this.getFocused().mouseDragged(click, deltaX, deltaY); } @Override - protected boolean onKeyPress(int keyCode, int scanCode, int modifiers) { - return this.focused != null && this.focused.keyPressed(new KeyInput(keyCode, scanCode, modifiers)); + protected boolean onKeyPress(@NotNull KeyInput input) { + return this.focused != null && this.focused.keyPressed(input); } /* Navigation */ @@ -215,9 +217,9 @@ public class ControlsListWidget extends SpruceEntryListWidget= this.children.size()) lastIndex = this.children.size() - 1; - if (!this.children.get(lastIndex).onNavigation(direction, tab)) + if (!this.children.get(lastIndex).onNavigation(event)) return false; this.setFocused(this.children.get(lastIndex)); return true; } - boolean result = NavigationUtils.tryNavigate(direction, tab, this.children, this.focused, this::setFocused, true); + boolean result = NavigationUtils.tryNavigate(event, this.children, this.focused, this::setFocused, true); if (result) { this.setFocused(true); - if (direction.isHorizontal() && this.getFocused() != null) { + if (event.direction().getAxis() == NavigationAxis.HORIZONTAL && this.getFocused() != null) { this.parent.lastIndex = this.children.indexOf(this.getFocused()); } } @@ -244,7 +246,7 @@ public class ControlsListWidget extends SpruceEntryListWidget { - if (button.isActive()) { + if (button.isInteractable()) { if (!this.client.player.isSpectator()) { Objects.requireNonNull(this.client.getNetworkHandler()).sendPacket(new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.SWAP_ITEM_WITH_OFFHAND, BlockPos.ORIGIN, Direction.DOWN)); } @@ -218,7 +216,7 @@ public class TouchscreenOverlay extends Screen { },0, 160, 20, WIDGETS_LOCATION)); // Drop this.addDrawableChild(this.dropButton = new SilentTexturedButtonWidget(Position.of(swapHandsX, sneakButtonY + 5 + 20), 20, 20, Text.empty(), btn -> { - if (btn.isActive() && !client.player.isSpectator() && client.player.dropSelectedItem(false)) { + if (btn.isInteractable() && !client.player.isSpectator() && client.player.dropSelectedItem(false)) { client.player.swingHand(Hand.MAIN_HAND); } }, 20, 160, 20, WIDGETS_LOCATION)); @@ -235,12 +233,12 @@ public class TouchscreenOverlay extends Screen { this::handleJump, 40, 40, 20, WIDGETS_LOCATION )); this.addDrawableChild(this.flyDownButton = new SilentTexturedButtonWidget(Position.of(jumpButtonX, sneakButtonY + 20 + 5), 20, 20, Text.empty(), - btn -> ((KeyBindingAccessor) this.client.options.sneakKey).midnightcontrols$handlePressState(btn.isActive()), 60, 40, 20, WIDGETS_LOCATION + btn -> ((KeyBindingAccessor) this.client.options.sneakKey).midnightcontrols$handlePressState(btn.isInteractable()), 60, 40, 20, WIDGETS_LOCATION )); this.updateJumpButtons(); // Movements keys this.addDrawableChild((this.startSneakButton = new SilentTexturedButtonWidget(Position.of(sneakButtonX, sneakButtonY), 20, 20, Text.empty(), btn -> { - if (btn.isActive()) { + if (btn.isInteractable()) { ((KeyBindingAccessor) this.client.options.sneakKey).midnightcontrols$handlePressState(true); this.startSneakButton.setVisible(false); this.endSneakButton.setVisible(true); @@ -248,40 +246,40 @@ public class TouchscreenOverlay extends Screen { }, 0, 120, 20, WIDGETS_LOCATION)) ); this.addDrawableChild((this.endSneakButton = new SilentTexturedButtonWidget(Position.of(sneakButtonX, sneakButtonY), 20, 20, Text.empty(), btn -> { - if (btn.isActive()) { + if (btn.isInteractable()) { ((KeyBindingAccessor) this.client.options.sneakKey).midnightcontrols$handlePressState(false); this.endSneakButton.setVisible(false); this.startSneakButton.setVisible(true); } }, 20, 120, 20, WIDGETS_LOCATION))); this.addDrawableChild(this.forwardLeftButton = new SilentTexturedButtonWidget(Position.of(sneakButtonX - 20 - 5, sneakButtonY - 5 - 20), 20, 20, Text.empty(), btn -> { - ((KeyBindingAccessor) this.client.options.forwardKey).midnightcontrols$handlePressState(btn.isActive()); - ((KeyBindingAccessor) this.client.options.leftKey).midnightcontrols$handlePressState(btn.isActive()); - this.updateForwardButtonsState(btn.isActive()); + ((KeyBindingAccessor) this.client.options.forwardKey).midnightcontrols$handlePressState(btn.isInteractable()); + ((KeyBindingAccessor) this.client.options.leftKey).midnightcontrols$handlePressState(btn.isInteractable()); + this.updateForwardButtonsState(btn.isInteractable()); }, 80, 80, 20, WIDGETS_LOCATION )); this.addDrawableChild(this.forwardButton = new SilentTexturedButtonWidget(Position.of(sneakButtonX, sneakButtonY - 5 - 20), 20, 20, Text.empty(), btn -> { - ((KeyBindingAccessor) this.client.options.forwardKey).midnightcontrols$handlePressState(btn.isActive()); - this.updateForwardButtonsState(btn.isActive()); + ((KeyBindingAccessor) this.client.options.forwardKey).midnightcontrols$handlePressState(btn.isInteractable()); + this.updateForwardButtonsState(btn.isInteractable()); this.forwardLeftButton.setVisible(true); this.forwardRightButton.setVisible(true); }, 0, 80, 20, WIDGETS_LOCATION )); this.addDrawableChild(this.forwardRightButton = new SilentTexturedButtonWidget(Position.of(sneakButtonX + 20 + 5, sneakButtonY - 5 - 20), 20, 20, Text.empty(), btn -> { - ((KeyBindingAccessor) this.client.options.forwardKey).midnightcontrols$handlePressState(btn.isActive()); - ((KeyBindingAccessor) this.client.options.rightKey).midnightcontrols$handlePressState(btn.isActive()); - this.updateForwardButtonsState(btn.isActive()); + ((KeyBindingAccessor) this.client.options.forwardKey).midnightcontrols$handlePressState(btn.isInteractable()); + ((KeyBindingAccessor) this.client.options.rightKey).midnightcontrols$handlePressState(btn.isInteractable()); + this.updateForwardButtonsState(btn.isInteractable()); }, 100, 80, 20, WIDGETS_LOCATION )); this.addDrawableChild(this.rightButton =new SilentTexturedButtonWidget(Position.of(sneakButtonX + 20 + 5, sneakButtonY), 20, 20, Text.empty(), - btn -> ((KeyBindingAccessor) this.client.options.rightKey).midnightcontrols$handlePressState(btn.isActive()), 20, 80, 20, WIDGETS_LOCATION + btn -> ((KeyBindingAccessor) this.client.options.rightKey).midnightcontrols$handlePressState(btn.isInteractable()), 20, 80, 20, WIDGETS_LOCATION )); this.addDrawableChild(this.backButton = new SilentTexturedButtonWidget(Position.of(sneakButtonX, sneakButtonY + 20 + 5), 20, 20, Text.empty(), - btn -> ((KeyBindingAccessor) this.client.options.backKey).midnightcontrols$handlePressState(btn.isActive()), 40, 80, 20, WIDGETS_LOCATION + btn -> ((KeyBindingAccessor) this.client.options.backKey).midnightcontrols$handlePressState(btn.isInteractable()), 40, 80, 20, WIDGETS_LOCATION )); this.addDrawableChild(this.leftButton = new SilentTexturedButtonWidget(Position.of(sneakButtonX - 20 - 5, sneakButtonY), 20, 20, Text.empty(), - btn -> ((KeyBindingAccessor) this.client.options.leftKey).midnightcontrols$handlePressState(btn.isActive()), 60, 80, 20, WIDGETS_LOCATION + btn -> ((KeyBindingAccessor) this.client.options.leftKey).midnightcontrols$handlePressState(btn.isInteractable()), 60, 80, 20, WIDGETS_LOCATION )); initCustomButtons(true); initCustomButtons(false); diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/virtualkeyboard/clickhandler/TextFieldWrapper.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/virtualkeyboard/clickhandler/TextFieldWrapper.java index f1190cb..c95a88a 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/virtualkeyboard/clickhandler/TextFieldWrapper.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/virtualkeyboard/clickhandler/TextFieldWrapper.java @@ -1,8 +1,8 @@ package eu.midnightdust.midnightcontrols.client.virtualkeyboard.clickhandler; +import dev.lambdaurora.spruceui.widget.text.SpruceTextFieldWidget; import net.minecraft.client.gui.Element; import net.minecraft.client.gui.widget.TextFieldWidget; -import org.thinkingstudio.obsidianui.widget.text.SpruceTextFieldWidget; public record TextFieldWrapper(Object textField) { diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/virtualkeyboard/gui/VirtualKeyboardScreen.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/virtualkeyboard/gui/VirtualKeyboardScreen.java index a760b41..4807eab 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/virtualkeyboard/gui/VirtualKeyboardScreen.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/virtualkeyboard/gui/VirtualKeyboardScreen.java @@ -1,16 +1,15 @@ package eu.midnightdust.midnightcontrols.client.virtualkeyboard.gui; +import dev.lambdaurora.spruceui.Position; +import dev.lambdaurora.spruceui.SpruceTexts; +import dev.lambdaurora.spruceui.screen.SpruceScreen; +import dev.lambdaurora.spruceui.widget.SpruceButtonWidget; +import dev.lambdaurora.spruceui.widget.container.SpruceContainerWidget; +import dev.lambdaurora.spruceui.widget.text.SpruceTextAreaWidget; import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig; import eu.midnightdust.midnightcontrols.client.virtualkeyboard.KeyboardLayout; import eu.midnightdust.midnightcontrols.client.virtualkeyboard.KeyboardLayoutManager; -import net.minecraft.client.gui.DrawContext; import net.minecraft.text.Text; -import org.thinkingstudio.obsidianui.Position; -import org.thinkingstudio.obsidianui.SpruceTexts; -import org.thinkingstudio.obsidianui.screen.SpruceScreen; -import org.thinkingstudio.obsidianui.widget.SpruceButtonWidget; -import org.thinkingstudio.obsidianui.widget.container.SpruceContainerWidget; -import org.thinkingstudio.obsidianui.widget.text.SpruceTextAreaWidget; import java.util.List; diff --git a/common/src/main/resources/midnightcontrols.mixins.json b/common/src/main/resources/midnightcontrols.mixins.json index 812f294..280248f 100644 --- a/common/src/main/resources/midnightcontrols.mixins.json +++ b/common/src/main/resources/midnightcontrols.mixins.json @@ -17,6 +17,7 @@ "GameOptionsScreenMixin", "GameRendererMixin", "HandledScreenMixin", + "InGameHudMixin", "InputAccessor", "InputUtilMixin", "KeyBindingIDAccessor", diff --git a/fabric/build.gradle b/fabric/build.gradle index da59615..db6505a 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -24,7 +24,8 @@ dependencies { modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" modApi "net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_api_version}" modImplementation include ("maven.modrinth:midnightlib:${rootProject.midnightlib_version}-fabric") - modImplementation include ("maven.modrinth:obsidianui:${rootProject.obsidianui_version}-fabric") + modImplementation include ("dev.lambdaurora:spruceui:${project.spruceui_version}") + include("dev.yumi.mc.core:yumi-mc-foundation:1.0.0-alpha.15+1.21.1") include 'org.aperlambda:lambdajcommon:1.8.1' modCompileOnly "maven.modrinth:emi:${project.emi_version}" diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 739cfb8..5472418 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -40,9 +40,6 @@ ], "client": [ "eu.midnightdust.midnightcontrols.fabric.MidnightControlsClientFabric" - ], - "modmenu": [ - "eu.midnightdust.midnightcontrols.client.MidnightControlsModMenu" ] }, "mixins": [ diff --git a/gradle.properties b/gradle.properties index 522258b..ebbb084 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,12 +10,12 @@ enabled_platforms=fabric,neoforge archives_base_name=midnightcontrols mod_version=1.11.3-beta.1 maven_group=eu.midnightdust -release_type=alpha +release_type=beta modrinth_id = bXX9h73M curseforge_id = 621768 # Configure the IDs here after creating the projects on the websites -midnightlib_version=1.8.2+1.21.9 +midnightlib_version=1.8.3+1.21.9 fabric_loader_version=0.17.2 fabric_api_version=0.133.13+1.21.9 @@ -27,7 +27,7 @@ quilt_loader_version=0.19.0-beta.18 quilt_fabric_api_version=7.0.1+0.83.0-1.20 sodium_version=mc1.21-0.6.0-beta.1 -obsidianui_version=0.2.12+mc1.21.6 +spruceui_version=9.0.0+1.21.9 modmenu_version=10.0.0-beta.1 emotecraft_version=2.5.5+1.21.4-fabric bendylib_version=2.0.+