PlayArea is intialized with a r/o list that is a reference to all cards in given zone.

This commit is contained in:
Maxmtg
2013-03-02 09:21:25 +00:00
parent f6746365ff
commit 06f252b2e4
6 changed files with 94 additions and 99 deletions

View File

@@ -18,7 +18,6 @@
package forge.gui;
import java.awt.Color;
import java.awt.Rectangle;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileInputStream;
@@ -61,8 +60,6 @@ import forge.game.zone.ZoneType;
import forge.item.CardDb;
import forge.item.CardPrinted;
import forge.item.IPaperCard;
import forge.view.arcane.PlayArea;
import forge.view.arcane.util.Animation;
/**
* <p>
@@ -255,91 +252,6 @@ public final class GuiDisplayUtil {
}
/**
* <p>
* setupPlayZone.
* </p>
*
* @param p
* a {@link forge.view.arcane.PlayArea} object.
* @param c
* an array of {@link forge.Card} objects.
*/
public static void setupPlayZone(final PlayArea p, final List<Card> c) {
List<Card> tmp, diff;
tmp = new ArrayList<Card>();
for (final forge.view.arcane.CardPanel cpa : p.getCardPanels()) {
tmp.add(cpa.getGameCard());
}
diff = new ArrayList<Card>(tmp);
diff.removeAll(c);
if (diff.size() == p.getCardPanels().size()) {
p.clear();
} else {
for (final Card card : diff) {
p.removeCardPanel(p.getCardPanel(card.getUniqueNumber()));
}
}
diff = new ArrayList<Card>(c);
diff.removeAll(tmp);
List<forge.view.arcane.CardPanel> panelList = new ArrayList<forge.view.arcane.CardPanel>();
for (final Card card : diff) {
panelList.add(p.addCard(card));
}
if (!diff.isEmpty()) {
p.doLayout();
}
for (final forge.view.arcane.CardPanel toPanel : panelList) {
p.scrollRectToVisible(new Rectangle(toPanel.getCardX(), toPanel.getCardY(), toPanel
.getCardWidth(), toPanel.getCardHeight()));
Animation.moveCard(toPanel);
}
for (final Card card : c) {
final forge.view.arcane.CardPanel toPanel = p.getCardPanel(card.getUniqueNumber());
if (card.isTapped()) {
toPanel.setTapped(true);
toPanel.setTappedAngle(forge.view.arcane.CardPanel.TAPPED_ANGLE);
} else {
toPanel.setTapped(false);
toPanel.setTappedAngle(0);
}
toPanel.getAttachedPanels().clear();
if (card.isEnchanted()) {
final ArrayList<Card> enchants = card.getEnchantedBy();
for (final Card e : enchants) {
final forge.view.arcane.CardPanel cardE = p.getCardPanel(e.getUniqueNumber());
if (cardE != null) {
toPanel.getAttachedPanels().add(cardE);
}
}
}
if (card.isEquipped()) {
final ArrayList<Card> enchants = card.getEquippedBy();
for (final Card e : enchants) {
final forge.view.arcane.CardPanel cardE = p.getCardPanel(e.getUniqueNumber());
if (cardE != null) {
toPanel.getAttachedPanels().add(cardE);
}
}
}
if (card.isEnchantingCard()) {
toPanel.setAttachedToPanel(p.getCardPanel(card.getEnchantingCard().getUniqueNumber()));
} else if (card.isEquipping()) {
toPanel.setAttachedToPanel(p.getCardPanel(card.getEquipping().get(0).getUniqueNumber()));
} else {
toPanel.setAttachedToPanel(null);
}
toPanel.setCard(toPanel.getGameCard());
}
p.invalidate();
p.repaint();
}
/**
* <p>
* updateGUI.

View File

@@ -29,9 +29,7 @@ import forge.Card;
import forge.Command;
import forge.game.player.Player;
import forge.game.zone.PlayerZone;
import forge.game.zone.ZoneType;
import forge.gui.GuiDisplayUtil;
import forge.gui.framework.ICDoc;
import forge.gui.match.CMatchUI;
import forge.gui.match.controllers.CMessage;
@@ -55,8 +53,7 @@ public class CCommand implements ICDoc {
private final Observer observerPlay = new Observer() {
@Override
public void update(final Observable a, final Object b) {
final PlayerZone pZone = (PlayerZone) a;
GuiDisplayUtil.setupPlayZone(CCommand.this.view.getTabletop(), pZone.getCards(false));
CCommand.this.view.getTabletop().setupPlayZone();
}
};
@@ -118,7 +115,7 @@ public class CCommand implements ICDoc {
if (c != null && c.isInZone(ZoneType.Command)) {
//TODO: Cast commander/activate avatar/roll planar dice here.
CMessage.SINGLETON_INSTANCE.getInputControl().getInput().selectCard(c);
CMessage.SINGLETON_INSTANCE.getInputControl().selectCard(c, player.getZone(ZoneType.Command));
}
}

View File

@@ -50,7 +50,6 @@ import forge.game.zone.PlayerZone;
import forge.game.zone.ZoneType;
import forge.gui.ForgeAction;
import forge.gui.GuiChoose;
import forge.gui.GuiDisplayUtil;
import forge.gui.framework.ICDoc;
import forge.gui.match.CMatchUI;
import forge.gui.match.controllers.CMessage;
@@ -147,8 +146,7 @@ public class CField implements ICDoc {
private final Observer observerPlay = new Observer() {
@Override
public void update(final Observable a, final Object b) {
final PlayerZone pZone = (PlayerZone) a;
GuiDisplayUtil.setupPlayZone(CField.this.view.getTabletop(), pZone.getCards(false));
CField.this.view.getTabletop().setupPlayZone();
}
};

View File

@@ -23,6 +23,7 @@ import javax.swing.border.MatteBorder;
import net.miginfocom.swing.MigLayout;
import forge.game.player.Player;
import forge.game.zone.ZoneType;
import forge.gui.framework.DragCell;
import forge.gui.framework.DragTab;
import forge.gui.framework.EDocID;
@@ -66,7 +67,7 @@ public class VCommand implements IVDoc<CCommand> {
// TODO player is hard-coded into tabletop...should be dynamic
// (haven't looked into it too deeply). Doublestrike 12-04-12
tabletop = new PlayArea(scroller, id0 == EDocID.COMMAND_0);
tabletop = new PlayArea(scroller, id0 == EDocID.COMMAND_0, player.getZone(ZoneType.Command).getCards(false));
control = new CCommand(player, this);

View File

@@ -121,7 +121,7 @@ public class VField implements IVDoc<CField> {
// TODO player is hard-coded into tabletop...should be dynamic
// (haven't looked into it too deeply). Doublestrike 12-04-12
tabletop = new PlayArea(scroller, id0 == EDocID.FIELD_1);
tabletop = new PlayArea(scroller, id0 == EDocID.FIELD_1, player.getZone(ZoneType.Battlefield).getCards(false));
control = new CField(player, this, playerViewer);

View File

@@ -27,6 +27,7 @@ import java.util.List;
import javax.swing.JScrollPane;
import forge.Card;
import forge.view.arcane.util.Animation;
import forge.view.arcane.util.CardPanelMouseListener;
/**
@@ -65,6 +66,8 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen
private int extraCardSpacingX, cardSpacingX, cardSpacingY;
private int stackSpacingX, stackSpacingY;
private List<Card> model;
/**
* <p>
* Constructor for PlayArea.
@@ -76,10 +79,11 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen
* a boolean.
* @param modelRef
*/
public PlayArea(final JScrollPane scrollPane, final boolean mirror) {
public PlayArea(final JScrollPane scrollPane, final boolean mirror, List<Card> modelRef) {
super(scrollPane);
this.setBackground(Color.white);
this.mirror = mirror;
this.model = modelRef;
}
private final CardStackRow collectAllLands() {
@@ -478,6 +482,89 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen
super.mouseLeftClicked(panel, evt);
}
/**
* <p>
* setupPlayZone.
* </p>
*
* @param newList
* an array of {@link forge.Card} objects.
*/
public void setupPlayZone() {
List<Card> oldCards, toDelete;
oldCards = new ArrayList<Card>();
for (final CardPanel cpa : getCardPanels()) {
oldCards.add(cpa.getGameCard());
}
toDelete = new ArrayList<Card>(oldCards);
toDelete.removeAll(model);
if (toDelete.size() == getCardPanels().size()) {
clear();
} else {
for (final Card card : toDelete) {
removeCardPanel(getCardPanel(card.getUniqueNumber()));
}
}
List<Card> toAdd = new ArrayList<Card>(model);
toAdd.removeAll(oldCards);
List<CardPanel> newPanels = new ArrayList<CardPanel>();
for (final Card card : toAdd) {
newPanels.add(addCard(card));
}
if (!toAdd.isEmpty()) {
doLayout();
}
for (final CardPanel toPanel : newPanels) {
scrollRectToVisible(new Rectangle(toPanel.getCardX(), toPanel.getCardY(), toPanel.getCardWidth(), toPanel.getCardHeight()));
Animation.moveCard(toPanel);
}
for (final Card card : model) {
final CardPanel toPanel = getCardPanel(card.getUniqueNumber());
if (card.isTapped()) {
toPanel.setTapped(true);
toPanel.setTappedAngle(forge.view.arcane.CardPanel.TAPPED_ANGLE);
} else {
toPanel.setTapped(false);
toPanel.setTappedAngle(0);
}
toPanel.getAttachedPanels().clear();
if (card.isEnchanted()) {
final ArrayList<Card> enchants = card.getEnchantedBy();
for (final Card e : enchants) {
final forge.view.arcane.CardPanel cardE = getCardPanel(e.getUniqueNumber());
if (cardE != null) {
toPanel.getAttachedPanels().add(cardE);
}
}
}
if (card.isEquipped()) {
final ArrayList<Card> enchants = card.getEquippedBy();
for (final Card e : enchants) {
final forge.view.arcane.CardPanel cardE = getCardPanel(e.getUniqueNumber());
if (cardE != null) {
toPanel.getAttachedPanels().add(cardE);
}
}
}
if (card.isEnchantingCard()) {
toPanel.setAttachedToPanel(getCardPanel(card.getEnchantingCard().getUniqueNumber()));
} else if (card.isEquipping()) {
toPanel.setAttachedToPanel(getCardPanel(card.getEquipping().get(0).getUniqueNumber()));
} else {
toPanel.setAttachedToPanel(null);
}
toPanel.setCard(toPanel.getGameCard());
}
invalidate();
repaint();
}
private static enum RowType {
Land,
Creature,