diff options
13 files changed, 156 insertions, 29 deletions
diff --git a/api/src/main/java/me/shedaniel/rei/api/config/ConfigObject.java b/api/src/main/java/me/shedaniel/rei/api/config/ConfigObject.java index bc471d90f..32f967fd3 100644 --- a/api/src/main/java/me/shedaniel/rei/api/config/ConfigObject.java +++ b/api/src/main/java/me/shedaniel/rei/api/config/ConfigObject.java @@ -162,4 +162,10 @@ public interface ConfigObject { @ApiStatus.Experimental SyntaxHighlightingMode getSyntaxHighlightingMode(); + + SearchMode getTooltipSearchMode(); + + SearchMode getTagSearchMode(); + + SearchMode getModSearchMode(); } diff --git a/api/src/main/java/me/shedaniel/rei/api/gui/config/SearchMode.java b/api/src/main/java/me/shedaniel/rei/api/gui/config/SearchMode.java new file mode 100644 index 000000000..2f105bed5 --- /dev/null +++ b/api/src/main/java/me/shedaniel/rei/api/gui/config/SearchMode.java @@ -0,0 +1,44 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020 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.gui.config; + +import me.shedaniel.clothconfig2.gui.entries.SelectionListEntry; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.resources.language.I18n; +import org.jetbrains.annotations.NotNull; + +import java.util.Locale; + +@Environment(EnvType.CLIENT) +public enum SearchMode implements SelectionListEntry.Translatable { + ALWAYS, + PREFIX, + NEVER; + + @Override + public @NotNull String getKey() { + return I18n.get("config.roughlyenoughitems.search_mode." + name().toLowerCase(Locale.ROOT)); + } +} diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/OverlaySearchField.java b/runtime/src/main/java/me/shedaniel/rei/gui/OverlaySearchField.java index a65022f50..9eec7c84c 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/OverlaySearchField.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/OverlaySearchField.java @@ -82,14 +82,13 @@ public class OverlaySearchField extends TextFieldWidget implements TextFieldWidg Style style = Style.EMPTY; if (arg > 0) { Argument<?, ?> argument = ArgumentsRegistry.ARGUMENT_LIST.get((arg - 1) / 2); + if (isMain && ContainerScreenOverlay.getEntryListWidget().getAllStacks().isEmpty() && !getText().isEmpty()) { + style = ERROR_STYLE; + } if (!isPlain) { style = argument.getHighlightedStyle(); } - if (argument instanceof TextArgument) { - if (isMain && ContainerScreenOverlay.getEntryListWidget().getAllStacks().isEmpty() && !getText().isEmpty()) { - style = ERROR_STYLE; - } - } else if (hasUnderscore && arg % 2 == 1) { + if (!(argument instanceof TextArgument) && hasUnderscore && arg % 2 == 1) { style = style.withUnderlined(true); } } else if (!isPlain) { @@ -100,7 +99,6 @@ public class OverlaySearchField extends TextFieldWidget implements TextFieldWidg } } - if (containsMouse(PointHelper.ofMouse()) || isFocused()) { return style; } @@ -132,6 +130,7 @@ public class OverlaySearchField extends TextFieldWidget implements TextFieldWidg public void laterRender(PoseStack matrices, int int_1, int int_2, float float_1) { RenderSystem.disableDepthTest(); + setEditableColor(isMain && ContainerScreenOverlay.getEntryListWidget().getAllStacks().isEmpty() && !getText().isEmpty() ? 16733525 : isHighlighting && isMain ? -852212 : (containsMouse(PointHelper.ofMouse()) || isFocused()) ? (REIHelper.getInstance().isDarkThemeEnabled() ? -17587 : -1) : -6250336); setSuggestion(!isFocused() && getText().isEmpty() ? I18n.get("text.rei.search.field.suggestion") : null); super.render(matrices, int_1, int_2, float_1); RenderSystem.enableDepthTest(); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java index 0445416a3..ad1ea29b3 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java @@ -350,6 +350,21 @@ public class ConfigObjectImpl implements ConfigObject, ConfigData { return appearance.syntaxHighlightingMode; } + @Override + public SearchMode getTooltipSearchMode() { + return advanced.search.tooltipSearch; + } + + @Override + public SearchMode getTagSearchMode() { + return advanced.search.tagSearch; + } + + @Override + public SearchMode getModSearchMode() { + return advanced.search.modSearch; + } + @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD}) @interface DontApplyFieldName {} @@ -475,6 +490,12 @@ public class ConfigObjectImpl implements ConfigObject, ConfigData { @Comment("Declares whether REI should search async.") private boolean asyncSearch = true; @Comment("Declares how many entries should be grouped one async search.") @ConfigEntry.BoundedDiscrete(min = 25, max = 400) private int asyncSearchPartitionSize = 100; + @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) + private SearchMode tooltipSearch = SearchMode.ALWAYS; + @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) + private SearchMode tagSearch = SearchMode.PREFIX; + @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) + private SearchMode modSearch = SearchMode.PREFIX; } public static class Commands { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/OverlaySearchFieldSyntaxHighlighter.java b/runtime/src/main/java/me/shedaniel/rei/impl/OverlaySearchFieldSyntaxHighlighter.java index 62d4af27d..c2faf9110 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/OverlaySearchFieldSyntaxHighlighter.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/OverlaySearchFieldSyntaxHighlighter.java @@ -56,14 +56,16 @@ public class OverlaySearchFieldSyntaxHighlighter implements Consumer<String> { } @Override - public void addPart(SearchArgument<?, ?> argument, Collection<IntRange> grammarRanges, int index) { - int argIndex = ArgumentsRegistry.ARGUMENT_LIST.indexOf(argument.getArgument()) * 2 + 1; - for (int i = argument.start(); i < argument.end(); i++) { - highlighted[i] = (byte) argIndex; - } - for (IntRange grammarRange : grammarRanges) { - for (int i = grammarRange.getMinInclusive(); i <= grammarRange.getMaxInclusive(); i++) { - highlighted[i + index] = (byte) (argIndex + 1); + public void addPart(SearchArgument<?, ?> argument, boolean usingGrammar, Collection<IntRange> grammarRanges, int index) { + if (usingGrammar) { + int argIndex = ArgumentsRegistry.ARGUMENT_LIST.indexOf(argument.getArgument()) * 2 + 1; + for (int i = argument.start(); i < argument.end(); i++) { + highlighted[i] = (byte) argIndex; + } + for (IntRange grammarRange : grammarRanges) { + for (int i = grammarRange.getMinInclusive(); i <= grammarRange.getMaxInclusive(); i++) { + highlighted[i + index] = (byte) (argIndex + 1); + } } } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/SearchArgument.java b/runtime/src/main/java/me/shedaniel/rei/impl/SearchArgument.java index 050f16f72..bb209c019 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/SearchArgument.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/SearchArgument.java @@ -26,6 +26,7 @@ package me.shedaniel.rei.impl; import com.google.common.base.MoreObjects; import com.google.common.collect.Lists; import me.shedaniel.math.Point; +import me.shedaniel.rei.api.gui.config.SearchMode; import me.shedaniel.rei.api.gui.widgets.Tooltip; import me.shedaniel.rei.api.ingredient.EntryStack; import me.shedaniel.rei.api.util.CollectionUtils; @@ -90,7 +91,7 @@ public class SearchArgument<T, R> { void addSplitter(int index); - void addPart(SearchArgument<?, ?> argument, Collection<IntRange> grammarRanges, int index); + void addPart(SearchArgument<?, ?> argument, boolean usingGrammar, Collection<IntRange> grammarRanges, int index); } @ApiStatus.Internal @@ -109,6 +110,7 @@ public class SearchArgument<T, R> { while (terms.find()) { String term = MoreObjects.firstNonNull(terms.group(1), terms.group(2)); for (Argument<?, ?> argument : ArgumentsRegistry.ARGUMENT_LIST) { + if (argument.getSearchMode() == SearchMode.NEVER) continue; MatchStatus status = argument.matchesArgumentPrefix(term); if (status.isMatched()) { SearchArgument<?, ?> searchArgument; @@ -124,7 +126,7 @@ public class SearchArgument<T, R> { arguments.add(searchArgument = new SearchArgument<>(argument, status.getText(), !status.isInverted(), terms.start(2) + tokenStartIndex, terms.end(2) + tokenStartIndex, !status.shouldPreserveCasing())); } if (sink != null) { - sink.addPart(searchArgument, status.grammarRanges(), terms.start() + tokenStartIndex); + sink.addPart(searchArgument, status.isUsingGrammar(), status.grammarRanges(), terms.start() + tokenStartIndex); } break; } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/search/Argument.java b/runtime/src/main/java/me/shedaniel/rei/impl/search/Argument.java index bca7c6b87..dd0ca4eb8 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/search/Argument.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/search/Argument.java @@ -23,6 +23,7 @@ package me.shedaniel.rei.impl.search; +import me.shedaniel.rei.api.gui.config.SearchMode; import me.shedaniel.rei.api.ingredient.EntryStack; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -45,13 +46,29 @@ public abstract class Argument<T, R> { return null; } - @NotNull public Style getHighlightedStyle() { return Style.EMPTY; } + public SearchMode getSearchMode() { + return SearchMode.PREFIX; + } + public MatchStatus matchesArgumentPrefix(String text) { - String prefix = getPrefix(); + MatchStatus status = checkMatchPrefix(text, getPrefix()); + if (status.isMatched()) { + return status; + } else if (getSearchMode() == SearchMode.ALWAYS) { + status = checkMatchPrefix(text, ""); + if (status.isMatched()) { + status.notUsingGrammar(); + } + return status; + } + return MatchStatus.unmatched(); + } + + private MatchStatus checkMatchPrefix(String text, String prefix) { if (prefix == null) return MatchStatus.unmatched(); if (text.startsWith("-" + prefix)) return MatchStatus.invertMatched(text.substring(1 + prefix.length())).grammar(0, prefix.length() + 1); if (text.startsWith(prefix + "-")) return MatchStatus.invertMatched(text.substring(1 + prefix.length())).grammar(0, prefix.length() + 1); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/search/MatchStatus.java b/runtime/src/main/java/me/shedaniel/rei/impl/search/MatchStatus.java index bedfdda0f..58b00e597 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/search/MatchStatus.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/search/MatchStatus.java @@ -39,6 +39,7 @@ public final class MatchStatus { @Nullable private final String text; private final boolean preserveCasing; + private boolean usingGrammar = true; private final List<IntRange> grammarRanges = new ArrayList<>(); private MatchStatus(MatchType type, @Nullable String text, boolean preserveCasing) { @@ -97,6 +98,15 @@ public final class MatchStatus { return type == MatchType.INVERT_MATCHED; } + public MatchStatus notUsingGrammar() { + usingGrammar = false; + return this; + } + + public boolean isUsingGrammar() { + return usingGrammar; + } + public boolean shouldPreserveCasing() { return preserveCasing; } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/search/ModArgument.java b/runtime/src/main/java/me/shedaniel/rei/impl/search/ModArgument.java index 1c374c374..6a740f044 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/search/ModArgument.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/search/ModArgument.java @@ -24,6 +24,8 @@ package me.shedaniel.rei.impl.search; import me.shedaniel.rei.api.ClientHelper; +import me.shedaniel.rei.api.config.ConfigObject; +import me.shedaniel.rei.api.gui.config.SearchMode; import me.shedaniel.rei.api.ingredient.EntryStack; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -33,7 +35,6 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Unit; import org.apache.commons.lang3.mutable.Mutable; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Locale; @@ -51,11 +52,17 @@ public final class ModArgument extends Argument<Unit, ModArgument.@Nullable ModI } @Override - public @Nullable String getPrefix() { + @Nullable + public String getPrefix() { return "@"; } @Override + public SearchMode getSearchMode() { + return ConfigObject.getInstance().getModSearchMode(); + } + + @Override public boolean matches(Mutable<@Nullable ModInfoPair> data, EntryStack<?> stack, String searchText, Unit filterData) { if (data.getValue() == null) { Optional<ResourceLocation> id = stack.getIdentifier(); @@ -78,7 +85,7 @@ public final class ModArgument extends Argument<Unit, ModArgument.@Nullable ModI } @Override - public @NotNull Style getHighlightedStyle() { + public Style getHighlightedStyle() { return STYLE; } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/search/RegexArgument.java b/runtime/src/main/java/me/shedaniel/rei/impl/search/RegexArgument.java index 6161d4d17..b5662b667 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/search/RegexArgument.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/search/RegexArgument.java @@ -30,7 +30,6 @@ import net.minecraft.network.chat.Style; import net.minecraft.network.chat.TextColor; import org.apache.commons.lang3.mutable.Mutable; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.regex.Matcher; @@ -74,7 +73,7 @@ public final class RegexArgument extends Argument<@Nullable Pattern, String> { } @Override - public @NotNull Style getHighlightedStyle() { + public Style getHighlightedStyle() { return STYLE; } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/search/TagArgument.java b/runtime/src/main/java/me/shedaniel/rei/impl/search/TagArgument.java index 9c4c844ab..5d5ee21e0 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/search/TagArgument.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/search/TagArgument.java @@ -23,6 +23,8 @@ package me.shedaniel.rei.impl.search; +import me.shedaniel.rei.api.config.ConfigObject; +import me.shedaniel.rei.api.gui.config.SearchMode; import me.shedaniel.rei.api.ingredient.EntryStack; import me.shedaniel.rei.api.ingredient.entry.type.EntryDefinition; import net.fabricmc.api.EnvType; @@ -34,7 +36,6 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Unit; import org.apache.commons.lang3.mutable.Mutable; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Collection; @@ -53,16 +54,22 @@ public final class TagArgument extends Argument<Unit, String[]> { } @Override - public @Nullable String getPrefix() { + @Nullable + public String getPrefix() { return "$"; } @Override - public @NotNull Style getHighlightedStyle() { + public Style getHighlightedStyle() { return STYLE; } @Override + public SearchMode getSearchMode() { + return ConfigObject.getInstance().getTagSearchMode(); + } + + @Override public boolean matches(Mutable<String[]> data, EntryStack<?> stack, String searchText, Unit filterData) { if (data.getValue() == null) { Collection<ResourceLocation> tags = ((EntryDefinition<Object>) stack.getDefinition()).getTagsFor((EntryStack<Object>) stack, stack.getValue()); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/search/TooltipArgument.java b/runtime/src/main/java/me/shedaniel/rei/impl/search/TooltipArgument.java index 1e641feb8..0c323feb5 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/search/TooltipArgument.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/search/TooltipArgument.java @@ -23,6 +23,8 @@ package me.shedaniel.rei.impl.search; +import me.shedaniel.rei.api.config.ConfigObject; +import me.shedaniel.rei.api.gui.config.SearchMode; import me.shedaniel.rei.api.ingredient.EntryStack; import me.shedaniel.rei.impl.SearchArgument; import net.fabricmc.api.EnvType; @@ -32,7 +34,6 @@ import net.minecraft.network.chat.TextColor; import net.minecraft.util.Unit; import org.apache.commons.lang3.mutable.Mutable; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Locale; @@ -49,16 +50,22 @@ public final class TooltipArgument extends Argument<Unit, String> { } @Override - public @Nullable String getPrefix() { + @Nullable + public String getPrefix() { return "#"; } @Override - public @NotNull Style getHighlightedStyle() { + public Style getHighlightedStyle() { return STYLE; } @Override + public SearchMode getSearchMode() { + return ConfigObject.getInstance().getTooltipSearchMode(); + } + + @Override public boolean matches(Mutable<String> data, EntryStack<?> stack, String searchText, Unit filterData) { if (data.getValue() == null) { data.setValue(SearchArgument.tryGetEntryStackTooltip(stack).toLowerCase(Locale.ROOT)); diff --git a/src/main/resources/assets/roughlyenoughitems/lang/en_us.json b/src/main/resources/assets/roughlyenoughitems/lang/en_us.json index 1a3864c54..f4ff589cf 100755 --- a/src/main/resources/assets/roughlyenoughitems/lang/en_us.json +++ b/src/main/resources/assets/roughlyenoughitems/lang/en_us.json @@ -172,6 +172,12 @@ "config.roughlyenoughitems.accessibility.displayPanelLocation": "Entry Panel Position:", "config.roughlyenoughitems.accessibility.displayPanelLocation.left": "Left Side", "config.roughlyenoughitems.accessibility.displayPanelLocation.right": "Right Side", + "config.roughlyenoughitems.search.tooltipSearch": "Tooltip Search (#):", + "config.roughlyenoughitems.search.tagSearch": "Tag Search ($):", + "config.roughlyenoughitems.search.modSearch": "Mod Search (@):", + "config.roughlyenoughitems.search_mode.always": "Always Enabled", + "config.roughlyenoughitems.search_mode.prefix": "While Using Prefix", + "config.roughlyenoughitems.search_mode.never": "Always Disabled", "config.roughlyenoughitems.layout.debugRenderTimeRequired": "Entry Panel Debug Mode:", "config.roughlyenoughitems.search.debugSearchTimeRequired": "Search Debug Mode:", "config.roughlyenoughitems.accessibility.resizeDynamically": "Resize Dynamically:", |
