diff options
| author | shedaniel <daniel@shedaniel.me> | 2022-06-22 18:21:04 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2022-06-28 03:21:12 +0800 |
| commit | 86f438c9d823b45f4fc113f1e813d2e12de0ca40 (patch) | |
| tree | 4a8ab3f36cea03c18f78bd615a25ebd0747aa014 /api/src/main/java/me | |
| parent | e982a8fbaa7b94a2eea242106322334a1a0eefe9 (diff) | |
| download | RoughlyEnoughItems-86f438c9d823b45f4fc113f1e813d2e12de0ca40.tar.gz RoughlyEnoughItems-86f438c9d823b45f4fc113f1e813d2e12de0ca40.tar.bz2 RoughlyEnoughItems-86f438c9d823b45f4fc113f1e813d2e12de0ca40.zip | |
Close #839
Diffstat (limited to 'api/src/main/java/me')
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 872c66636..b6fbca32b 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 @@ -33,6 +33,7 @@ import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.gui.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.gui.components.events.GuiEventListener; @@ -67,12 +68,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 a32474290..f1c6e7879 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 @@ -26,6 +26,9 @@ package me.shedaniel.rei.api.client.registry.transfer; import me.shedaniel.math.Point; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; 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; @@ -33,6 +36,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; @@ -160,6 +164,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(); @@ -197,7 +221,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 { @@ -239,7 +263,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 TransferHandlerRenderer renderer; private BiConsumer<Point, TooltipSink> tooltipRenderer; private int color; @@ -296,11 +320,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; } @@ -336,13 +371,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 e6a6e112e..f2d84da72 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 @@ -160,6 +160,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 bdf2cbefa..382f4873c 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; @@ -75,6 +77,7 @@ public final class ClientInternals { private static Function<Object, Tooltip.Entry> tooltipEntryProvider = (component) -> 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!"); @@ -161,6 +164,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); |
