Feature: Set card editions as favorite (for deck importing purposes)

This commit is contained in:
lilacLunatic 2025-11-05 17:35:16 -03:00
parent 4ad97ef48c
commit 535ef2eb6e
6 changed files with 92 additions and 2 deletions

View file

@ -568,6 +568,8 @@ public class DragCardGrid extends JPanel implements DragCardSource, DragCardTarg
void duplicateCards(Collection<CardView> cards);
void markCardsAsFavorite(Collection<CardView> cards);
void invertCardSelection(Collection<CardView> cards);
void showAll();
@ -1181,6 +1183,13 @@ public class DragCardGrid extends JPanel implements DragCardSource, DragCardTarg
}
}
private void markAsFavorite() {
Collection<CardView> toFave = dragCardList();
for (DragCardGridListener l : listeners) {
l.markCardsAsFavorite(toFave);
}
}
private void invertSelection() {
Collection<CardView> toInvert = allCards;
for (DragCardGridListener l : listeners) {
@ -1980,6 +1989,10 @@ public class DragCardGrid extends JPanel implements DragCardSource, DragCardTarg
JMenuItem duplicateSelection = new JMenuItem("Duplicate selected cards");
duplicateSelection.addActionListener(e2 -> duplicateSelection());
menu.add(duplicateSelection);
JMenuItem markAsFavorite = new JMenuItem("Mark selected card editions as favorite");
markAsFavorite.addActionListener(e2 -> markAsFavorite());
menu.add(markAsFavorite);
}
menu.show(e.getComponent(), e.getX(), e.getY());
}

View file

