Added full support to card preview with foil and correct updates

Now all cards displayed in cardpreview panel will automatically adapt to any change in the decklist.
That is, the panel will be reset only if current-displayed card is not in decklist anymore. In all other cases, the preview will adjust depending on the new token status, and/or whether the card is/was foiled!

Signed-off-by: leriomaggio <valeriomaggio@gmail.com>
This commit is contained in:
leriomaggio
2021-10-10 09:10:19 +01:00
parent 44cfc76552
commit 1718ca9020
2 changed files with 70 additions and 9 deletions

View File

@@ -554,7 +554,7 @@ public class DeckImport<TModel extends DeckBase> extends FDialog {
} }
private void activateCardPreview(HyperlinkEvent e) { private void activateCardPreview(HyperlinkEvent e) {
// TODO: FOIL and Card Status // FIXME: Card Status
if(e.getEventType() == HyperlinkEvent.EventType.ENTERED || if(e.getEventType() == HyperlinkEvent.EventType.ENTERED ||
e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
String keyString = e.getDescription(); String keyString = e.getDescription();
@@ -675,7 +675,32 @@ public class DeckImport<TModel extends DeckBase> extends FDialog {
private void updateSummaries(final List<DeckRecognizer.Token> tokens) { private void updateSummaries(final List<DeckRecognizer.Token> tokens) {
this.cStatsView.updateStats(tokens, this.controller.importBannedAndRestrictedCards()); this.cStatsView.updateStats(tokens, this.controller.importBannedAndRestrictedCards());
cmdAcceptButton.setEnabled(this.cStatsView.getTotalCardsInDecklist() > 0); cmdAcceptButton.setEnabled(this.cStatsView.getTotalCardsInDecklist() > 0);
this.resetCardImagePreviewPanel(); Object displayedCardInPanel = this.cardImagePreview.getDisplayed();
if (!(displayedCardInPanel instanceof PaperCard)) // also accounts for any null
this.resetCardImagePreviewPanel();
else {
PaperCard cardDisplayed = (PaperCard) displayedCardInPanel;
// this will return either the same card instance or its [un]foiled version
// null will be returned if not found in card list anymore
cardDisplayed = this.controller.getCardFromDecklist(cardDisplayed);
if (cardDisplayed == null)
this.resetCardImagePreviewPanel(); // current displayed card is not in decklist
else {
if (this.controller.isTokenInListLegal(cardDisplayed)) {
this.cardImagePreview.setItem(cardDisplayed);
this.cardImagePreview.showAsEnabled();
} else if (this.controller.isTokenInListLimited(cardDisplayed)) {
this.cardImagePreview.setItem(cardDisplayed);
if (this.includeBnRCheck.isSelected())
this.cardImagePreview.showAsEnabled();
else
this.cardImagePreview.showAsDisabled();
} else { // any other card token NOT legal nor limited
this.cardImagePreview.setItem(cardDisplayed);
this.cardImagePreview.showAsDisabled();
}
}
}
} }
private String toHTML(final DeckRecognizer.Token token) { private String toHTML(final DeckRecognizer.Token token) {
@@ -721,7 +746,8 @@ public class DeckImport<TModel extends DeckBase> extends FDialog {
private String getTokenMessage(DeckRecognizer.Token token){ private String getTokenMessage(DeckRecognizer.Token token){
switch (token.getType()){ switch (token.getType()){
case LIMITED_CARD: case LIMITED_CARD:
return String.format("- %s", Localizer.getInstance().getMessage("lblErrLimitedCard", return String.format("- <span class=\"%s\">%s</span>", WARN_MSG_CLASS,
Localizer.getInstance().getMessage("lblErrLimitedCard",
StringUtils.capitalize(token.getLimitedCardType().name()), getGameFormatLabel())); StringUtils.capitalize(token.getLimitedCardType().name()), getGameFormatLabel()));
case CARD_FROM_NOT_ALLOWED_SET: case CARD_FROM_NOT_ALLOWED_SET:
return String.format("- %s", Localizer.getInstance().getMessage("lblErrNotAllowedCard", return String.format("- %s", Localizer.getInstance().getMessage("lblErrNotAllowedCard",

View File

@@ -1,9 +1,7 @@
package forge.deck; package forge.deck;
import java.text.DateFormatSymbols; import java.text.DateFormatSymbols;
import java.util.ArrayList; import java.util.*;
import java.util.Calendar;
import java.util.List;
import forge.StaticData; import forge.StaticData;
import forge.card.CardDb; import forge.card.CardDb;
@@ -34,6 +32,7 @@ public class DeckImportController {
private boolean inlcludeBnRInDeck = false; private boolean inlcludeBnRInDeck = false;
private final List<Token> tokens = new ArrayList<>(); private final List<Token> tokens = new ArrayList<>();
private final Map<PaperCard, Token> cardsInTokens = new HashMap<>();
private final boolean currentDeckNotEmpty; private final boolean currentDeckNotEmpty;
private DeckFormat currentDeckFormat; private DeckFormat currentDeckFormat;
private GameFormat currentGameFormat; private GameFormat currentGameFormat;
@@ -145,6 +144,7 @@ public class DeckImportController {
public List<Token> parseInput(String input) { public List<Token> parseInput(String input) {
tokens.clear(); tokens.clear();
cardsInTokens.clear();
DeckRecognizer recognizer = new DeckRecognizer(); DeckRecognizer recognizer = new DeckRecognizer();
// Set Art Preference first thing // Set Art Preference first thing
recognizer.setArtPreference(this.artPreference); recognizer.setArtPreference(this.artPreference);
@@ -177,11 +177,18 @@ public class DeckImportController {
checkAndFixCommanderIn(DeckSection.Commander); checkAndFixCommanderIn(DeckSection.Commander);
} }
collectAllCardsInTokens();
return tokens; return tokens;
} }
public boolean currentGameFormatAllowsCommander(){ private void collectAllCardsInTokens(){
return this.allowedSections.contains(DeckSection.Commander); cardsInTokens.clear();
for (Token token : tokens){
if (!token.isCardToken())
continue;
PaperCard tokenCard = token.getCard();
cardsInTokens.put(tokenCard, token);
}
} }
private void checkAndFixCommanderIn(DeckSection targetDeckSection){ private void checkAndFixCommanderIn(DeckSection targetDeckSection){
@@ -277,6 +284,34 @@ public class DeckImportController {
return tokensInSection; return tokensInSection;
} }
public boolean currentGameFormatAllowsCommander(){
return this.allowedSections.contains(DeckSection.Commander);
}
public PaperCard getCardFromDecklist(final PaperCard card){
if (cardsInTokens.containsKey(card))
return card; // found - same instance returned
// Account for any [un]foiled version
PaperCard cardKey;
if (card.isFoil())
cardKey = new PaperCard(card.getRules(), card.getEdition(), card.getRarity(), card.getArtIndex(),
false, card.getCollectorNumber(), card.getArtist());
else
cardKey = card.getFoiled();
return cardsInTokens.containsKey(cardKey) ? cardsInTokens.get(cardKey).getCard() : null;
}
public boolean isTokenInListLimited(PaperCard cardKey) {
Token cardToken = this.cardsInTokens.getOrDefault(cardKey, null);
return (cardToken != null) && (cardToken.getType() == TokenType.LIMITED_CARD);
}
public boolean isTokenInListLegal(PaperCard cardKey) {
Token cardToken = this.cardsInTokens.getOrDefault(cardKey, null);
return (cardToken != null) && (cardToken.getType() == TokenType.LEGAL_CARD);
}
public Deck accept(){ public Deck accept(){
return this.accept(""); return this.accept("");
} }
@@ -321,7 +356,7 @@ public class DeckImportController {
/* Deck Sections have been already validated for tokens by DeckRecogniser, /* Deck Sections have been already validated for tokens by DeckRecogniser,
* plus any other adjustment (like accounting for Commander in Sideboard) has been * plus any other adjustment (like accounting for Commander in Sideboard) has been
* already taken care of in previous parseInput. * already taken care of in previous parseInput.
* Therefore we can safely proceed here by just adding the cards. */ * Therefore, we can safely proceed here by just adding the cards. */
resultDeck.getOrCreate(deckSection).add(crd, t.getQuantity()); resultDeck.getOrCreate(deckSection).add(crd, t.getQuantity());
} }
return resultDeck; return resultDeck;