diff options
| author | shedaniel <daniel@shedaniel.me> | 2020-10-01 00:27:21 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2020-10-01 00:27:21 +0800 |
| commit | 868f4d2970aa7bf6105c627393b8ea3baf7f029b (patch) | |
| tree | 646bb61a4ac41d0d8b2870be48111892d01f56ae /RoughlyEnoughItems-runtime/src/main/java | |
| parent | b7778439101429fe432d42287707bc5d57dd3764 (diff) | |
| download | RoughlyEnoughItems-868f4d2970aa7bf6105c627393b8ea3baf7f029b.tar.gz RoughlyEnoughItems-868f4d2970aa7bf6105c627393b8ea3baf7f029b.tar.bz2 RoughlyEnoughItems-868f4d2970aa7bf6105c627393b8ea3baf7f029b.zip | |
Allow a more specific click area handler.
Signed-off-by: shedaniel <daniel@shedaniel.me>
Diffstat (limited to 'RoughlyEnoughItems-runtime/src/main/java')
4 files changed, 71 insertions, 51 deletions
diff --git a/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java b/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java index a3bead190..2bb94e36e 100644 --- a/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java +++ b/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java @@ -87,6 +87,8 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.function.BiFunction; +import java.util.function.Function; +import java.util.stream.Stream; import static me.shedaniel.rei.impl.Internals.attachInstance; @@ -179,6 +181,25 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer { } }, Internals.WidgetsProvider.class); attachInstance((BiFunction<@Nullable Point, Collection<Component>, Tooltip>) QueuedTooltip::create, "tooltipProvider"); + attachInstance((Function<@Nullable Boolean, ClickAreaHandler.Result>) successful -> new ClickAreaHandler.Result() { + private List<ResourceLocation> categories = Lists.newArrayList(); + + @Override + public ClickAreaHandler.Result category(ResourceLocation category) { + this.categories.add(category); + return this; + } + + @Override + public boolean isSuccessful() { + return successful; + } + + @Override + public Stream<ResourceLocation> getCategories() { + return categories.stream(); + } + }, "clickAreaHandlerResult"); } /** diff --git a/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java b/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java index 366fc5691..5ab13593c 100644 --- a/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java +++ b/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java @@ -43,10 +43,7 @@ import me.shedaniel.rei.gui.modules.Menu; import me.shedaniel.rei.gui.modules.entries.GameModeMenuEntry; import me.shedaniel.rei.gui.modules.entries.WeatherMenuEntry; import me.shedaniel.rei.gui.widget.*; -import me.shedaniel.rei.impl.ClientHelperImpl; -import me.shedaniel.rei.impl.InternalWidgets; -import me.shedaniel.rei.impl.ScreenHelper; -import me.shedaniel.rei.impl.Weather; +import me.shedaniel.rei.impl.*; import me.shedaniel.rei.utils.CollectionUtils; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.chat.NarratorChatListener; @@ -75,6 +72,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; +import java.util.stream.Collectors; @ApiStatus.Internal public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverlay { @@ -530,13 +528,27 @@ public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverl if (ConfigObject.getInstance().areClickableRecipeArrowsEnabled()) { List<ResourceLocation> categories = null; Screen screen = Minecraft.getInstance().screen; - for (RecipeHelper.ScreenClickArea area : RecipeHelper.getInstance().getScreenClickAreas()) - if (area.getScreenClass().equals(screen.getClass())) - if (area.getRectangle().contains(mouseX, mouseY)) { + ClickAreaHandler.ClickAreaContext context = new ClickAreaHandler.ClickAreaContext<Screen>() { + @Override + public Screen getScreen() { + return screen; + } + + @Override + public Point getMousePosition() { + return new Point(mouseX, mouseY); + } + }; + for (Map.Entry<Class<? extends Screen>, ClickAreaHandler<?>> area : ((RecipeHelperImpl) RecipeHelper.getInstance()).getClickAreas().entries()) { + if (area.getKey().equals(screen.getClass())) { + ClickAreaHandler.Result result = area.getValue().handle(context); + if (result.isSuccessful()) { if (categories == null) { - categories = new ArrayList<>(Arrays.asList(area.getCategories())); - } else categories.addAll(Arrays.asList(area.getCategories())); + categories = result.getCategories().collect(Collectors.toList()); + } else categories.addAll(result.getCategories().collect(Collectors.toList())); } + } + } if (categories != null && !categories.isEmpty()) { String collect = CollectionUtils.mapAndJoinToString(categories, identifier -> RecipeHelper.getInstance().getCategory(identifier).getCategoryName(), ", "); Tooltip.create(new TranslatableComponent("text.rei.view_recipes_for", collect)).queue(); @@ -772,13 +784,27 @@ public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverl if (ConfigObject.getInstance().areClickableRecipeArrowsEnabled()) { List<ResourceLocation> categories = null; Screen screen = Minecraft.getInstance().screen; - for (RecipeHelper.ScreenClickArea area : RecipeHelper.getInstance().getScreenClickAreas()) - if (area.getScreenClass().equals(screen.getClass())) - if (area.getRectangle().contains(mouseX, mouseY)) { + ClickAreaHandler.ClickAreaContext context = new ClickAreaHandler.ClickAreaContext<Screen>() { + @Override + public Screen getScreen() { + return screen; + } + + @Override + public Point getMousePosition() { + return new Point(mouseX, mouseY); + } + }; + for (Map.Entry<Class<? extends Screen>, ClickAreaHandler<?>> area : ((RecipeHelperImpl) RecipeHelper.getInstance()).getClickAreas().entries()) { + if (area.getKey().equals(screen.getClass())) { + ClickAreaHandler.Result result = area.getValue().handle(context); + if (result.isSuccessful()) { if (categories == null) { - categories = new ArrayList<>(Arrays.asList(area.getCategories())); - } else categories.addAll(Arrays.asList(area.getCategories())); + categories = result.getCategories().collect(Collectors.toList()); + } else categories.addAll(result.getCategories().collect(Collectors.toList())); } + } + } if (categories != null && !categories.isEmpty()) { ClientHelper.getInstance().openView(ClientHelper.ViewSearchBuilder.builder().addCategories(categories).fillPreferredOpenedCategory()); Minecraft.getInstance().getSoundManager().play(SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK, 1.0F)); diff --git a/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java b/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java index 03a4b1b18..96a177779 100644 --- a/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java +++ b/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java @@ -36,7 +36,6 @@ import me.shedaniel.rei.utils.CollectionUtils; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.Util; -import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.resources.ResourceLocation; @@ -53,7 +52,6 @@ import java.util.*; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; -import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -69,7 +67,7 @@ public class RecipeHelperImpl implements RecipeHelper { private final List<FocusedStackProvider> focusedStackProviders = Lists.newArrayList(); private final List<AutoTransferHandler> autoTransferHandlers = Lists.newArrayList(); private final List<RecipeFunction> recipeFunctions = Lists.newArrayList(); - private final List<ScreenClickArea> screenClickAreas = Lists.newArrayList(); + private final Multimap<Class<? extends Screen>, ClickAreaHandler<?>> screenClickAreas = HashMultimap.create(); private final int[] recipeCount = {0}; private final Map<ResourceLocation, List<RecipeDisplay>> recipeDisplays = Maps.newHashMap(); private final BiMap<RecipeCategory<?>, ResourceLocation> categories = HashBiMap.create(); @@ -606,7 +604,12 @@ public class RecipeHelperImpl implements RecipeHelper { @Override public <T extends Screen> void registerClickArea(ScreenClickAreaProvider<T> rectangleSupplier, Class<T> screenClass, ResourceLocation... categories) { - this.screenClickAreas.add(new ScreenClickAreaImpl(screenClass, () -> rectangleSupplier.provide((T) Minecraft.getInstance().screen), categories)); + registerClickArea(screenClass, rectangleSupplier.toHandler(() -> categories)); + } + + @Override + public <T extends Screen> void registerClickArea(Class<T> screenClass, ClickAreaHandler<T> handler) { + this.screenClickAreas.put(screenClass, handler); } @Override @@ -631,38 +634,10 @@ public class RecipeHelperImpl implements RecipeHelper { liveRecipeGenerators.add((LiveRecipeGenerator<RecipeDisplay>) liveRecipeGenerator); } - @Override - public List<ScreenClickArea> getScreenClickAreas() { + public Multimap<Class<? extends Screen>, ClickAreaHandler<?>> getClickAreas() { return screenClickAreas; } - private static class ScreenClickAreaImpl implements ScreenClickArea { - private Class<? extends Screen> screenClass; - private Supplier<Rectangle> rectangleSupplier; - private ResourceLocation[] categories; - - private ScreenClickAreaImpl(Class<? extends Screen> screenClass, Supplier<Rectangle> rectangleSupplier, ResourceLocation[] categories) { - this.screenClass = screenClass; - this.rectangleSupplier = rectangleSupplier; - this.categories = categories; - } - - @Override - public Class<? extends Screen> getScreenClass() { - return screenClass; - } - - @Override - public Rectangle getRectangle() { - return rectangleSupplier.get(); - } - - @Override - public ResourceLocation[] getCategories() { - return categories; - } - } - @SuppressWarnings("rawtypes") private static class RecipeFunction { private ResourceLocation category; diff --git a/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/impl/ScreenHelper.java b/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/impl/ScreenHelper.java index b5ef8a29e..04b789ff0 100644 --- a/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/impl/ScreenHelper.java +++ b/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/impl/ScreenHelper.java @@ -24,7 +24,6 @@ package me.shedaniel.rei.impl; import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.mojang.blaze3d.platform.Window; import com.mojang.blaze3d.vertex.PoseStack; @@ -44,8 +43,7 @@ import me.shedaniel.rei.gui.widget.TextFieldWidget; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.event.client.ClientTickCallback; -import net.fabricmc.fabric.api.screenhandler.v1.ScreenHandlerRegistry; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; @@ -288,7 +286,7 @@ public class ScreenHelper implements ClientModInitializer, REIHelper { return; } Executor.run(() -> () -> { - ClientTickCallback.EVENT.register(minecraftClient -> { + ClientTickEvents.END_CLIENT_TICK.register(minecraft -> { if (isOverlayVisible() && getSearchField() != null) getSearchField().tick(); }); |