@ -11,6 +11,7 @@ import mage.client.util.ClientEventType;
import mage.client.util.Event;
import mage.client.util.GUISizeHelper;
import mage.client.util.Listener;
import mage.client.preference.MagePreferences;
import mage.view.CardView;
import mage.view.CardsView;
@ -113,6 +114,17 @@ public class DeckArea extends javax.swing.JPanel {
deckList.addCardView(newCard, card);
}
}
@Override
public void markCardsAsFavorite(Collection<CardView> cards) {
deckList.deselectAll();
for (CardView card : cards) {
String name = card.getName();
String setCode = card.getExpansionSetCode();
String cardNumber = card.getCardNumber();
MagePreferences.setFavoriteCard(name, cardNumber, setCode);
}
}
@Override
public void invertCardSelection(Collection<CardView> cards) {
@ -154,6 +166,17 @@ public class DeckArea extends javax.swing.JPanel {
}
}
@Override
public void markCardsAsFavorite(Collection<CardView> cards) {
deckList.deselectAll();
for (CardView card : cards) {
String name = card.getName();
String setCode = card.getExpansionSetCode();
String cardNumber = card.getCardNumber();
MagePreferences.setFavoriteCard(name, cardNumber, setCode);
}
}
@Override
public void invertCardSelection(Collection<CardView> cards) {
// Invert Selection

View file

@ -759,6 +759,7 @@ public class DeckEditorPanel extends javax.swing.JPanel {
MageFrame.getDesktop().setCursor(new Cursor(Cursor.WAIT_CURSOR));
try {
DeckImporter importer = DeckImporter.getDeckImporter(file.getPath());
importer.setPreferences(MageFrame.getPreferences());
if (importer != null) {
StringBuilder errorMessages = new StringBuilder();
@ -822,7 +823,13 @@ public class DeckEditorPanel extends javax.swing.JPanel {
StringBuilder errorMessages = new StringBuilder();
MageFrame.getDesktop().setCursor(new Cursor(Cursor.WAIT_CURSOR));
try {
Deck deckToAppend = Deck.load(DeckImporter.importDeckFromFile(tempDeckPath, errorMessages, false), true, true);
DeckImporter deckImporter = DeckImporter.getDeckImporter(tempDeckPath);
DeckCardLists deckCardLists = new DeckCardLists();
if (deckImporter != null) {
deckImporter.setPreferences(MageFrame.getPreferences());
deckCardLists = deckImporter.importDeck(tempDeckPath, errorMessages, false);
}
Deck deckToAppend = Deck.load(deckCardLists, true, true);
processAndShowImportErrors(errorMessages);
this.deck = Deck.append(deckToAppend, this.deck);
refreshDeck(false, true);
@ -924,7 +931,14 @@ public class DeckEditorPanel extends javax.swing.JPanel {
MageFrame.getDesktop().setCursor(new Cursor(Cursor.WAIT_CURSOR));
try {
StringBuilder errorMessages = new StringBuilder();
Deck newDeck = Deck.load(DeckImporter.importDeckFromFile(file, errorMessages, saveAutoFixedFile), true, true);
DeckImporter deckImporter = DeckImporter.getDeckImporter(file);
DeckCardLists deckCardLists = new DeckCardLists();
if (deckImporter != null) {
deckImporter.setPreferences(MageFrame.getPreferences());
deckCardLists = deckImporter.importDeck(file, errorMessages, saveAutoFixedFile);
}
Deck newDeck = Deck.load(deckCardLists, true, true);
processAndShowImportErrors(errorMessages);
if (newDeck != null) {

View file

@ -18,6 +18,7 @@ public final class MagePreferences {
private static final String KEY_PASSWORD = "password";
private static final String KEY_EMAIL = "email";
private static final String KEY_AUTO_CONNECT = "autoConnect";
private static final String KEY_FAVORITE_CARD_PREFIX = "favoriteCard";
private static final String NODE_KEY_IGNORE_LIST = "ignoreListString";
private static final String NODE_KEY_RESTORE_SESSIONS_LIST = "restoreSessionsListString";
@ -115,6 +116,26 @@ public final class MagePreferences {
prefs().putBoolean(KEY_AUTO_CONNECT, autoConnect);
}
public static String getFavoriteCardNumber(String cardName) {
String setAndNumber = prefs().get(prefixedKey(KEY_FAVORITE_CARD_PREFIX, cardName), "");
if (setAndNumber != null && !setAndNumber.equals("")) {
return setAndNumber.split("##")[1];
}
return "";
}
public static String getFavoriteCardSet(String cardName) {
String setAndNumber = prefs().get(prefixedKey(KEY_FAVORITE_CARD_PREFIX, cardName), "");
if (setAndNumber != null && !setAndNumber.equals("")) {
return setAndNumber.split("##")[0];
}
return "";
}
public static void setFavoriteCard(String cardName, String cardNumber, String setCode) {
prefs().put(prefixedKey(KEY_FAVORITE_CARD_PREFIX, cardName), setCode + "##" + cardNumber);
}
public static void addIgnoredUser(String serverAddress, String username) {
ignoreListNode(serverAddress).putBoolean(username, true);
}

View file

@ -5,6 +5,7 @@ import org.apache.log4j.Logger;
import java.io.File;
import java.util.Locale;
import java.util.prefs.Preferences;
import java.util.Scanner;
/**
@ -47,6 +48,12 @@ public abstract class DeckImporter {
private static final String[] SIDEBOARD_MARKS = new String[]{"//sideboard", "sb: "};
protected Preferences prefs = null;
public void setPreferences(Preferences prefs) {
this.prefs = prefs;
}
public static DeckImporter getDeckImporter(String file) {
if (file == null) {
return null;

View file

@ -10,6 +10,7 @@ import java.util.Arrays;
import java.util.HashSet;
import java.util.Locale;
import java.util.Set;
import java.util.prefs.Preferences;
/**
* Deck import: text deck, compatible with MTGO and many other apps/services
@ -21,6 +22,7 @@ public class TxtDeckImporter extends PlainTextDeckImporter {
private static final String[] SET_VALUES = new String[]{"lands", "creatures", "planeswalkers", "other spells", "sideboard cards",
"Instant", "Land", "Enchantment", "Artifact", "Sorcery", "Planeswalker", "Creature"};
private static final Set<String> IGNORE_NAMES = new HashSet<>(Arrays.asList(SET_VALUES));
private static final String KEY_FAVORITE_CARD_PREFIX = "favoriteCard";
private boolean sideboard = false;
private boolean switchSideboardByEmptyLine = true; // all cards after first empty line will be sideboard (like mtgo format)
@ -129,6 +131,16 @@ public class TxtDeckImporter extends PlainTextDeckImporter {
wasCardLines = true;
CardInfo cardInfo = CardRepository.instance.findPreferredCoreExpansionCard(lineName);
if (prefs != null) {
String favSetAndNumber = prefs.get(KEY_FAVORITE_CARD_PREFIX + '/' + lineName, "");
if (favSetAndNumber != null && !favSetAndNumber.equals("")) {
String favoriteSet = favSetAndNumber.split("##")[0];
String favoriteNumber = favSetAndNumber.split("##")[1];
cardInfo = CardRepository.instance.findCard(favoriteSet, favoriteNumber);
}
}
if (cardInfo == null) {
sbMessage.append("Could not find card: '").append(lineName).append("' at line ").append(lineCount).append('\n');
} else {