diff options
| author | shedaniel <daniel@shedaniel.me> | 2022-01-27 09:51:57 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2022-01-27 10:39:48 +0800 |
| commit | 2961a0449da999a5b8198bd043b6bad26879667d (patch) | |
| tree | 8c2e6aee249c18f3d3b812dcd4eb72443d887687 /api/src/main/java/me/shedaniel | |
| parent | d095053af792cc5b6368772a7c4e36914ca097f5 (diff) | |
| download | RoughlyEnoughItems-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')
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); + } + }; + } +} |
