mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 11:18:01 +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 java.util.*;
|
||||||
|
|
||||||
|
import forge.StaticData;
|
||||||
import forge.game.card.Card;
|
import forge.game.card.Card;
|
||||||
import forge.item.PaperCard;
|
import forge.item.PaperCard;
|
||||||
|
|
||||||
@@ -182,10 +183,11 @@ public enum Keyword {
|
|||||||
return keywords;
|
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) {
|
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) {
|
if (keywordSet == null) {
|
||||||
keywordSet = new HashSet<Keyword>();
|
keywordSet = new HashSet<Keyword>();
|
||||||
List<String> keywords = Card.getCardForUi(card).getKeywords();
|
List<String> keywords = Card.getCardForUi(card).getKeywords();
|
||||||
@@ -195,8 +197,23 @@ public enum Keyword {
|
|||||||
keywordSet.add(keyword);
|
keywordSet.add(keyword);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cardKeywordsLookup.put(card, keywordSet);
|
cardKeywordSetLookup.put(card.getName(), keywordSet);
|
||||||
}
|
}
|
||||||
return 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.FThreads;
|
||||||
import forge.Forge;
|
import forge.Forge;
|
||||||
|
import forge.game.keyword.Keyword;
|
||||||
import forge.item.InventoryItem;
|
import forge.item.InventoryItem;
|
||||||
import forge.itemmanager.AdvancedSearch;
|
import forge.itemmanager.AdvancedSearch;
|
||||||
import forge.itemmanager.ItemManager;
|
import forge.itemmanager.ItemManager;
|
||||||
|
import forge.itemmanager.AdvancedSearch.FilterOption;
|
||||||
import forge.menu.FTooltip;
|
import forge.menu.FTooltip;
|
||||||
import forge.screens.FScreen;
|
import forge.screens.FScreen;
|
||||||
|
import forge.screens.LoadingOverlay;
|
||||||
import forge.toolbox.FContainer;
|
import forge.toolbox.FContainer;
|
||||||
import forge.toolbox.FDisplayObject;
|
import forge.toolbox.FDisplayObject;
|
||||||
import forge.toolbox.FEvent;
|
import forge.toolbox.FEvent;
|
||||||
@@ -338,6 +341,13 @@ public class AdvancedSearchFilter<T extends InventoryItem> extends ItemFilter<T>
|
|||||||
else {
|
else {
|
||||||
btnFilter.setText(emptyFilterText);
|
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;
|
private String caption;
|
||||||
|
|
||||||
public LoadingOverlay(String caption0) {
|
public LoadingOverlay(String caption0) {
|
||||||
|
|||||||
@@ -891,6 +891,14 @@ public class AdvancedSearch {
|
|||||||
return caption.substring(emptyCaption.length());
|
return caption.substring(emptyCaption.length());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public FilterOption getOption() {
|
||||||
|
return option;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FilterOperator getOperator() {
|
||||||
|
return operator;
|
||||||
|
}
|
||||||
|
|
||||||
public Predicate<T> getPredicate() {
|
public Predicate<T> getPredicate() {
|
||||||
return predicate;
|
return predicate;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user