From d81b1f59ccdf27c29e149ed3d037f0f1f57aa08e Mon Sep 17 00:00:00 2001 From: isXander Date: Mon, 15 May 2023 22:16:59 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9E=95=20Config=20option=20`delegate=5Fsetup?= =?UTF-8?q?`=20to=20not=20discover=20controllers=20immediately.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dev/isxander/controlify/Controlify.java | 27 ++++++++++++++++--- .../controlify/config/ControlifyConfig.java | 17 +++++++----- .../controlify/config/GlobalSettings.java | 1 + .../controlify/config/gui/YACLHelper.java | 23 +++++++++++----- .../gui/screen/SDLOnboardingScreen.java | 6 +++-- .../assets/controlify/lang/en_us.json | 2 ++ 6 files changed, 59 insertions(+), 17 deletions(-) diff --git a/src/main/java/dev/isxander/controlify/Controlify.java b/src/main/java/dev/isxander/controlify/Controlify.java index b3bd0d2..76db99b 100644 --- a/src/main/java/dev/isxander/controlify/Controlify.java +++ b/src/main/java/dev/isxander/controlify/Controlify.java @@ -63,6 +63,7 @@ public class Controlify implements ControlifyApi { private final ControlifyConfig config = new ControlifyConfig(this); private final Queue> calibrationQueue = new ArrayDeque<>(); + private boolean canDiscoverControllers = true; private int consecutiveInputSwitches = 0; private double lastInputSwitchTime = 0; @@ -78,7 +79,20 @@ public class Controlify implements ControlifyApi { var controllersConnected = IntStream.range(0, GLFW.GLFW_JOYSTICK_LAST + 1).anyMatch(GLFW::glfwJoystickPresent); if (controllersConnected) { - askNatives().whenComplete((loaded, th) -> discoverControllers()); + if (!config().globalSettings().delegateSetup) { + askNatives().whenComplete((loaded, th) -> discoverControllers()); + } else { + ToastUtils.sendToast( + Component.translatable("controlify.toast.setup_in_config.title"), + Component.translatable( + "controlify.toast.setup_in_config.description", + Component.translatable("options.title"), + Component.translatable("controls.keybinds.title"), + Component.literal("Controlify") + ), + false + ); + } } // listen for new controllers @@ -107,7 +121,7 @@ public class Controlify implements ControlifyApi { nativeOnboardingFuture = new CompletableFuture<>(); minecraft.setScreen(new SDLOnboardingScreen( - minecraft.screen, + () -> minecraft.screen, answer -> { if (answer) SDL2NativesManager.initialise(); @@ -118,7 +132,12 @@ public class Controlify implements ControlifyApi { return nativeOnboardingFuture; } - private void discoverControllers() { + public void discoverControllers() { + if (!canDiscoverControllers) { + throw new IllegalStateException("Cannot discover controllers!"); + } + canDiscoverControllers = false; + DebugLog.log("Discovering and initializing controllers..."); if (config().globalSettings().loadVibrationNatives) @@ -321,6 +340,8 @@ public class Controlify implements ControlifyApi { this.askToSwitchController(controller); config().saveIfDirty(); } + + canDiscoverControllers = false; } private void onControllerDisconnect(int jid) { diff --git a/src/main/java/dev/isxander/controlify/config/ControlifyConfig.java b/src/main/java/dev/isxander/controlify/config/ControlifyConfig.java index 26b81e8..6df05da 100644 --- a/src/main/java/dev/isxander/controlify/config/ControlifyConfig.java +++ b/src/main/java/dev/isxander/controlify/config/ControlifyConfig.java @@ -13,6 +13,7 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardOpenOption; +import java.util.HashMap; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; @@ -119,12 +120,16 @@ public class ControlifyConfig { setDirty(); } - this.compoundJoysticks = object - .getAsJsonArray("compound_joysticks") - .asList() - .stream() - .map(element -> GSON.fromJson(element, CompoundJoystickInfo.class)) - .collect(Collectors.toMap(info -> info.type().mappingId(), Function.identity())); + if (object.has("compound_joysticks")) { + this.compoundJoysticks = object + .getAsJsonArray("compound_joysticks") + .asList() + .stream() + .map(element -> GSON.fromJson(element, CompoundJoystickInfo.class)) + .collect(Collectors.toMap(info -> info.type().mappingId(), Function.identity())); + } else { + this.compoundJoysticks = Map.of(); + } if (object.has("current_controller")) { JsonElement element = object.get("current_controller"); diff --git a/src/main/java/dev/isxander/controlify/config/GlobalSettings.java b/src/main/java/dev/isxander/controlify/config/GlobalSettings.java index 8ea623c..0d4c288 100644 --- a/src/main/java/dev/isxander/controlify/config/GlobalSettings.java +++ b/src/main/java/dev/isxander/controlify/config/GlobalSettings.java @@ -20,4 +20,5 @@ public class GlobalSettings { public ReachAroundMode reachAround = ReachAroundMode.OFF; public boolean uiSounds = false; public boolean notifyLowBattery = true; + public boolean delegateSetup = false; } diff --git a/src/main/java/dev/isxander/controlify/config/gui/YACLHelper.java b/src/main/java/dev/isxander/controlify/config/gui/YACLHelper.java index 0fdce07..c24f751 100644 --- a/src/main/java/dev/isxander/controlify/config/gui/YACLHelper.java +++ b/src/main/java/dev/isxander/controlify/config/gui/YACLHelper.java @@ -38,7 +38,6 @@ import net.minecraft.network.chat.CommonComponents; import net.minecraft.network.chat.Component; import java.util.*; -import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -48,14 +47,26 @@ public class YACLHelper { private static final Function percentOrOffFormatter = v -> v == 0 ? CommonComponents.OPTION_OFF : percentFormatter.apply(v); public static Screen openConfigScreen(Screen parent) { - Screen configScreen = generateConfigScreen(parent); - if (!Controlify.instance().config().globalSettings().vibrationOnboarded) - configScreen = new SDLOnboardingScreen(configScreen, yes -> { + var controlify = Controlify.instance(); + + if (!controlify.config().globalSettings().vibrationOnboarded) { + return new SDLOnboardingScreen(() -> generateConfigScreen(parent), yes -> { if (yes) { SDL2NativesManager.initialise(); + + if (controlify.config().globalSettings().delegateSetup) { + controlify.discoverControllers(); + controlify.config().globalSettings().delegateSetup = false; + controlify.config().save(); + } } - }); - return configScreen; + }); + } else if (Controlify.instance().config().globalSettings().delegateSetup) { + controlify.discoverControllers(); + controlify.config().globalSettings().delegateSetup = false; + controlify.config().save(); + } + return generateConfigScreen(parent); } private static Screen generateConfigScreen(Screen parent) { diff --git a/src/main/java/dev/isxander/controlify/gui/screen/SDLOnboardingScreen.java b/src/main/java/dev/isxander/controlify/gui/screen/SDLOnboardingScreen.java index 96f8a76..51d33ed 100644 --- a/src/main/java/dev/isxander/controlify/gui/screen/SDLOnboardingScreen.java +++ b/src/main/java/dev/isxander/controlify/gui/screen/SDLOnboardingScreen.java @@ -9,15 +9,17 @@ import net.minecraft.client.gui.screens.ConfirmScreen; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; +import java.util.function.Supplier; + public class SDLOnboardingScreen extends ConfirmScreen { - public SDLOnboardingScreen(Screen lastScreen, BooleanConsumer onAnswered) { + public SDLOnboardingScreen(Supplier lastScreen, BooleanConsumer onAnswered) { super( yes -> { Controlify.instance().config().globalSettings().loadVibrationNatives = yes; Controlify.instance().config().globalSettings().vibrationOnboarded = true; Controlify.instance().config().save(); - Minecraft.getInstance().setScreen(lastScreen); onAnswered.accept(yes); + Minecraft.getInstance().setScreen(lastScreen.get()); }, Component.translatable("controlify.sdl2_onboarding.title").withStyle(ChatFormatting.BOLD), Util.make(() -> { diff --git a/src/main/resources/assets/controlify/lang/en_us.json b/src/main/resources/assets/controlify/lang/en_us.json index d4311a7..d811dff 100644 --- a/src/main/resources/assets/controlify/lang/en_us.json +++ b/src/main/resources/assets/controlify/lang/en_us.json @@ -128,6 +128,8 @@ "controlify.toast.faulty_input.description": "The controller was found to conflict with the keyboard and mouse and is now disabled. Increase deadzone values or check joystick mapping to fix.", "controlify.toast.low_battery.title": "Low Battery", "controlify.toast.low_battery.message": "Your controller '%s' is low on battery. Please charge it soon.", + "controlify.toast.setup_in_config.title": "Controllers found!", + "controlify.toast.setup_in_config.description": "To use with Controlify, go to %s -> %s -> %s.", "controlify.sdl2_onboarding.title": "Controlify Native Library", "controlify.sdl2_onboarding.message": "Many features in Controlify require an extra library that needs to be downloaded for your system. If you do not download this library, you will lose access to many features such as: controller vibration, gyroscope control, better controller identification. This is a seamless process and will only take a few seconds. If you choose no, you may change your mind later in Controlify settings, but you won't have access to these features in the meantime.",