diff options
| author | shedaniel <daniel@shedaniel.me> | 2022-06-22 18:21:04 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2023-05-29 21:05:32 +0800 |
| commit | 0fa53473e7c10d904532126f37eee091abd8358b (patch) | |
| tree | d021e91974739ac5492ce7c9079d6acfa1eafddb /api/src/main/java | |
| parent | 9e822be1e85509bd533412c802b283a58e08346b (diff) | |
| download | RoughlyEnoughItems-0fa53473e7c10d904532126f37eee091abd8358b.tar.gz RoughlyEnoughItems-0fa53473e7c10d904532126f37eee091abd8358b.tar.bz2 RoughlyEnoughItems-0fa53473e7c10d904532126f37eee091abd8358b.zip | |
Close #839
Diffstat (limited to 'api/src/main/java')
4 files changed, 88 insertions, 10 deletions
diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/SimpleDisplayRenderer.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/SimpleDisplayRenderer.java index 3a4e5e473..391d2244b 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/gui/SimpleDisplayRenderer.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/SimpleDisplayRenderer.java @@ -35,6 +35,7 @@ import me.shedaniel.rei.api.client.gui.widgets.WidgetHolder; import me.shedaniel.rei.api.client.gui.widgets.Widgets; import me.shedaniel.rei.api.common.entry.EntryIngredient; import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.api.common.entry.type.EntryDefinition; import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.api.common.util.EntryStacks; import net.minecraft.client.Minecraft; @@ -70,12 +71,29 @@ public class SimpleDisplayRenderer extends DisplayRenderer implements WidgetHold .disableTooltips(); } - private static List<EntryIngredient> simplify(List<EntryIngredient> original) { + public static List<EntryIngredient> simplify(List<EntryIngredient> original) { List<EntryIngredient> out = new ArrayList<>(); for (EntryIngredient ingredient : original) { EntryIngredient filter = ingredient.filter(Predicates.not(EntryStack::isEmpty)); - if (!filter.isEmpty() && out.stream().noneMatch(s -> equalsList(filter, s))) { + if (filter.isEmpty()) continue; + EntryIngredient orNull = CollectionUtils.findFirstOrNull(out, s -> equalsList(filter, s)); + if (orNull == null) { out.add(filter); + } else { + out.set(out.indexOf(orNull), orNull.map(stack -> { + for (EntryStack<?> filterStack : filter) { + if (EntryStacks.equalsExact(filterStack, stack)) { + EntryDefinition<Object> definition = (EntryDefinition<Object>) filterStack.getDefinition(); + Object newValue = definition.add(stack.getValue(), filterStack.getValue()); + + if (newValue != null) { + stack = EntryStack.of(definition, newValue); + } + } + } + + return stack; + })); } } return out; 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 732990437..277a1b88b 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 @@ -28,6 +28,9 @@ 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 me.shedaniel.rei.api.common.entry.EntryIngredient; +import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.impl.ClientInternals; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.Minecraft; @@ -35,6 +38,7 @@ 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; +import net.minecraft.world.inventory.tooltip.TooltipComponent; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; @@ -210,6 +214,26 @@ public interface TransferHandler extends Comparable<TransferHandler> { Result tooltip(Component component); /** + * Adds a line of tooltip to the result. + * + * @param component the component to add + * @return the result + * @since 8.3 + */ + @ApiStatus.Experimental + Result tooltip(TooltipComponent component); + + /** + * Adds a tooltip component for the missing items. + * + * @param stacks the missing stacks + * @return the result + * @since 8.3 + */ + @ApiStatus.Experimental + Result tooltipMissing(List<EntryIngredient> stacks); + + /** * @return whether this handler has successfully handled the transfer. */ boolean isSuccessful(); @@ -247,7 +271,7 @@ public interface TransferHandler extends Comparable<TransferHandler> { BiConsumer<Point, TooltipSink> getTooltipRenderer(); @ApiStatus.Internal - void fillTooltip(List<Component> components); + void fillTooltip(List<Tooltip.Entry> entries); @FunctionalInterface interface TooltipSink { @@ -295,7 +319,7 @@ public interface TransferHandler extends Comparable<TransferHandler> { final class ResultImpl implements Result { private boolean successful, applicable, returningToScreen, blocking; private Component error; - private List<Component> tooltips = new ArrayList<>(); + private List<Tooltip.Entry> tooltips = new ArrayList<>(); private Object errorRenderer; private BiConsumer<Point, TooltipSink> tooltipRenderer; private int color; @@ -358,11 +382,22 @@ public interface TransferHandler extends Comparable<TransferHandler> { @Override public Result tooltip(Component component) { - this.tooltips.add(component); + this.tooltips.add(Tooltip.entry(component)); + return this; + } + + @Override + public Result tooltip(TooltipComponent component) { + this.tooltips.add(Tooltip.entry(component)); return this; } @Override + public Result tooltipMissing(List<EntryIngredient> ingredients) { + return tooltip(ClientInternals.createMissingTooltip(ingredients)); + } + + @Override public boolean isSuccessful() { return successful; } @@ -402,13 +437,12 @@ public interface TransferHandler extends Comparable<TransferHandler> { } @Override - public void fillTooltip(List<Component> components) { + public void fillTooltip(List<Tooltip.Entry> entries) { if (isApplicable()) { - if (isSuccessful()) { - components.addAll(tooltips); - } else { - components.add(getError()); + if (!isSuccessful()) { + entries.add(Tooltip.entry(getError())); } + entries.addAll(tooltips); } } } diff --git a/api/src/main/java/me/shedaniel/rei/api/common/entry/type/EntryDefinition.java b/api/src/main/java/me/shedaniel/rei/api/common/entry/type/EntryDefinition.java index d2a3f2e37..e072d253c 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/entry/type/EntryDefinition.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/entry/type/EntryDefinition.java @@ -162,6 +162,25 @@ public interface EntryDefinition<T> { return null; } + /** + * Returns a merged copy for two entries. + * <p> + * It is guaranteed that the two entries satisfy {@link #equals(Object, Object, ComparisonContext)} + * with the {@link ComparisonContext#EXACT} context. + * <p> + * Implementation of this method should just need to copy the first value and sets the count to + * the sum of both values. + * + * @param o1 the first value + * @param o2 the second value + * @return the merged copy + * @since 8.3 + */ + @Nullable + default T add(T o1, T o2) { + return null; + } + long hash(EntryStack<T> entry, T value, ComparisonContext context); boolean equals(T o1, T o2, ComparisonContext context); diff --git a/api/src/main/java/me/shedaniel/rei/impl/ClientInternals.java b/api/src/main/java/me/shedaniel/rei/impl/ClientInternals.java index 7164ea085..637cc0d93 100644 --- a/api/src/main/java/me/shedaniel/rei/impl/ClientInternals.java +++ b/api/src/main/java/me/shedaniel/rei/impl/ClientInternals.java @@ -36,6 +36,8 @@ import me.shedaniel.rei.api.client.gui.widgets.*; import me.shedaniel.rei.api.client.plugins.REIClientPlugin; import me.shedaniel.rei.api.client.registry.screen.ClickArea; import me.shedaniel.rei.api.client.view.ViewSearchBuilder; +import me.shedaniel.rei.api.common.entry.EntryIngredient; +import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.plugins.PluginManager; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -70,6 +72,7 @@ public final class ClientInternals { private static TriFunction<Point, @Nullable TooltipFlag, Boolean, TooltipContext> tooltipContextProvider = (point, texts, search) -> throwNotSetup(); private static Supplier<List<String>> jeiCompatMods = ClientInternals::throwNotSetup; private static Supplier<Object> builtinClientPlugin = ClientInternals::throwNotSetup; + private static Function<List<EntryIngredient>, TooltipComponent> missingTooltip = (stacks) -> throwNotSetup(); private static <T> T throwNotSetup() { throw new AssertionError("REI Internals have not been initialized!"); @@ -148,6 +151,10 @@ public final class ClientInternals { return clientPluginManager.get(); } + public static TooltipComponent createMissingTooltip(List<EntryIngredient> stacks) { + return missingTooltip.apply(stacks); + } + @Environment(EnvType.CLIENT) public interface WidgetsProvider { boolean isRenderingPanel(Panel panel); |
