Support changing preferred art for cards in catalog

Support adding and removing catalog cards from favorites
Only show unique cards in Catalog by default
This commit is contained in:
drdev
2014-07-31 17:55:11 +00:00
parent 3502714bfd
commit d7664e6cfc
7 changed files with 112 additions and 12 deletions

View File

@@ -347,6 +347,11 @@ public final class CardDb implements ICardDatabase {
return roAllCards;
}
@Override
public List<PaperCard> getAllCards(String cardName) {
return allCardsByName.get(cardName);
}
/** Returns a modifiable list of cards matching the given predicate */
@Override
public List<PaperCard> getAllCards(Predicate<PaperCard> predicate) {

View File

@@ -25,6 +25,7 @@ public interface ICardDatabase extends Iterable<PaperCard> {
Collection<PaperCard> getUniqueCards();
List<PaperCard> getAllCards();
List<PaperCard> getAllCards(String cardName);
List<PaperCard> getAllCards(Predicate<PaperCard> predicate);
Predicate<? super PaperCard> wasPrintedInSets(List<String> allowedSetCodes);

View File

@@ -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<FDeckEditor> {
@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<Integer>() {
addItem(menu, "Add", "to " + parentScreen.getMainDeckPage().cardManager.getCaption(), parentScreen.getMainDeckPage().getIcon(), true, true, new Callback<Integer>() {
@Override
public void run(Integer result) {
if (result == null || result <= 0) { return; }
@@ -771,7 +773,7 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
}
});
if (parentScreen.getSideboardPage() != null) {
addItem(menu, "Add", "to sideboard", parentScreen.getSideboardPage().getIcon(), true, true, new Callback<Integer>() {
addItem(menu, "Add", "to Sideboard", parentScreen.getSideboardPage().getIcon(), true, true, new Callback<Integer>() {
@Override
public void run(Integer result) {
if (result == null || result <= 0) { return; }
@@ -785,7 +787,7 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
}
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<Integer>() {
addItem(menu, "Set", "as Commander", parentScreen.getCommanderPage().getIcon(), true, true, new Callback<Integer>() {
@Override
public void run(Integer result) {
if (result == null || result <= 0) { return; }
@@ -801,6 +803,56 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
});
}
}
//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<PaperCard> 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<PaperCard> sortedOptions = new ArrayList<PaperCard>();
sortedOptions.add(card);
for (PaperCard option : artOptions) {
if (option != card) {
sortedOptions.add(option);
}
}
GuiChoose.oneOrNone("Select preferred art for " + card.getName(), sortedOptions, new Callback<PaperCard>() {
@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<FDeckEditor> {
}
});
}
addItem(menu, "Move", "to sideboard", parentScreen.getSideboardPage().getIcon(), false, false, new Callback<Integer>() {
addItem(menu, "Move", "to Sideboard", parentScreen.getSideboardPage().getIcon(), false, false, new Callback<Integer>() {
@Override
public void run(Integer result) {
if (result == null || result <= 0) { return; }
@@ -959,7 +1011,7 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
}
});
}
addItem(menu, "Move", "to main deck", parentScreen.getMainDeckPage().getIcon(), false, false, new Callback<Integer>() {
addItem(menu, "Move", "to Main Deck", parentScreen.getMainDeckPage().getIcon(), false, false, new Callback<Integer>() {
@Override
public void run(Integer result) {
if (result == null || result <= 0) { return; }
@@ -1029,7 +1081,7 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
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<Integer>() {
addItem(menu, "Set", "as Commander", parentScreen.getCommanderPage().getIcon(), false, false, new Callback<Integer>() {
@Override
public void run(Integer result) {
if (result == null || result <= 0) { return; }

View File

@@ -163,7 +163,7 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
}
public void setup(ItemManagerConfig config0, Map<ColumnDef, ItemColumn> 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<ItemColumn> cols = new LinkedList<ItemColumn>();
@@ -674,6 +674,20 @@ public abstract class ItemManager<T extends InventoryItem> 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<T> itemsToSelect = currentView == listView ? getSelectedItems() : null;
pool.removeAll(item);
pool.add(replacement, count);
if (isUnfiltered()) {
model.replaceAll(item, replacement);
}
updateView(false, itemsToSelect);
}
/**
*
* scrollSelectionIntoView.

View File

@@ -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<String, CardPreferences> 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;
}
}

View File

@@ -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),

View File

@@ -124,6 +124,15 @@ public final class ItemManagerModel<T extends InventoryItem> {
}
}
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.
*