Skip to content

Commit fe1bd62

Browse files
committed
Fix #3981 Vanilla search bar has priority over JEI search bar
1 parent 502ae82 commit fe1bd62

File tree

11 files changed

+169
-28
lines changed

11 files changed

+169
-28
lines changed

Common/src/main/java/mezz/jei/common/platform/IPlatformScreenHelper.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import mezz.jei.common.util.ImmutableRect2i;
44
import net.minecraft.client.gui.components.AbstractWidget;
5+
import net.minecraft.client.gui.components.EditBox;
6+
import net.minecraft.client.gui.screens.Screen;
57
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
68
import net.minecraft.client.gui.screens.recipebook.RecipeBookComponent;
79
import net.minecraft.client.gui.screens.recipebook.RecipeBookTabButton;
@@ -28,5 +30,5 @@ public interface IPlatformScreenHelper {
2830

2931
List<RecipeBookTabButton> getTabButtons(RecipeBookComponent recipeBookComponent);
3032

31-
void setFocused(AbstractWidget widget, boolean value);
33+
boolean canLoseFocus(EditBox editBox);
3234
}

Fabric/src/main/java/mezz/jei/fabric/platform/ScreenHelper.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import mezz.jei.common.platform.IPlatformScreenHelper;
55
import mezz.jei.common.util.ImmutableRect2i;
66
import net.minecraft.client.Minecraft;
7-
import net.minecraft.client.gui.components.AbstractWidget;
7+
import net.minecraft.client.gui.components.EditBox;
88
import net.minecraft.client.gui.components.toasts.Toast;
99
import net.minecraft.client.gui.components.toasts.ToastComponent;
1010
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
@@ -80,7 +80,7 @@ public List<RecipeBookTabButton> getTabButtons(RecipeBookComponent recipeBookCom
8080
}
8181

8282
@Override
83-
public void setFocused(AbstractWidget widget, boolean value) {
84-
widget.setFocused(value);
83+
public boolean canLoseFocus(EditBox editBox) {
84+
return editBox.canLoseFocus;
8585
}
8686
}

Fabric/src/main/resources/jei.accesswidener

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
accessWidener v1 named
22

