diff options
| author | Aaron <51387595+AzureAaron@users.noreply.github.com> | 2024-12-05 04:13:23 -0500 |
|---|---|---|
| committer | Aaron <51387595+AzureAaron@users.noreply.github.com> | 2024-12-08 16:10:15 -0500 |
| commit | a9855234c7ade3c46f4a94f98c434f12ee5fcd50 (patch) | |
| tree | 9123c3841c6c224bcfb7a2d8af219295d3078f55 /src/main/java | |
| parent | 54079b09a88b0c957f562922491bb80cf8d3c4c7 (diff) | |
| download | Skyblocker-a9855234c7ade3c46f4a94f98c434f12ee5fcd50.tar.gz Skyblocker-a9855234c7ade3c46f4a94f98c434f12ee5fcd50.tar.bz2 Skyblocker-a9855234c7ade3c46f4a94f98c434f12ee5fcd50.zip | |
Fix Inventory Search clicking
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java | 20 | ||||
| -rw-r--r-- | src/main/java/de/hysky/skyblocker/skyblock/InventorySearch.java | 44 |
2 files changed, 45 insertions, 19 deletions
diff --git a/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java index fc9381b9..c833d06c 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java @@ -1,5 +1,6 @@ package de.hysky.skyblocker.mixins; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.sugar.Local; import com.mojang.blaze3d.systems.RenderSystem; @@ -22,9 +23,11 @@ import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.Utils; import de.hysky.skyblocker.utils.container.ContainerSolver; import de.hysky.skyblocker.utils.container.ContainerSolverManager; +import net.fabricmc.fabric.api.client.screen.v1.Screens; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.HandledScreen; +import net.minecraft.client.gui.widget.ClickableWidget; import net.minecraft.client.render.RenderLayer; import net.minecraft.inventory.SimpleInventory; import net.minecraft.item.ItemStack; @@ -48,6 +51,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.util.List; +import java.util.Optional; import java.util.Set; import java.util.regex.Matcher; @@ -144,6 +148,22 @@ public abstract class HandledScreenMixin<T extends ScreenHandler> extends Screen } } + @ModifyExpressionValue(method = "mouseClicked", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/Screen;mouseClicked(DDI)Z")) + public boolean skyblocker$passThroughSearchFieldUnfocusedClicks(boolean superClicked, double mouseX, double mouseY, int button) { + //Handle Search Field clicks - as of 1.21.4 the game will only send clicks to the selected element rather than trying to send one to each and stopping when the first returns true (if any). + if (!superClicked) { + Optional<ClickableWidget> searchField = Screens.getButtons(this).stream() + .filter(InventorySearch.SearchTextFieldWidget.class::isInstance) + .findFirst(); + + if (searchField.isPresent() && searchField.get().mouseClicked(mouseX, mouseY, button)) { + return true; + } + } + + return superClicked; + } + /** * Draws the unselected tabs in front of the background blur, but behind the main inventory, similar to creative inventory tabs */ diff --git a/src/main/java/de/hysky/skyblocker/skyblock/InventorySearch.java b/src/main/java/de/hysky/skyblocker/skyblock/InventorySearch.java index d0e1b9f6..d1e147ce 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/InventorySearch.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/InventorySearch.java @@ -57,24 +57,7 @@ public class InventorySearch { private static @NotNull TextFieldWidget getTextFieldWidget(HandledScreen<?> handledScreen) { // Slightly modified text field widget - TextFieldWidget textFieldWidget = new TextFieldWidget(Screens.getTextRenderer(handledScreen), 120, 20, Text.literal("Search Inventory")) { - @Override - public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - // Makes the widget catch all key presses (except escape) to fix closing the inventory when pressing E - // also check that the widget is focused and active - return super.keyPressed(keyCode, scanCode, modifiers) || (keyCode != GLFW.GLFW_KEY_ESCAPE && this.isNarratable() && this.isFocused()); - } - - // Unfocus when clicking outside - @Override - public boolean mouseClicked(double mouseX, double mouseY, int button) { - if (isFocused() && !isMouseOver(mouseX, mouseY)) { - setFocused(false); - return false; - } - return super.mouseClicked(mouseX, mouseY, button); - } - }; + TextFieldWidget textFieldWidget = new SearchTextFieldWidget(handledScreen); textFieldWidget.setPosition((handledScreen.width - textFieldWidget.getWidth()) / 2, 15); textFieldWidget.setPlaceholder(Text.translatable("gui.socialInteractions.search_hint")); textFieldWidget.setText(search); // Restore previous search @@ -106,7 +89,6 @@ public class InventorySearch { * Button to open the search bar, for accessibility reasons (pojav and general preferences) */ private static class SearchTextWidget extends TextWidget { - private final Text underlinedText; private final Text normalText; private final HandledScreen<?> screen; @@ -137,4 +119,28 @@ public class InventorySearch { super.renderWidget(context, mouseX, mouseY, delta); } } + + public static class SearchTextFieldWidget extends TextFieldWidget { + public SearchTextFieldWidget(HandledScreen<?> handledScreen) { + super(Screens.getTextRenderer(handledScreen), 120, 20, Text.literal("Search Inventory")); + } + + @Override + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + // Makes the widget catch all key presses (except escape) to fix closing the inventory when pressing E + // also check that the widget is focused and active + return super.keyPressed(keyCode, scanCode, modifiers) || (keyCode != GLFW.GLFW_KEY_ESCAPE && this.isNarratable() && this.isFocused()); + } + + // Unfocus when clicking outside + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (isFocused() && !isMouseOver(mouseX, mouseY)) { + setFocused(false); + return false; + } + + return super.mouseClicked(mouseX, mouseY, button); + } + } } |
