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 520150c27c..c0c8322d04 100644 --- a/runelite-api/src/main/java/net/runelite/api/ScriptID.java +++ b/runelite-api/src/main/java/net/runelite/api/ScriptID.java @@ -293,4 +293,7 @@ public final class ScriptID */ @ScriptArguments(integer = 17) public static final int BANKMAIN_BUILD = 277; + + @ScriptArguments(integer = 19) + public static final int BANKMAIN_FINISHBUILDING = 505; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/BankTagsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/BankTagsPlugin.java index f28f86fec8..7af659873e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/BankTagsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/BankTagsPlugin.java @@ -61,6 +61,7 @@ import net.runelite.api.events.MenuEntryAdded; import net.runelite.api.events.MenuOptionClicked; import net.runelite.api.events.ScriptCallbackEvent; import net.runelite.api.events.ScriptPostFired; +import net.runelite.api.events.ScriptPreFired; import net.runelite.api.events.WidgetLoaded; import net.runelite.api.vars.InputType; import net.runelite.api.widgets.Widget; @@ -84,6 +85,7 @@ import net.runelite.client.plugins.banktags.tabs.BankSearch; import net.runelite.client.plugins.banktags.tabs.TabInterface; import static net.runelite.client.plugins.banktags.tabs.TabInterface.FILTERED_CHARS; import net.runelite.client.plugins.banktags.tabs.TabSprites; +import net.runelite.client.plugins.banktags.tabs.TagTab; import net.runelite.client.plugins.cluescrolls.ClueScrollPlugin; import net.runelite.client.util.Text; @@ -308,8 +310,19 @@ public class BankTagsPlugin extends Plugin implements MouseWheelListener break; } case "bankSearchFilter": - int itemId = intStack[intStackSize - 1]; - String search = stringStack[stringStackSize - 1]; + final int itemId = intStack[intStackSize - 1]; + final String searchfilter = stringStack[stringStackSize - 1]; + + // This event fires regardless of the bank being in search mode. If we have a current + // tab set then the bank should be not in search mode (and the filter empty). Otherwise + // the filter is either empty for no search or contains the search filter. + TagTab activeTab = tabInterface.getActiveTab(); + String search = activeTab != null ? TAG_SEARCH + activeTab.getTag() : searchfilter; + + if (search.isEmpty()) + { + return; + } boolean tagSearch = search.startsWith(TAG_SEARCH); if (tagSearch) @@ -324,6 +337,8 @@ public class BankTagsPlugin extends Plugin implements MouseWheelListener } else if (tagSearch) { + // if the item isn't tagged we return false to prevent the item matching if the item name happens + // to contain the tag name. intStack[intStackSize - 2] = 0; } break; @@ -402,8 +417,6 @@ public class BankTagsPlugin extends Plugin implements MouseWheelListener .map(i -> i + "*") .forEach(tags::add); - boolean isSearchOpen = client.getVar(VarClientInt.INPUT_TYPE) == InputType.SEARCH.getType(); - String searchText = client.getVar(VarClientStr.INPUT_TEXT); String initialValue = Text.toCSV(tags); chatboxPanelManager.openTextInput(name + " tags:
(append " + VAR_TAG_SUFFIX + " for variation tag)") @@ -430,12 +443,6 @@ public class BankTagsPlugin extends Plugin implements MouseWheelListener tabInterface.updateTabIfActive(Text.fromCSV(newValue.toLowerCase().replaceAll(Pattern.quote(VAR_TAG_SUFFIX), ""))); })) .build(); - - if (isSearchOpen) - { - bankSearch.reset(false); - bankSearch.search(InputType.SEARCH, searchText, false); - } } else { @@ -466,6 +473,29 @@ public class BankTagsPlugin extends Plugin implements MouseWheelListener && !Strings.isNullOrEmpty(client.getVar(VarClientStr.INPUT_TEXT))); } + @Subscribe + public void onScriptPreFired(ScriptPreFired event) + { + if (event.getScriptId() == ScriptID.BANKMAIN_FINISHBUILDING) + { + // Since we apply tag tab search filters even when the bank is not in search mode, + // bankkmain_build will reset the bank title to "The Bank of Gielinor". So apply our + // own title. + TagTab activeTab = tabInterface.getActiveTab(); + if (tabInterface.isTagTabActive()) + { + // Tag tab tab has its own title since it isn't a real tag + Widget bankTitle = client.getWidget(WidgetInfo.BANK_TITLE_BAR); + bankTitle.setText("Tag tab tab"); + } + else if (activeTab != null) + { + Widget bankTitle = client.getWidget(WidgetInfo.BANK_TITLE_BAR); + bankTitle.setText("Tag tab " + activeTab.getTag() + ""); + } + } + } + @Subscribe public void onScriptPostFired(ScriptPostFired event) { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/BankSearch.java b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/BankSearch.java index 34cd7e8244..c5c2a4a9db 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/BankSearch.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/BankSearch.java @@ -25,7 +25,8 @@ package net.runelite.client.plugins.banktags.tabs; -import com.google.inject.Inject; +import javax.inject.Inject; +import javax.inject.Singleton; import net.runelite.api.Client; import net.runelite.api.ScriptID; import net.runelite.api.VarClientInt; @@ -35,6 +36,7 @@ import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.callback.ClientThread; +@Singleton public class BankSearch { private final Client client; @@ -50,24 +52,6 @@ public class BankSearch this.clientThread = clientThread; } - public void search(InputType inputType, String search, boolean closeInput) - { - clientThread.invoke(() -> - { - // This ensures that any chatbox input (e.g from search) will not remain visible when - // selecting/changing tab - if (closeInput) - { - client.runScript(ScriptID.MESSAGE_LAYER_CLOSE, 0, 0); - } - - client.setVar(VarClientInt.INPUT_TYPE, inputType.getType()); - client.setVar(VarClientStr.INPUT_TEXT, search); - - layoutBank(); - }); - } - public void layoutBank() { Widget bankContainer = client.getWidget(WidgetInfo.BANK_ITEM_CONTAINER); @@ -87,6 +71,19 @@ public class BankSearch public void reset(boolean closeChat) { - search(InputType.NONE, "", closeChat); + clientThread.invoke(() -> + { + // This ensures that any chatbox input (e.g from search) will not remain visible when + // selecting/changing tab + if (closeChat) + { + client.runScript(ScriptID.MESSAGE_LAYER_CLOSE, 0, 0); + } + + client.setVar(VarClientInt.INPUT_TYPE, InputType.NONE.getType()); + client.setVar(VarClientStr.INPUT_TEXT, ""); + + layoutBank(); + }); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TabInterface.java b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TabInterface.java index 5c7796cbe5..df7abee0e7 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TabInterface.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TabInterface.java @@ -70,7 +70,6 @@ import net.runelite.api.Varbits; import net.runelite.api.events.MenuEntryAdded; import net.runelite.api.events.MenuOptionClicked; import net.runelite.api.events.ScriptCallbackEvent; -import net.runelite.api.vars.InputType; import net.runelite.api.widgets.ItemQuantityMode; import net.runelite.api.widgets.JavaScriptCallback; import net.runelite.api.widgets.Widget; @@ -118,8 +117,6 @@ public class TabInterface private static final String OPEN_TAB_MENU = "View tag tabs"; private static final String SHOW_WORN = "Show worn items"; private static final String SHOW_SETTINGS = "Show menu"; - private static final String HIDE_WORN = "Hide worn items"; - private static final String HIDE_SETTINGS = "Hide menu"; private static final String SHOW_TUTORIAL = "Show tutorial"; private static final int TAB_HEIGHT = 40; private static final int TAB_WIDTH = 39; @@ -149,12 +146,13 @@ public class TabInterface private final Rectangle canvasBounds = new Rectangle(); private ChatboxItemSearch searchProvider; + @Getter private TagTab activeTab; + @Getter + private boolean tagTabActive; private int maxTabs; private int currentTabIndex; private Instant startScroll = Instant.now(); - private String rememberedSearch; - private boolean waitSearchTick; @Getter private Widget upButton; @@ -410,16 +408,15 @@ public class TabInterface if (tab.equals(activeTab)) { - bankSearch.reset(true); - rememberedSearch = ""; - - clientThread.invokeLater(() -> client.runScript(ScriptID.MESSAGE_LAYER_CLOSE, 0, 0)); + activateTab(null); } else { openTag(Text.removeTags(clicked.getName())); } + bankSearch.reset(true); + client.playSoundEffect(SoundEffectID.UI_BOOP); break; case Tab.CHANGE_ICON: @@ -481,8 +478,6 @@ public class TabInterface currentTabIndex = 0; maxTabs = 0; parent = null; - waitSearchTick = false; - rememberedSearch = ""; if (upButton != null) { @@ -499,8 +494,6 @@ public class TabInterface if (isHidden()) { parent = null; - waitSearchTick = false; - rememberedSearch = ""; saveTab(); return; @@ -512,57 +505,6 @@ public class TabInterface return; } - if (activeTab != null && client.getVar(VarClientInt.INPUT_TYPE) == InputType.RUNELITE_CHATBOX_PANEL.getType()) - { - // don't reset active tab if we are editing tags - updateBounds(); - scrollTab(0); - return; - } - - String str = client.getVar(VarClientStr.INPUT_TEXT); - - if (Strings.isNullOrEmpty(str)) - { - str = ""; - } - - Widget bankTitle = client.getWidget(WidgetInfo.BANK_TITLE_BAR); - if (bankTitle != null && !bankTitle.isHidden() && !str.startsWith(TAG_SEARCH)) - { - str = bankTitle.getText().replaceFirst("Showing items: ", ""); - - if (str.startsWith("Tab ")) - { - str = ""; - } - } - - str = Text.standardize(str); - - if (str.startsWith(BankTagsPlugin.TAG_SEARCH)) - { - activateTab(tabManager.find(str.substring(TAG_SEARCH.length()))); - } - else - { - activateTab(null); - } - - if (!waitSearchTick - && activeTab == null - && !Strings.isNullOrEmpty(rememberedSearch) - && client.getVar(VarClientInt.INPUT_TYPE) == InputType.NONE.getType()) - { - bankSearch.reset(true); - bankSearch.search(InputType.NONE, rememberedSearch, true); - rememberedSearch = ""; - } - else if (waitSearchTick) - { - waitSearchTick = false; - } - updateBounds(); scrollTab(0); } @@ -603,7 +545,7 @@ public class TabInterface private boolean isTabMenuActive() { - return TAB_MENU.equals(client.getVar(VarClientStr.INPUT_TEXT)); + return tagTabActive; } public void handleScriptEvent(final ScriptCallbackEvent event) @@ -633,17 +575,6 @@ public class TabInterface case "beforeBankLayout": setTabMenuVisible(false); break; - case "isTabMenuActive": - if (!isTabMenuActive()) - { - intStack[intStackSize - 1] = 0; - return; - } - - // Must set the bank title because we are skipping it in scripts - client.getWidget(WidgetInfo.BANK_TITLE_BAR).setText("Showing items: " + ColorUtil.wrapWithColorTag(TAB_MENU, Color.red)); - intStack[intStackSize - 1] = 1; - break; } } @@ -724,17 +655,6 @@ public class TabInterface chatboxPanelManager.close(); } - if ((event.getWidgetId() == WidgetInfo.BANK_ITEM_CONTAINER.getId() - || event.getWidgetId() == WidgetInfo.BANK_INVENTORY_ITEMS_CONTAINER.getId()) - && event.getMenuAction() == MenuAction.CC_OP_LOW_PRIORITY - && (event.getMenuOption().equalsIgnoreCase("withdraw-x") - || event.getMenuOption().equalsIgnoreCase("deposit-x"))) - { - waitSearchTick = true; - rememberedSearch = client.getVar(VarClientStr.INPUT_TEXT); - bankSearch.search(InputType.NONE, rememberedSearch, true); - } - if (activeTab != null && event.getMenuOption().equals("Search") && client.getWidget(WidgetInfo.BANK_SEARCH_BUTTON_BACKGROUND).getSpriteId() != SpriteID.EQUIPMENT_SLOT_SELECTED) @@ -760,7 +680,7 @@ public class TabInterface final ItemComposition item = getItem(event.getActionParam()); final int itemId = item.getId(); tagManager.removeTag(itemId, activeTab.getTag()); - bankSearch.search(InputType.SEARCH, TAG_SEARCH + activeTab.getTag(), true); + bankSearch.layoutBank(); // re-layout to filter the removed item out } else if (event.getMenuAction() == MenuAction.RUNELITE && ((event.getWidgetId() == WidgetInfo.BANK_DEPOSIT_INVENTORY.getId() && event.getMenuOption().equals(TAG_INVENTORY)) @@ -773,14 +693,6 @@ public class TabInterface || (event.getWidgetId() == WidgetInfo.BANK_TUTORIAL_BUTTON.getId() && event.getMenuOption().equals(SHOW_TUTORIAL)))) { saveTab(); - rememberedSearch = TAG_SEARCH + activeTab.getTag(); - } - else if (!Strings.isNullOrEmpty(rememberedSearch) && ((event.getWidgetId() == WidgetInfo.BANK_EQUIPMENT_BUTTON.getId() && event.getMenuOption().equals(HIDE_WORN)) - || (event.getWidgetId() == WidgetInfo.BANK_SETTINGS_BUTTON.getId() && event.getMenuOption().equals(HIDE_SETTINGS)))) - { - bankSearch.reset(true); - bankSearch.search(InputType.NONE, rememberedSearch, true); - rememberedSearch = ""; } } @@ -963,6 +875,7 @@ public class TabInterface { if (activeTab != null && activeTab.getTag().equals(tag)) { + activateTab(null); bankSearch.reset(true); } @@ -1092,6 +1005,8 @@ public class TabInterface tab.revalidate(); activeTab = tagTab; } + + tagTabActive = false; } private void updateBounds() @@ -1253,8 +1168,9 @@ public class TabInterface private void openTag(final String tag) { - bankSearch.search(InputType.SEARCH, TAG_SEARCH + tag, true); activateTab(tabManager.find(tag)); + tagTabActive = BankTagsPlugin.TAG_TABS_CONFIG.equals(tag); + bankSearch.layoutBank(); // When tab is selected with search window open, the search window closes but the search button // stays highlighted, this solves that issue diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TagTab.java b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TagTab.java index 403fc9dddf..88ef36537b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TagTab.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TagTab.java @@ -31,7 +31,7 @@ import net.runelite.api.widgets.Widget; @Data @EqualsAndHashCode(of = "tag") -class TagTab +public class TagTab { private String tag; private int iconItemId; diff --git a/runelite-client/src/main/scripts/BankSearchFilter.rs2asm b/runelite-client/src/main/scripts/BankSearchFilter.rs2asm index 5f9db325af..506aa4530b 100644 --- a/runelite-client/src/main/scripts/BankSearchFilter.rs2asm +++ b/runelite-client/src/main/scripts/BankSearchFilter.rs2asm @@ -10,6 +10,16 @@ invoke 514 iconst 1 if_icmpeq LABEL8 + + iconst 1 ; return value - default to true to match anything + iload 0 ; load item id + sconst "" ; we are not searching, so there is no search string + sconst "bankSearchFilter" ; push event name + runelite_callback ; invoke callback + pop_int ; pop item id + pop_string ; pop search string + return ; return rv + jump LABEL34 LABEL8: get_varc_string 359 ; Skip truncating of varcstr 22 by not calling 280 @@ -32,13 +42,11 @@ LABEL19: sstore 0 iconst -1 ; load return value iload 0 ; load item id - sload 0 ; load item name sload 1 ; load search string sconst "bankSearchFilter" ; push event name runelite_callback ; invoke callback pop_int ; pop item id pop_string ; pop search string - pop_string ; pop item name istore 1 ; store return value for the below comparisons iload 1 iconst 0 diff --git a/runelite-client/src/main/scripts/BankSearchLayout.rs2asm b/runelite-client/src/main/scripts/BankSearchLayout.rs2asm index 04692f488f..485a6d08e9 100644 --- a/runelite-client/src/main/scripts/BankSearchLayout.rs2asm +++ b/runelite-client/src/main/scripts/BankSearchLayout.rs2asm @@ -10,9 +10,6 @@ ; callback "setBankScroll" ; Fired before bank is calculated ; Used by the TabInterface to show fake bank items for tag tabs -; -; callback "isTabMenuActive" -; Used by the TabInterface to skip setting the bank title sconst "beforeBankLayout" runelite_callback get_varbit 5102 @@ -966,12 +963,6 @@ LABEL848: add istore 20 jump LABEL769 -SetTitle: - iconst 0 ; Compare variable - iconst 0 ; - sconst "isTabMenuActive" - runelite_callback ; skip setting the bank title if the tag tab menu is active - if_icmpne FinishBuilding LABEL853: get_varbit 4170 iconst 2