From 2db69e7c104bcb0ec8019fe538c1f910ace23da0 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sun, 19 Jun 2022 20:05:32 +0800 Subject: Add isSearch into TooltipContext and add TooltipContext into asFormattedText --- .../rei/api/client/gui/widgets/TooltipContext.java | 12 +++++++++++- .../rei/api/common/entry/type/EntryDefinition.java | 5 +++++ .../me/shedaniel/rei/api/common/util/TextRepresentable.java | 5 +++++ .../main/java/me/shedaniel/rei/impl/ClientInternals.java | 7 ++++--- .../java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java | 3 ++- .../client/entry/type/types/RenderingEntryDefinition.java | 13 +++++++++++++ .../rei/impl/client/gui/widget/TooltipContextImpl.java | 9 ++++++++- .../impl/client/search/argument/type/TextArgumentType.java | 7 ++++++- .../client/search/argument/type/TooltipArgumentType.java | 2 +- .../shedaniel/rei/impl/common/entry/AbstractEntryStack.java | 7 ++++++- .../rei/plugin/client/entry/ItemEntryDefinition.java | 9 ++++++++- 11 files changed, 69 insertions(+), 10 deletions(-) diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/TooltipContext.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/TooltipContext.java index 7bc2ecd15..598bbc292 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/TooltipContext.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/TooltipContext.java @@ -35,12 +35,20 @@ import org.jetbrains.annotations.Nullable; @Environment(EnvType.CLIENT) @ApiStatus.NonExtendable public interface TooltipContext { + static TooltipContext of() { + return TooltipContext.of(new Point()); + } + static TooltipContext of(Point point) { return TooltipContext.of(point, null); } static TooltipContext of(Point point, @Nullable TooltipFlag flag) { - return ClientInternals.createTooltipContext(point, flag); + return TooltipContext.of(point, flag, false); + } + + static TooltipContext of(Point point, @Nullable TooltipFlag flag, boolean isSearch) { + return ClientInternals.createTooltipContext(point, flag, isSearch); } static TooltipContext ofMouse() { @@ -50,4 +58,6 @@ public interface TooltipContext { TooltipFlag getFlag(); Point getPoint(); + + boolean isSearch(); } 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 d2e3e62e5..e6a6e112e 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 @@ -24,6 +24,7 @@ package me.shedaniel.rei.api.common.entry.type; import me.shedaniel.rei.api.client.entry.renderer.EntryRenderer; +import me.shedaniel.rei.api.client.gui.widgets.TooltipContext; import me.shedaniel.rei.api.common.entry.EntrySerializer; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.entry.comparison.ComparisonContext; @@ -168,6 +169,10 @@ public interface EntryDefinition { Component asFormattedText(EntryStack entry, T value); + default Component asFormattedText(EntryStack entry, T value, TooltipContext context) { + return asFormattedText(entry, value); + } + /** * Returns a stream of {@link TagKey} for an entry. * It is not guaranteed that the stream is ordered, or that the {@link TagKey} diff --git a/api/src/main/java/me/shedaniel/rei/api/common/util/TextRepresentable.java b/api/src/main/java/me/shedaniel/rei/api/common/util/TextRepresentable.java index 23f96182e..a2e7fa86c 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/util/TextRepresentable.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/util/TextRepresentable.java @@ -23,6 +23,7 @@ package me.shedaniel.rei.api.common.util; +import me.shedaniel.rei.api.client.gui.widgets.TooltipContext; import net.minecraft.network.chat.Component; /** @@ -33,6 +34,10 @@ public interface TextRepresentable { return Component.empty(); } + default Component asFormattedText(TooltipContext context) { + return asFormattedText(); + } + default Component asFormatStrippedText() { return Component.literal(FormattingUtils.stripFormatting(asFormattedText().getString())); } 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 10b29150f..bdf2cbefa 100644 --- a/api/src/main/java/me/shedaniel/rei/impl/ClientInternals.java +++ b/api/src/main/java/me/shedaniel/rei/impl/ClientInternals.java @@ -47,6 +47,7 @@ import net.minecraft.network.chat.FormattedText; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.inventory.tooltip.TooltipComponent; import net.minecraft.world.item.TooltipFlag; +import org.apache.commons.lang3.function.TriFunction; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; @@ -70,7 +71,7 @@ public final class ClientInternals { private static Function clickAreaHandlerResult = (result) -> throwNotSetup(); private static BiConsumer, TooltipComponent> clientTooltipComponentProvider = (tooltip, result) -> throwNotSetup(); private static BiFunction<@Nullable Point, Collection, Tooltip> tooltipProvider = (point, texts) -> throwNotSetup(); - private static BiFunction tooltipContextProvider = (point, texts) -> throwNotSetup(); + private static TriFunction tooltipContextProvider = (point, texts, search) -> throwNotSetup(); private static Function tooltipEntryProvider = (component) -> throwNotSetup(); private static Supplier> jeiCompatMods = ClientInternals::throwNotSetup; private static Supplier builtinClientPlugin = ClientInternals::throwNotSetup; @@ -132,8 +133,8 @@ public final class ClientInternals { return tooltipProvider.apply(point, texts); } - public static TooltipContext createTooltipContext(Point point, @Nullable TooltipFlag flag) { - return tooltipContextProvider.apply(point, flag); + public static TooltipContext createTooltipContext(Point point, @Nullable TooltipFlag flag, boolean isSearch) { + return tooltipContextProvider.apply(point, flag, isSearch); } public static Tooltip.Entry createTooltipEntry(Object component) { diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java index dab08c264..09fd38d66 100644 --- a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java +++ b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java @@ -100,6 +100,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.crafting.Ingredient; +import org.apache.commons.lang3.function.TriFunction; import org.apache.commons.lang3.mutable.MutableLong; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; @@ -143,7 +144,7 @@ public class RoughlyEnoughItemsCoreClient { return entryType.read(object); }, "favoriteEntryFromJson"); ClientInternals.attachInstance((BiFunction<@Nullable Point, Collection, Tooltip>) QueuedTooltip::impl, "tooltipProvider"); - ClientInternals.attachInstance((BiFunction) TooltipContextImpl::new, "tooltipContextProvider"); + ClientInternals.attachInstance((TriFunction) TooltipContextImpl::new, "tooltipContextProvider"); ClientInternals.attachInstance((Function) QueuedTooltip.TooltipEntryImpl::new, "tooltipEntryProvider"); ClientInternals.attachInstance((Function<@Nullable Boolean, ClickArea.Result>) successful -> new ClickArea.Result() { private List> categories = Lists.newArrayList(); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/type/types/RenderingEntryDefinition.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/type/types/RenderingEntryDefinition.java index 20b0c9a5b..8936f4d61 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/type/types/RenderingEntryDefinition.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/type/types/RenderingEntryDefinition.java @@ -57,6 +57,19 @@ public class RenderingEntryDefinition { } return super.asFormattedText(entry, value); } + + @Override + public Component asFormattedText(EntryStack entry, Renderer value, TooltipContext context) { + Tooltip tooltip = value.getTooltip(context); + if (tooltip != null) { + for (Tooltip.Entry e : tooltip.entries()) { + if (e.isText()) { + return e.getAsText(); + } + } + } + return super.asFormattedText(entry, value, context); + } }; private static T throwRendering() { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/TooltipContextImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/TooltipContextImpl.java index 0b91481ac..3f8504968 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/TooltipContextImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/TooltipContextImpl.java @@ -35,10 +35,12 @@ public class TooltipContextImpl implements TooltipContext { private final Point point; @Nullable private final TooltipFlag flag; + private final boolean isSearch; - public TooltipContextImpl(Point point, @Nullable TooltipFlag flag) { + public TooltipContextImpl(Point point, @Nullable TooltipFlag flag, boolean isSearch) { this.point = Objects.requireNonNull(point); this.flag = flag; + this.isSearch = isSearch; } @Override @@ -51,4 +53,9 @@ public class TooltipContextImpl implements TooltipContext { public Point getPoint() { return point; } + + @Override + public boolean isSearch() { + return isSearch; + } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TextArgumentType.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TextArgumentType.java index 1342a2b0c..8d05ea91b 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TextArgumentType.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TextArgumentType.java @@ -23,11 +23,15 @@ package me.shedaniel.rei.impl.client.search.argument.type; +import me.shedaniel.math.Point; import me.shedaniel.rei.api.client.gui.config.SearchMode; +import me.shedaniel.rei.api.client.gui.widgets.TooltipContext; import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.api.common.util.FormattingUtils; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.util.Unit; +import net.minecraft.world.item.TooltipFlag; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; @@ -37,6 +41,7 @@ import java.util.Locale; @Environment(EnvType.CLIENT) public final class TextArgumentType extends ArgumentType { public static final TextArgumentType INSTANCE = new TextArgumentType(); + private static final TooltipContext CONTEXT = TooltipContext.of(new Point(), TooltipFlag.Default.NORMAL, true); @Override public String getName() { @@ -56,7 +61,7 @@ public final class TextArgumentType extends ArgumentType { @Override public String cacheData(EntryStack stack) { - return stack.asFormatStrippedText().getString().toLowerCase(Locale.ROOT); + return FormattingUtils.stripFormatting(stack.asFormattedText(CONTEXT).getString()).toLowerCase(Locale.ROOT); } @Override diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TooltipArgumentType.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TooltipArgumentType.java index 4557ddeae..4dcc0f00f 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TooltipArgumentType.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TooltipArgumentType.java @@ -46,7 +46,7 @@ import java.util.StringJoiner; @Environment(EnvType.CLIENT) public final class TooltipArgumentType extends ArgumentType { public static final TooltipArgumentType INSTANCE = new TooltipArgumentType(); - private static final TooltipContext CONTEXT = TooltipContext.of(new Point(), TooltipFlag.Default.NORMAL); + private static final TooltipContext CONTEXT = TooltipContext.of(new Point(), TooltipFlag.Default.NORMAL, true); public static String INVALID = "INVALID_PIECE_OF_TOOLTIP_I_DONT_THINK_PEOPLE_WILL_EXACTLY_HAVE_THIS_REI_REI_REI"; private static final Style STYLE = Style.EMPTY.withColor(TextColor.fromRgb(0xffe0ad)); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/AbstractEntryStack.java b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/AbstractEntryStack.java index 66aff5e0d..24994570e 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/AbstractEntryStack.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/AbstractEntryStack.java @@ -257,7 +257,12 @@ public abstract class AbstractEntryStack implements EntryStack, Renderer { @Override public Component asFormattedText() { - return getDefinition().asFormattedText(this, getValue()); + return getDefinition().asFormattedText(this, getValue(), TooltipContext.of()); + } + + @Override + public Component asFormattedText(TooltipContext context) { + return getDefinition().asFormattedText(this, getValue(), context); } @Override diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/ItemEntryDefinition.java b/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/ItemEntryDefinition.java index b049ee893..f7d0e771f 100644 --- a/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/ItemEntryDefinition.java +++ b/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/ItemEntryDefinition.java @@ -187,10 +187,16 @@ public class ItemEntryDefinition implements EntryDefinition, EntrySer @Override public Component asFormattedText(EntryStack entry, ItemStack value) { + return asFormattedText(entry, value, TooltipContext.of()); + } + + @Override + public Component asFormattedText(EntryStack entry, ItemStack value, TooltipContext context) { if (!SEARCH_BLACKLISTED.contains(value.getItem())) try { return value.getHoverName(); } catch (Throwable e) { + if (context != null && context.isSearch()) throw e; e.printStackTrace(); SEARCH_BLACKLISTED.add(value.getItem()); } @@ -213,10 +219,11 @@ public class ItemEntryDefinition implements EntryDefinition, EntrySer try { return value.getTooltipLines(Minecraft.getInstance().player, context.getFlag()); } catch (Throwable e) { + if (context.isSearch()) throw e; e.printStackTrace(); SEARCH_BLACKLISTED.add(value.getItem()); } - return Lists.newArrayList(asFormattedText(entry, value)); + return Lists.newArrayList(asFormattedText(entry, value, context)); } @Override -- cgit