Skip to content

Commit

Permalink
Allow any Character to be used as Search-Prefix (#522)
Browse files Browse the repository at this point in the history
* Allow any character to be used as prefix

* Enable Jabel

* Add back search mode settings and add ingame setting for prefixes

* Implement prefix redefinitions
  • Loading branch information
glowredman authored Aug 29, 2024
1 parent e0171ad commit 2507634
Show file tree
Hide file tree
Showing 7 changed files with 74 additions and 55 deletions.
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ developmentEnvironmentUserName = Developer

# Enables using modern Java syntax (up to version 17) via Jabel, while still targeting JVM 8.
# See https://github.com/bsideup/jabel for details on how this works.
enableModernJavaSyntax = false
enableModernJavaSyntax = true

# Enables injecting missing generics into the decompiled source code for a better coding experience.
# Turns most publicly visible List, Map, etc. into proper List<E>, Map<K, V> types.
Expand Down
17 changes: 17 additions & 0 deletions src/main/java/codechicken/nei/NEIClientConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@
import org.lwjgl.input.Keyboard;

import com.google.common.base.Objects;
import com.google.common.reflect.TypeToken;
import com.google.gson.Gson;
import com.google.gson.JsonParseException;

import codechicken.core.CCUpdateChecker;
import codechicken.core.ClassDiscoverer;
Expand Down Expand Up @@ -238,6 +241,20 @@ public String getButtonText() {

});

String prefixRedefinitions = tag.getTag("inventory.search.prefixRedefinitions").setComment(
"Redefine search prefixes by providing a char-to-char map (JSON). The keys are the original prefixes, the values the new ones. Example: { \"$\": \"\", \"#\": \"+\", \"@\": \"°\", \"%\": \"!\" }")
.getValue("{}");
try {
TypeToken<Map<Character, Character>> typeToken = new TypeToken<Map<Character, Character>>() {

private static final long serialVersionUID = 1L;
};
Map<Character, Character> charMap = new Gson().fromJson(prefixRedefinitions, typeToken.getType());
SearchField.searchParser.prefixRedefinitions.putAll(charMap);
} catch (JsonParseException e) {
logger.warn("Failed to convert prefix redefinitions from JSON to CharToCharMap:", e);
}

tag.getTag("inventory.bookmarks.enabled").setComment("Enable/Disable Bookmark Panel").getBooleanValue(true);
API.addOption(new OptionToggleButton("inventory.bookmarks.enabled", true));

Expand Down
35 changes: 20 additions & 15 deletions src/main/java/codechicken/nei/SearchTokenParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringJoiner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
Expand All @@ -20,6 +19,8 @@
import codechicken.nei.ItemList.NegatedItemFilter;
import codechicken.nei.ItemList.NothingItemFilter;
import codechicken.nei.api.ItemFilter;
import gnu.trove.map.TCharCharMap;
import gnu.trove.map.hash.TCharCharHashMap;

