From 1718ca90202d9138e0f2da7c47e727efb979215b Mon Sep 17 00:00:00 2001 From: leriomaggio Date: Sun, 10 Oct 2021 09:10:19 +0100 Subject: [PATCH] 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 --- .../forge/screens/deckeditor/DeckImport.java | 32 +++++++++++-- .../java/forge/deck/DeckImportController.java | 47 ++++++++++++++++--- 2 files changed, 70 insertions(+), 9 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/DeckImport.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/DeckImport.java index 02ffa64f283..71991bb2bbf 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/DeckImport.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/DeckImport.java @@ -554,7 +554,7 @@ public class DeckImport extends FDialog { } private void activateCardPreview(HyperlinkEvent e) { - // TODO: FOIL and Card Status + // FIXME: Card Status if(e.getEventType() == HyperlinkEvent.EventType.ENTERED || e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { String keyString = e.getDescription(); @@ -675,7 +675,32 @@ public class DeckImport extends FDialog { private void updateSummaries(final List tokens) { this.cStatsView.updateStats(tokens, this.controller.importBannedAndRestrictedCards()); 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) { @@ -721,7 +746,8 @@ public class DeckImport extends FDialog { private String getTokenMessage(DeckRecognizer.Token token){ switch (token.getType()){ case LIMITED_CARD: - return String.format("- %s", Localizer.getInstance().getMessage("lblErrLimitedCard", + return String.format("- %s", WARN_MSG_CLASS, + Localizer.getInstance().getMessage("lblErrLimitedCard", StringUtils.capitalize(token.getLimitedCardType().name()), getGameFormatLabel())); case CARD_FROM_NOT_ALLOWED_SET: return String.format("- %s", Localizer.getInstance().getMessage("lblErrNotAllowedCard", diff --git a/forge-gui/src/main/java/forge/deck/DeckImportController.java b/forge-gui/src/main/java/forge/deck/DeckImportController.java index 7eb12e62563..a4fc491fbf1 100644 --- a/forge-gui/src/main/java/forge/deck/DeckImportController.java +++ b/forge-gui/src/main/java/forge/deck/DeckImportController.java @@ -1,9 +1,7 @@ package forge.deck; import java.text.DateFormatSymbols; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; +import java.util.*; import forge.StaticData; import forge.card.CardDb; @@ -34,6 +32,7 @@ public class DeckImportController { private boolean inlcludeBnRInDeck = false; private final List tokens = new ArrayList<>(); + private final Map cardsInTokens = new HashMap<>(); private final boolean currentDeckNotEmpty; private DeckFormat currentDeckFormat; private GameFormat currentGameFormat; @@ -145,6 +144,7 @@ public class DeckImportController { public List parseInput(String input) { tokens.clear(); + cardsInTokens.clear(); DeckRecognizer recognizer = new DeckRecognizer(); // Set Art Preference first thing recognizer.setArtPreference(this.artPreference); @@ -177,11 +177,18 @@ public class DeckImportController { checkAndFixCommanderIn(DeckSection.Commander); } + collectAllCardsInTokens(); return tokens; } - public boolean currentGameFormatAllowsCommander(){ - return this.allowedSections.contains(DeckSection.Commander); + private void collectAllCardsInTokens(){ + cardsInTokens.clear(); + for (Token token : tokens){ + if (!token.isCardToken()) + continue; + PaperCard tokenCard = token.getCard(); + cardsInTokens.put(tokenCard, token); + } } private void checkAndFixCommanderIn(DeckSection targetDeckSection){ @@ -277,6 +284,34 @@ public class DeckImportController { 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(){ return this.accept(""); } @@ -321,7 +356,7 @@ public class DeckImportController { /* Deck Sections have been already validated for tokens by DeckRecogniser, * plus any other adjustment (like accounting for Commander in Sideboard) has been * 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()); } return resultDeck;