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; package forge.gui;
import java.awt.Color; import java.awt.Color;
import java.awt.Rectangle;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.DataInputStream; import java.io.DataInputStream;
import java.io.FileInputStream; import java.io.FileInputStream;
@@ -61,8 +60,6 @@ import forge.game.zone.ZoneType;
import forge.item.CardDb; import forge.item.CardDb;
import forge.item.CardPrinted; import forge.item.CardPrinted;
import forge.item.IPaperCard; import forge.item.IPaperCard;
import forge.view.arcane.PlayArea;
import forge.view.arcane.util.Animation;
/** /**
* <p> * <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> * <p>
* updateGUI. * updateGUI.

View File

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

View File

@@ -23,6 +23,7 @@ import javax.swing.border.MatteBorder;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType;
import forge.gui.framework.DragCell; import forge.gui.framework.DragCell;
import forge.gui.framework.DragTab; import forge.gui.framework.DragTab;
import forge.gui.framework.EDocID; 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 // TODO player is hard-coded into tabletop...should be dynamic
// (haven't looked into it too deeply). Doublestrike 12-04-12 // (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); 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 // TODO player is hard-coded into tabletop...should be dynamic
// (haven't looked into it too deeply). Doublestrike 12-04-12 // (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); control = new CField(player, this, playerViewer);

View File

@@ -27,6 +27,7 @@ import java.util.List;
import javax.swing.JScrollPane; import javax.swing.JScrollPane;
import forge.Card; import forge.Card;
import forge.view.arcane.util.Animation;
import forge.view.arcane.util.CardPanelMouseListener; import forge.view.arcane.util.CardPanelMouseListener;
/** /**
@@ -65,6 +66,8 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen
private int extraCardSpacingX, cardSpacingX, cardSpacingY; private int extraCardSpacingX, cardSpacingX, cardSpacingY;
private int stackSpacingX, stackSpacingY; private int stackSpacingX, stackSpacingY;
private List<Card> model;
/** /**
* <p> * <p>
* Constructor for PlayArea. * Constructor for PlayArea.
@@ -76,10 +79,11 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen
* a boolean. * a boolean.
* @param modelRef * @param modelRef
*/ */
public PlayArea(final JScrollPane scrollPane, final boolean mirror) { public PlayArea(final JScrollPane scrollPane, final boolean mirror, List<Card> modelRef) {
super(scrollPane); super(scrollPane);
this.setBackground(Color.white); this.setBackground(Color.white);
this.mirror = mirror; this.mirror = mirror;
this.model = modelRef;
} }
private final CardStackRow collectAllLands() { private final CardStackRow collectAllLands() {
@@ -478,6 +482,89 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen
super.mouseLeftClicked(panel, evt); 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 { private static enum RowType {
Land, Land,
Creature, Creature,