From e4b43d98f224032273da79f377c1cd0ad19ed0dd Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 22 Jul 2020 22:44:17 -0400 Subject: [PATCH] tagtabs: split tag search from bank search This fixes a lot of edge cases which required us to re-search for things after input was re-used when a tag tab was open, and removes the requirement of having the bank search text be in sync with the currently selected tab. This also no longer parses the tag tab out of the title during times when the input is being re-used (like Withdraw-x) which was broken earlier from the bank plugin changing the title to include the value of searches. A new tag tab title is being set now on all tag tab views so the old tag tab tab title event can be removed. --- .../main/java/net/runelite/api/ScriptID.java | 3 + .../plugins/banktags/BankTagsPlugin.java | 50 ++++++-- .../plugins/banktags/tabs/BankSearch.java | 37 +++--- .../plugins/banktags/tabs/TabInterface.java | 110 +++--------------- .../client/plugins/banktags/tabs/TagTab.java | 2 +- .../src/main/scripts/BankSearchFilter.rs2asm | 12 +- .../src/main/scripts/BankSearchLayout.rs2asm | 9 -- 7 files changed, 84 insertions(+), 139 deletions(-) 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