3-
accessible method net/minecraft/client/gui/components/AbstractWidget setFocused (Z)V
4-
53
accessible field net/minecraft/client/gui/screens/inventory/AbstractContainerScreen hoveredSlot Lnet/minecraft/world/inventory/Slot;
64
accessible field net/minecraft/client/gui/screens/inventory/AbstractContainerScreen leftPos I
75
accessible field net/minecraft/client/gui/screens/inventory/AbstractContainerScreen topPos I
@@ -30,3 +28,5 @@ accessible method net/minecraft/client/gui/GuiGraphics renderTooltipInternal (Ln
3028

3129
accessible field net/minecraft/client/gui/components/toasts/ToastComponent visible Ljava/util/List;
3230
accessible class net/minecraft/client/gui/components/toasts/ToastComponent$ToastInstance
31+
32+
accessible field net/minecraft/client/gui/components/EditBox canLoseFocus Z

Forge/src/main/java/mezz/jei/forge/platform/ScreenHelper.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import mezz.jei.common.platform.IPlatformScreenHelper;
55
import mezz.jei.common.util.ImmutableRect2i;
66
import net.minecraft.client.Minecraft;
7-
import net.minecraft.client.gui.components.AbstractWidget;
7+
import net.minecraft.client.gui.components.EditBox;
88
import net.minecraft.client.gui.components.toasts.Toast;
99
import net.minecraft.client.gui.components.toasts.ToastComponent;
1010
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
@@ -80,7 +80,7 @@ public List<RecipeBookTabButton> getTabButtons(RecipeBookComponent recipeBookCom
8080
}
8181

8282
@Override
83-
public void setFocused(AbstractWidget widget, boolean value) {
84-
widget.setFocused(value);
83+
public boolean canLoseFocus(EditBox editBox) {
84+
return editBox.canLoseFocus;
8585
}
8686
}

Forge/src/main/resources/META-INF/accesstransformer.cfg

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ public net.minecraft.client.gui.screens.recipebook.RecipeBookComponent f_100278_
77
public net.minecraft.client.gui.screens.recipebook.RecipeBookComponent f_100276_ # xOffset
88
public net.minecraft.client.gui.screens.recipebook.RecipeBookComponent f_100279_ # tabButtons
99

10-
# AbstractWidget
11-
public net.minecraft.client.gui.components.AbstractWidget m_93692_(Z)V # setFocused
10+
# EditBox
11+
public net.minecraft.client.gui.components.EditBox f_94097_ # canLoseFocus
1212

1313
#potions
1414
public net.minecraft.world.item.alchemy.PotionBrewing f_43496_ # ALLOWED_CONTAINERS

Gui/src/main/java/mezz/jei/gui/input/GuiTextFieldFilter.java

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,12 @@
44
import mezz.jei.common.Internal;
55
import mezz.jei.common.gui.elements.DrawableNineSliceTexture;
66
import mezz.jei.common.gui.textures.Textures;
7-
import mezz.jei.common.platform.IPlatformScreenHelper;
8-
import mezz.jei.common.platform.Services;
97
import mezz.jei.common.util.ImmutableRect2i;
108
import mezz.jei.core.util.TextHistory;
9+
import mezz.jei.gui.input.focus.ScreenFocusHandler;
1110
import mezz.jei.gui.input.handlers.TextFieldInputHandler;
1211
import net.minecraft.client.Minecraft;
1312
import net.minecraft.client.gui.GuiGraphics;
14-
import net.minecraft.client.gui.components.AbstractWidget;
1513
import net.minecraft.client.gui.components.EditBox;
1614
import net.minecraft.client.gui.screens.Screen;
1715
import net.minecraft.network.chat.CommonComponents;
@@ -29,7 +27,7 @@ public class GuiTextFieldFilter extends EditBox {
2927
private final DrawableNineSliceTexture background;
3028
private ImmutableRect2i backgroundBounds;
3129

32-
private @Nullable AbstractWidget previouslyFocusedWidget;
30+
private @Nullable ScreenFocusHandler screenUnfocusHandler;
3331

3432
public GuiTextFieldFilter(BooleanSupplier filterEmpty) {
3533
// TODO narrator string
@@ -86,22 +84,15 @@ public void setFocused(boolean keyboardFocus) {
8684
if (keyboardFocus) {
8785
Screen screen = minecraft.screen;
8886
if (screen != null) {
89-
if (screen.getFocused() instanceof AbstractWidget widget) {
90-
IPlatformScreenHelper screenHelper = Services.PLATFORM.getScreenHelper();
91-
screenHelper.setFocused(widget, false);
92-
previouslyFocusedWidget = widget;
87+
screenUnfocusHandler = ScreenFocusHandler.create(screen);
88+
if (screenUnfocusHandler != null) {
89+
screenUnfocusHandler.unFocus();
9390
}
94-
screen.setFocused(null);
9591
}
9692
} else {
97-
if (previouslyFocusedWidget != null) {
98-
Screen screen = minecraft.screen;
99-
if (screen != null) {
100-
IPlatformScreenHelper screenHelper = Services.PLATFORM.getScreenHelper();
101-
screenHelper.setFocused(previouslyFocusedWidget, true);
102-
screen.setFocused(previouslyFocusedWidget);
103-
}
104-
previouslyFocusedWidget = null;
93+
if (screenUnfocusHandler != null) {
94+
screenUnfocusHandler.focus();
95+
screenUnfocusHandler = null;
10596
}
10697
}
10798

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package mezz.jei.gui.input.focus;
2+
3+
import mezz.jei.common.platform.IPlatformScreenHelper;
4+
import mezz.jei.common.platform.Services;
5+
import net.minecraft.client.gui.components.EditBox;
6+
7+
public class EditBoxFocusHandler implements IFocusHandler {
8+
private final EditBox editBox;
9+
private final boolean canLoseFocus;
10+
11+
public EditBoxFocusHandler(EditBox editBox) {
12+
this.editBox = editBox;
13+
IPlatformScreenHelper screenHelper = Services.PLATFORM.getScreenHelper();
14+
this.canLoseFocus = screenHelper.canLoseFocus(this.editBox);
15+
}
16+
17+
@Override
18+
public void unFocus() {
19+
if (editBox.isFocused()) {
20+
if (!canLoseFocus) {
21+
this.editBox.setCanLoseFocus(true);
22+
}
23+
this.editBox.setFocused(false);
24+
}
25+
}
26+
27+
@Override
28+
public void focus() {
29+
if (!editBox.isFocused()) {
30+
this.editBox.setFocused(true);
31+
if (!canLoseFocus) {
32+
this.editBox.setCanLoseFocus(false);
33+
}
34+
}
35+
}
36+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package mezz.jei.gui.input.focus;
2+
3+
import net.minecraft.client.gui.components.EditBox;
4+
import net.minecraft.client.gui.components.events.GuiEventListener;
5+
6+
public class GuiEventListenerFocusHandler implements IFocusHandler {
7+
private final GuiEventListener guiEventListener;
8+
9+
public static IFocusHandler create(GuiEventListener guiEventListener) {
10+
if (guiEventListener instanceof EditBox editBox) {
11+
return new EditBoxFocusHandler(editBox);
12+
}
13+
return new GuiEventListenerFocusHandler(guiEventListener);
14+
}
15+
16+
private GuiEventListenerFocusHandler(GuiEventListener guiEventListener) {
17+
this.guiEventListener = guiEventListener;
18+
}
19+
20+
@Override
21+
public void unFocus() {
22+
if (guiEventListener.isFocused()) {
23+
guiEventListener.setFocused(false);
24+
}
25+
}
26+
27+
@Override
28+
public void focus() {
29+
if (!guiEventListener.isFocused()) {
30+
guiEventListener.setFocused(true);
31+
}
32+
}
33+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package mezz.jei.gui.input.focus;
2+
3+
public interface IFocusHandler {
4+
void unFocus();
5+
6+
void focus();
7+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package mezz.jei.gui.input.focus;
2+
3+
import mezz.jei.core.util.ReflectionUtil;
4+
import net.minecraft.client.gui.components.EditBox;
5+
import net.minecraft.client.gui.components.events.GuiEventListener;
6+
import net.minecraft.client.gui.screens.Screen;
7+
import org.jetbrains.annotations.Nullable;
8+
9+
public class ScreenFocusHandler implements IFocusHandler {
10+
private static final ReflectionUtil reflectionUtil = new ReflectionUtil();
11+
12+
private final Screen screen;
13+
private final @Nullable IFocusHandler focusedElement;
14+
private final @Nullable GuiEventListener storedInScreenFocus;
15+
16+
public static @Nullable ScreenFocusHandler create(Screen screen) {
17+
GuiEventListener focused = screen.getFocused();
18+
final @Nullable IFocusHandler focusedElement;
19+
final @Nullable GuiEventListener storedInScreenFocus;
20+
if (focused != null) {
21+
focusedElement = GuiEventListenerFocusHandler.create(focused);
22+
storedInScreenFocus = focused;
23+
} else {
24+
EditBox editBox = reflectionUtil.getFieldWithClass(screen, EditBox.class)
25+
.findFirst()
26+
.orElse(null);
27+
if (editBox != null) {
28+
focusedElement = GuiEventListenerFocusHandler.create(editBox);
29+
} else {
30+
return null;
31+
}
32+
storedInScreenFocus = null;
33+
}
34+
return new ScreenFocusHandler(screen, focusedElement, storedInScreenFocus);
35+
}
36+
37+
public ScreenFocusHandler(Screen screen,
38+
@Nullable IFocusHandler focusedElement,
39+
@Nullable GuiEventListener storedInScreenFocus
40+
) {
41+
this.screen = screen;
42+
this.focusedElement = focusedElement;
43+
this.storedInScreenFocus = storedInScreenFocus;
44+
}
45+
46+
@Override
47+
public void unFocus() {
48+
if (focusedElement != null) {
49+
focusedElement.unFocus();
50+
if (storedInScreenFocus != null) {
51+
screen.setFocused(null);
52+
}
53+
}
54+
}
55+
56+
@Override
57+
public void focus() {
58+
if (focusedElement != null) {
59+
focusedElement.focus();
60+
if (storedInScreenFocus != null) {
61+
screen.setFocused(storedInScreenFocus);
62+
}
63+
}
64+
}
65+
}

0 commit comments

Comments
 (0)