ge plugin: move item composition and image calls off of awt thread

This commit is contained in:
Adam
2018-03-17 18:47:52 -04:00
parent eac4f5d30e
commit d35ec38577
4 changed files with 21 additions and 26 deletions

View File

@@ -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"));

View File

@@ -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()

View File

@@ -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()));
}
}

View File

@@ -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);
}
}