From 53453243dc4ddda9ed0d2f3b971dfe342ea60a4a Mon Sep 17 00:00:00 2001 From: magenoxx Date: Thu, 7 Aug 2014 15:30:44 +0400 Subject: [PATCH] [UI] Exile dialog --- .../components/ext/dlg/DialogContainer.java | 10 ++ .../components/ext/dlg/DialogManager.java | 43 ++++- .../java/mage/client/game/PlayerPanelExt.java | 153 ++++++++++++------ Mage.Client/src/main/resources/info/exile.png | Bin 0 -> 19202 bytes Mage.Common/src/mage/view/PlayerView.java | 16 +- 5 files changed, 161 insertions(+), 61 deletions(-) create mode 100644 Mage.Client/src/main/resources/info/exile.png diff --git a/Mage.Client/src/main/java/mage/client/components/ext/dlg/DialogContainer.java b/Mage.Client/src/main/java/mage/client/components/ext/dlg/DialogContainer.java index 86445ea0e0d..bacdbd0956b 100644 --- a/Mage.Client/src/main/java/mage/client/components/ext/dlg/DialogContainer.java +++ b/Mage.Client/src/main/java/mage/client/components/ext/dlg/DialogContainer.java @@ -97,6 +97,16 @@ public class DialogContainer extends JPanel { dlg.setLocation(X_OFFSET + 10, Y_OFFSET + 10); dlg.updateSize(params.rect.width - 80, params.rect.height - 80); + } else if (dialogType == DialogManager.MTGDialogs.ExileDialog) { + + backgroundColor = new Color(250, 250, 250, 50); + + alpha = 0; + ChoiceDialog dlg = new ChoiceDialog(params, "Exile"); + add(dlg); + dlg.setLocation(X_OFFSET + 10, Y_OFFSET + 10); + dlg.updateSize(params.rect.width - 80, params.rect.height - 80); + } else if (dialogType == DialogManager.MTGDialogs.EmblemsDialog) { backgroundColor = new Color(0, 0, 50, 110); diff --git a/Mage.Client/src/main/java/mage/client/components/ext/dlg/DialogManager.java b/Mage.Client/src/main/java/mage/client/components/ext/dlg/DialogManager.java index 9721b8952dc..66db7ad4c36 100644 --- a/Mage.Client/src/main/java/mage/client/components/ext/dlg/DialogManager.java +++ b/Mage.Client/src/main/java/mage/client/components/ext/dlg/DialogManager.java @@ -1,7 +1,11 @@ package mage.client.components.ext.dlg; -import java.awt.Component; -import java.awt.Rectangle; +import mage.client.cards.BigCard; +import mage.client.game.FeedbackPanel; +import mage.view.CardsView; + +import javax.swing.*; +import java.awt.*; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; @@ -9,10 +13,6 @@ import java.awt.event.MouseWheelEvent; import java.util.HashMap; import java.util.Map; import java.util.UUID; -import javax.swing.JComponent; -import mage.client.cards.BigCard; -import mage.client.game.FeedbackPanel; -import mage.view.CardsView; /** * @author mw, noxx @@ -40,7 +40,7 @@ public class DialogManager extends JComponent implements MouseListener, public enum MTGDialogs { none, AboutDialog, MessageDialog, StackDialog, AssignDamageDialog, ManaChoiceDialog, ChoiceDialog, EmblemsDialog, GraveDialog, DialogContainer, CombatDialog, - ChooseDeckDialog, ChooseCommonDialog, RevealDialog + ChooseDeckDialog, ChooseCommonDialog, RevealDialog, ExileDialog } /** @@ -176,6 +176,35 @@ public class DialogManager extends JComponent implements MouseListener, setVisible(true); } + public void showExileDialog(CardsView cards, BigCard bigCard, UUID gameId) { + + int w = 720; + int h = 550; + + int height = getHeight(); + int width = getWidth(); + + int x = ((width - w) / 2); + int y = ((height - h) / 2); + + DlgParams params = new DlgParams(); + params.rect = new Rectangle(x, y, w, h); + params.bigCard = bigCard; + params.gameId = gameId; + params.setCards(cards); + dialogContainer = new DialogContainer(MTGDialogs.ExileDialog, params); + dialogContainer.setVisible(true); + add(dialogContainer); + + this.currentDialog = MTGDialogs.DialogContainer; + + setDlgBounds(new Rectangle(x, y, w, h)); + + dialogContainer.showDialog(true); + + setVisible(true); + } + public void showEmblemsDialog(CardsView cards, BigCard bigCard, UUID gameId) { int w = 720; diff --git a/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java b/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java index b0b345bbde8..9f9d9b2d856 100644 --- a/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java +++ b/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java @@ -34,28 +34,6 @@ package mage.client.game; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.Image; -import java.awt.Rectangle; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.image.BufferedImage; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; -import javax.swing.BorderFactory; -import javax.swing.GroupLayout; -import javax.swing.GroupLayout.Alignment; -import javax.swing.ImageIcon; -import javax.swing.JButton; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.LayoutStyle.ComponentPlacement; -import javax.swing.SwingConstants; -import javax.swing.border.Border; -import javax.swing.border.LineBorder; import mage.MageException; import mage.cards.MageCard; import mage.cards.action.ActionCallback; @@ -82,6 +60,19 @@ import mage.view.ManaPoolView; import mage.view.PlayerView; import org.mage.card.arcane.ManaSymbols; +import javax.swing.*; +import javax.swing.GroupLayout.Alignment; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.border.Border; +import javax.swing.border.LineBorder; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.image.BufferedImage; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + /** * Enhanced player pane. * @@ -94,7 +85,6 @@ public class PlayerPanelExt extends javax.swing.JPanel { private Session session; private PlayerView player; - //private ShowCardsDialog graveyard; private BigCard bigCard; private static final int AVATAR_COUNT = 77; @@ -193,10 +183,12 @@ public class PlayerPanelExt extends javax.swing.JPanel { int graveCards = player.getGraveyard().size(); if (graveCards > 99) { - Font font = graveLabel.getFont(); - font = font.deriveFont(9f); - graveLabel.setFont(font); - changedFontGrave = true; + if (!changedFontGrave) { + Font font = graveLabel.getFont(); + font = font.deriveFont(9f); + graveLabel.setFont(font); + changedFontGrave = true; + } } else if (changedFontGrave) { Font font = lifeLabel.getFont(); font = font.deriveFont(12f); @@ -205,6 +197,22 @@ public class PlayerPanelExt extends javax.swing.JPanel { } graveLabel.setText(Integer.toString(graveCards)); + int exileCards = player.getExile().size(); + if (exileCards > 99) { + if (!changedFontExile) { + Font font = exileLabel.getFont(); + font = font.deriveFont(9f); + exileLabel.setFont(font); + changedFontExile = true; + } + } else if (changedFontExile) { + Font font = lifeLabel.getFont(); + font = font.deriveFont(12f); + exileLabel.setFont(font); + changedFontExile = false; + } + exileLabel.setText(Integer.toString(exileCards)); + if (!MageFrame.isLite()) { int id = player.getUserData().getAvatarId(); if (id <= 0) { @@ -395,6 +403,22 @@ public class PlayerPanelExt extends javax.swing.JPanel { } }); + exileLabel = new JLabel(); + exileLabel.setToolTipText("Exile"); + image = ImageHelper.getImageFromResources("/info/exile.png"); + r = new Rectangle(21, 21); + resized = ImageHelper.getResizedImage(BufferedImageBuilder.bufferImage(image, BufferedImage.TYPE_INT_ARGB), r); + exileZone = new HoverButton(null, resized, resized, resized, r); + exileZone.setToolTipText("Exile"); + exileZone.setOpaque(false); + exileZone.setObserver(new Command() { + @Override + public void execute() { + btnExileZoneActionPerformed(null); + } + }); + exileZone.setBounds(25, 0, 21, 21); + // Cheat button r = new Rectangle(25, 21); image = ImageHelper.getImageFromResources("/info/cheat.png"); @@ -426,9 +450,12 @@ public class PlayerPanelExt extends javax.swing.JPanel { btnCommandZoneActionPerformed(null); } }); - commandZone.setBounds(0, 0, 21, 21); + commandZone.setBounds(5, 0, 21, 21); zonesPanel.add(commandZone); + cheat.setBounds(28, 0, 25, 21); + zonesPanel.add(cheat); + btnPlayer = new JButton(); btnPlayer.setText("Player"); btnPlayer.setVisible(false); @@ -554,19 +581,19 @@ public class PlayerPanelExt extends javax.swing.JPanel { .addGroup(gl_panelBackground.createSequentialGroup() .addGap(9) .addGroup(gl_panelBackground.createParallelGroup(Alignment.LEADING) - .addGroup(gl_panelBackground.createSequentialGroup() - .addGap(3) - .addComponent(poison, GroupLayout.PREFERRED_SIZE, 14, GroupLayout.PREFERRED_SIZE)) - .addGroup(gl_panelBackground.createSequentialGroup() - .addGap(2) - .addComponent(btnWhiteMana, GroupLayout.PREFERRED_SIZE, 15, GroupLayout.PREFERRED_SIZE)) - .addGroup(gl_panelBackground.createSequentialGroup() - .addGap(2) - .addComponent(btnBlueMana, GroupLayout.PREFERRED_SIZE, 15, GroupLayout.PREFERRED_SIZE)) - .addGroup(gl_panelBackground.createSequentialGroup() - .addGap(2) - .addComponent(btnBlackMana, GroupLayout.PREFERRED_SIZE, 15, GroupLayout.PREFERRED_SIZE)) - .addComponent(grave, GroupLayout.PREFERRED_SIZE, 21, GroupLayout.PREFERRED_SIZE) + .addGroup(gl_panelBackground.createSequentialGroup() + .addGap(3) + .addComponent(poison, GroupLayout.PREFERRED_SIZE, 14, GroupLayout.PREFERRED_SIZE)) + .addGroup(gl_panelBackground.createSequentialGroup() + .addGap(2) + .addComponent(btnWhiteMana, GroupLayout.PREFERRED_SIZE, 15, GroupLayout.PREFERRED_SIZE)) + .addGroup(gl_panelBackground.createSequentialGroup() + .addGap(2) + .addComponent(btnBlueMana, GroupLayout.PREFERRED_SIZE, 15, GroupLayout.PREFERRED_SIZE)) + .addGroup(gl_panelBackground.createSequentialGroup() + .addGap(2) + .addComponent(btnBlackMana, GroupLayout.PREFERRED_SIZE, 15, GroupLayout.PREFERRED_SIZE)) + .addComponent(grave, GroupLayout.PREFERRED_SIZE, 21, GroupLayout.PREFERRED_SIZE) ) .addGroup(gl_panelBackground.createParallelGroup(Alignment.LEADING) .addGroup(gl_panelBackground.createSequentialGroup() @@ -601,12 +628,19 @@ public class PlayerPanelExt extends javax.swing.JPanel { .addGroup(gl_panelBackground.createSequentialGroup() .addGap(40) .addComponent(libraryLabel, GroupLayout.PREFERRED_SIZE, 25, GroupLayout.PREFERRED_SIZE)) + /*.addGroup(gl_panelBackground.createSequentialGroup() + .addGap(18) + .addComponent(cheat, GroupLayout.PREFERRED_SIZE, 25, GroupLayout.PREFERRED_SIZE))*/ .addGroup(gl_panelBackground.createSequentialGroup() .addGap(18) - .addComponent(cheat, GroupLayout.PREFERRED_SIZE, 25, GroupLayout.PREFERRED_SIZE)) + .addComponent(exileZone, GroupLayout.PREFERRED_SIZE, 25, GroupLayout.PREFERRED_SIZE) + ) .addGroup(gl_panelBackground.createSequentialGroup() .addGap(5) .addComponent(graveLabel, GroupLayout.PREFERRED_SIZE, 25, GroupLayout.PREFERRED_SIZE)) + .addGroup(gl_panelBackground.createSequentialGroup() + .addGap(40) + .addComponent(exileLabel, GroupLayout.PREFERRED_SIZE, 25, GroupLayout.PREFERRED_SIZE)) .addGroup(gl_panelBackground.createSequentialGroup() .addGap(1) .addComponent(manaCountLabelU, GroupLayout.PREFERRED_SIZE, 30, GroupLayout.PREFERRED_SIZE)))) @@ -644,16 +678,16 @@ public class PlayerPanelExt extends javax.swing.JPanel { .addGap(1) .addGroup(gl_panelBackground.createParallelGroup(Alignment.LEADING) .addGroup(gl_panelBackground.createSequentialGroup() - .addGap(4) - .addComponent(poison, GroupLayout.PREFERRED_SIZE, 14, GroupLayout.PREFERRED_SIZE) - .addGap(4) - .addComponent(btnWhiteMana, GroupLayout.PREFERRED_SIZE, 15, GroupLayout.PREFERRED_SIZE) - .addGap(2) - .addComponent(btnBlueMana, GroupLayout.PREFERRED_SIZE, 15, GroupLayout.PREFERRED_SIZE) - .addGap(2) - .addComponent(btnBlackMana, GroupLayout.PREFERRED_SIZE, 15, GroupLayout.PREFERRED_SIZE) - .addGap(5) - .addComponent(grave, GroupLayout.PREFERRED_SIZE, 21, GroupLayout.PREFERRED_SIZE) + .addGap(4) + .addComponent(poison, GroupLayout.PREFERRED_SIZE, 14, GroupLayout.PREFERRED_SIZE) + .addGap(4) + .addComponent(btnWhiteMana, GroupLayout.PREFERRED_SIZE, 15, GroupLayout.PREFERRED_SIZE) + .addGap(2) + .addComponent(btnBlueMana, GroupLayout.PREFERRED_SIZE, 15, GroupLayout.PREFERRED_SIZE) + .addGap(2) + .addComponent(btnBlackMana, GroupLayout.PREFERRED_SIZE, 15, GroupLayout.PREFERRED_SIZE) + .addGap(5) + .addComponent(grave, GroupLayout.PREFERRED_SIZE, 21, GroupLayout.PREFERRED_SIZE) ) .addGroup(gl_panelBackground.createSequentialGroup() .addGroup(gl_panelBackground.createParallelGroup(Alignment.LEADING) @@ -685,12 +719,19 @@ public class PlayerPanelExt extends javax.swing.JPanel { .addGap(31) .addComponent(manaCountLabelG, GroupLayout.PREFERRED_SIZE, 30, GroupLayout.PREFERRED_SIZE)) .addComponent(libraryLabel, GroupLayout.PREFERRED_SIZE, 20, GroupLayout.PREFERRED_SIZE) + /*.addGroup(gl_panelBackground.createSequentialGroup() + .addGap(76) + .addComponent(cheat, GroupLayout.PREFERRED_SIZE, 21, GroupLayout.PREFERRED_SIZE))*/ .addGroup(gl_panelBackground.createSequentialGroup() .addGap(76) - .addComponent(cheat, GroupLayout.PREFERRED_SIZE, 21, GroupLayout.PREFERRED_SIZE)) + .addComponent(exileZone, GroupLayout.PREFERRED_SIZE, 21, GroupLayout.PREFERRED_SIZE) + ) .addGroup(gl_panelBackground.createSequentialGroup() .addGap(76) .addComponent(graveLabel, GroupLayout.PREFERRED_SIZE, 21, GroupLayout.PREFERRED_SIZE)) + .addGroup(gl_panelBackground.createSequentialGroup() + .addGap(76) + .addComponent(exileLabel, GroupLayout.PREFERRED_SIZE, 21, GroupLayout.PREFERRED_SIZE)) .addGroup(gl_panelBackground.createSequentialGroup() .addGap(31) .addComponent(manaCountLabelU, GroupLayout.PREFERRED_SIZE, 30, GroupLayout.PREFERRED_SIZE) @@ -749,6 +790,10 @@ public class PlayerPanelExt extends javax.swing.JPanel { DialogManager.getManager(gameId).showEmblemsDialog(CardsViewUtil.convertCommandObject(player.getCommadObjectList()), bigCard, gameId); } + private void btnExileZoneActionPerformed(java.awt.event.ActionEvent evt) { + DialogManager.getManager(gameId).showExileDialog(CardsViewUtil.convertSimple(player.getExile(), MageFrame.getGame(gameId).getLoadedCards()), bigCard, gameId); + } + private void btnCheatActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCheatActionPerformed DckDeckImporter deckImporter = new DckDeckImporter(); session.cheat(gameId, playerId, deckImporter.importDeck("cheat.dck")); @@ -776,9 +821,11 @@ public class PlayerPanelExt extends javax.swing.JPanel { private JLabel libraryLabel; private JLabel poisonLabel; private JLabel graveLabel; + private JLabel exileLabel; private boolean changedFontLibrary; private boolean changedFontLife; private boolean changedFontGrave; + private boolean changedFontExile; private JPanel zonesPanel; private HoverButton exileZone; diff --git a/Mage.Client/src/main/resources/info/exile.png b/Mage.Client/src/main/resources/info/exile.png new file mode 100644 index 0000000000000000000000000000000000000000..6f0fe92cc396e3bde1e6c19eb7d257ef502b2d2e GIT binary patch literal 19202 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 literal 0 HcmV?d00001 diff --git a/Mage.Common/src/mage/view/PlayerView.java b/Mage.Common/src/mage/view/PlayerView.java index 4a70758182f..c4ae12e3e09 100644 --- a/Mage.Common/src/mage/view/PlayerView.java +++ b/Mage.Common/src/mage/view/PlayerView.java @@ -30,16 +30,17 @@ package mage.view; import mage.cards.Card; import mage.counters.CounterType; +import mage.game.ExileZone; import mage.game.Game; import mage.game.GameState; import mage.game.command.CommandObject; +import mage.game.command.Commander; import mage.game.command.Emblem; import mage.game.permanent.Permanent; import mage.players.Player; import java.io.Serializable; import java.util.*; -import mage.game.command.Commander; /** * @@ -59,6 +60,7 @@ public class PlayerView implements Serializable { private final boolean hasLeft; private final ManaPoolView manaPool; private final SimpleCardsView graveyard = new SimpleCardsView(); + private final SimpleCardsView exile = new SimpleCardsView(); private final Map battlefield = new LinkedHashMap<>(); private final CardView topCard; private final UserDataView userDataView; @@ -81,6 +83,14 @@ public class PlayerView implements Serializable { for (Card card: player.getGraveyard().getCards(game)) { graveyard.put(card.getId(), new SimpleCardView(card.getId(), card.getExpansionSetCode(), card.getCardNumber(), card.getUsesVariousArt(), card.isFaceDown(), card.getTokenSetCode())); } + for (ExileZone exileZone : game.getExile().getExileZones()) { + for (Card card : exileZone.getCards(game)) { + if (!player.getId().equals(card.getOwnerId())) { + break; + } + exile.put(card.getId(), new SimpleCardView(card.getId(), card.getExpansionSetCode(), card.getCardNumber(), card.getUsesVariousArt(), card.isFaceDown(), card.getTokenSetCode())); + } + } for (Permanent permanent: state.getBattlefield().getAllPermanents()) { if (showInBattlefield(permanent, state)) { PermanentView view = new PermanentView(permanent, game.getCard(permanent.getId()), createdForPlayerId, game); @@ -165,6 +175,10 @@ public class PlayerView implements Serializable { return this.graveyard; } + public SimpleCardsView getExile() { + return exile; + } + public Map getBattlefield() { return this.battlefield; }