diff --git a/forge-gui/src/main/java/forge/gui/match/controllers/CHand.java b/forge-gui/src/main/java/forge/gui/match/controllers/CHand.java index 6a7b18ff466..feae466276b 100644 --- a/forge-gui/src/main/java/forge/gui/match/controllers/CHand.java +++ b/forge-gui/src/main/java/forge/gui/match/controllers/CHand.java @@ -87,7 +87,6 @@ public class CHand implements ICDoc { return; } final Rectangle rctLibraryLabel = vf.getDetailsPanel().getLblLibrary().getBounds(); - final List cc = player.getZone(ZoneType.Hand).getCards(); // Animation starts from the library label and runs to the hand panel. // This check prevents animation running if label hasn't been realized yet. @@ -95,24 +94,24 @@ public class CHand implements ICDoc { return; } - List tmp, diff; - tmp = new ArrayList(); - for (final forge.view.arcane.CardPanel cpa : p.getCardPanels()) { - tmp.add(cpa.getGameCard()); - } - diff = new ArrayList(tmp); - diff.removeAll(cc); - if (diff.size() == p.getCardPanels().size()) { - p.clear(); - } - else { - for (final Card card : diff) { - p.removeCardPanel(p.getCardPanel(card.getUniqueNumber())); + //update card panels in hand area + final List cards = player.getZone(ZoneType.Hand).getCards(); + final List placeholders = new ArrayList(); + final List cardPanels = new ArrayList(); + + for (Card card : cards) { + CardPanel cardPanel = p.getCardPanel(card.getUniqueNumber()); + if (cardPanel == null) { //create placeholders for new cards + cardPanel = new CardPanel(card); + cardPanel.setDisplayEnabled(false); + placeholders.add(cardPanel); } + cardPanels.add(cardPanel); } - diff = new ArrayList(cc); - diff.removeAll(tmp); + p.setCardPanels(cardPanels); + + //animate new cards into positions defined by placeholders JLayeredPane layeredPane = Singletons.getView().getFrame().getLayeredPane(); int fromZoneX = 0, fromZoneY = 0; @@ -127,20 +126,19 @@ public class CHand implements ICDoc { int endWidth, endX, endY; - for (final Card card : diff) { - CardPanel toPanel = p.addCard(card); - endWidth = toPanel.getCardWidth(); - final Point toPos = SwingUtilities.convertPoint(view.getHandArea(), toPanel.getCardLocation(), layeredPane); + for (final CardPanel placeholder : placeholders) { + endWidth = placeholder.getCardWidth(); + final Point toPos = SwingUtilities.convertPoint(view.getHandArea(), placeholder.getCardLocation(), layeredPane); endX = toPos.x; endY = toPos.y; - final forge.view.arcane.CardPanel animationPanel = new forge.view.arcane.CardPanel(card); + final CardPanel animationPanel = new CardPanel(placeholder.getGameCard()); if (Singletons.getView().getFrame().isShowing()) { - Animation.moveCard(startX, startY, startWidth, endX, endY, endWidth, animationPanel, toPanel, + Animation.moveCard(startX, startY, startWidth, endX, endY, endWidth, animationPanel, placeholder, layeredPane, 500); } else { - Animation.moveCard(toPanel); + Animation.moveCard(placeholder); } } } diff --git a/forge-gui/src/main/java/forge/view/arcane/CardPanelContainer.java b/forge-gui/src/main/java/forge/view/arcane/CardPanelContainer.java index f1fcc226d5d..477773688ee 100644 --- a/forge-gui/src/main/java/forge/view/arcane/CardPanelContainer.java +++ b/forge-gui/src/main/java/forge/view/arcane/CardPanelContainer.java @@ -346,6 +346,31 @@ public abstract class CardPanelContainer extends JPanel { CardPanelContainer.this.repaint(); } + /** + *

+ * setCardPanels. + *

+ * + * @param cardPanels + */ + public final void setCardPanels(List cardPanels) { + if (cardPanels.size() == 0) { + clear(); + return; + } + + this.getCardPanels().clear(); + this.removeAll(); + this.getCardPanels().addAll(cardPanels); + for (CardPanel cardPanel : cardPanels) { + this.add(cardPanel); + } + this.doLayout(); + this.invalidate(); + this.getParent().validate(); + this.repaint(); + } + /** *

* clear.