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