From 87f5e98a0882f2250af1e580c192baa6e7a7d215 Mon Sep 17 00:00:00 2001 From: trimbe Date: Sun, 27 Oct 2019 16:09:25 -0400 Subject: [PATCH] bank plugin: add ctrl+f hotkey to initiate bank search Co-authored-by: melkypie <5113962+melkypie@users.noreply.github.com> Co-authored-by: Adam --- .../main/java/net/runelite/api/ScriptID.java | 14 ++++++ .../client/plugins/bank/BankConfig.java | 14 ++++++ .../client/plugins/bank/BankPlugin.java | 46 +++++++++++++++++++ .../client/plugins/bank/BankSearch.java | 27 +++++++++++ 4 files changed, 101 insertions(+) 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 + * + * + * + * 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(() ->