public class SearchTokenParser {

Expand All @@ -30,16 +31,11 @@ public enum SearchMode {
NEVER;

public static SearchMode fromInt(int value) {
switch (value) {
case 0:
return ALWAYS;
case 1:
return PREFIX;
case 2:
return NEVER;
default:
return ALWAYS;
}
return switch (value) {
case 0 -> ALWAYS;
case 1 -> PREFIX;
default -> NEVER;
};
}
}

Expand Down Expand Up @@ -76,6 +72,7 @@ public void clear() {

protected final List<ISearchParserProvider> searchProviders;
protected final ProvidersCache providersCache = new ProvidersCache();
protected final TCharCharMap prefixRedefinitions = new TCharCharHashMap();

public SearchTokenParser(List<ISearchParserProvider> searchProviders) {
this.searchProviders = searchProviders;
Expand Down Expand Up @@ -114,7 +111,9 @@ protected List<ISearchParserProvider> getProviders() {

public ISearchParserProvider getProvider(char ch) {
return getProviders().stream()
.filter(provider -> provider.getSearchMode() == SearchMode.PREFIX && provider.getPrefix() == ch)
.filter(
provider -> provider.getSearchMode() == SearchMode.PREFIX
&& getRedefinedPrefix(provider.getPrefix()) == ch)
.findFirst().orElse(null);
}

Expand All @@ -133,18 +132,24 @@ public ItemFilter getFilter(String filterText) {
}

public Pattern getSplitPattern() {
StringJoiner prefixes = new StringJoiner("");
prefixes.add(String.valueOf('\0'));
StringBuilder prefixes = new StringBuilder().append('\0');

for (ISearchParserProvider provider : getProviders()) {
if (provider.getSearchMode() == SearchMode.PREFIX) {
prefixes.add(String.valueOf(provider.getPrefix()));
prefixes.append(getRedefinedPrefix(provider.getPrefix()));
}
}

return Pattern.compile("((-*)([" + Pattern.quote(prefixes.toString()) + "]*)(\\\".*?(?:\\\"|$)|\\S+))");
}

private char getRedefinedPrefix(char prefix) {
if (this.prefixRedefinitions.containsKey(prefix)) {
return this.prefixRedefinitions.get(prefix);
}
return prefix;
}

private ItemFilter parseSearchText(String filterText) {

if (filterText.isEmpty()) {
Expand Down
7 changes: 3 additions & 4 deletions src/main/java/codechicken/nei/SubsetWidget.java
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ protected void slotClicked(int slot, int button, int mx, int my, int count) {
if (slot < sorted.size()) {
SubsetTag tag = sorted.get(slot);
if (NEIClientUtils.shiftKey()) {
codechicken.nei.LayoutManager.searchField.setText("%" + tag.fullname);
LayoutManager.searchField.setText("%" + tag.fullname);
} else if (button == 0 && count >= 2) {
SubsetWidget.showOnly(tag);
} else {
Expand All @@ -94,7 +94,7 @@ protected void drawSlot(int slot, int x, int y, int mx, int my, float frame) {
Rectangle4i r = new Rectangle4i(x, y, w, getSlotHeight(slot));
if (slot < sorted.size()) {
SubsetTag tag = sorted.get(slot);
codechicken.nei.LayoutManager.getLayoutStyle()
LayoutManager.getLayoutStyle()
.drawSubsetTag(tag.displayName(), x, y, r.w, r.h, tag.state.state, r.contains(mx, my));
} else {
ItemStack stack = state.items.get(slot - sorted.size());
Expand All @@ -103,8 +103,7 @@ protected void drawSlot(int slot, int x, int y, int mx, int my, float frame) {
int itemx = w / 2 - 8;
int itemy = 1;

codechicken.nei.LayoutManager.getLayoutStyle()
.drawSubsetTag(null, x, y, r.w, r.h, hidden ? 0 : 2, false);
LayoutManager.getLayoutStyle().drawSubsetTag(null, x, y, r.w, r.h, hidden ? 0 : 2, false);

GuiContainerManager.drawItem(x + itemx, y + itemy, stack);
if (new Rectangle4i(itemx, itemy, 16, 16).contains(mx, my)) SubsetWidget.hoverStack = stack;
Expand Down
31 changes: 5 additions & 26 deletions src/main/java/codechicken/nei/api/ItemInfo.java
Original file line number Diff line number Diff line change
Expand Up @@ -141,11 +141,7 @@ private static void addHiddenItemFilter() {

private static void addSearchProviders() {
API.addSearchProvider(
new SearchParserProvider(
'\0',
"default",
EnumChatFormatting.RESET,
(pattern) -> new PatternItemFilter(pattern)) {
new SearchParserProvider('\0', "default", EnumChatFormatting.RESET, PatternItemFilter::new) {

@Override
public SearchMode getSearchMode() {
Expand All @@ -154,29 +150,12 @@ public SearchMode getSearchMode() {

});
API.addSearchProvider(
new SearchParserProvider(
'@',
"modName",
EnumChatFormatting.LIGHT_PURPLE,
(pattern) -> new ModNameFilter(pattern)));
new SearchParserProvider('@', "modName", EnumChatFormatting.LIGHT_PURPLE, ModNameFilter::new));
API.addSearchProvider(
new SearchParserProvider(
'$',
"oreDict",
EnumChatFormatting.AQUA,
(pattern) -> new OreDictionaryFilter(pattern)));
new SearchParserProvider('$', "oreDict", EnumChatFormatting.AQUA, OreDictionaryFilter::new));
API.addSearchProvider(new SearchParserProvider('#', "tooltip", EnumChatFormatting.YELLOW, TooltipFilter::new));
API.addSearchProvider(
new SearchParserProvider(
'#',
"tooltip",
EnumChatFormatting.YELLOW,
(pattern) -> new TooltipFilter(pattern)));
API.addSearchProvider(
new SearchParserProvider(
'&',
"identifier",
EnumChatFormatting.GOLD,
(pattern) -> new IdentifierFilter(pattern)));
new SearchParserProvider('&', "identifier", EnumChatFormatting.GOLD, IdentifierFilter::new));
}

private static void addIDDumps() {
Expand Down
17 changes: 8 additions & 9 deletions src/main/java/codechicken/nei/config/OptionTextField.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,30 +11,29 @@

public class OptionTextField extends Option {

private TextField textField = new TextField("test") {
protected final TextField textField = new TextField("test") {

{
this.h = 20;
}

@Override
public void onTextChange(String oldText) {
if (focused() && isValidValue(text())) if (!defaulting() || !text().equals(getTag().getValue())) // don't
// override
// global
// if text
// hasn't
// changed
// don't override global if text hasn't changed
if (focused() && isValidValue(text()) && (!defaulting() || !text().equals(getTag().getValue()))) {
getTag().setValue(text());
}
}

@Override
public void setFocus(boolean focus) {
if (!focus && !isValidValue(text())) setText(renderTag().getValue());

super.setFocus(focus);
}
};

public OptionTextField(String name) {
super(name);
textField.h = 20;
}

@Override
Expand Down
20 changes: 20 additions & 0 deletions src/main/resources/assets/nei/lang/de_DE.lang
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,26 @@ nei.options.inventory.search.patternMode=Suchmodus
nei.options.inventory.search.patternMode.0=Gewöhnlich
nei.options.inventory.search.patternMode.1=Erweitert
nei.options.inventory.search.patternMode.2=Regex
nei.options.inventory.search.modNameSearchMode=Modname Suchmodus
nei.options.inventory.search.modNameSearchMode.0=Immer
nei.options.inventory.search.modNameSearchMode.1=Präfix: %s
nei.options.inventory.search.modNameSearchMode.2=Nie
nei.options.inventory.search.tooltipSearchMode=Tooltip Suchmodus
nei.options.inventory.search.tooltipSearchMode.0=Immer
nei.options.inventory.search.tooltipSearchMode.1=Präfix: %s
nei.options.inventory.search.tooltipSearchMode.2=Nie
nei.options.inventory.search.identifierSearchMode=Identifikator Suchmodus
nei.options.inventory.search.identifierSearchMode.0=Immer
nei.options.inventory.search.identifierSearchMode.1=Präfix: %s
nei.options.inventory.search.identifierSearchMode.2=Nie
nei.options.inventory.search.oreDictSearchMode=OreDict Suchmodus
nei.options.inventory.search.oreDictSearchMode.0=Immer
nei.options.inventory.search.oreDictSearchMode.1=Präfix: %s
nei.options.inventory.search.oreDictSearchMode.2=Nie
nei.options.inventory.search.subsetsSearchMode=Item-SubSet Suchmodus
nei.options.inventory.search.subsetsSearchMode.0=Immer
nei.options.inventory.search.subsetsSearchMode.1=Präfix: %s
nei.options.inventory.search.subsetsSearchMode.2=Nie
nei.options.inventory.utilities=Nützliches
nei.options.inventory.utilities.tip=Wähle Inhalte für den Mehrzweckmodus
nei.options.inventory.utilities.time=Zeit
Expand Down

0 comments on commit 2507634

Please sign in to comment.