mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-20 12:48:00 +00:00
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:
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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),
|
||||
|
||||
@@ -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.
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user