Avatar rebuild, also fixing indexing bug #2.

This commit is contained in:
Doublestrike
2012-02-28 06:53:59 +00:00
parent c5dba14b80
commit 4d9af1d881
2 changed files with 78 additions and 139 deletions

View File

@@ -3,7 +3,6 @@ package forge.view.home;
import java.awt.Color; import java.awt.Color;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.Font; import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image; import java.awt.Image;
import java.awt.event.FocusAdapter; import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent; import java.awt.event.FocusEvent;
@@ -16,6 +15,7 @@ import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import javax.swing.ImageIcon;
import javax.swing.JCheckBox; import javax.swing.JCheckBox;
import javax.swing.JLabel; import javax.swing.JLabel;
import javax.swing.JList; import javax.swing.JList;
@@ -30,7 +30,7 @@ import net.miginfocom.swing.MigLayout;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.text.WordUtils; import org.apache.commons.lang3.text.WordUtils;
import forge.PlayerType; import forge.Command;
import forge.Singletons; import forge.Singletons;
import forge.control.KeyboardShortcuts; import forge.control.KeyboardShortcuts;
import forge.control.KeyboardShortcuts.Shortcut; import forge.control.KeyboardShortcuts.Shortcut;
@@ -64,8 +64,7 @@ public class ViewSettings extends JPanel {
private String sectionConstraints, regularConstraints, tabberConstraints; private String sectionConstraints, regularConstraints, tabberConstraints;
private AvatarLabel avatarHuman, avatarAI; private final FLabel lblAvatarHuman, lblAvatarAI;
private List<AvatarLabel> lstAvatars;
/** Assembles swing components for "Settings" mode menu. */ /** Assembles swing components for "Settings" mode menu. */
public ViewSettings() { public ViewSettings() {
@@ -114,6 +113,11 @@ public class ViewSettings extends JPanel {
lblTitleSkin = new FLabel.Builder().text("Choose Skin").fontScaleAuto(false).build(); lblTitleSkin = new FLabel.Builder().text("Choose Skin").fontScaleAuto(false).build();
lblTitleSkin.setFont(FSkin.getBoldFont(14)); 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(); populateTabber();
populatePrefs(); populatePrefs();
populateAvatars(); populateAvatars();
@@ -129,8 +133,8 @@ public class ViewSettings extends JPanel {
/** */ /** */
public void updateSkinNames() { public void updateSkinNames() {
String[] uglyNames = FSkin.getSkins().toArray(new String[0]); final String[] uglyNames = FSkin.getSkins().toArray(new String[0]);
String[] prettyNames = new String[uglyNames.length]; final String[] prettyNames = new String[uglyNames.length];
for (int i = 0; i < uglyNames.length; i++) { for (int i = 0; i < uglyNames.length; i++) {
prettyNames[i] = WordUtils.capitalize(uglyNames[i].replace('_', ' ')); prettyNames[i] = WordUtils.capitalize(uglyNames[i].replace('_', ' '));
@@ -228,100 +232,89 @@ public class ViewSettings extends JPanel {
private void populateAvatars() { private void populateAvatars() {
final Map<Integer, Image> avatarMap = FSkin.getAvatars(); final Map<Integer, Image> 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<AvatarLabel>(); 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()) { for (final Integer i : avatarMap.keySet()) {
lstAvatars.add(new AvatarLabel(avatarMap.get(i), i)); pnlAvatarPics.add(makeAvatarLabel(avatarMap.get(i), i));
pnlAvatars.add(lstAvatars.get(lstAvatars.size() - 1));
} }
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(","); final String[] indexes = Singletons.getModel().getPreferences().getPref(FPref.UI_AVATARS).split(",");
int humanIndex = Integer.parseInt(indexes[0]); int humanIndex = Integer.parseInt(indexes[0]);
int aiIndex = Integer.parseInt(indexes[1]); int aiIndex = Integer.parseInt(indexes[1]);
// Set human avatar from preferences if (humanIndex >= FSkin.getAvatars().size()) { humanIndex = 0; }
if (humanIndex >= lstAvatars.size()) { if (aiIndex >= FSkin.getAvatars().size()) { aiIndex = 0; }
humanIndex = (int) (Math.random() * (lstAvatars.size() - 1));
}
avatarHuman = lstAvatars.get(humanIndex); lblAvatarHuman.setIcon(new ImageIcon(FSkin.getAvatars().get(humanIndex)));
avatarHuman.setOwner(PlayerType.HUMAN); lblAvatarAI.setIcon(new ImageIcon(FSkin.getAvatars().get(aiIndex)));
avatarHuman.repaintOnlyThisLabel();
if (humanIndex == aiIndex || aiIndex >= lstAvatars.size()) { Singletons.getModel().getPreferences().setPref(FPref.UI_AVATARS, aiIndex + "," + humanIndex);
aiIndex = humanIndex; Singletons.getModel().getPreferences().save();
while (aiIndex == humanIndex) {
aiIndex = (int) (Math.random() * (lstAvatars.size() - 1));
}
}
avatarAI = lstAvatars.get(aiIndex);
avatarAI.setOwner(PlayerType.COMPUTER);
avatarAI.repaintOnlyThisLabel();
} }
/** Surprisingly complicated - be careful when modifying! */ private FLabel makeAvatarLabel(final Image img0, final int index0) {
private void cycleOwner(final AvatarLabel lbl0) { final FLabel lbl = new FLabel.Builder().icon(new ImageIcon(img0)).iconScaleFactor(1.0)
if (lbl0.getOwner() == null) { .iconAlpha(0.7f).iconInBackground(true).hoverable(true).build();
lbl0.setOwner(PlayerType.HUMAN);
lbl0.repaintOnlyThisLabel();
if (avatarHuman != null) { final Dimension size = new Dimension(100, 100);
avatarHuman.setOwner(null); lbl.setPreferredSize(size);
avatarHuman.repaintOnlyThisLabel(); lbl.setMaximumSize(size);
} lbl.setMinimumSize(size);
avatarHuman = lbl0; final Command cmd = new Command() {
} @Override
else if (lbl0.getOwner() == PlayerType.HUMAN) { public void execute() {
// Re-assign avatar to human String[] indices = Singletons.getModel().getPreferences()
avatarHuman.setOwner(null); .getPref(FPref.UI_AVATARS).split(",");
avatarHuman.repaintOnlyThisLabel();
for (int i = 0; i < lstAvatars.size(); i++) { if (lblAvatarAI.isSelected()) {
if (lstAvatars.get(i) != lbl0) { lblAvatarAI.setIcon(new ImageIcon(FSkin.getAvatars().get(index0)));
avatarHuman = lstAvatars.get(i); lblAvatarAI.repaintOnlyThisLabel();
avatarHuman.setOwner(PlayerType.HUMAN); indices[0] = String.valueOf(index0);
avatarHuman.repaintOnlyThisLabel();
break;
} }
} else {
lblAvatarHuman.setIcon(new ImageIcon(FSkin.getAvatars().get(index0)));
// Assign computer lblAvatarHuman.repaintOnlyThisLabel();
lbl0.setOwner(PlayerType.COMPUTER); indices[1] = String.valueOf(index0);
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;
} }
}
}
Singletons.getModel().getPreferences().setPref( Singletons.getModel().getPreferences().setPref(FPref.UI_AVATARS, indices[0] + "," + indices[1]);
FPref.UI_AVATARS, avatarAI.getIndex() + "," + avatarHuman.getIndex()); Singletons.getModel().getPreferences().save();
Singletons.getModel().getPreferences().save(); }
};
lbl.setCommand(cmd);
return lbl;
} }
/** Consolidates checkbox styling in one place. */ /** 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 * A JTextField plus a "codeString" property, that stores keycodes for the
* shortcut. Also, an action listener that handles translation of keycodes * shortcut. Also, an action listener that handles translation of keycodes

View File

@@ -316,6 +316,11 @@ public class FLabel extends JLabel {
return this.resizeTimer; return this.resizeTimer;
} }
/** @return boolean */
public boolean isSelected() {
return selected;
}
@Override @Override
// Must be public. // Must be public.
public void setIcon(final Icon i0) { public void setIcon(final Icon i0) {