diff --git a/src/main/java/codechicken/nei/NEIClientConfig.java b/src/main/java/codechicken/nei/NEIClientConfig.java index 49425e03..3a9991bf 100644 --- a/src/main/java/codechicken/nei/NEIClientConfig.java +++ b/src/main/java/codechicken/nei/NEIClientConfig.java @@ -344,6 +344,8 @@ public class NEIClientConfig { API.addHashBind("gui.overlay_use", Keyboard.KEY_S + NEIClientUtils.SHIFT_HASH); API.addHashBind("gui.overlay_hide", Keyboard.KEY_S + NEIClientUtils.CTRL_HASH); API.addHashBind("gui.hide_bookmarks", Keyboard.KEY_B); + API.addKeyBind("gui.getprevioussearch", Keyboard.KEY_UP); + API.addKeyBind("gui.getnextsearch", Keyboard.KEY_DOWN); API.addKeyBind("world.chunkoverlay", Keyboard.KEY_F9); API.addKeyBind("world.moboverlay", Keyboard.KEY_F7); diff --git a/src/main/java/codechicken/nei/SearchField.java b/src/main/java/codechicken/nei/SearchField.java index c4759266..3ac1c521 100644 --- a/src/main/java/codechicken/nei/SearchField.java +++ b/src/main/java/codechicken/nei/SearchField.java @@ -9,6 +9,7 @@ import codechicken.nei.ItemList.PatternItemFilter; import codechicken.nei.api.API; import codechicken.nei.api.ItemFilter; import codechicken.nei.api.ItemFilter.ItemFilterProvider; +import codechicken.nei.util.TextHistory; import java.util.LinkedList; import java.util.List; import java.util.regex.Pattern; @@ -45,6 +46,7 @@ public class SearchField extends TextField implements ItemFilterProvider { } public static List searchProviders = new LinkedList<>(); + private static final TextHistory history = new TextHistory(); private boolean isVisible = true; long lastclicktime; @@ -116,6 +118,13 @@ public class SearchField extends TextField implements ItemFilterProvider { if (isVisible() && NEIClientConfig.isKeyHashDown("gui.search")) { setFocus(true); } + if (NEIClientConfig.isKeyHashDown("gui.getprevioussearch") && focused()) { + handleNavigateHistory(TextHistory.Direction.PREVIOUS); + } + + if (NEIClientConfig.isKeyHashDown("gui.getnextsearch") && focused()) { + handleNavigateHistory(TextHistory.Direction.NEXT); + } } @Override @@ -156,4 +165,26 @@ public class SearchField extends TextField implements ItemFilterProvider { if (!secondary.isEmpty()) return new AnyMultiItemFilter(secondary); return new EverythingItemFilter(); } + + @Override + public void setFocus(boolean focus) { + final boolean previousFocus = field.isFocused(); + + if (previousFocus != focus) { + history.add(text()); + } + super.setFocus(focus); + } + + private boolean handleNavigateHistory(TextHistory.Direction direction) { + if (focused()) { + return history.get(direction, text()) + .map(newText -> { + setText(newText); + return true; + }) + .orElse(false); + } + return false; + } } diff --git a/src/main/java/codechicken/nei/util/TextHistory.java b/src/main/java/codechicken/nei/util/TextHistory.java new file mode 100644 index 00000000..05ba6e37 --- /dev/null +++ b/src/main/java/codechicken/nei/util/TextHistory.java @@ -0,0 +1,69 @@ +package codechicken.nei.util; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +/** + * Backported from JustEnoughItems/Core/src/main/java/mezz/jei/core/util/TextHistory.java + */ +public class TextHistory { + private static final int MAX_HISTORY = 100; + + public enum Direction { + NEXT, + PREVIOUS + } + + private final List history = new ArrayList<>(); + + public boolean add(String currentText) { + if (currentText.length() > 0) { + history.remove(currentText); + history.add(currentText); + if (history.size() > MAX_HISTORY) { + history.remove(0); + } + return true; + } + return false; + } + + public Optional get(Direction direction, String currentText) { + if (direction == direction.NEXT) { + return getNext(currentText); + } else { + return getPrevious(currentText); + } + } + + public Optional getPrevious(String currentText) { + int historyIndex = history.indexOf(currentText); + if (historyIndex < 0) { + if (add(currentText)) { + historyIndex = history.size() - 1; + } else { + historyIndex = history.size(); + } + } + if (historyIndex <= 0) { + return Optional.empty(); + } + String value = history.get(historyIndex - 1); + return Optional.of(value); + } + + public Optional getNext(String currentText) { + int historyIndex = history.indexOf(currentText); + if (historyIndex < 0) { + return Optional.empty(); + } + final String historyString; + if (historyIndex + 1 < history.size()) { + historyString = history.get(historyIndex + 1); + } else { + historyString = ""; + } + return Optional.of(historyString); + } +} diff --git a/src/main/resources/assets/nei/lang/en_US.lang b/src/main/resources/assets/nei/lang/en_US.lang index 59076556..b41b8d62 100644 --- a/src/main/resources/assets/nei/lang/en_US.lang +++ b/src/main/resources/assets/nei/lang/en_US.lang @@ -106,6 +106,8 @@ nei.options.keys.gui.hide_bookmarks=Toggle Bookmark Panel Visibility nei.options.keys.gui.overlay=Overlay Recipe nei.options.keys.gui.overlay_hide=Hide Overlay Recipe nei.options.keys.gui.overlay_use=Use Overlay Recipe +nei.options.keys.gui.getprevioussearch=Previous Search +nei.options.keys.gui.getnextsearch=Next Search nei.options.keys.world=World nei.options.keys.world.chunkoverlay=Chunk Boundary Overlay nei.options.keys.world.moboverlay=Mob Spawn Overlay