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.
This commit is contained in:
Adam
2020-07-22 22:44:17 -04:00
parent b5abb09152
commit e4b43d98f2
7 changed files with 84 additions and 139 deletions

View File

@@ -293,4 +293,7 @@ public final class ScriptID
*/ */
@ScriptArguments(integer = 17) @ScriptArguments(integer = 17)
public static final int BANKMAIN_BUILD = 277; public static final int BANKMAIN_BUILD = 277;
@ScriptArguments(integer = 19)
public static final int BANKMAIN_FINISHBUILDING = 505;
} }

View File

@@ -61,6 +61,7 @@ import net.runelite.api.events.MenuEntryAdded;
import net.runelite.api.events.MenuOptionClicked; import net.runelite.api.events.MenuOptionClicked;
import net.runelite.api.events.ScriptCallbackEvent; import net.runelite.api.events.ScriptCallbackEvent;
import net.runelite.api.events.ScriptPostFired; import net.runelite.api.events.ScriptPostFired;
import net.runelite.api.events.ScriptPreFired;
import net.runelite.api.events.WidgetLoaded; import net.runelite.api.events.WidgetLoaded;
import net.runelite.api.vars.InputType; import net.runelite.api.vars.InputType;
import net.runelite.api.widgets.Widget; 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 net.runelite.client.plugins.banktags.tabs.TabInterface;
import static net.runelite.client.plugins.banktags.tabs.TabInterface.FILTERED_CHARS; 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.TabSprites;
import net.runelite.client.plugins.banktags.tabs.TagTab;
import net.runelite.client.plugins.cluescrolls.ClueScrollPlugin; import net.runelite.client.plugins.cluescrolls.ClueScrollPlugin;
import net.runelite.client.util.Text; import net.runelite.client.util.Text;
@@ -308,8 +310,19 @@ public class BankTagsPlugin extends Plugin implements MouseWheelListener
break; break;
} }
case "bankSearchFilter": case "bankSearchFilter":
int itemId = intStack[intStackSize - 1]; final int itemId = intStack[intStackSize - 1];
String search = stringStack[stringStackSize - 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); boolean tagSearch = search.startsWith(TAG_SEARCH);
if (tagSearch) if (tagSearch)
@@ -324,6 +337,8 @@ public class BankTagsPlugin extends Plugin implements MouseWheelListener
} }
else if (tagSearch) 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; intStack[intStackSize - 2] = 0;
} }
break; break;
@@ -402,8 +417,6 @@ public class BankTagsPlugin extends Plugin implements MouseWheelListener
.map(i -> i + "*") .map(i -> i + "*")
.forEach(tags::add); .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); String initialValue = Text.toCSV(tags);
chatboxPanelManager.openTextInput(name + " tags:<br>(append " + VAR_TAG_SUFFIX + " for variation tag)") chatboxPanelManager.openTextInput(name + " tags:<br>(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), ""))); tabInterface.updateTabIfActive(Text.fromCSV(newValue.toLowerCase().replaceAll(Pattern.quote(VAR_TAG_SUFFIX), "")));
})) }))
.build(); .build();
if (isSearchOpen)
{
bankSearch.reset(false);
bankSearch.search(InputType.SEARCH, searchText, false);
}
} }
else else
{ {
@@ -466,6 +473,29 @@ public class BankTagsPlugin extends Plugin implements MouseWheelListener
&& !Strings.isNullOrEmpty(client.getVar(VarClientStr.INPUT_TEXT))); && !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 <col=ff0000>" + activeTab.getTag() + "</col>");
}
}
}
@Subscribe @Subscribe
public void onScriptPostFired(ScriptPostFired event) public void onScriptPostFired(ScriptPostFired event)
{ {

View File

@@ -25,7 +25,8 @@
package net.runelite.client.plugins.banktags.tabs; 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.Client;
import net.runelite.api.ScriptID; import net.runelite.api.ScriptID;
import net.runelite.api.VarClientInt; import net.runelite.api.VarClientInt;
@@ -35,6 +36,7 @@ import net.runelite.api.widgets.Widget;
import net.runelite.api.widgets.WidgetInfo; import net.runelite.api.widgets.WidgetInfo;
import net.runelite.client.callback.ClientThread; import net.runelite.client.callback.ClientThread;
@Singleton
public class BankSearch public class BankSearch
{ {
private final Client client; private final Client client;
@@ -50,24 +52,6 @@ public class BankSearch
this.clientThread = clientThread; 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() public void layoutBank()
{ {
Widget bankContainer = client.getWidget(WidgetInfo.BANK_ITEM_CONTAINER); Widget bankContainer = client.getWidget(WidgetInfo.BANK_ITEM_CONTAINER);
@@ -87,6 +71,19 @@ public class BankSearch
public void reset(boolean closeChat) 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();
});
} }
} }

