From b724f393860e012325b1738fcfdaa7451c27d838 Mon Sep 17 00:00:00 2001 From: Doublestrike Date: Sun, 19 Feb 2012 01:55:48 +0000 Subject: [PATCH] Avatar icons now update in the player field without restarting Forge. --- .../java/forge/control/ControlMatchUI.java | 38 +++++++++++ src/main/java/forge/view/match/ViewField.java | 63 ++++--------------- src/main/java/forge/view/toolbox/FLabel.java | 13 +++- 3 files changed, 62 insertions(+), 52 deletions(-) diff --git a/src/main/java/forge/control/ControlMatchUI.java b/src/main/java/forge/control/ControlMatchUI.java index 23978fbd150..10f9c11b171 100644 --- a/src/main/java/forge/control/ControlMatchUI.java +++ b/src/main/java/forge/control/ControlMatchUI.java @@ -17,9 +17,13 @@ */ package forge.control; +import java.awt.Image; +import java.io.File; import java.util.ArrayList; import java.util.List; +import javax.swing.ImageIcon; + import forge.AllZone; import forge.Card; import forge.CardContainer; @@ -37,8 +41,14 @@ import forge.control.match.ControlHand; import forge.control.match.ControlMessage; import forge.control.match.ControlPicture; import forge.control.match.ControlTabber; +import forge.game.GameType; +import forge.properties.ForgePreferences.FPref; +import forge.properties.ForgeProps; +import forge.properties.NewConstants; import forge.view.ViewMatchUI; import forge.view.match.ViewField; +import forge.view.toolbox.FLabel; +import forge.view.toolbox.FSkin; /** *

@@ -93,6 +103,34 @@ public class ControlMatchUI implements CardContainer { f.getPlayer().updateObservers(); } + // Update avatars + final String[] indices = Singletons.getModel().getPreferences().getPref(FPref.UI_AVATARS).split(","); + final Object[] views = Singletons.getView().getMatchView().getFieldViews().toArray(); + for (int i = 0; i < views.length; i++) { + final Image img; + // Update AI quest icon + if (i > 0 && Constant.Runtime.getGameType() == GameType.Quest) { + String filename = ForgeProps.getFile(NewConstants.IMAGE_ICON) + File.separator; + + if (Constant.Quest.OPP_ICON_NAME[0] != null) { + filename += Constant.Quest.OPP_ICON_NAME[0]; + final File f = new File(filename); + img = (f.exists() + ? new ImageIcon(filename).getImage() + : FSkin.getAvatars().get(Integer.parseInt(indices[i]))); + } + else { + img = FSkin.getAvatars().get(Integer.parseInt(indices[i])); + } + } + else { + img = FSkin.getAvatars().get(Integer.parseInt(indices[i])); + } + + ((ViewField) views[i]).getLblAvatar().setIcon(new ImageIcon(img)); + ((FLabel) ((ViewField) views[i]).getLblAvatar()).getResizeTimer().start(); + } + AllZone.getHumanPlayer().getZone(Zone.Hand).updateObservers(); AllZone.getComputerPlayer().getZone(Zone.Hand).updateObservers(); AllZone.getStack().updateObservers(); diff --git a/src/main/java/forge/view/match/ViewField.java b/src/main/java/forge/view/match/ViewField.java index e325e82e0bc..ff88f83133c 100644 --- a/src/main/java/forge/view/match/ViewField.java +++ b/src/main/java/forge/view/match/ViewField.java @@ -19,13 +19,10 @@ package forge.view.match; import java.awt.Color; import java.awt.Dimension; +import java.awt.Font; import java.awt.Graphics; -import java.awt.Image; -import java.awt.event.ComponentAdapter; -import java.awt.event.ComponentEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.io.File; import javax.swing.ImageIcon; import javax.swing.JLabel; @@ -39,17 +36,12 @@ import javax.swing.border.MatteBorder; import net.miginfocom.swing.MigLayout; import arcane.ui.PlayArea; import forge.AllZone; -import forge.Constant; import forge.Constant.Zone; import forge.Player; import forge.Singletons; import forge.card.cardfactory.CardFactoryUtil; import forge.card.mana.ManaPool; import forge.control.match.ControlField; -import forge.game.GameType; -import forge.properties.ForgePreferences.FPref; -import forge.properties.ForgeProps; -import forge.properties.NewConstants; import forge.view.toolbox.FLabel; import forge.view.toolbox.FPanel; import forge.view.toolbox.FSkin; @@ -75,8 +67,7 @@ public class ViewField extends FPanel { lblEndCombat, lblMain2, lblEndTurn, lblCleanup; private final JPanel avatarArea, phaseArea, pnlDetails; - private JLabel lblAvatar, lblLife; - private final Image img; + private final JLabel lblAvatar, lblLife; private final Color clrHover, clrPhaseActiveEnabled, clrPhaseActiveDisabled, clrPhaseInactiveEnabled, clrPhaseInactiveDisabled; /** @@ -99,42 +90,18 @@ public class ViewField extends FPanel { this.clrPhaseActiveDisabled = FSkin.getColor(FSkin.Colors.CLR_PHASE_ACTIVE_DISABLED); this.clrPhaseInactiveDisabled = FSkin.getColor(FSkin.Colors.CLR_PHASE_INACTIVE_DISABLED); - // Player icon logic - final String[] indexes = Singletons.getModel().getPreferences().getPref(FPref.UI_AVATARS).split(","); - if (player.isHuman()) { - img = FSkin.getAvatars().get(Integer.parseInt(indexes[0])); - } - else if (Constant.Runtime.getGameType() == GameType.Quest) { - String filename = ForgeProps.getFile(NewConstants.IMAGE_ICON) + File.separator; - - if (Constant.Quest.OPP_ICON_NAME[0] != null) { - filename += Constant.Quest.OPP_ICON_NAME[0]; - final File f = new File(filename); - img = (f.exists() - ? new ImageIcon(filename).getImage() - : FSkin.getAvatars().get(Integer.parseInt(indexes[1]))); - } - else { - img = FSkin.getAvatars().get(Integer.parseInt(indexes[1])); - } - } - else { - img = FSkin.getAvatars().get(Integer.parseInt(indexes[1])); - } - // Avatar and life avatarArea = new JPanel(); avatarArea.setOpaque(false); avatarArea.setBackground(FSkin.getColor(FSkin.Colors.CLR_HOVER)); avatarArea.setLayout(new MigLayout("insets 0, gap 0")); - lblAvatar = new JLabel(); - lblAvatar.setHorizontalAlignment(SwingConstants.CENTER); - avatarArea.add(lblAvatar, "w 100%!, wrap, gaptop 4%"); + lblAvatar = new FLabel.Builder().fontAlign(SwingConstants.CENTER) + .iconScaleFactor(1.0f).build(); + avatarArea.add(lblAvatar, "w 100%!, h 70%!, wrap, gaptop 4%"); - lblLife = new JLabel(); - lblLife.setHorizontalAlignment(SwingConstants.CENTER); - lblLife.setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT)); + lblLife = new FLabel.Builder().fontAlign(SwingConstants.CENTER) + .fontStyle(Font.BOLD).build(); avatarArea.add(lblLife, "w 100%!, h 30%!, gaptop 4%"); this.add(avatarArea, "w 10%!, h 30%!"); @@ -167,17 +134,6 @@ public class ViewField extends FPanel { populateDetails(); this.add(pnlDetails, "w 10%!, h 69%!, gapleft 1px"); - // Resize adapter - this.addComponentListener(new ComponentAdapter() { - @Override - public void componentResized(ComponentEvent e) { - int side = (int) (avatarArea.getHeight() * 0.7); - int size = (int) (avatarArea.getHeight() * 0.24); - lblLife.setFont(FSkin.getBoldFont(size)); - lblAvatar.setIcon(new ImageIcon(img.getScaledInstance(side, side, java.awt.Image.SCALE_SMOOTH))); - } - }); - // Player hover effect avatarArea.addMouseListener(new MouseAdapter() { @Override @@ -411,6 +367,11 @@ public class ViewField extends FPanel { return this.avatarArea; } + /** @return {@link javax.swing.JLabel} */ + public JLabel getLblAvatar() { + return this.lblAvatar; + } + /** @return {@link javax.swing.JLabel} */ public JLabel getLblLife() { return this.lblLife; diff --git a/src/main/java/forge/view/toolbox/FLabel.java b/src/main/java/forge/view/toolbox/FLabel.java index aa4ef2d2974..99b9fc18005 100644 --- a/src/main/java/forge/view/toolbox/FLabel.java +++ b/src/main/java/forge/view/toolbox/FLabel.java @@ -291,6 +291,17 @@ public class FLabel extends JLabel { this.setHorizontalAlignment(i0); } + /** Resizing in MigLayout "slides" between the original and destination sizes. + * To prevent this label from recalculating on each increment, a timer + * is run to check that the the "sliding" is finished. To resize this label + * explicitly, retrieve this timer and start it. It will stop automatically. + * + * @return {@link javax.swing.Timer} + */ + public Timer getResizeTimer() { + return this.resizeTimer; + } + @Override // Must be public. public void setIcon(final Icon i0) { @@ -335,7 +346,7 @@ public class FLabel extends JLabel { // Opacity, select if (this.opaque && !selected) { - g2d.setColor(clrInactive); + g2d.setColor(getBackground()); g2d.fillRect(0, 0, w, h); } else if (selectable && selected) {