From d35ec3857709e76045c03571ad0aa8ab37a34679 Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 17 Mar 2018 18:47:52 -0400 Subject: [PATCH] ge plugin: move item composition and image calls off of awt thread --- .../grandexchange/GrandExchangeOfferSlot.java | 16 ++++------------ .../grandexchange/GrandExchangePanel.java | 8 +++++--- .../grandexchange/GrandExchangePlugin.java | 11 ++++++++++- .../GrandExchangeOfferSlotTest.java | 12 ++---------- 4 files changed, 21 insertions(+), 26 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeOfferSlot.java b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeOfferSlot.java index 689ac1120f..b08a895d43 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeOfferSlot.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeOfferSlot.java @@ -28,6 +28,7 @@ package net.runelite.client.plugins.grandexchange; import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Color; +import java.awt.image.BufferedImage; import java.text.NumberFormat; import javax.annotation.Nullable; import javax.swing.BorderFactory; @@ -43,7 +44,6 @@ import net.runelite.api.GrandExchangeOffer; import net.runelite.api.GrandExchangeOfferState; import static net.runelite.api.GrandExchangeOfferState.EMPTY; import net.runelite.api.ItemComposition; -import net.runelite.client.game.ItemManager; @Slf4j public class GrandExchangeOfferSlot extends JPanel @@ -57,8 +57,6 @@ public class GrandExchangeOfferSlot extends JPanel private static final String INFO_CARD = "INFO_CARD"; private static final String EMPTY_CARD = "EMPTY_CARD"; - private final ItemManager itemManager; - private final CardLayout cardLayout = new CardLayout(); private final JLabel itemIcon = new JLabel(); private final TitledBorder itemName = BorderFactory.createTitledBorder("Nothing"); @@ -69,9 +67,8 @@ public class GrandExchangeOfferSlot extends JPanel * This (sub)panel is used for each GE slot displayed * in the sidebar */ - GrandExchangeOfferSlot(ItemManager itemManager) + GrandExchangeOfferSlot() { - this.itemManager = itemManager; buildPanel(); } @@ -120,12 +117,9 @@ public class GrandExchangeOfferSlot extends JPanel emptySlotCard.add(Box.createHorizontalGlue()); cardLayout.show(this, EMPTY_CARD); - - - } - void updateOffer(@Nullable GrandExchangeOffer newOffer) + void updateOffer(ItemComposition offerItem, BufferedImage itemImage, @Nullable GrandExchangeOffer newOffer) { if (newOffer == null || newOffer.getState() == EMPTY) { @@ -136,12 +130,10 @@ public class GrandExchangeOfferSlot extends JPanel { cardLayout.show(this, INFO_CARD); - ItemComposition offerItem = itemManager.getItemComposition(newOffer.getItemId()); - itemName.setTitle(offerItem.getName()); boolean shouldStack = offerItem.isStackable() || newOffer.getTotalQuantity() > 1; - ImageIcon newItemIcon = new ImageIcon(itemManager.getImage(newOffer.getItemId(), newOffer.getTotalQuantity(), shouldStack)); + ImageIcon newItemIcon = new ImageIcon(itemImage); itemIcon.setIcon(newItemIcon); offerState.setText(getNameForState(newOffer.getState()) + " at " + NUMBER_FORMATTER.format(newOffer.getPrice()) + (newOffer.getTotalQuantity() > 1 ? "gp ea" : "gp")); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePanel.java index 1c956029cf..3f84da8e01 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePanel.java @@ -26,6 +26,7 @@ package net.runelite.client.plugins.grandexchange; import java.awt.BorderLayout; +import java.awt.image.BufferedImage; import java.util.concurrent.ScheduledExecutorService; import javax.inject.Inject; import javax.swing.BoxLayout; @@ -35,6 +36,7 @@ import lombok.Getter; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; import net.runelite.api.GrandExchangeOffer; +import net.runelite.api.ItemComposition; import net.runelite.client.game.ItemManager; import net.runelite.client.ui.PluginPanel; @@ -62,7 +64,7 @@ class GrandExchangePanel extends PluginPanel offerPanel.setLayout(new BoxLayout(offerPanel, BoxLayout.Y_AXIS)); for (int i = 0; i < offerSlotPanels.length; ++i) { - offerSlotPanels[i] = new GrandExchangeOfferSlot(itemManager); + offerSlotPanels[i] = new GrandExchangeOfferSlot(); offerPanel.add(offerSlotPanels[i]); } @@ -73,9 +75,9 @@ class GrandExchangePanel extends PluginPanel tabbedPane.addTab("Search", searchPanel); } - void updateOffer(GrandExchangeOffer newOffer, int slot) + void updateOffer(ItemComposition item, BufferedImage itemImage, GrandExchangeOffer newOffer, int slot) { - offerSlotPanels[slot].updateOffer(newOffer); + offerSlotPanels[slot].updateOffer(item, itemImage, newOffer); } void showSearch() 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 e78e4f50ca..95850415b4 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 @@ -36,6 +36,7 @@ import javax.imageio.ImageIO; import javax.inject.Inject; import javax.swing.SwingUtilities; import net.runelite.api.Client; +import net.runelite.api.GrandExchangeOffer; import net.runelite.api.ItemComposition; import net.runelite.api.Point; import net.runelite.api.events.ConfigChanged; @@ -44,6 +45,7 @@ import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetInfo; import net.runelite.api.widgets.WidgetItem; import net.runelite.client.config.ConfigManager; +import net.runelite.client.game.ItemManager; import net.runelite.client.input.MouseListener; import net.runelite.client.input.MouseManager; import net.runelite.client.plugins.Plugin; @@ -62,6 +64,9 @@ public class GrandExchangePlugin extends Plugin private MouseListener itemClick; + @Inject + private ItemManager itemManager; + @Inject private MouseManager mouseManager; @@ -179,6 +184,10 @@ public class GrandExchangePlugin extends Plugin @Subscribe public void onGrandExchangeOfferChanged(GrandExchangeOfferChanged offerEvent) { - SwingUtilities.invokeLater(() -> panel.updateOffer(offerEvent.getOffer(), offerEvent.getSlot())); + GrandExchangeOffer offer = offerEvent.getOffer(); + ItemComposition offerItem = itemManager.getItemComposition(offer.getItemId()); + boolean shouldStack = offerItem.isStackable() || offer.getTotalQuantity() > 1; + BufferedImage itemImage = itemManager.getImage(offer.getItemId(), offer.getTotalQuantity(), shouldStack); + SwingUtilities.invokeLater(() -> panel.updateOffer(offerItem, itemImage, offerEvent.getOffer(), offerEvent.getSlot())); } } diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/grandexchange/GrandExchangeOfferSlotTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/grandexchange/GrandExchangeOfferSlotTest.java index 99b0753c9e..216b6493c9 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/grandexchange/GrandExchangeOfferSlotTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/grandexchange/GrandExchangeOfferSlotTest.java @@ -29,11 +29,8 @@ import java.awt.image.BufferedImage; import net.runelite.api.GrandExchangeOffer; import net.runelite.api.GrandExchangeOfferState; import net.runelite.api.ItemComposition; -import net.runelite.client.game.ItemManager; import org.junit.Test; import org.junit.runner.RunWith; -import static org.mockito.Matchers.anyBoolean; -import static org.mockito.Matchers.anyInt; import org.mockito.Mock; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -42,21 +39,16 @@ import org.mockito.runners.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class GrandExchangeOfferSlotTest { - @Mock - private ItemManager itemManager; - @Mock private GrandExchangeOffer offer; @Test public void testUpdateOffer() { - when(itemManager.getItemComposition(anyInt())).thenReturn(mock(ItemComposition.class)); - when(itemManager.getImage(anyInt(), anyInt(), anyBoolean())).thenReturn(mock(BufferedImage.class)); when(offer.getState()).thenReturn(GrandExchangeOfferState.CANCELLED); - GrandExchangeOfferSlot offerSlot = new GrandExchangeOfferSlot(itemManager); - offerSlot.updateOffer(offer); + GrandExchangeOfferSlot offerSlot = new GrandExchangeOfferSlot(); + offerSlot.updateOffer(mock(ItemComposition.class), mock(BufferedImage.class), offer); } }