1
0
forked from Clones/Controlify

✏️ Make the "edit box keeps focus" feature customizable behaviour by ComponentProcessor

This commit is contained in:
isXander
2023-08-08 10:32:05 +01:00
parent 9e476e2969
commit 5836c380ac
5 changed files with 37 additions and 3 deletions

View File

@ -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;
}
}

View File

@ -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;

View File

@ -65,10 +65,10 @@ public class ScreenProcessor<T extends Screen> {
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();
}
}

View File

@ -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;
}
}