mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 03:08:02 +00:00
Support preloading keywords for improved performance
This commit is contained in:
@@ -2,6 +2,7 @@ package forge.game.keyword;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import forge.StaticData;
|
||||
import forge.game.card.Card;
|
||||
import forge.item.PaperCard;
|
||||
|
||||
@@ -182,10 +183,11 @@ public enum Keyword {
|
||||
return keywords;
|
||||
}
|
||||
|
||||
private static final Map<PaperCard, Set<Keyword>> cardKeywordsLookup = new HashMap<PaperCard, Set<Keyword>>();
|
||||
private static final Map<String, Set<Keyword>> cardKeywordSetLookup = new HashMap<String, Set<Keyword>>();
|
||||
|
||||
public static Set<Keyword> getKeywordSet(PaperCard card) {
|
||||
Set<Keyword> keywordSet = cardKeywordsLookup.get(card);
|
||||
String key = card.getName();
|
||||
Set<Keyword> keywordSet = cardKeywordSetLookup.get(key);
|
||||
if (keywordSet == null) {
|
||||
keywordSet = new HashSet<Keyword>();
|
||||
List<String> keywords = Card.getCardForUi(card).getKeywords();
|
||||
@@ -195,8 +197,23 @@ public enum Keyword {
|
||||
keywordSet.add(keyword);
|
||||
}
|
||||
}
|
||||
cardKeywordsLookup.put(card, keywordSet);
|
||||
cardKeywordSetLookup.put(card.getName(), keywordSet);
|
||||
}
|
||||
return keywordSet;
|
||||
}
|
||||
|
||||
public static Runnable getPreloadTask() {
|
||||
if (cardKeywordSetLookup.size() < 10000) { //allow preloading even if some but not all cards loaded
|
||||
return new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
final Collection<PaperCard> cards = StaticData.instance().getCommonCards().getUniqueCards();
|
||||
for (PaperCard card : cards) {
|
||||
getKeywordSet(card);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,11 +9,14 @@ import com.google.common.base.Predicates;
|
||||
|
||||
import forge.FThreads;
|
||||
import forge.Forge;
|
||||
import forge.game.keyword.Keyword;
|
||||
import forge.item.InventoryItem;
|
||||
import forge.itemmanager.AdvancedSearch;
|
||||
import forge.itemmanager.ItemManager;
|
||||
import forge.itemmanager.AdvancedSearch.FilterOption;
|
||||
import forge.menu.FTooltip;
|
||||
import forge.screens.FScreen;
|
||||
import forge.screens.LoadingOverlay;
|
||||
import forge.toolbox.FContainer;
|
||||
import forge.toolbox.FDisplayObject;
|
||||
import forge.toolbox.FEvent;
|
||||
@@ -338,6 +341,13 @@ public class AdvancedSearchFilter<T extends InventoryItem> extends ItemFilter<T>
|
||||
else {
|
||||
btnFilter.setText(emptyFilterText);
|
||||
}
|
||||
if (filter.getOption() == FilterOption.CARD_KEYWORDS) {
|
||||
//the first time the user selects keywords, preload keywords for all cards
|
||||
Runnable preloadTask = Keyword.getPreloadTask();
|
||||
if (preloadTask != null) {
|
||||
LoadingOverlay.runBackgroundTask("Loading keywords...", preloadTask);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -38,6 +38,23 @@ public class LoadingOverlay extends FOverlay {
|
||||
});
|
||||
}
|
||||
|
||||
public static void runBackgroundTask(String caption0, final Runnable task) {
|
||||
final LoadingOverlay loader = new LoadingOverlay(caption0);
|
||||
loader.show();
|
||||
FThreads.invokeInBackgroundThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
task.run();
|
||||
FThreads.invokeInEdtLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
loader.hide();
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private String caption;
|
||||
|
||||
public LoadingOverlay(String caption0) {
|
||||
|
||||
@@ -891,6 +891,14 @@ public class AdvancedSearch {
|
||||
return caption.substring(emptyCaption.length());
|
||||
}
|
||||
|
||||
public FilterOption getOption() {
|
||||
return option;
|
||||
}
|
||||
|
||||
public FilterOperator getOperator() {
|
||||
return operator;
|
||||
}
|
||||
|
||||
public Predicate<T> getPredicate() {
|
||||
return predicate;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user