View File

@@ -70,7 +70,6 @@ import net.runelite.api.Varbits;
import net.runelite.api.events.MenuEntryAdded; import net.runelite.api.events.MenuEntryAdded;
import net.runelite.api.events.MenuOptionClicked; import net.runelite.api.events.MenuOptionClicked;
import net.runelite.api.events.ScriptCallbackEvent; import net.runelite.api.events.ScriptCallbackEvent;
import net.runelite.api.vars.InputType;
import net.runelite.api.widgets.ItemQuantityMode; import net.runelite.api.widgets.ItemQuantityMode;
import net.runelite.api.widgets.JavaScriptCallback; import net.runelite.api.widgets.JavaScriptCallback;
import net.runelite.api.widgets.Widget; 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 OPEN_TAB_MENU = "View tag tabs";
private static final String SHOW_WORN = "Show worn items"; private static final String SHOW_WORN = "Show worn items";
private static final String SHOW_SETTINGS = "Show menu"; 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 String SHOW_TUTORIAL = "Show tutorial";
private static final int TAB_HEIGHT = 40; private static final int TAB_HEIGHT = 40;
private static final int TAB_WIDTH = 39; private static final int TAB_WIDTH = 39;
@@ -149,12 +146,13 @@ public class TabInterface
private final Rectangle canvasBounds = new Rectangle(); private final Rectangle canvasBounds = new Rectangle();
private ChatboxItemSearch searchProvider; private ChatboxItemSearch searchProvider;
@Getter
private TagTab activeTab; private TagTab activeTab;
@Getter
private boolean tagTabActive;
private int maxTabs; private int maxTabs;
private int currentTabIndex; private int currentTabIndex;
private Instant startScroll = Instant.now(); private Instant startScroll = Instant.now();
private String rememberedSearch;
private boolean waitSearchTick;
@Getter @Getter
private Widget upButton; private Widget upButton;
@@ -410,16 +408,15 @@ public class TabInterface
if (tab.equals(activeTab)) if (tab.equals(activeTab))
{ {
bankSearch.reset(true); activateTab(null);
rememberedSearch = "";
clientThread.invokeLater(() -> client.runScript(ScriptID.MESSAGE_LAYER_CLOSE, 0, 0));
} }
else else
{ {
openTag(Text.removeTags(clicked.getName())); openTag(Text.removeTags(clicked.getName()));
} }
bankSearch.reset(true);
client.playSoundEffect(SoundEffectID.UI_BOOP); client.playSoundEffect(SoundEffectID.UI_BOOP);
break; break;
case Tab.CHANGE_ICON: case Tab.CHANGE_ICON:
@@ -481,8 +478,6 @@ public class TabInterface
currentTabIndex = 0; currentTabIndex = 0;
maxTabs = 0; maxTabs = 0;
parent = null; parent = null;
waitSearchTick = false;
rememberedSearch = "";
if (upButton != null) if (upButton != null)
{ {
@@ -499,8 +494,6 @@ public class TabInterface
if (isHidden()) if (isHidden())
{ {
parent = null; parent = null;
waitSearchTick = false;
rememberedSearch = "";
saveTab(); saveTab();
return; return;
@@ -512,57 +505,6 @@ public class TabInterface
return; 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(); updateBounds();
scrollTab(0); scrollTab(0);
} }
@@ -603,7 +545,7 @@ public class TabInterface
private boolean isTabMenuActive() private boolean isTabMenuActive()
{ {
return TAB_MENU.equals(client.getVar(VarClientStr.INPUT_TEXT)); return tagTabActive;
} }
public void handleScriptEvent(final ScriptCallbackEvent event) public void handleScriptEvent(final ScriptCallbackEvent event)
@@ -633,17 +575,6 @@ public class TabInterface
case "beforeBankLayout": case "beforeBankLayout":
setTabMenuVisible(false); setTabMenuVisible(false);
break; 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(); 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 if (activeTab != null
&& event.getMenuOption().equals("Search") && event.getMenuOption().equals("Search")
&& client.getWidget(WidgetInfo.BANK_SEARCH_BUTTON_BACKGROUND).getSpriteId() != SpriteID.EQUIPMENT_SLOT_SELECTED) && 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 ItemComposition item = getItem(event.getActionParam());
final int itemId = item.getId(); final int itemId = item.getId();
tagManager.removeTag(itemId, activeTab.getTag()); 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 else if (event.getMenuAction() == MenuAction.RUNELITE
&& ((event.getWidgetId() == WidgetInfo.BANK_DEPOSIT_INVENTORY.getId() && event.getMenuOption().equals(TAG_INVENTORY)) && ((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)))) || (event.getWidgetId() == WidgetInfo.BANK_TUTORIAL_BUTTON.getId() && event.getMenuOption().equals(SHOW_TUTORIAL))))
{ {
saveTab(); 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)) if (activeTab != null && activeTab.getTag().equals(tag))
{ {
activateTab(null);
bankSearch.reset(true); bankSearch.reset(true);
} }
@@ -1092,6 +1005,8 @@ public class TabInterface
tab.revalidate(); tab.revalidate();
activeTab = tagTab; activeTab = tagTab;
} }
tagTabActive = false;
} }
private void updateBounds() private void updateBounds()
@@ -1253,8 +1168,9 @@ public class TabInterface
private void openTag(final String tag) private void openTag(final String tag)
{ {
bankSearch.search(InputType.SEARCH, TAG_SEARCH + tag, true);
activateTab(tabManager.find(tag)); 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 // When tab is selected with search window open, the search window closes but the search button
// stays highlighted, this solves that issue // stays highlighted, this solves that issue

View File

@@ -31,7 +31,7 @@ import net.runelite.api.widgets.Widget;
@Data @Data
@EqualsAndHashCode(of = "tag") @EqualsAndHashCode(of = "tag")
class TagTab public class TagTab
{ {
private String tag; private String tag;
private int iconItemId; private int iconItemId;

View File

@@ -10,6 +10,16 @@
invoke 514 invoke 514
iconst 1 iconst 1
if_icmpeq LABEL8 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 jump LABEL34
LABEL8: LABEL8:
get_varc_string 359 ; Skip truncating of varcstr 22 by not calling 280 get_varc_string 359 ; Skip truncating of varcstr 22 by not calling 280
@@ -32,13 +42,11 @@ LABEL19:
sstore 0 sstore 0
iconst -1 ; load return value iconst -1 ; load return value
iload 0 ; load item id iload 0 ; load item id
sload 0 ; load item name
sload 1 ; load search string sload 1 ; load search string
sconst "bankSearchFilter" ; push event name sconst "bankSearchFilter" ; push event name
runelite_callback ; invoke callback runelite_callback ; invoke callback
pop_int ; pop item id pop_int ; pop item id
pop_string ; pop search string pop_string ; pop search string
pop_string ; pop item name
istore 1 ; store return value for the below comparisons istore 1 ; store return value for the below comparisons
iload 1 iload 1
iconst 0 iconst 0

View File

@@ -10,9 +10,6 @@
; callback "setBankScroll" ; callback "setBankScroll"
; Fired before bank is calculated ; Fired before bank is calculated
; Used by the TabInterface to show fake bank items for tag tabs ; 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" sconst "beforeBankLayout"
runelite_callback runelite_callback
get_varbit 5102 get_varbit 5102
@@ -966,12 +963,6 @@ LABEL848:
add add
istore 20 istore 20
jump LABEL769 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: LABEL853:
get_varbit 4170 get_varbit 4170
iconst 2 iconst 2