aboutsummaryrefslogtreecommitdiff
path: root/api/src/main/java/me/shedaniel
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2022-01-27 09:51:57 +0800
committershedaniel <daniel@shedaniel.me>2022-01-27 10:39:48 +0800
commit2961a0449da999a5b8198bd043b6bad26879667d (patch)
tree8c2e6aee249c18f3d3b812dcd4eb72443d887687 /api/src/main/java/me/shedaniel
parentd095053af792cc5b6368772a7c4e36914ca097f5 (diff)
downloadRoughlyEnoughItems-2961a0449da999a5b8198bd043b6bad26879667d.tar.gz
RoughlyEnoughItems-2961a0449da999a5b8198bd043b6bad26879667d.tar.bz2
RoughlyEnoughItems-2961a0449da999a5b8198bd043b6bad26879667d.zip
Close #724
- Sort displays so craftable ones are on the top - Add Ctrl+Click shortcut to move items immediately - Improve TransferHandler API to allow renderers even when it is "successful"
Diffstat (limited to 'api/src/main/java/me/shedaniel')
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/client/registry/transfer/TransferHandler.java70
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/client/registry/transfer/TransferHandlerErrorRenderer.java6
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/client/registry/transfer/TransferHandlerRenderer.java54
3 files changed, 124 insertions, 6 deletions
diff --git a/api/src/main/java/me/shedaniel/rei/api/client/registry/transfer/TransferHandler.java b/api/src/main/java/me/shedaniel/rei/api/client/registry/transfer/TransferHandler.java
index 83f74ccf4..0c8a1a147 100644
--- a/api/src/main/java/me/shedaniel/rei/api/client/registry/transfer/TransferHandler.java
+++ b/api/src/main/java/me/shedaniel/rei/api/client/registry/transfer/TransferHandler.java
@@ -23,10 +23,15 @@
package me.shedaniel.rei.api.client.registry.transfer;
+import it.unimi.dsi.fastutil.ints.IntList;
+import me.shedaniel.math.Point;
+import me.shedaniel.rei.api.client.gui.widgets.Tooltip;
+import me.shedaniel.rei.api.client.registry.display.TransferDisplayCategory;
import me.shedaniel.rei.api.common.display.Display;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
import net.minecraft.network.chat.Component;
import net.minecraft.world.inventory.AbstractContainerMenu;
@@ -34,6 +39,7 @@ import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;
import java.util.List;
+import java.util.function.BiConsumer;
import java.util.function.Supplier;
/**
@@ -61,8 +67,10 @@ public interface TransferHandler extends Comparable<TransferHandler> {
return Double.compare(getPriority(), o.getPriority());
}
+ @Deprecated
@Environment(EnvType.CLIENT)
@Nullable
+ @ApiStatus.ScheduledForRemoval
default TransferHandlerErrorRenderer provideErrorRenderer(Context context, Object data) {
return null;
}
@@ -129,8 +137,14 @@ public interface TransferHandler extends Comparable<TransferHandler> {
/**
* Sets the error data, to be passed to {@link TransferHandler#provideErrorRenderer(Context, Object)}.
*/
+ @Deprecated
Result errorRenderer(Object data);
+ Result renderer(TransferHandlerRenderer renderer);
+
+ @ApiStatus.Experimental
+ Result overrideTooltipRenderer(BiConsumer<Point, TooltipSink> renderer);
+
/**
* @return whether this handler has successfully handled the transfer.
*/
@@ -162,16 +176,31 @@ public interface TransferHandler extends Comparable<TransferHandler> {
@Environment(EnvType.CLIENT)
@ApiStatus.Internal
- TransferHandlerErrorRenderer getErrorRenderer(TransferHandler handler, Context context);
+ TransferHandlerRenderer getRenderer(TransferHandler handler, Context context);
+
+ @Environment(EnvType.CLIENT)
+ @ApiStatus.Internal
+ BiConsumer<Point, TooltipSink> getTooltipRenderer();
@ApiStatus.Internal
void fillTooltip(List<Component> components);
+
+ @FunctionalInterface
+ interface TooltipSink {
+ void accept(Tooltip tooltip);
+ }
}
@ApiStatus.NonExtendable
interface Context {
+ @Deprecated
+ @ApiStatus.ScheduledForRemoval
static Context create(boolean actuallyCrafting, @Nullable AbstractContainerScreen<?> containerScreen, Display display) {
- return new ContextImpl(actuallyCrafting, containerScreen, () -> display);
+ return create(actuallyCrafting, Screen.hasShiftDown(), containerScreen, display);
+ }
+
+ static Context create(boolean actuallyCrafting, boolean stackedCrafting, @Nullable AbstractContainerScreen<?> containerScreen, Display display) {
+ return new ContextImpl(actuallyCrafting, stackedCrafting, containerScreen, () -> display);
}
default Minecraft getMinecraft() {
@@ -185,6 +214,8 @@ public interface TransferHandler extends Comparable<TransferHandler> {
*/
boolean isActuallyCrafting();
+ boolean isStackedCrafting();
+
Display getDisplay();
@Nullable
@@ -201,6 +232,7 @@ public interface TransferHandler extends Comparable<TransferHandler> {
private boolean successful, applicable, returningToScreen, blocking;
private Component error;
private Object errorRenderer;
+ private BiConsumer<Point, TooltipSink> tooltipRenderer;
private int color;
private ResultImpl() {
@@ -248,6 +280,18 @@ public interface TransferHandler extends Comparable<TransferHandler> {
}
@Override
+ public Result renderer(TransferHandlerRenderer renderer) {
+ this.errorRenderer = renderer;
+ return this;
+ }
+
+ @Override
+ public Result overrideTooltipRenderer(BiConsumer<Point, TooltipSink> renderer) {
+ this.tooltipRenderer = renderer;
+ return this;
+ }
+
+ @Override
public boolean isSuccessful() {
return successful;
}
@@ -273,10 +317,17 @@ public interface TransferHandler extends Comparable<TransferHandler> {
}
@Override
- @Environment(EnvType.CLIENT)
- public TransferHandlerErrorRenderer getErrorRenderer(TransferHandler handler, Context context) {
+ public TransferHandlerRenderer getRenderer(TransferHandler handler, Context context) {
if (errorRenderer == null) return null;
- return handler.provideErrorRenderer(context, errorRenderer);
+ if (errorRenderer instanceof TransferHandlerRenderer) return (TransferHandlerRenderer) errorRenderer;
+ if (isSuccessful()) return null;
+ TransferHandlerErrorRenderer renderer = handler.provideErrorRenderer(context, this.errorRenderer);
+ return renderer == null ? null : renderer.asNew();
+ }
+
+ @Override
+ public BiConsumer<Point, TooltipSink> getTooltipRenderer() {
+ return tooltipRenderer;
}
@Override
@@ -290,11 +341,13 @@ public interface TransferHandler extends Comparable<TransferHandler> {
@ApiStatus.Internal
final class ContextImpl implements Context {
private boolean actuallyCrafting;
+ private boolean stackedCrafting;
private AbstractContainerScreen<?> containerScreen;
private Supplier<Display> recipeDisplaySupplier;
- private ContextImpl(boolean actuallyCrafting, AbstractContainerScreen<?> containerScreen, Supplier<Display> recipeDisplaySupplier) {
+ private ContextImpl(boolean actuallyCrafting, boolean stackedCrafting, AbstractContainerScreen<?> containerScreen, Supplier<Display> recipeDisplaySupplier) {
this.actuallyCrafting = actuallyCrafting;
+ this.stackedCrafting = stackedCrafting;
this.containerScreen = containerScreen;
this.recipeDisplaySupplier = recipeDisplaySupplier;
}
@@ -305,6 +358,11 @@ public interface TransferHandler extends Comparable<TransferHandler> {
}
@Override
+ public boolean isStackedCrafting() {
+ return stackedCrafting;
+ }
+
+ @Override
public AbstractContainerScreen<?> getContainerScreen() {
return containerScreen;
}
diff --git a/api/src/main/java/me/shedaniel/rei/api/client/registry/transfer/TransferHandlerErrorRenderer.java b/api/src/main/java/me/shedaniel/rei/api/client/registry/transfer/TransferHandlerErrorRenderer.java
index fa7d48e5b..6c890f8fc 100644
--- a/api/src/main/java/me/shedaniel/rei/api/client/registry/transfer/TransferHandlerErrorRenderer.java
+++ b/api/src/main/java/me/shedaniel/rei/api/client/registry/transfer/TransferHandlerErrorRenderer.java
@@ -33,6 +33,12 @@ import java.util.List;
@ApiStatus.Experimental
@FunctionalInterface
+@Deprecated
+@ApiStatus.ScheduledForRemoval
public interface TransferHandlerErrorRenderer {
void render(PoseStack matrices, int mouseX, int mouseY, float delta, List<Widget> widgets, Rectangle bounds, Display display);
+
+ default TransferHandlerRenderer asNew() {
+ return this::render;
+ }
}
diff --git a/api/src/main/java/me/shedaniel/rei/api/client/registry/transfer/TransferHandlerRenderer.java b/api/src/main/java/me/shedaniel/rei/api/client/registry/transfer/TransferHandlerRenderer.java
new file mode 100644
index 000000000..29ef202d1
--- /dev/null
+++ b/api/src/main/java/me/shedaniel/rei/api/client/registry/transfer/TransferHandlerRenderer.java
@@ -0,0 +1,54 @@
+/*
+ * This file is licensed under the MIT License, part of Roughly Enough Items.
+ * Copyright (c) 2018, 2019, 2020, 2021, 2022 shedaniel
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package me.shedaniel.rei.api.client.registry.transfer;
+
+import com.mojang.blaze3d.vertex.PoseStack;
+import it.unimi.dsi.fastutil.ints.IntList;
+import me.shedaniel.math.Rectangle;
+import me.shedaniel.rei.api.client.gui.widgets.Widget;
+import me.shedaniel.rei.api.client.registry.category.CategoryRegistry;
+import me.shedaniel.rei.api.client.registry.display.DisplayCategory;
+import me.shedaniel.rei.api.client.registry.display.TransferDisplayCategory;
+import me.shedaniel.rei.api.common.display.Display;
+import org.jetbrains.annotations.ApiStatus;
+
+import java.util.List;
+import java.util.Objects;
+
+@ApiStatus.Experimental
+@FunctionalInterface
+public interface TransferHandlerRenderer {
+ void render(PoseStack matrices, int mouseX, int mouseY, float delta, List<Widget> widgets, Rectangle bounds, Display display);
+
+ @ApiStatus.Internal
+ static TransferHandlerRenderer forRedSlots(IntList redSlots) {
+ return (matrices, mouseX, mouseY, delta, widgets, bounds, display) -> {
+ DisplayCategory<?> category = Objects.requireNonNull(CategoryRegistry.getInstance().get(display.getCategoryIdentifier()))
+ .getCategory();
+ if (category instanceof TransferDisplayCategory) {
+ ((TransferDisplayCategory<Display>) category).renderRedSlots(matrices, widgets, bounds, display, redSlots);
+ }
+ };
+ }
+}