From 4d9af1d8819222acb9335440299d7907b0af7c0b Mon Sep 17 00:00:00 2001 From: Doublestrike Date: Tue, 28 Feb 2012 06:53:59 +0000 Subject: [PATCH] Avatar rebuild, also fixing indexing bug #2. --- .../java/forge/view/home/ViewSettings.java | 212 ++++++------------ src/main/java/forge/view/toolbox/FLabel.java | 5 + 2 files changed, 78 insertions(+), 139 deletions(-) diff --git a/src/main/java/forge/view/home/ViewSettings.java b/src/main/java/forge/view/home/ViewSettings.java index faafb793e24..534d896ee05 100644 --- a/src/main/java/forge/view/home/ViewSettings.java +++ b/src/main/java/forge/view/home/ViewSettings.java @@ -3,7 +3,6 @@ package forge.view.home; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; -import java.awt.Graphics; import java.awt.Image; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; @@ -16,6 +15,7 @@ import java.util.Arrays; import java.util.List; import java.util.Map; +import javax.swing.ImageIcon; import javax.swing.JCheckBox; import javax.swing.JLabel; import javax.swing.JList; @@ -30,7 +30,7 @@ import net.miginfocom.swing.MigLayout; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.text.WordUtils; -import forge.PlayerType; +import forge.Command; import forge.Singletons; import forge.control.KeyboardShortcuts; import forge.control.KeyboardShortcuts.Shortcut; @@ -64,8 +64,7 @@ public class ViewSettings extends JPanel { private String sectionConstraints, regularConstraints, tabberConstraints; - private AvatarLabel avatarHuman, avatarAI; - private List lstAvatars; + private final FLabel lblAvatarHuman, lblAvatarAI; /** Assembles swing components for "Settings" mode menu. */ public ViewSettings() { @@ -114,6 +113,11 @@ public class ViewSettings extends JPanel { lblTitleSkin = new FLabel.Builder().text("Choose Skin").fontScaleAuto(false).build(); lblTitleSkin.setFont(FSkin.getBoldFont(14)); + lblAvatarHuman = new FLabel.Builder().hoverable(true).selectable(true) + .iconScaleFactor(0.99f).iconInBackground(true).build(); + lblAvatarAI = new FLabel.Builder().hoverable(true).selectable(true) + .iconScaleFactor(0.99f).iconInBackground(true).build(); + populateTabber(); populatePrefs(); populateAvatars(); @@ -129,8 +133,8 @@ public class ViewSettings extends JPanel { /** */ public void updateSkinNames() { - String[] uglyNames = FSkin.getSkins().toArray(new String[0]); - String[] prettyNames = new String[uglyNames.length]; + final String[] uglyNames = FSkin.getSkins().toArray(new String[0]); + final String[] prettyNames = new String[uglyNames.length]; for (int i = 0; i < uglyNames.length; i++) { prettyNames[i] = WordUtils.capitalize(uglyNames[i].replace('_', ' ')); @@ -228,100 +232,89 @@ public class ViewSettings extends JPanel { private void populateAvatars() { final Map avatarMap = FSkin.getAvatars(); + final JPanel pnlAvatarPics = new JPanel(new WrapLayout()); + final JPanel pnlAvatarUsers = new JPanel(new MigLayout("insets 0, gap 0, align center")); - pnlAvatars.setLayout(new WrapLayout()); + pnlAvatarUsers.setOpaque(false); + pnlAvatarPics.setOpaque(false); - lstAvatars = new ArrayList(); + pnlAvatarUsers.add(new FLabel.Builder().fontSize(12).text("Human").build(), + "w 100px!, h 20px!, gap 0 20px 0 0"); + pnlAvatarUsers.add(new FLabel.Builder().fontSize(12).text("AI").build(), + "w 100px!, h 20px!, wrap"); + + pnlAvatarUsers.add(lblAvatarHuman, "w 100px!, h 100px!, gap 0 20px 0 0"); + pnlAvatarUsers.add(lblAvatarAI, "w 100px!, h 100px!"); for (final Integer i : avatarMap.keySet()) { - lstAvatars.add(new AvatarLabel(avatarMap.get(i), i)); - pnlAvatars.add(lstAvatars.get(lstAvatars.size() - 1)); + pnlAvatarPics.add(makeAvatarLabel(avatarMap.get(i), i)); } + pnlAvatars.removeAll(); + pnlAvatars.setLayout(new MigLayout("insets 0, gap 0")); + pnlAvatars.add(pnlAvatarUsers, "w 90%!, h 150px!, wrap"); + pnlAvatars.add(new FScrollPane(pnlAvatarPics, + JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER), + "w 90%!, pushy, growy, gap 5% 0 0 0"); + + final Command cmdHuman = new Command() { @Override + public void execute() { lblAvatarAI.setSelected(false); } }; + + final Command cmdAI = new Command() { @Override + public void execute() { lblAvatarHuman.setSelected(false); } }; + + lblAvatarHuman.setCommand(cmdHuman); + lblAvatarAI.setCommand(cmdAI); + + lblAvatarHuman.setSelected(true); + final String[] indexes = Singletons.getModel().getPreferences().getPref(FPref.UI_AVATARS).split(","); int humanIndex = Integer.parseInt(indexes[0]); int aiIndex = Integer.parseInt(indexes[1]); - // Set human avatar from preferences - if (humanIndex >= lstAvatars.size()) { - humanIndex = (int) (Math.random() * (lstAvatars.size() - 1)); - } + if (humanIndex >= FSkin.getAvatars().size()) { humanIndex = 0; } + if (aiIndex >= FSkin.getAvatars().size()) { aiIndex = 0; } - avatarHuman = lstAvatars.get(humanIndex); - avatarHuman.setOwner(PlayerType.HUMAN); - avatarHuman.repaintOnlyThisLabel(); + lblAvatarHuman.setIcon(new ImageIcon(FSkin.getAvatars().get(humanIndex))); + lblAvatarAI.setIcon(new ImageIcon(FSkin.getAvatars().get(aiIndex))); - if (humanIndex == aiIndex || aiIndex >= lstAvatars.size()) { - aiIndex = humanIndex; - while (aiIndex == humanIndex) { - aiIndex = (int) (Math.random() * (lstAvatars.size() - 1)); - } - } - - avatarAI = lstAvatars.get(aiIndex); - avatarAI.setOwner(PlayerType.COMPUTER); - avatarAI.repaintOnlyThisLabel(); + Singletons.getModel().getPreferences().setPref(FPref.UI_AVATARS, aiIndex + "," + humanIndex); + Singletons.getModel().getPreferences().save(); } - /** Surprisingly complicated - be careful when modifying! */ - private void cycleOwner(final AvatarLabel lbl0) { - if (lbl0.getOwner() == null) { - lbl0.setOwner(PlayerType.HUMAN); - lbl0.repaintOnlyThisLabel(); + private FLabel makeAvatarLabel(final Image img0, final int index0) { + final FLabel lbl = new FLabel.Builder().icon(new ImageIcon(img0)).iconScaleFactor(1.0) + .iconAlpha(0.7f).iconInBackground(true).hoverable(true).build(); - if (avatarHuman != null) { - avatarHuman.setOwner(null); - avatarHuman.repaintOnlyThisLabel(); - } + final Dimension size = new Dimension(100, 100); + lbl.setPreferredSize(size); + lbl.setMaximumSize(size); + lbl.setMinimumSize(size); - avatarHuman = lbl0; - } - else if (lbl0.getOwner() == PlayerType.HUMAN) { - // Re-assign avatar to human - avatarHuman.setOwner(null); - avatarHuman.repaintOnlyThisLabel(); + final Command cmd = new Command() { + @Override + public void execute() { + String[] indices = Singletons.getModel().getPreferences() + .getPref(FPref.UI_AVATARS).split(","); - for (int i = 0; i < lstAvatars.size(); i++) { - if (lstAvatars.get(i) != lbl0) { - avatarHuman = lstAvatars.get(i); - avatarHuman.setOwner(PlayerType.HUMAN); - avatarHuman.repaintOnlyThisLabel(); - break; + if (lblAvatarAI.isSelected()) { + lblAvatarAI.setIcon(new ImageIcon(FSkin.getAvatars().get(index0))); + lblAvatarAI.repaintOnlyThisLabel(); + indices[0] = String.valueOf(index0); } - } - - // Assign computer - lbl0.setOwner(PlayerType.COMPUTER); - lbl0.repaintOnlyThisLabel(); - - if (avatarAI != null) { - avatarAI.setOwner(null); - avatarAI.repaintOnlyThisLabel(); - } - - avatarAI = lbl0; - } - else { - lbl0.setOwner(null); - lbl0.repaintOnlyThisLabel(); - - // Re-assign avatar to computer - avatarAI.setOwner(null); - avatarAI.repaintOnlyThisLabel(); - - for (int i = 0; i < lstAvatars.size(); i++) { - if (lstAvatars.get(i) != avatarHuman) { - avatarAI = lstAvatars.get(i); - avatarAI.setOwner(PlayerType.COMPUTER); - avatarAI.repaintOnlyThisLabel(); - break; + else { + lblAvatarHuman.setIcon(new ImageIcon(FSkin.getAvatars().get(index0))); + lblAvatarHuman.repaintOnlyThisLabel(); + indices[1] = String.valueOf(index0); } - } - } - Singletons.getModel().getPreferences().setPref( - FPref.UI_AVATARS, avatarAI.getIndex() + "," + avatarHuman.getIndex()); - Singletons.getModel().getPreferences().save(); + Singletons.getModel().getPreferences().setPref(FPref.UI_AVATARS, indices[0] + "," + indices[1]); + Singletons.getModel().getPreferences().save(); + } + }; + + lbl.setCommand(cmd); + return lbl; } /** Consolidates checkbox styling in one place. */ @@ -368,65 +361,6 @@ public class ViewSettings extends JPanel { } } - private class AvatarLabel extends JLabel { - private final Image img; - private final int index; - private PlayerType owner; - private boolean hovered = false; - - public AvatarLabel(final Image img0, final int index0) { - super(); - img = img0; - index = index0; - setMaximumSize(new Dimension(100, 120)); - setMinimumSize(new Dimension(100, 120)); - setPreferredSize(new Dimension(100, 120)); - - this.addMouseListener(new MouseAdapter() { - @Override - public void mouseEntered(final MouseEvent evt) { hovered = true; repaintOnlyThisLabel(); } - - @Override - public void mouseExited(final MouseEvent evt) { hovered = false; repaintOnlyThisLabel(); } - - @Override - public void mouseClicked(final MouseEvent evt) { cycleOwner(AvatarLabel.this); repaintOnlyThisLabel(); } - }); - } - - public void setOwner(final PlayerType player0) { - this.owner = player0; - } - - public PlayerType getOwner() { - return this.owner; - } - - public int getIndex() { - return this.index; - } - - public void repaintOnlyThisLabel() { - final Dimension d = AvatarLabel.this.getSize(); - repaint(0, 0, d.width, d.height); - } - - protected void paintComponent(final Graphics graphics0) { - if (hovered) { - graphics0.setColor(FSkin.getColor(FSkin.Colors.CLR_HOVER)); - graphics0.fillRect(0, 0, 100, 120); - } - - graphics0.drawImage(img, 0, 20, null); - if (owner == null) { return; } - - graphics0.setColor(FSkin.getColor(FSkin.Colors.CLR_TEXT)); - graphics0.drawRect(0, 0, 99, 119); - graphics0.setFont(FSkin.getBoldFont(14)); - graphics0.drawString(owner.toString(), 5, 15); - } - } - /** * A JTextField plus a "codeString" property, that stores keycodes for the * shortcut. Also, an action listener that handles translation of keycodes diff --git a/src/main/java/forge/view/toolbox/FLabel.java b/src/main/java/forge/view/toolbox/FLabel.java index 9fda0842c4f..9f9424ac763 100644 --- a/src/main/java/forge/view/toolbox/FLabel.java +++ b/src/main/java/forge/view/toolbox/FLabel.java @@ -316,6 +316,11 @@ public class FLabel extends JLabel { return this.resizeTimer; } + /** @return boolean */ + public boolean isSelected() { + return selected; + } + @Override // Must be public. public void setIcon(final Icon i0) {