From 5836c380acac82054a4838304670c15afaf41cc8 Mon Sep 17 00:00:00 2001 From: isXander Date: Tue, 8 Aug 2023 10:32:05 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20Make=20the=20"edit=20box?= =?UTF-8?q?=20keeps=20focus"=20feature=20customizable=20behaviour=20by=20C?= =?UTF-8?q?omponentProcessor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feature/screenop/vanilla/EditBoxMixin.java | 18 ++++++++++++++++++ .../screenop/ComponentProcessor.java | 4 ++++ .../controlify/screenop/ScreenProcessor.java | 6 +++--- .../vanilla/EditBoxComponentProcessor.java | 11 +++++++++++ src/main/resources/controlify.mixins.json | 1 + 5 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/EditBoxMixin.java create mode 100644 src/main/java/dev/isxander/controlify/screenop/compat/vanilla/EditBoxComponentProcessor.java diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/EditBoxMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/EditBoxMixin.java new file mode 100644 index 0000000..ccd9b93 --- /dev/null +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/EditBoxMixin.java @@ -0,0 +1,18 @@ +package dev.isxander.controlify.mixins.feature.screenop.vanilla; + +import dev.isxander.controlify.screenop.ComponentProcessor; +import dev.isxander.controlify.screenop.ComponentProcessorProvider; +import dev.isxander.controlify.screenop.compat.vanilla.EditBoxComponentProcessor; +import net.minecraft.client.gui.components.EditBox; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; + +@Mixin(EditBox.class) +public class EditBoxMixin implements ComponentProcessorProvider { + @Unique private final ComponentProcessor processor = new EditBoxComponentProcessor(); + + @Override + public ComponentProcessor componentProcessor() { + return processor; + } +} diff --git a/src/main/java/dev/isxander/controlify/screenop/ComponentProcessor.java b/src/main/java/dev/isxander/controlify/screenop/ComponentProcessor.java index c34745e..ee82599 100644 --- a/src/main/java/dev/isxander/controlify/screenop/ComponentProcessor.java +++ b/src/main/java/dev/isxander/controlify/screenop/ComponentProcessor.java @@ -16,6 +16,10 @@ public interface ComponentProcessor extends ComponentProcessorProvider { default void onFocusGained(ScreenProcessor screen, Controller controller) { } + default boolean shouldKeepFocusOnKeyboardMode(ScreenProcessor screen) { + return false; + } + @Override default ComponentProcessor componentProcessor() { return this; diff --git a/src/main/java/dev/isxander/controlify/screenop/ScreenProcessor.java b/src/main/java/dev/isxander/controlify/screenop/ScreenProcessor.java index e8aaa13..bbc9924 100644 --- a/src/main/java/dev/isxander/controlify/screenop/ScreenProcessor.java +++ b/src/main/java/dev/isxander/controlify/screenop/ScreenProcessor.java @@ -65,10 +65,10 @@ public class ScreenProcessor { public void onInputModeChanged(InputMode mode) { switch (mode) { case KEYBOARD_MOUSE -> { - boolean focusingEditBox = getFocusTree().stream() - .anyMatch(component -> component instanceof EditBox); + boolean shouldKeepFocus = getFocusTree().stream() + .anyMatch(component -> ComponentProcessorProvider.provide(component).shouldKeepFocusOnKeyboardMode(this)); - if (!focusingEditBox) { + if (!shouldKeepFocus) { ((ScreenAccessor) screen).invokeClearFocus(); } } diff --git a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/EditBoxComponentProcessor.java b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/EditBoxComponentProcessor.java new file mode 100644 index 0000000..cb962aa --- /dev/null +++ b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/EditBoxComponentProcessor.java @@ -0,0 +1,11 @@ +package dev.isxander.controlify.screenop.compat.vanilla; + +import dev.isxander.controlify.screenop.ComponentProcessor; +import dev.isxander.controlify.screenop.ScreenProcessor; + +public class EditBoxComponentProcessor implements ComponentProcessor { + @Override + public boolean shouldKeepFocusOnKeyboardMode(ScreenProcessor screen) { + return true; + } +} diff --git a/src/main/resources/controlify.mixins.json b/src/main/resources/controlify.mixins.json index d8871fb..5c47581 100644 --- a/src/main/resources/controlify.mixins.json +++ b/src/main/resources/controlify.mixins.json @@ -67,6 +67,7 @@ "feature.screenop.vanilla.CreateWorldScreenMixin", "feature.screenop.vanilla.CreativeModeInventoryScreenAccessor", "feature.screenop.vanilla.CreativeModeInventoryScreenMixin", + "feature.screenop.vanilla.EditBoxMixin", "feature.screenop.vanilla.JoinMultiplayerScreenAccessor", "feature.screenop.vanilla.JoinMultiplayerScreenMixin", "feature.screenop.vanilla.LanguageSelectionListEntryMixin",