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;
|
return roAllCards;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<PaperCard> getAllCards(String cardName) {
|
||||||
|
return allCardsByName.get(cardName);
|
||||||
|
}
|
||||||
|
|
||||||
/** Returns a modifiable list of cards matching the given predicate */
|
/** Returns a modifiable list of cards matching the given predicate */
|
||||||
@Override
|
@Override
|
||||||
public List<PaperCard> getAllCards(Predicate<PaperCard> predicate) {
|
public List<PaperCard> getAllCards(Predicate<PaperCard> predicate) {
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ public interface ICardDatabase extends Iterable<PaperCard> {
|
|||||||
|
|
||||||
Collection<PaperCard> getUniqueCards();
|
Collection<PaperCard> getUniqueCards();
|
||||||
List<PaperCard> getAllCards();
|
List<PaperCard> getAllCards();
|
||||||
|
List<PaperCard> getAllCards(String cardName);
|
||||||
List<PaperCard> getAllCards(Predicate<PaperCard> predicate);
|
List<PaperCard> getAllCards(Predicate<PaperCard> predicate);
|
||||||
|
|
||||||
Predicate<? super PaperCard> wasPrintedInSets(List<String> allowedSetCodes);
|
Predicate<? super PaperCard> wasPrintedInSets(List<String> allowedSetCodes);
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package forge.deck;
|
package forge.deck;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@@ -21,6 +22,7 @@ import forge.assets.FSkinFont;
|
|||||||
import forge.assets.FSkinImage;
|
import forge.assets.FSkinImage;
|
||||||
import forge.assets.FTextureRegionImage;
|
import forge.assets.FTextureRegionImage;
|
||||||
import forge.card.CardEdition;
|
import forge.card.CardEdition;
|
||||||
|
import forge.card.CardPreferences;
|
||||||
import forge.card.CardRulesPredicates;
|
import forge.card.CardRulesPredicates;
|
||||||
import forge.card.CardZoom;
|
import forge.card.CardZoom;
|
||||||
import forge.deck.io.DeckPreferences;
|
import forge.deck.io.DeckPreferences;
|
||||||
@@ -759,7 +761,7 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void buildMenu(final FDropDownMenu menu, final PaperCard card) {
|
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
|
@Override
|
||||||
public void run(Integer result) {
|
public void run(Integer result) {
|
||||||
if (result == null || result <= 0) { return; }
|
if (result == null || result <= 0) { return; }
|
||||||
@@ -771,7 +773,7 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
if (parentScreen.getSideboardPage() != null) {
|
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
|
@Override
|
||||||
public void run(Integer result) {
|
public void run(Integer result) {
|
||||||
if (result == null || result <= 0) { return; }
|
if (result == null || result <= 0) { return; }
|
||||||
@@ -785,7 +787,7 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
|
|||||||
}
|
}
|
||||||
if (parentScreen.getCommanderPage() != null) {
|
if (parentScreen.getCommanderPage() != null) {
|
||||||
if (card.getRules().getType().isLegendary() && card.getRules().getType().isCreature() && !parentScreen.getCommanderPage().cardManager.getPool().contains(card)) {
|
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
|
@Override
|
||||||
public void run(Integer result) {
|
public void run(Integer result) {
|
||||||
if (result == null || result <= 0) { return; }
|
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
|
@Override
|
||||||
public void run(Integer result) {
|
public void run(Integer result) {
|
||||||
if (result == null || result <= 0) { return; }
|
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
|
@Override
|
||||||
public void run(Integer result) {
|
public void run(Integer result) {
|
||||||
if (result == null || result <= 0) { return; }
|
if (result == null || result <= 0) { return; }
|
||||||
@@ -1029,7 +1081,7 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
|
|||||||
|
|
||||||
if (parentScreen.getCommanderPage() != null && deckSection != DeckSection.Commander) {
|
if (parentScreen.getCommanderPage() != null && deckSection != DeckSection.Commander) {
|
||||||
if (card.getRules().getType().isLegendary() && card.getRules().getType().isCreature() && !parentScreen.getCommanderPage().cardManager.getPool().contains(card)) {
|
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
|
@Override
|
||||||
public void run(Integer result) {
|
public void run(Integer result) {
|
||||||
if (result == null || result <= 0) { return; }
|
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) {
|
public void setup(ItemManagerConfig config0, Map<ColumnDef, ItemColumn> colOverrides) {
|
||||||
config = config0;
|
config = config0;
|
||||||
setWantUnique(true); //set want unique for mobile game by default regardless of config setting
|
setWantUnique(config0.getUniqueCardsOnly());
|
||||||
|
|
||||||
//ensure sort cols ordered properly
|
//ensure sort cols ordered properly
|
||||||
final List<ItemColumn> cols = new LinkedList<ItemColumn>();
|
final List<ItemColumn> cols = new LinkedList<ItemColumn>();
|
||||||
@@ -674,6 +674,20 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
|
|||||||
updateView(false, null);
|
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.
|
* scrollSelectionIntoView.
|
||||||
|
|||||||
@@ -45,6 +45,10 @@ public class CardPreferences {
|
|||||||
final Element el = (Element)cards.item(i);
|
final Element el = (Element)cards.item(i);
|
||||||
allPrefs.put(el.getAttribute("name"), prefs);
|
allPrefs.put(el.getAttribute("name"), prefs);
|
||||||
prefs.starCount = Integer.parseInt(el.getAttribute("stars"));
|
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) {
|
catch (FileNotFoundException e) {
|
||||||
@@ -67,10 +71,16 @@ public class CardPreferences {
|
|||||||
document.appendChild(root);
|
document.appendChild(root);
|
||||||
|
|
||||||
for (Map.Entry<String, CardPreferences> entry : allPrefs.entrySet()) {
|
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");
|
Element card = document.createElement("card");
|
||||||
card.setAttribute("name", entry.getKey());
|
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);
|
root.appendChild(card);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -82,15 +92,24 @@ public class CardPreferences {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private int starCount;
|
private int starCount;
|
||||||
|
private String preferredArt;
|
||||||
|
|
||||||
private CardPreferences() {
|
private CardPreferences() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getStarCount() {
|
public int getStarCount() {
|
||||||
return this.starCount;
|
return starCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setStarCount(int starCount0) {
|
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 {
|
public enum ItemManagerConfig {
|
||||||
STRING_ONLY(SColumnUtil.getStringColumn(), false, false, true,
|
STRING_ONLY(SColumnUtil.getStringColumn(), false, false, true,
|
||||||
null, null, 1, 0),
|
null, null, 1, 0),
|
||||||
CARD_CATALOG(SColumnUtil.getCatalogDefaultColumns(true), true, false, false,
|
CARD_CATALOG(SColumnUtil.getCatalogDefaultColumns(true), true, true, false,
|
||||||
null, null, 4, 0),
|
null, null, 4, 0),
|
||||||
DECK_EDITOR(SColumnUtil.getDeckEditorDefaultColumns(), false, false, true,
|
DECK_EDITOR(SColumnUtil.getDeckEditorDefaultColumns(), false, false, true,
|
||||||
GroupDef.DEFAULT, ColumnDef.CMC, 4, 1),
|
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.
|
* Adds a item to the model.
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user