From 670f61fba24b42e501f1b683514867065fea1e6c Mon Sep 17 00:00:00 2001 From: Max Weber Date: Tue, 23 Oct 2018 16:00:05 -0600 Subject: [PATCH 1/3] loottracker: Lazily rebuild panels --- .../plugins/loottracker/LootTrackerBox.java | 4 ++++ .../plugins/loottracker/LootTrackerPanel.java | 18 +++++++++++------- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java index b4ffdcb44e..a0360ff1a1 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java @@ -162,6 +162,10 @@ class LootTrackerBox extends JPanel } records.add(record); + } + + void rebuild() + { buildItems(); priceLabel.setText(StackFormatter.quantityToStackSize(totalPrice) + " gp"); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java index 8764ad79c5..a4d7aaf8a3 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java @@ -325,7 +325,12 @@ class LootTrackerPanel extends PluginPanel final String subTitle = actorLevel > -1 ? "(lvl-" + actorLevel + ")" : ""; final LootTrackerRecord record = new LootTrackerRecord(eventName, subTitle, items, System.currentTimeMillis()); records.add(record); - buildBox(record); + LootTrackerBox box = buildBox(record); + if (box != null) + { + box.rebuild(); + updateOverall(); + } } /** @@ -381,6 +386,7 @@ class LootTrackerPanel extends PluginPanel logsContainer.removeAll(); boxes.clear(); records.forEach(this::buildBox); + boxes.forEach(LootTrackerBox::rebuild); updateOverall(); logsContainer.revalidate(); logsContainer.repaint(); @@ -391,12 +397,12 @@ class LootTrackerPanel extends PluginPanel * add its items to it, updating the log's overall price and kills. If not, a new log will be created * to hold this entry's information. */ - private void buildBox(LootTrackerRecord record) + private LootTrackerBox buildBox(LootTrackerRecord record) { // If this record is not part of current view, return if (!record.matches(currentView)) { - return; + return null; } // Group all similar loot together @@ -407,8 +413,7 @@ class LootTrackerPanel extends PluginPanel if (box.matches(record)) { box.combine(record); - updateOverall(); - return; + return box; } } } @@ -456,8 +461,7 @@ class LootTrackerPanel extends PluginPanel boxes.add(box); logsContainer.add(box, 0); - // Update overall - updateOverall(); + return box; } private void updateOverall() From 120be3ab1380f42e878ebb356a2f17811d2e5212 Mon Sep 17 00:00:00 2001 From: Max Weber Date: Tue, 23 Oct 2018 17:02:07 -0600 Subject: [PATCH 2/3] Limit amount of LootTrackerBoxes to 500 Otherwise its incredibly slow to switch to or from the ungrouped view. This isn't entirely correct because the header is also limited. --- .../plugins/loottracker/LootTrackerPanel.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java index a4d7aaf8a3..73384afd57 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java @@ -53,6 +53,8 @@ import net.runelite.client.util.StackFormatter; class LootTrackerPanel extends PluginPanel { + private static final int MAX_LOOT_BOXES = 500; + private static final ImageIcon SINGLE_LOOT_VIEW; private static final ImageIcon SINGLE_LOOT_VIEW_FADED; private static final ImageIcon SINGLE_LOOT_VIEW_HOVER; @@ -385,7 +387,15 @@ class LootTrackerPanel extends PluginPanel { logsContainer.removeAll(); boxes.clear(); - records.forEach(this::buildBox); + int start = 0; + if (!groupLoot && records.size() > MAX_LOOT_BOXES) + { + start = records.size() - MAX_LOOT_BOXES; + } + for (int i = start; i < records.size(); i++) + { + buildBox(records.get(i)); + } boxes.forEach(LootTrackerBox::rebuild); updateOverall(); logsContainer.revalidate(); @@ -461,6 +471,11 @@ class LootTrackerPanel extends PluginPanel boxes.add(box); logsContainer.add(box, 0); + if (!groupLoot && boxes.size() > MAX_LOOT_BOXES) + { + logsContainer.remove(boxes.remove(0)); + } + return box; } From b899a4b675062bc0fc2eae4b2032a79c33e97149 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Wed, 24 Oct 2018 08:58:16 +0200 Subject: [PATCH 3/3] Calculate total count/value from loot records instead of boxes Signed-off-by: Tomas Slusny --- .../plugins/loottracker/LootTrackerBox.java | 10 +++--- .../plugins/loottracker/LootTrackerPanel.java | 31 +++++++++++++++++-- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java index a0360ff1a1..eb079d3f86 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java @@ -63,9 +63,7 @@ class LootTrackerBox extends JPanel @Getter private final List records = new ArrayList<>(); - @Getter private long totalPrice; - private boolean hideIgnoredItems; private BiConsumer onItemToggle; @@ -116,7 +114,7 @@ class LootTrackerBox extends JPanel * * @return total amount of kills */ - long getTotalKills() + private long getTotalKills() { return hideIgnoredItems ? records.stream().filter(r -> !Arrays.stream(r.getItems()).allMatch(LootTrackerItem::isIgnored)).count() @@ -169,9 +167,11 @@ class LootTrackerBox extends JPanel buildItems(); priceLabel.setText(StackFormatter.quantityToStackSize(totalPrice) + " gp"); - if (records.size() > 1) + + final long kills = getTotalKills(); + if (kills > 1) { - subTitleLabel.setText("x " + records.size()); + subTitleLabel.setText("x " + kills); } repaint(); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java index 73384afd57..001e747bb4 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java @@ -481,8 +481,35 @@ class LootTrackerPanel extends PluginPanel private void updateOverall() { - final long overallGp = boxes.stream().mapToLong(LootTrackerBox::getTotalPrice).sum(); - final long overallKills = boxes.stream().mapToLong(LootTrackerBox::getTotalKills).sum(); + long overallKills = 0; + long overallGp = 0; + + for (LootTrackerRecord record : records) + { + if (!record.matches(currentView)) + { + continue; + } + + int present = record.getItems().length; + + for (LootTrackerItem item : record.getItems()) + { + if (hideIgnoredItems && item.isIgnored()) + { + present--; + continue; + } + + overallGp += item.getPrice(); + } + + if (present > 0) + { + overallKills++; + } + } + overallKillsLabel.setText(htmlLabel("Total count: ", overallKills)); overallGpLabel.setText(htmlLabel("Total value: ", overallGp)); }