aboutsummaryrefslogtreecommitdiff
path: root/RoughlyEnoughItems-runtime/src/main/java
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2020-10-01 00:27:21 +0800
committershedaniel <daniel@shedaniel.me>2020-10-01 00:27:21 +0800
commit868f4d2970aa7bf6105c627393b8ea3baf7f029b (patch)
tree646bb61a4ac41d0d8b2870be48111892d01f56ae /RoughlyEnoughItems-runtime/src/main/java
parentb7778439101429fe432d42287707bc5d57dd3764 (diff)
downloadRoughlyEnoughItems-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')
-rw-r--r--RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java21
-rw-r--r--RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java54
-rw-r--r--RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java41
-rw-r--r--RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/impl/ScreenHelper.java6
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();
});