diff --git a/forge-game/src/main/java/forge/game/keyword/Keyword.java b/forge-game/src/main/java/forge/game/keyword/Keyword.java index 44f73d02563..6213c670657 100644 --- a/forge-game/src/main/java/forge/game/keyword/Keyword.java +++ b/forge-game/src/main/java/forge/game/keyword/Keyword.java @@ -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> cardKeywordsLookup = new HashMap>(); + private static final Map> cardKeywordSetLookup = new HashMap>(); public static Set getKeywordSet(PaperCard card) { - Set keywordSet = cardKeywordsLookup.get(card); + String key = card.getName(); + Set keywordSet = cardKeywordSetLookup.get(key); if (keywordSet == null) { keywordSet = new HashSet(); List 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 cards = StaticData.instance().getCommonCards().getUniqueCards(); + for (PaperCard card : cards) { + getKeywordSet(card); + } + } + }; + } + return null; + } } diff --git a/forge-gui-mobile/src/forge/itemmanager/filters/AdvancedSearchFilter.java b/forge-gui-mobile/src/forge/itemmanager/filters/AdvancedSearchFilter.java index 2c768f7929a..cd569343374 100644 --- a/forge-gui-mobile/src/forge/itemmanager/filters/AdvancedSearchFilter.java +++ b/forge-gui-mobile/src/forge/itemmanager/filters/AdvancedSearchFilter.java @@ -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 extends ItemFilter 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); + } + } } }); } diff --git a/forge-gui-mobile/src/forge/screens/LoadingOverlay.java b/forge-gui-mobile/src/forge/screens/LoadingOverlay.java index b317e1e1176..fbe0d29ae7c 100644 --- a/forge-gui-mobile/src/forge/screens/LoadingOverlay.java +++ b/forge-gui-mobile/src/forge/screens/LoadingOverlay.java @@ -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) { diff --git a/forge-gui/src/main/java/forge/itemmanager/AdvancedSearch.java b/forge-gui/src/main/java/forge/itemmanager/AdvancedSearch.java index 8cf5a069883..92ee835d23a 100644 --- a/forge-gui/src/main/java/forge/itemmanager/AdvancedSearch.java +++ b/forge-gui/src/main/java/forge/itemmanager/AdvancedSearch.java @@ -891,6 +891,14 @@ public class AdvancedSearch { return caption.substring(emptyCaption.length()); } + public FilterOption getOption() { + return option; + } + + public FilterOperator getOperator() { + return operator; + } + public Predicate getPredicate() { return predicate; }