diff --git a/runelite-api/src/main/java/net/runelite/api/ScriptID.java b/runelite-api/src/main/java/net/runelite/api/ScriptID.java
index b5d1bb0fbc..3e9e426d4d 100644
--- a/runelite-api/src/main/java/net/runelite/api/ScriptID.java
+++ b/runelite-api/src/main/java/net/runelite/api/ScriptID.java
@@ -299,4 +299,18 @@ public final class ScriptID
@ScriptArguments()
public static final int BANKMAIN_SEARCHING = 514;
+
+ /**
+ * Toggles the bank search
+ *
+ *
+ * - int 1 (must be 1 or script immediately returns)
+ *
+ *
+ * Also takes 17 widget IDs corresponding to various bank widgets.
+ * These can be retrieved from the onInvTransmitListener of BANK_ITEM_CONTAINER. Note that this array also
+ * contains the script ID for the bank layout script in the first index
+ */
+ @ScriptArguments(integer = 18)
+ public static final int BANKMAIN_SEARCH_TOGGLE = 281;
}
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankConfig.java
index f51625bff5..002e01a3d4 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankConfig.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankConfig.java
@@ -25,9 +25,12 @@
*/
package net.runelite.client.plugins.bank;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
import net.runelite.client.config.Config;
import net.runelite.client.config.ConfigGroup;
import net.runelite.client.config.ConfigItem;
+import net.runelite.client.config.Keybind;
@ConfigGroup("bank")
public interface BankConfig extends Config
@@ -119,4 +122,15 @@ public interface BankConfig extends Config
{
return false;
}
+
+ @ConfigItem(
+ keyName = "searchKeybind",
+ name = "Search Shortcut",
+ description = "Keyboard shortcut for initiating a bank search",
+ position = 9
+ )
+ default Keybind searchKeybind()
+ {
+ return new Keybind(KeyEvent.VK_F, InputEvent.CTRL_DOWN_MASK);
+ }
}
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankPlugin.java
index dca67f75a4..e0e1efbd5c 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankPlugin.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankPlugin.java
@@ -30,6 +30,7 @@ import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.HashMultiset;
import com.google.common.collect.Multiset;
import com.google.inject.Provides;
+import java.awt.event.KeyEvent;
import java.text.ParseException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -59,8 +60,11 @@ import static net.runelite.api.widgets.WidgetInfo.TO_CHILD;
import static net.runelite.api.widgets.WidgetInfo.TO_GROUP;
import net.runelite.client.callback.ClientThread;
import net.runelite.client.config.ConfigManager;
+import net.runelite.client.config.Keybind;
import net.runelite.client.eventbus.Subscribe;
import net.runelite.client.game.ItemManager;
+import net.runelite.client.input.KeyListener;
+import net.runelite.client.input.KeyManager;
import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor;
import net.runelite.client.util.QuantityFormatter;
@@ -98,19 +102,61 @@ public class BankPlugin extends Plugin
@Inject
private BankSearch bankSearch;
+ @Inject
+ private KeyManager keyManager;
+
private boolean forceRightClickFlag;
private Multiset itemQuantities; // bank item quantities for bank value search
private String searchString;
+ private final KeyListener searchHotkeyListener = new KeyListener()
+ {
+ @Override
+ public void keyTyped(KeyEvent e)
+ {
+ }
+
+ @Override
+ public void keyPressed(KeyEvent e)
+ {
+ Keybind keybind = config.searchKeybind();
+ if (keybind.matches(e))
+ {
+ Widget bankContainer = client.getWidget(WidgetInfo.BANK_ITEM_CONTAINER);
+ if (bankContainer == null || bankContainer.isSelfHidden())
+ {
+ return;
+ }
+
+ log.debug("Search hotkey pressed");
+
+ bankSearch.initSearch();
+ e.consume();
+ }
+ }
+
+ @Override
+ public void keyReleased(KeyEvent e)
+ {
+ }
+ };
+
@Provides
BankConfig getConfig(ConfigManager configManager)
{
return configManager.getConfig(BankConfig.class);
}
+ @Override
+ protected void startUp()
+ {
+ keyManager.registerKeyListener(searchHotkeyListener);
+ }
+
@Override
protected void shutDown()
{
+ keyManager.unregisterKeyListener(searchHotkeyListener);
clientThread.invokeLater(() -> bankSearch.reset(false));
forceRightClickFlag = false;
itemQuantities = null;
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankSearch.java b/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankSearch.java
index 7ae0995dc1..73e00b436e 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankSearch.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankSearch.java
@@ -35,6 +35,7 @@ import net.runelite.api.vars.InputType;
import net.runelite.api.widgets.Widget;
import net.runelite.api.widgets.WidgetInfo;
import net.runelite.client.callback.ClientThread;
+import org.apache.commons.lang3.ArrayUtils;
@Singleton
public class BankSearch
@@ -69,6 +70,32 @@ public class BankSearch
client.runScript(scriptArgs);
}
+ public void initSearch()
+ {
+ clientThread.invoke(() ->
+ {
+ Widget bankContainer = client.getWidget(WidgetInfo.BANK_ITEM_CONTAINER);
+ if (bankContainer == null || bankContainer.isHidden())
+ {
+ return;
+ }
+
+ Object[] bankBuildArgs = bankContainer.getOnInvTransmitListener();
+ if (bankBuildArgs == null)
+ {
+ return;
+ }
+
+ // the search toggle script requires 1 as its first argument
+ Object[] searchToggleArgs = ArrayUtils.insert(1, bankBuildArgs, 1);
+ searchToggleArgs[0] = ScriptID.BANKMAIN_SEARCH_TOGGLE;
+
+ // reset search to clear tab tags and also allow us to initiate a new search while searching
+ reset(true);
+ client.runScript(searchToggleArgs);
+ });
+ }
+
public void reset(boolean closeChat)
{
clientThread.invoke(() ->