diff options
| author | shedaniel <daniel@shedaniel.me> | 2022-06-19 20:05:32 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2022-06-28 03:21:12 +0800 |
| commit | 2db69e7c104bcb0ec8019fe538c1f910ace23da0 (patch) | |
| tree | 474ab3ba47294539ea99f07ce0f6d4bc63eed2aa | |
| parent | 42ad22e9d671520eec5c78b587972ac50830c719 (diff) | |
| download | RoughlyEnoughItems-2db69e7c104bcb0ec8019fe538c1f910ace23da0.tar.gz RoughlyEnoughItems-2db69e7c104bcb0ec8019fe538c1f910ace23da0.tar.bz2 RoughlyEnoughItems-2db69e7c104bcb0ec8019fe538c1f910ace23da0.zip | |
Add isSearch into TooltipContext and add TooltipContext into asFormattedText
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<T> { Component asFormattedText(EntryStack<T> entry, T value); + default Component asFormattedText(EntryStack<T> 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<Boolean, ClickArea.Result> clickAreaHandlerResult = (result) -> throwNotSetup(); private static BiConsumer<List<ClientTooltipComponent>, TooltipComponent> clientTooltipComponentProvider = (tooltip, result) -> throwNotSetup(); private static BiFunction<@Nullable Point, Collection<Tooltip.Entry>, Tooltip> tooltipProvider = (point, texts) -> throwNotSetup(); - private static BiFunction<Point, @Nullable TooltipFlag, TooltipContext> tooltipContextProvider = (point, texts) -> throwNotSetup(); + private static TriFunction<Point, @Nullable TooltipFlag, Boolean, TooltipContext> tooltipContextProvider = (point, texts, search) -> throwNotSetup(); private static Function<Object, Tooltip.Entry> tooltipEntryProvider = (component) -> throwNotSetup(); private static Supplier<List<String>> jeiCompatMods = ClientInternals::throwNotSetup; private static Supplier<Object> 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.Entry>, Tooltip>) QueuedTooltip::impl, "tooltipProvider"); - ClientInternals.attachInstance((BiFunction<Point, @Nullable TooltipFlag, TooltipContext>) TooltipContextImpl::new, "tooltipContextProvider"); + ClientInternals.attachInstance((TriFunction<Point, @Nullable TooltipFlag, Boolean, TooltipContext>) TooltipContextImpl::new, "tooltipContextProvider"); ClientInternals.attachInstance((Function<Object, Tooltip.Entry>) QueuedTooltip.TooltipEntryImpl::new, "tooltipEntryProvider"); ClientInternals.attachInstance((Function<@Nullable Boolean, ClickArea.Result>) successful -> new ClickArea.Result() { private List<CategoryIdentifier<?>> 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<Renderer> 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> 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<Unit, String> { 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<Unit, String> { @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<Unit, String> { 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<A> implements EntryStack<A>, 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<ItemStack>, EntrySer @Override public Component asFormattedText(EntryStack<ItemStack> entry, ItemStack value) { + return asFormattedText(entry, value, TooltipContext.of()); + } + + @Override + public Component asFormattedText(EntryStack<ItemStack> 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<ItemStack>, 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 |
