diff --git a/forge-core/src/main/java/forge/card/CardDb.java b/forge-core/src/main/java/forge/card/CardDb.java index c51cb83ea75..9449b389ab8 100644 --- a/forge-core/src/main/java/forge/card/CardDb.java +++ b/forge-core/src/main/java/forge/card/CardDb.java @@ -79,12 +79,17 @@ public final class CardDb implements ICardDatabase { this.isFoil = isFoil; } - public static CardRequest fromString(String name) { + public static CardRequest fromString(String name) { boolean isFoil = name.endsWith(foilSuffix); if (isFoil) { name = name.substring(0, name.length() - foilSuffix.length()); } + String preferredArt = artPrefs.get(name); + if (preferredArt != null) { //account for preferred art if needed + name += NameSetSeparator + preferredArt; + } + String[] nameParts = TextUtil.split(name, NameSetSeparator); int setPos = nameParts.length >= 2 && !StringUtils.isNumeric(nameParts[1]) ? 1 : -1; @@ -189,10 +194,6 @@ public final class CardDb implements ICardDatabase { @Override public PaperCard getCard(String cardName) { - String preferredArt = artPrefs.get(cardName); - if (preferredArt != null) { //account for preferred art if needed - cardName += NameSetSeparator + preferredArt; - } CardRequest request = CardRequest.fromString(cardName); return tryGetCard(request); } @@ -217,10 +218,10 @@ public final class CardDb implements ICardDatabase { } return tryGetCard(request); } - + private PaperCard tryGetCard(CardRequest request) { Collection cards = allCardsByName.get(request.cardName); - if (null == cards) { return null; } + if (cards == null) { return null; } PaperCard result = null; @@ -228,18 +229,23 @@ public final class CardDb implements ICardDatabase { if (reqEdition != null && !editions.contains(reqEdition)) { CardEdition edition = editions.get(reqEdition); if (edition != null) { - reqEdition = edition.getCode(); + reqEdition = edition.getCode(); } } if (request.artIndex <= 0) { // this stands for 'random art' - List candidates = new ArrayList(9); // 9 cards with same name per set is a maximum of what has been printed (Arnchenemy) - for (PaperCard pc : cards) { - if (pc.getEdition().equalsIgnoreCase(reqEdition) || reqEdition == null) { - candidates.add(pc); + Collection candidates; + if (reqEdition == null) { + candidates = cards; + } + else { + candidates = new ArrayList(); + for (PaperCard pc : cards) { + if (pc.getEdition().equalsIgnoreCase(reqEdition)) { + candidates.add(pc); + } } } - if (candidates.isEmpty()) { return null; } diff --git a/forge-core/src/main/java/forge/deck/CardPool.java b/forge-core/src/main/java/forge/deck/CardPool.java index 3a433dc523b..9d9889afb3e 100644 --- a/forge-core/src/main/java/forge/deck/CardPool.java +++ b/forge-core/src/main/java/forge/deck/CardPool.java @@ -64,7 +64,7 @@ public class CardPool extends ItemPool { public void add(String cardName, String setCode, final int artIndex, final int amount) { PaperCard cp = StaticData.instance().getCommonCards().getCard(cardName, setCode, artIndex); boolean isCommonCard = cp != null; - if ( !isCommonCard ) { + if (!isCommonCard) { cp = StaticData.instance().getVariantCards().getCard(cardName, setCode); } diff --git a/forge-core/src/main/java/forge/util/Aggregates.java b/forge-core/src/main/java/forge/util/Aggregates.java index e43e4a07646..fbc3a7853f5 100644 --- a/forge-core/src/main/java/forge/util/Aggregates.java +++ b/forge-core/src/main/java/forge/util/Aggregates.java @@ -118,7 +118,6 @@ public class Aggregates { return result; } - public static final Iterable uniqueByLast(final Iterable source, final Function fnUniqueKey) { // this might be exotic final Map uniques = new Hashtable(); for (final U c : source) { diff --git a/forge-gui-mobile/src/forge/itemmanager/CardManager.java b/forge-gui-mobile/src/forge/itemmanager/CardManager.java index d4e9e713cc3..c22cba9a8bf 100644 --- a/forge-gui-mobile/src/forge/itemmanager/CardManager.java +++ b/forge-gui-mobile/src/forge/itemmanager/CardManager.java @@ -1,5 +1,6 @@ package forge.itemmanager; +import java.util.HashSet; import java.util.Map.Entry; import forge.Graphics; @@ -7,6 +8,7 @@ import forge.assets.FSkinColor; import forge.assets.FSkinFont; import forge.card.CardRenderer; import forge.card.CardZoom; +import forge.deck.CardPool; import forge.item.PaperCard; import forge.itemmanager.filters.CardColorFilter; import forge.itemmanager.filters.CardFormatFilter; @@ -34,6 +36,22 @@ public class CardManager extends ItemManager { return createSearchFilter(this); } + @Override + protected Iterable> createUniqueList(final Iterable> source) { + boolean isInfinite = isInfinite(); + HashSet usedCardNames = isInfinite ? new HashSet() : null; + String cardName; + final CardPool uniques = new CardPool(); + for (Entry item : source) { + cardName = item.getKey().getName(); + if (isInfinite && !usedCardNames.add(cardName)) { + continue; //don't add card more than once if infinite + } + uniques.add(cardName, item.getValue()); + } + return uniques; + } + /* Static overrides shared with SpellShopManager*/ public static void addDefaultFilters(final ItemManager itemManager) { diff --git a/forge-gui-mobile/src/forge/itemmanager/ItemManager.java b/forge-gui-mobile/src/forge/itemmanager/ItemManager.java index e67c244fb00..dd500fd8520 100644 --- a/forge-gui-mobile/src/forge/itemmanager/ItemManager.java +++ b/forge-gui-mobile/src/forge/itemmanager/ItemManager.java @@ -847,6 +847,10 @@ public abstract class ItemManager extends FContainer im updateView(true, getSelectedItems()); } + protected Iterable> createUniqueList(final Iterable> source) { + return Aggregates.uniqueByLast(source, pool.FN_GET_NAME); + } + /** * * updateView. @@ -858,43 +862,37 @@ public abstract class ItemManager extends FContainer im if (useFilter || wantUnique || forceFilter) { model.clear(); - } - if (useFilter && wantUnique) { - Predicate> filterForPool = Predicates.compose(filterPredicate, pool.FN_GET_KEY); - Iterable> items = Aggregates.uniqueByLast(Iterables.filter(pool, filterForPool), pool.FN_GET_NAME); + Iterable> items = pool; + if (useFilter) { + Predicate> pred = Predicates.compose(filterPredicate, pool.FN_GET_KEY); + items = Iterables.filter(pool, pred); + } + if (wantUnique) { + items = createUniqueList(items); + } model.addItems(items); } - else if (useFilter) { - Predicate> pred = Predicates.compose(filterPredicate, pool.FN_GET_KEY); - model.addItems(Iterables.filter(pool, pred)); - } - else if (wantUnique) { - Iterable> items = Aggregates.uniqueByLast(pool, pool.FN_GET_NAME); - model.addItems(items); - } - else if (!useFilter && forceFilter) { - model.addItems(pool); - } currentView.refresh(itemsToSelect, getSelectedIndex(), forceFilter ? 0 : currentView.getScrollValue()); //update ratio of # in filtered pool / # in total pool - int total; + int totalCount; + int filteredCount = getFilteredItems().countAll(); if (!useFilter) { - total = getFilteredItems().countAll(); + totalCount = filteredCount; } else if (wantUnique) { - total = 0; - Iterable> items = Aggregates.uniqueByLast(pool, pool.FN_GET_NAME); + totalCount = 0; + Iterable> items = createUniqueList(pool); for (Entry entry : items) { - total += entry.getValue(); + totalCount += entry.getValue(); } } else { - total = pool.countAll(); + totalCount = pool.countAll(); } - searchFilter.setRatio("(" + getFilteredItems().countAll() + " / " + total + ")"); + searchFilter.setRatio("(" + filteredCount + " / " + totalCount + ")"); } /**