diff --git a/src/generated/resources/assets/ae2/lang/en_us.json b/src/generated/resources/assets/ae2/lang/en_us.json index 821557e1010..fc7807be3d1 100644 --- a/src/generated/resources/assets/ae2/lang/en_us.json +++ b/src/generated/resources/assets/ae2/lang/en_us.json @@ -459,16 +459,15 @@ "gui.ae2.SearchSettingsClearExternal": "Clear %s search on open", "gui.ae2.SearchSettingsRememberSearch": "Remember last search", "gui.ae2.SearchSettingsReplaceWithExternal": "Replace with %s search", - "gui.ae2.SearchSettingsSearchTooltips": "Search in tooltips", "gui.ae2.SearchSettingsSyncWithExternal": "Sync with %s search", "gui.ae2.SearchSettingsTitle": "Search Settings", "gui.ae2.SearchSettingsUseExternalSearch": "Use %s", "gui.ae2.SearchSettingsUseInternalSearch": "Use AE", "gui.ae2.SearchTooltip": "Search in Name", - "gui.ae2.SearchTooltipIncludingTooltips": "Search in Name and Tooltip", "gui.ae2.SearchTooltipItemId": "Use * to search by id (*cell)", "gui.ae2.SearchTooltipModId": "Use @ to search by mod (@ae2)", - "gui.ae2.SearchTooltipTag": "Use # to search by tag (#ores)", + "gui.ae2.SearchTooltipTag": "Use $ to search by tags ($ingot)", + "gui.ae2.SearchTooltipToolTips": "Use # to search in tooltips (#looting)", "gui.ae2.SelectAmount": "Select Amount", "gui.ae2.SelectedCraftingCPU": "Crafting CPU: %s", "gui.ae2.SerialNumber": "Serial Number: %s", diff --git a/src/main/java/appeng/client/gui/me/common/MEStorageScreen.java b/src/main/java/appeng/client/gui/me/common/MEStorageScreen.java index 55d9def41d6..5bcaa93c86b 100644 --- a/src/main/java/appeng/client/gui/me/common/MEStorageScreen.java +++ b/src/main/java/appeng/client/gui/me/common/MEStorageScreen.java @@ -405,11 +405,11 @@ private void updateSearch() { // This can change due to changes in the search settings sub-screen this.searchField.setTooltipMessage(List.of( - config.isSearchTooltips() ? GuiText.SearchTooltipIncludingTooltips.text() - : GuiText.SearchTooltip.text(), + GuiText.SearchTooltip.text(), GuiText.SearchTooltipModId.text(), - GuiText.SearchTooltipItemId.text(), - GuiText.SearchTooltipTag.text())); + GuiText.SearchTooltipTag.text(), + GuiText.SearchTooltipToolTips.text(), + GuiText.SearchTooltipItemId.text())); // Sync the search text both ways but make the direction depend on which search has the focus if (config.isSyncWithExternalSearch()) { diff --git a/src/main/java/appeng/client/gui/me/common/TerminalSettingsScreen.java b/src/main/java/appeng/client/gui/me/common/TerminalSettingsScreen.java index f786025201a..e9785bf8c25 100644 --- a/src/main/java/appeng/client/gui/me/common/TerminalSettingsScreen.java +++ b/src/main/java/appeng/client/gui/me/common/TerminalSettingsScreen.java @@ -24,7 +24,6 @@ public class TerminalSettingsScreen extends AESubScreen private final AECheckbox autoFocusCheckbox; private final AECheckbox syncWithExternalCheckbox; private final AECheckbox clearExternalCheckbox; - private final AECheckbox searchTooltipsCheckbox; public TerminalSettingsScreen(MEStorageScreen parent) { super(parent, "/screens/terminals/terminal_settings.json"); @@ -57,8 +56,6 @@ public TerminalSettingsScreen(MEStorageScreen parent) { useExternalSearchRadio.setRadio(true); useExternalSearchRadio.active = hasExternalSearch; - searchTooltipsCheckbox = widgets.addCheckbox("searchTooltipsCheckbox", - GuiText.SearchSettingsSearchTooltips.text(), this::save); rememberCheckbox = widgets.addCheckbox("rememberCheckbox", GuiText.SearchSettingsRememberSearch.text(), this::save); autoFocusCheckbox = widgets.addCheckbox("autoFocusCheckbox", GuiText.SearchSettingsAutoFocus.text(), @@ -109,7 +106,6 @@ private void updateState() { autoFocusCheckbox.setSelected(config.isAutoFocusSearch()); syncWithExternalCheckbox.setSelected(config.isSyncWithExternalSearch()); clearExternalCheckbox.setSelected(config.isClearExternalSearchOnOpen()); - searchTooltipsCheckbox.setSelected(config.isSearchTooltips()); rememberCheckbox.visible = useInternalSearchRadio.isSelected(); autoFocusCheckbox.visible = useInternalSearchRadio.isSelected(); @@ -124,7 +120,6 @@ private void save() { config.setAutoFocusSearch(autoFocusCheckbox.isSelected()); config.setSyncWithExternalSearch(syncWithExternalCheckbox.isSelected()); config.setClearExternalSearchOnOpen(clearExternalCheckbox.isSelected()); - config.setSearchTooltips(searchTooltipsCheckbox.isSelected()); config.setPinAutoCraftedItems(pinAutoCraftedItemsCheckbox.isSelected()); config.setNotifyForFinishedCraftingJobs(notifyForFinishedCraftingJobsCheckbox.isSelected()); config.setClearGridOnClose(clearGridOnCloseCheckbox.isSelected()); diff --git a/src/main/java/appeng/client/gui/me/search/AndSearchPredicate.java b/src/main/java/appeng/client/gui/me/search/AndSearchPredicate.java new file mode 100644 index 00000000000..db299e6a1bd --- /dev/null +++ b/src/main/java/appeng/client/gui/me/search/AndSearchPredicate.java @@ -0,0 +1,35 @@ +package appeng.client.gui.me.search; + +import java.util.List; +import java.util.function.Predicate; + +import appeng.menu.me.common.GridInventoryEntry; + +final class AndSearchPredicate implements Predicate { + private final List> terms; + + private AndSearchPredicate(List> terms) { + this.terms = terms; + } + + public static Predicate of(List> predicates) { + if (predicates.isEmpty()) { + return t -> true; + } + if (predicates.size() == 1) { + return predicates.getFirst(); + } + return new AndSearchPredicate(predicates); + } + + @Override + public boolean test(GridInventoryEntry entry) { + for (var term : terms) { + if (!term.test(entry)) { + return false; + } + } + + return true; + } +} diff --git a/src/main/java/appeng/client/gui/me/search/ItemIdSearchPredicate.java b/src/main/java/appeng/client/gui/me/search/ItemIdSearchPredicate.java new file mode 100644 index 00000000000..c021f70ce8c --- /dev/null +++ b/src/main/java/appeng/client/gui/me/search/ItemIdSearchPredicate.java @@ -0,0 +1,23 @@ +package appeng.client.gui.me.search; + +import java.util.Locale; +import java.util.Objects; +import java.util.function.Predicate; + +import appeng.api.stacks.AEKey; +import appeng.menu.me.common.GridInventoryEntry; + +final class ItemIdSearchPredicate implements Predicate { + private final String term; + + public ItemIdSearchPredicate(String term) { + this.term = term.toLowerCase(); + } + + @Override + public boolean test(GridInventoryEntry gridInventoryEntry) { + AEKey what = Objects.requireNonNull(gridInventoryEntry.getWhat()); + var id = what.getId().toString(); + return id.toLowerCase(Locale.ROOT).contains(term); + } +} diff --git a/src/main/java/appeng/client/gui/me/search/ModSearchPredicate.java b/src/main/java/appeng/client/gui/me/search/ModSearchPredicate.java new file mode 100644 index 00000000000..05e9cb8c796 --- /dev/null +++ b/src/main/java/appeng/client/gui/me/search/ModSearchPredicate.java @@ -0,0 +1,39 @@ +package appeng.client.gui.me.search; + +import java.util.Locale; +import java.util.Objects; +import java.util.function.Predicate; + +import appeng.api.stacks.AEKey; +import appeng.menu.me.common.GridInventoryEntry; +import appeng.util.Platform; + +final class ModSearchPredicate implements Predicate { + private final String term; + + public ModSearchPredicate(String term) { + this.term = normalize(term); + } + + @Override + public boolean test(GridInventoryEntry gridInventoryEntry) { + AEKey entryInfo = Objects.requireNonNull(gridInventoryEntry.getWhat()); + String modId = entryInfo.getModId(); + + if (modId != null) { + if (modId.contains(term)) { + return true; + } + + String modName = Platform.getModName(modId); + modName = normalize(modName); + return modName.contains(term); + } + + return false; + } + + private static String normalize(String input) { + return input.toLowerCase(Locale.ROOT); + } +} diff --git a/src/main/java/appeng/client/gui/me/search/NameSearchPredicate.java b/src/main/java/appeng/client/gui/me/search/NameSearchPredicate.java new file mode 100644 index 00000000000..91049c1ee6e --- /dev/null +++ b/src/main/java/appeng/client/gui/me/search/NameSearchPredicate.java @@ -0,0 +1,22 @@ +package appeng.client.gui.me.search; + +import java.util.Objects; +import java.util.function.Predicate; + +import appeng.api.stacks.AEKey; +import appeng.menu.me.common.GridInventoryEntry; + +final class NameSearchPredicate implements Predicate { + private final String term; + + public NameSearchPredicate(String term) { + this.term = term.toLowerCase(); + } + + @Override + public boolean test(GridInventoryEntry gridInventoryEntry) { + AEKey entryInfo = Objects.requireNonNull(gridInventoryEntry.getWhat()); + String displayName = entryInfo.getDisplayName().getString(); + return displayName.toLowerCase().contains(term); + } +} diff --git a/src/main/java/appeng/client/gui/me/search/OrSearchPredicate.java b/src/main/java/appeng/client/gui/me/search/OrSearchPredicate.java new file mode 100644 index 00000000000..14cfcf76f7b --- /dev/null +++ b/src/main/java/appeng/client/gui/me/search/OrSearchPredicate.java @@ -0,0 +1,35 @@ +package appeng.client.gui.me.search; + +import java.util.List; +import java.util.function.Predicate; + +import appeng.menu.me.common.GridInventoryEntry; + +final class OrSearchPredicate implements Predicate { + private final List> terms; + + private OrSearchPredicate(List> terms) { + this.terms = terms; + } + + public static Predicate of(List> filters) { + if (filters.isEmpty()) { + return t -> false; + } + if (filters.size() == 1) { + return filters.getFirst(); + } + return new OrSearchPredicate(filters); + } + + @Override + public boolean test(GridInventoryEntry entry) { + for (var term : terms) { + if (term.test(entry)) { + return true; + } + } + + return false; + } +} diff --git a/src/main/java/appeng/client/gui/me/search/RepoSearch.java b/src/main/java/appeng/client/gui/me/search/RepoSearch.java index 39c87eab84c..3b7777febad 100644 --- a/src/main/java/appeng/client/gui/me/search/RepoSearch.java +++ b/src/main/java/appeng/client/gui/me/search/RepoSearch.java @@ -1,21 +1,16 @@ package appeng.client.gui.me.search; +import java.util.ArrayList; +import java.util.List; import java.util.Map; -import java.util.Objects; -import java.util.Optional; import java.util.WeakHashMap; import java.util.function.Predicate; -import net.minecraft.ChatFormatting; - import it.unimi.dsi.fastutil.longs.Long2BooleanMap; import it.unimi.dsi.fastutil.longs.Long2BooleanOpenHashMap; -import appeng.api.client.AEKeyRendering; import appeng.api.stacks.AEKey; -import appeng.core.AEConfig; import appeng.menu.me.common.GridInventoryEntry; -import appeng.util.Platform; public class RepoSearch { @@ -24,8 +19,7 @@ public class RepoSearch { // Cached information private final Long2BooleanMap cache = new Long2BooleanOpenHashMap(); private Predicate search = (e) -> true; - - private final Map tooltipCache = new WeakHashMap<>(); + final Map tooltipCache = new WeakHashMap<>(); public RepoSearch() { } @@ -36,7 +30,7 @@ public String getSearchString() { public void setSearchString(String searchString) { if (!searchString.equals(this.searchString)) { - this.search = SearchPredicates.fromString(searchString, this); + this.search = fromString(searchString); this.searchString = searchString; this.cache.clear(); } @@ -46,46 +40,47 @@ public boolean matches(GridInventoryEntry entry) { return cache.computeIfAbsent(entry.getSerial(), s -> search.test(entry)); } - /** - * Gets the concatenated text of a keys tooltip for search purposes. + /* + * Creates a predicate for provided search string. */ - public String getTooltipText(AEKey what) { - return tooltipCache.computeIfAbsent(what, key -> { - var lines = AEKeyRendering.getTooltip(key); - - var tooltipText = new StringBuilder(); - for (int i = 0; i < lines.size(); i++) { - var line = lines.get(i); - - // Process last line and skip mod name if our heuristic detects it - if (i > 0 && i >= lines.size() - 1 && !AEConfig.instance().isSearchModNameInTooltips()) { - var text = line.getString(); - boolean hadFormatting = false; - if (text.indexOf(ChatFormatting.PREFIX_CODE) != -1) { - text = ChatFormatting.stripFormatting(text); - hadFormatting = true; - } else { - hadFormatting = !line.getStyle().isEmpty(); - } - - if (!hadFormatting || !Objects.equals(text, Platform.getModName(what.getModId()))) { - tooltipText.append('\n').append(text); - } - } else { - if (i > 0) { - tooltipText.append('\n'); - } - line.visit(text -> { - if (text.indexOf(ChatFormatting.PREFIX_CODE) != -1) { - text = ChatFormatting.stripFormatting(text); - } - tooltipText.append(text); - return Optional.empty(); - }); - } + private Predicate fromString(String searchString) { + var orParts = searchString.split("\\|"); + + if (orParts.length == 1) { + return AndSearchPredicate.of(getPredicates(orParts[0])); + } else { + var orPartFilters = new ArrayList>(orParts.length); + + for (String orPart : orParts) { + orPartFilters.add(AndSearchPredicate.of(getPredicates(orPart))); } - return tooltipText.toString(); - }); + return OrSearchPredicate.of(orPartFilters); + } + } + + /* + * Created as a helper function for {@code fromString()}. This is designed to handle between the | (or operations) + * to and the searched together delimited by " " Each space in {@code query} treated as a separate 'and' operation. + */ + private List> getPredicates(String query) { + var terms = query.toLowerCase().trim().split("\\s+"); + var predicateFilters = new ArrayList>(terms.length); + + for (String part : terms) { + if (part.startsWith("@")) { + predicateFilters.add(new ModSearchPredicate(part.substring(1))); + } else if (part.startsWith("#")) { + predicateFilters.add(new TooltipsSearchPredicate(part.substring(1), tooltipCache)); + } else if (part.startsWith("$")) { + predicateFilters.add(new TagSearchPredicate(part.substring(1))); + } else if (part.startsWith("*")) { + predicateFilters.add(new ItemIdSearchPredicate(part.substring(1))); + } else { + predicateFilters.add(new NameSearchPredicate(part)); + } + } + + return predicateFilters; } } diff --git a/src/main/java/appeng/client/gui/me/search/SearchPredicates.java b/src/main/java/appeng/client/gui/me/search/SearchPredicates.java deleted file mode 100644 index bf7429a2d24..00000000000 --- a/src/main/java/appeng/client/gui/me/search/SearchPredicates.java +++ /dev/null @@ -1,84 +0,0 @@ -package appeng.client.gui.me.search; - -import java.util.Objects; -import java.util.function.Predicate; -import java.util.regex.Pattern; -import java.util.regex.PatternSyntaxException; - -import appeng.core.AEConfig; -import appeng.menu.me.common.GridInventoryEntry; -import appeng.util.Platform; - -final class SearchPredicates { - - static Predicate fromString(String searchString, RepoSearch repoSearch) { - if (searchString.startsWith("@")) { - return createModIdPredicate(searchString.substring(1)) - .or(createModNamePredicate(searchString.substring(1))); - } else if (searchString.startsWith("*")) { - return createIdPredicate(searchString.substring(1)); - } else if (searchString.startsWith("#")) { - var pattern = createPattern(searchString.substring(1)); - return new TagPredicate(pattern); - } else { - var pattern = createPattern(searchString); - - if (AEConfig.instance().isSearchTooltips()) { - // The tooltip obviously includes the display name too - return createTooltipPredicate(pattern, repoSearch); - } else { - return createNamePredicate(pattern); - } - } - } - - private static Predicate createModIdPredicate(String searchText) { - var searchPattern = createPattern(searchText); - return entry -> { - var what = Objects.requireNonNull(entry.getWhat()); - return searchPattern.matcher(what.getModId()).find(); - }; - } - - private static Predicate createModNamePredicate(String searchText) { - var searchPattern = createPattern(searchText); - return entry -> { - var what = Objects.requireNonNull(entry.getWhat()); - return searchPattern.matcher(Platform.getModName(what.getModId())).find(); - }; - } - - private static Predicate createIdPredicate(String searchText) { - var searchPattern = createPattern(searchText); - return entry -> { - var what = Objects.requireNonNull(entry.getWhat()); - return searchPattern.matcher(what.getId().toString()).find(); - }; - } - - private static Predicate createNamePredicate(Pattern searchPattern) { - return entry -> { - var what = Objects.requireNonNull(entry.getWhat()); - String displayName = what.getDisplayName().getString(); - return searchPattern.matcher(displayName).find(); - }; - } - - private static Predicate createTooltipPredicate(Pattern searchPattern, RepoSearch repoSearch) { - return entry -> { - var tooltipText = repoSearch.getTooltipText(entry.getWhat()); - return searchPattern.matcher(tooltipText).find(); - }; - } - - private static Pattern createPattern(String searchText) { - try { - return Pattern.compile(searchText.toLowerCase(), - Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE); - } catch (PatternSyntaxException ignored) { - return Pattern.compile(Pattern.quote(searchText.toLowerCase()), - Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE); - } - } - -} diff --git a/src/main/java/appeng/client/gui/me/search/TagPredicate.java b/src/main/java/appeng/client/gui/me/search/TagSearchPredicate.java similarity index 56% rename from src/main/java/appeng/client/gui/me/search/TagPredicate.java rename to src/main/java/appeng/client/gui/me/search/TagSearchPredicate.java index cd1004c3b0e..f94dcaa346b 100644 --- a/src/main/java/appeng/client/gui/me/search/TagPredicate.java +++ b/src/main/java/appeng/client/gui/me/search/TagSearchPredicate.java @@ -2,40 +2,48 @@ import java.util.IdentityHashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.function.Predicate; -import java.util.regex.Pattern; import net.minecraft.tags.TagKey; import appeng.api.stacks.AEKeyType; import appeng.menu.me.common.GridInventoryEntry; -public class TagPredicate implements Predicate { - private final Pattern searchPattern; +final class TagSearchPredicate implements Predicate { + private final String term; /** * Stores the tag keys we found for each AE key type we encountered. */ private final Map>> tagCache = new IdentityHashMap<>(); - public TagPredicate(Pattern searchPattern) { - this.searchPattern = searchPattern; + public TagSearchPredicate(String term) { + this.term = term.toLowerCase(Locale.ROOT); } /** * Finds all tags for all AE key types that match the given search pattern. */ - private List> buildTagCache(AEKeyType keyType) { + private List> getTagsMatchingTerm(AEKeyType keyType) { return keyType.getTagNames() - .filter(tagKey -> searchPattern.matcher(tagKey.location().toString()).find()) + .filter(tagKey -> { + // ResourceLocations require namespace and path to already be lowercase + var tagId = tagKey.location(); + if (term.contains(":")) { + return tagId.toString().contains(term); + } else { + return tagId.getNamespace().contains(term) || tagId.getPath().contains(term); + } + }) .toList(); } @Override public boolean test(GridInventoryEntry entry) { var what = Objects.requireNonNull(entry.getWhat()); - var tags = tagCache.computeIfAbsent(what.getType(), this::buildTagCache); + var tags = tagCache.computeIfAbsent(what.getType(), this::getTagsMatchingTerm); for (var tag : tags) { if (what.isTagged(tag)) { diff --git a/src/main/java/appeng/client/gui/me/search/TooltipsSearchPredicate.java b/src/main/java/appeng/client/gui/me/search/TooltipsSearchPredicate.java new file mode 100644 index 00000000000..4c6bff393ae --- /dev/null +++ b/src/main/java/appeng/client/gui/me/search/TooltipsSearchPredicate.java @@ -0,0 +1,79 @@ +package appeng.client.gui.me.search; + +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.function.Predicate; + +import net.minecraft.ChatFormatting; + +import appeng.api.client.AEKeyRendering; +import appeng.api.stacks.AEKey; +import appeng.core.AEConfig; +import appeng.menu.me.common.GridInventoryEntry; +import appeng.util.Platform; + +final class TooltipsSearchPredicate implements Predicate { + private final String tooltip; + private final Map tooltipCache; + + public TooltipsSearchPredicate(String tooltip, Map tooltipCache) { + this.tooltip = normalize(tooltip.toLowerCase()); + this.tooltipCache = tooltipCache; + } + + @Override + public boolean test(GridInventoryEntry gridInventoryEntry) { + AEKey entryInfo = Objects.requireNonNull(gridInventoryEntry.getWhat()); + var tooltipText = getTooltipText(entryInfo); + + return tooltipText.contains(tooltip); + } + + /** + * Gets the concatenated text of a keys tooltip for search purposes. + */ + private String getTooltipText(AEKey what) { + return tooltipCache.computeIfAbsent(what, key -> { + var lines = AEKeyRendering.getTooltip(key); + + var tooltipText = new StringBuilder(); + for (int i = 0; i < lines.size(); i++) { + var line = lines.get(i); + + // Process last line and skip mod name if our heuristic detects it + if (i > 0 && i >= lines.size() - 1 && !AEConfig.instance().isSearchModNameInTooltips()) { + var text = line.getString(); + boolean hadFormatting = false; + if (text.indexOf(ChatFormatting.PREFIX_CODE) != -1) { + text = ChatFormatting.stripFormatting(text); + hadFormatting = true; + } else { + hadFormatting = !line.getStyle().isEmpty(); + } + + if (!hadFormatting || !Objects.equals(text, Platform.getModName(what.getModId()))) { + tooltipText.append('\n').append(text); + } + } else { + if (i > 0) { + tooltipText.append('\n'); + } + line.visit(text -> { + if (text.indexOf(ChatFormatting.PREFIX_CODE) != -1) { + text = ChatFormatting.stripFormatting(text); + } + tooltipText.append(text); + return Optional.empty(); + }); + } + } + + return normalize(tooltipText.toString()); + }); + } + + private static String normalize(String input) { + return input.toLowerCase().replace(" ", ""); + } +} diff --git a/src/main/java/appeng/core/AEConfig.java b/src/main/java/appeng/core/AEConfig.java index 6faee8d0a83..35b2bf747a7 100644 --- a/src/main/java/appeng/core/AEConfig.java +++ b/src/main/java/appeng/core/AEConfig.java @@ -228,14 +228,6 @@ public double wireless_getPowerDrain(int boosters) { + this.wirelessCostMultiplier * Math.pow(boosters, 1 + boosters / this.wirelessHighWirelessCount); } - public boolean isSearchTooltips() { - return CLIENT.searchTooltips.get(); - } - - public void setSearchTooltips(boolean enable) { - CLIENT.searchTooltips.set(enable); - } - public boolean isSearchModNameInTooltips() { return CLIENT.searchModNameInTooltips.get(); } @@ -578,7 +570,6 @@ private static class ClientConfig { public final IntegerOption terminalMargin; // Search Settings - public final BooleanOption searchTooltips; public final BooleanOption searchModNameInTooltips; public final BooleanOption useExternalSearch; public final BooleanOption clearExternalSearchOnOpen; @@ -620,8 +611,6 @@ public ClientConfig(ConfigSection root) { // Search Settings var search = root.subsection("search"); - this.searchTooltips = search.addBoolean("searchTooltips", true, - "Should tooltips be searched. Performance impact"); this.searchModNameInTooltips = search.addBoolean("searchModNameInTooltips", false, "Should the mod name be included when searching in tooltips."); this.useExternalSearch = search.addBoolean("useExternalSearch", false, diff --git a/src/main/java/appeng/core/localization/GuiText.java b/src/main/java/appeng/core/localization/GuiText.java index 83c1cda0852..dffa1fc1669 100644 --- a/src/main/java/appeng/core/localization/GuiText.java +++ b/src/main/java/appeng/core/localization/GuiText.java @@ -222,17 +222,16 @@ public enum GuiText implements LocalizationEnum { SearchSettingsTitle("Search Settings"), SearchSettingsUseInternalSearch("Use AE"), SearchSettingsUseExternalSearch("Use %s"), - SearchSettingsSearchTooltips("Search in tooltips"), SearchSettingsRememberSearch("Remember last search"), SearchSettingsAutoFocus("Auto-Focus on open"), SearchSettingsSyncWithExternal("Sync with %s search"), SearchSettingsClearExternal("Clear %s search on open"), SearchSettingsReplaceWithExternal("Replace with %s search"), SearchTooltip("Search in Name"), - SearchTooltipIncludingTooltips("Search in Name and Tooltip"), SearchTooltipModId("Use @ to search by mod (@ae2)"), + SearchTooltipToolTips("Use # to search in tooltips (#looting)"), SearchTooltipItemId("Use * to search by id (*cell)"), - SearchTooltipTag("Use # to search by tag (#ores)"), + SearchTooltipTag("Use $ to search by tags ($ingot)"), StorageCellTooltipUpgrades("Upgrades:"), Stored("Stored"), StoredEnergy("Stored Energy"),