diff options
| author | shedaniel <daniel@shedaniel.me> | 2022-01-27 09:51:57 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2022-01-27 09:54:15 +0800 |
| commit | b2363d66e2c233a76b92084186742478d221a86b (patch) | |
| tree | b217ba6b11e8ba6dc86ef94e9008922f8fac3871 /api/src/main/java | |
| parent | de37c7de7d6800a1d574ba96e2516f2c16311ee7 (diff) | |
| download | RoughlyEnoughItems-b2363d66e2c233a76b92084186742478d221a86b.tar.gz RoughlyEnoughItems-b2363d66e2c233a76b92084186742478d221a86b.tar.bz2 RoughlyEnoughItems-b2363d66e2c233a76b92084186742478d221a86b.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')
3 files changed, 122 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 a49a68b59..26a18110a 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 @@ -24,11 +24,14 @@ 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; @@ -36,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; /** @@ -63,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) { if (data instanceof IntList) { return TransferHandlerErrorRenderer.forRedSlots((IntList) data); @@ -157,8 +163,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. */ @@ -190,16 +202,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() { @@ -213,6 +240,8 @@ public interface TransferHandler extends Comparable<TransferHandler> { */ boolean isActuallyCrafting(); + boolean isStackedCrafting(); + Display getDisplay(); @Nullable @@ -229,6 +258,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() { @@ -276,6 +306,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; } @@ -301,10 +343,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 @@ -318,11 +367,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; } @@ -333,6 +384,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 05a0df069..b7c43884f 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 @@ -38,6 +38,8 @@ import java.util.Objects; @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); @@ -51,4 +53,8 @@ public interface TransferHandlerErrorRenderer { } }; } + + 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); + } + }; + } +} |
