From 4fce3b5c84601e484348a6d355cdc0433739fb1c Mon Sep 17 00:00:00 2001 From: Jeremy Plsek Date: Wed, 27 Jun 2018 18:59:16 -0400 Subject: [PATCH] ge plugin: rewrite alt-click searching This simplfies the code and improves performance by only needing to loop over the menu entries instead of the inventory and checking all types of inventories. - Fix exceptions being thrown when losing focus on the client when searching. There is still an exception when spam clicking, but that was always there to begin with. - Fix searching while using the GE window and while using a shop window. --- .../GrandExchangeInputListener.java | 89 +++---------------- .../grandexchange/GrandExchangePlugin.java | 8 +- .../GrandExchangeSearchPanel.java | 7 +- 3 files changed, 23 insertions(+), 81 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeInputListener.java b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeInputListener.java index ad39cade4e..ec6408e376 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeInputListener.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeInputListener.java @@ -29,32 +29,22 @@ import java.awt.event.MouseEvent; import javax.inject.Inject; import javax.swing.SwingUtilities; import net.runelite.api.Client; -import net.runelite.api.ItemComposition; -import net.runelite.api.Point; -import net.runelite.api.queries.BankItemQuery; -import net.runelite.api.widgets.Widget; -import net.runelite.api.widgets.WidgetInfo; -import net.runelite.api.widgets.WidgetItem; -import net.runelite.client.game.ItemManager; +import net.runelite.api.MenuEntry; import net.runelite.client.input.KeyListener; import net.runelite.client.input.MouseListener; -import net.runelite.client.util.QueryRunner; +import static net.runelite.client.plugins.grandexchange.GrandExchangePlugin.SEARCH_GRAND_EXCHANGE; +import net.runelite.client.util.Text; public class GrandExchangeInputListener extends MouseListener implements KeyListener { private final Client client; private final GrandExchangePlugin plugin; - private final ItemManager itemManager; - private final QueryRunner queryRunner; @Inject - GrandExchangeInputListener(Client client, GrandExchangePlugin plugin, ItemManager itemManager, - QueryRunner queryRunner) + GrandExchangeInputListener(Client client, GrandExchangePlugin plugin) { this.client = client; this.plugin = plugin; - this.itemManager = itemManager; - this.queryRunner = queryRunner; } @Override @@ -63,36 +53,14 @@ public class GrandExchangeInputListener extends MouseListener implements KeyList // Check if left click + alt if (e.getButton() == MouseEvent.BUTTON1 && e.isAltDown()) { - Widget inventoryWidget = client.getWidget(WidgetInfo.INVENTORY); - if (inventoryWidget != null && !inventoryWidget.isHidden()) + final MenuEntry[] menuEntries = client.getMenuEntries(); + for (final MenuEntry menuEntry : menuEntries) { - if (findAndSearch(inventoryWidget.getWidgetItems().toArray(new WidgetItem[0]))) + if (menuEntry.getOption().equals(SEARCH_GRAND_EXCHANGE)) { + search(Text.removeTags(menuEntry.getTarget())); e.consume(); - return super.mouseClicked(e); - } - } - - // Check the inventory when the bank is open aswell - Widget bankInventoryWidget = client.getWidget(WidgetInfo.BANK_INVENTORY_ITEMS_CONTAINER); - if (bankInventoryWidget != null && !bankInventoryWidget.isHidden()) - { - if (findAndSearch(bankInventoryWidget.getDynamicChildren())) - { - e.consume(); - return super.mouseClicked(e); - } - } - - Widget bankWidget = client.getWidget(WidgetInfo.BANK_ITEM_CONTAINER); - if (bankWidget != null && !bankWidget.isHidden()) - { - // Use bank item query for only checking the active tab - WidgetItem[] items = queryRunner.runQuery(new BankItemQuery()); - if (findAndSearch(items)) - { - e.consume(); - return super.mouseClicked(e); + break; } } } @@ -100,42 +68,7 @@ public class GrandExchangeInputListener extends MouseListener implements KeyList return super.mouseClicked(e); } - private boolean findAndSearch(Widget[] widgets) - { - Point mousePosition = client.getMouseCanvasPosition(); - for (Widget widget : widgets) - { - if (widget.getBounds().contains(mousePosition.getX(), mousePosition.getY())) - { - ItemComposition itemComposition = itemManager.getItemComposition(widget.getItemId()); - search(itemComposition); - return true; - } - } - return false; - } - - /** - * Finds the item clicked based on the mouse location - * @param items - * @return true if an item is found, false otherwise - */ - private boolean findAndSearch(WidgetItem[] items) - { - Point mousePosition = client.getMouseCanvasPosition(); - for (WidgetItem item : items) - { - if (item.getCanvasBounds().contains(mousePosition.getX(), mousePosition.getY())) - { - ItemComposition itemComposition = itemManager.getItemComposition(item.getId()); - search(itemComposition); - return true; - } - } - return false; - } - - private void search(ItemComposition itemComposition) + private void search(final String itemName) { SwingUtilities.invokeLater(() -> { @@ -146,7 +79,7 @@ public class GrandExchangeInputListener extends MouseListener implements KeyList plugin.getButton().getOnSelect().run(); } - plugin.getPanel().getSearchPanel().priceLookup(itemComposition.getName()); + plugin.getPanel().getSearchPanel().priceLookup(itemName); }); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java index 44b5f783bc..d995139d56 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java @@ -44,6 +44,7 @@ import net.runelite.api.Client; import net.runelite.api.GameState; import net.runelite.api.GrandExchangeOffer; import net.runelite.api.ItemComposition; +import net.runelite.api.MenuAction; import net.runelite.api.MenuEntry; import net.runelite.api.events.ChatMessage; import net.runelite.api.events.ConfigChanged; @@ -82,6 +83,8 @@ public class GrandExchangePlugin extends Plugin private static final int OFFER_DEFAULT_ITEM_ID = 6512; private static final GrandExchangeClient CLIENT = new GrandExchangeClient(); + static final String SEARCH_GRAND_EXCHANGE = "Search Grand Exchange"; + @Getter(AccessLevel.PACKAGE) private NavigationButton button; @@ -247,7 +250,10 @@ public class GrandExchangePlugin extends Plugin } case WidgetID.INVENTORY_GROUP_ID: case WidgetID.BANK_INVENTORY_GROUP_ID: - menuEntry.setOption("Search Grand Exchange"); + case WidgetID.GRAND_EXCHANGE_INVENTORY_GROUP_ID: + case WidgetID.SHOP_INVENTORY_GROUP_ID: + menuEntry.setOption(SEARCH_GRAND_EXCHANGE); + menuEntry.setType(MenuAction.RUNELITE.getId()); client.setMenuEntries(entries); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeSearchPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeSearchPanel.java index 04ccd7fcfe..05e92315c4 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeSearchPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeSearchPanel.java @@ -273,8 +273,11 @@ class GrandExchangeSearchPanel extends JPanel constraints.gridy++; } - // remove focus from the search bar - searchItemsPanel.requestFocusInWindow(); + // if exactMatch was set, then it came from the applet, so don't lose focus + if (!exactMatch) + { + searchItemsPanel.requestFocusInWindow(); + } searchBox.setEditable(true); // Remove searching label after search is complete