diff --git a/forge-core/src/main/java/forge/card/CardDb.java b/forge-core/src/main/java/forge/card/CardDb.java index f71b0b79d85..23f4360b083 100644 --- a/forge-core/src/main/java/forge/card/CardDb.java +++ b/forge-core/src/main/java/forge/card/CardDb.java @@ -347,6 +347,11 @@ public final class CardDb implements ICardDatabase { return roAllCards; } + @Override + public List getAllCards(String cardName) { + return allCardsByName.get(cardName); + } + /** Returns a modifiable list of cards matching the given predicate */ @Override public List getAllCards(Predicate predicate) { diff --git a/forge-core/src/main/java/forge/card/ICardDatabase.java b/forge-core/src/main/java/forge/card/ICardDatabase.java index c8ece9228c1..6c1ffb3dca2 100644 --- a/forge-core/src/main/java/forge/card/ICardDatabase.java +++ b/forge-core/src/main/java/forge/card/ICardDatabase.java @@ -25,6 +25,7 @@ public interface ICardDatabase extends Iterable { Collection getUniqueCards(); List getAllCards(); + List getAllCards(String cardName); List getAllCards(Predicate predicate); Predicate wasPrintedInSets(List allowedSetCodes); diff --git a/forge-gui-mobile/src/forge/deck/FDeckEditor.java b/forge-gui-mobile/src/forge/deck/FDeckEditor.java index 051c0567031..8a884840622 100644 --- a/forge-gui-mobile/src/forge/deck/FDeckEditor.java +++ b/forge-gui-mobile/src/forge/deck/FDeckEditor.java @@ -1,5 +1,6 @@ package forge.deck; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -21,6 +22,7 @@ import forge.assets.FSkinFont; import forge.assets.FSkinImage; import forge.assets.FTextureRegionImage; import forge.card.CardEdition; +import forge.card.CardPreferences; import forge.card.CardRulesPredicates; import forge.card.CardZoom; import forge.deck.io.DeckPreferences; @@ -759,7 +761,7 @@ public class FDeckEditor extends TabPageScreen { @Override protected void buildMenu(final FDropDownMenu menu, final PaperCard card) { - addItem(menu, "Add", "to " + parentScreen.getMainDeckPage().cardManager.getCaption().toLowerCase(), parentScreen.getMainDeckPage().getIcon(), true, true, new Callback() { + addItem(menu, "Add", "to " + parentScreen.getMainDeckPage().cardManager.getCaption(), parentScreen.getMainDeckPage().getIcon(), true, true, new Callback() { @Override public void run(Integer result) { if (result == null || result <= 0) { return; } @@ -771,7 +773,7 @@ public class FDeckEditor extends TabPageScreen { } }); if (parentScreen.getSideboardPage() != null) { - addItem(menu, "Add", "to sideboard", parentScreen.getSideboardPage().getIcon(), true, true, new Callback() { + addItem(menu, "Add", "to Sideboard", parentScreen.getSideboardPage().getIcon(), true, true, new Callback() { @Override public void run(Integer result) { if (result == null || result <= 0) { return; } @@ -785,7 +787,7 @@ public class FDeckEditor extends TabPageScreen { } if (parentScreen.getCommanderPage() != null) { if (card.getRules().getType().isLegendary() && card.getRules().getType().isCreature() && !parentScreen.getCommanderPage().cardManager.getPool().contains(card)) { - addItem(menu, "Set", "as commander", parentScreen.getCommanderPage().getIcon(), true, true, new Callback() { + addItem(menu, "Set", "as Commander", parentScreen.getCommanderPage().getIcon(), true, true, new Callback() { @Override public void run(Integer result) { if (result == null || result <= 0) { return; } @@ -801,6 +803,56 @@ public class FDeckEditor extends TabPageScreen { }); } } + + //add option to add or remove card from favorites + final CardPreferences prefs = CardPreferences.getPrefs(card); + if (prefs.getStarCount() == 0) { + menu.addItem(new FMenuItem("Add to Favorites", FSkinImage.STAR_FILLED, new FEventHandler() { + @Override + public void handleEvent(FEvent e) { + prefs.setStarCount(1); + CardPreferences.save(); + } + })); + } + else { + menu.addItem(new FMenuItem("Remove from Favorites", FSkinImage.STAR_OUTINE, new FEventHandler() { + @Override + public void handleEvent(FEvent e) { + prefs.setStarCount(0); + CardPreferences.save(); + } + })); + } + + //if card has more than one art option, add item to change user's preferred art + final List artOptions = FModel.getMagicDb().getCommonCards().getAllCards(card.getName()); + if (artOptions != null && artOptions.size() > 1) { + menu.addItem(new FMenuItem("Change Preferred Art", FSkinImage.SETTINGS, new FEventHandler() { + @Override + public void handleEvent(FEvent e) { + //sort options so current option is on top and selected by default + List sortedOptions = new ArrayList(); + sortedOptions.add(card); + for (PaperCard option : artOptions) { + if (option != card) { + sortedOptions.add(option); + } + } + GuiChoose.oneOrNone("Select preferred art for " + card.getName(), sortedOptions, new Callback() { + @Override + public void run(PaperCard result) { + if (result != null) { + if (result != card) { + cardManager.replaceAll(card, result); + } + prefs.setPreferredArt(result.getEdition() + "|" + result.getArtIndex()); + } + } + }); + } + })); + } } } @@ -924,7 +976,7 @@ public class FDeckEditor extends TabPageScreen { } }); } - addItem(menu, "Move", "to sideboard", parentScreen.getSideboardPage().getIcon(), false, false, new Callback() { + addItem(menu, "Move", "to Sideboard", parentScreen.getSideboardPage().getIcon(), false, false, new Callback() { @Override public void run(Integer result) { if (result == null || result <= 0) { return; } @@ -959,7 +1011,7 @@ public class FDeckEditor extends TabPageScreen { } }); } - addItem(menu, "Move", "to main deck", parentScreen.getMainDeckPage().getIcon(), false, false, new Callback() { + addItem(menu, "Move", "to Main Deck", parentScreen.getMainDeckPage().getIcon(), false, false, new Callback() { @Override public void run(Integer result) { if (result == null || result <= 0) { return; } @@ -1029,7 +1081,7 @@ public class FDeckEditor extends TabPageScreen { if (parentScreen.getCommanderPage() != null && deckSection != DeckSection.Commander) { if (card.getRules().getType().isLegendary() && card.getRules().getType().isCreature() && !parentScreen.getCommanderPage().cardManager.getPool().contains(card)) { - addItem(menu, "Set", "as commander", parentScreen.getCommanderPage().getIcon(), false, false, new Callback() { + addItem(menu, "Set", "as Commander", parentScreen.getCommanderPage().getIcon(), false, false, new Callback() { @Override public void run(Integer result) { if (result == null || result <= 0) { return; } diff --git a/forge-gui-mobile/src/forge/itemmanager/ItemManager.java b/forge-gui-mobile/src/forge/itemmanager/ItemManager.java index adc26d8a5a7..1e8336745d8 100644 --- a/forge-gui-mobile/src/forge/itemmanager/ItemManager.java +++ b/forge-gui-mobile/src/forge/itemmanager/ItemManager.java @@ -163,7 +163,7 @@ public abstract class ItemManager extends FContainer im } public void setup(ItemManagerConfig config0, Map colOverrides) { config = config0; - setWantUnique(true); //set want unique for mobile game by default regardless of config setting + setWantUnique(config0.getUniqueCardsOnly()); //ensure sort cols ordered properly final List cols = new LinkedList(); @@ -674,6 +674,20 @@ public abstract class ItemManager extends FContainer im updateView(false, null); } + public void replaceAll(final T item, final T replacement) { + int count = pool.count(item); + if (count == 0) { return; } + + final Iterable itemsToSelect = currentView == listView ? getSelectedItems() : null; + + pool.removeAll(item); + pool.add(replacement, count); + if (isUnfiltered()) { + model.replaceAll(item, replacement); + } + updateView(false, itemsToSelect); + } + /** * * scrollSelectionIntoView. diff --git a/forge-gui/src/main/java/forge/card/CardPreferences.java b/forge-gui/src/main/java/forge/card/CardPreferences.java index 2e167f8656a..e44012540ef 100644 --- a/forge-gui/src/main/java/forge/card/CardPreferences.java +++ b/forge-gui/src/main/java/forge/card/CardPreferences.java @@ -45,6 +45,10 @@ public class CardPreferences { final Element el = (Element)cards.item(i); allPrefs.put(el.getAttribute("name"), prefs); prefs.starCount = Integer.parseInt(el.getAttribute("stars")); + prefs.preferredArt = el.getAttribute("art"); + if (prefs.preferredArt.length() == 0) { + prefs.preferredArt = null; //don't store empty string + } } } catch (FileNotFoundException e) { @@ -67,10 +71,16 @@ public class CardPreferences { document.appendChild(root); for (Map.Entry entry : allPrefs.entrySet()) { - if (entry.getValue().starCount > 0) { + CardPreferences prefs = entry.getValue(); + if (prefs.starCount > 0 || prefs.preferredArt != null) { Element card = document.createElement("card"); card.setAttribute("name", entry.getKey()); - card.setAttribute("stars", String.valueOf(entry.getValue().starCount)); + if (prefs.starCount > 0) { + card.setAttribute("stars", String.valueOf(prefs.starCount)); + } + if (prefs.preferredArt != null) { + card.setAttribute("art", prefs.preferredArt); + } root.appendChild(card); } } @@ -82,15 +92,24 @@ public class CardPreferences { } private int starCount; + private String preferredArt; private CardPreferences() { } public int getStarCount() { - return this.starCount; + return starCount; } public void setStarCount(int starCount0) { - this.starCount = starCount0; + starCount = starCount0; + } + + public String getPreferredArt() { + return preferredArt; + } + + public void setPreferredArt(String preferredArt0) { + preferredArt = preferredArt0; } } \ No newline at end of file diff --git a/forge-gui/src/main/java/forge/itemmanager/ItemManagerConfig.java b/forge-gui/src/main/java/forge/itemmanager/ItemManagerConfig.java index bcd64f65121..52efe6959fe 100644 --- a/forge-gui/src/main/java/forge/itemmanager/ItemManagerConfig.java +++ b/forge-gui/src/main/java/forge/itemmanager/ItemManagerConfig.java @@ -22,7 +22,7 @@ import org.w3c.dom.NodeList; public enum ItemManagerConfig { STRING_ONLY(SColumnUtil.getStringColumn(), false, false, true, null, null, 1, 0), - CARD_CATALOG(SColumnUtil.getCatalogDefaultColumns(true), true, false, false, + CARD_CATALOG(SColumnUtil.getCatalogDefaultColumns(true), true, true, false, null, null, 4, 0), DECK_EDITOR(SColumnUtil.getDeckEditorDefaultColumns(), false, false, true, GroupDef.DEFAULT, ColumnDef.CMC, 4, 1), diff --git a/forge-gui/src/main/java/forge/itemmanager/ItemManagerModel.java b/forge-gui/src/main/java/forge/itemmanager/ItemManagerModel.java index 6c48f374eab..1a367c9233b 100644 --- a/forge-gui/src/main/java/forge/itemmanager/ItemManagerModel.java +++ b/forge-gui/src/main/java/forge/itemmanager/ItemManagerModel.java @@ -124,6 +124,15 @@ public final class ItemManagerModel { } } + public void replaceAll(final T item0, final T replacement0) { + int count = this.data.count(item0); + if (count > 0) { + this.data.removeAll(item0); + this.data.add(replacement0, count); + isListInSync = false; + } + } + /** * Adds a item to the model. *