- Fix : Selected human & AI avatars now remain in fixed position when scrolling list of available avatar images.

This commit is contained in:
spr
2013-08-10 05:55:39 +00:00
parent 2bb8c97a5a
commit fdac56a9a7

View File

@@ -1,212 +1,208 @@
package forge.gui.home.settings; package forge.gui.home.settings;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.Image; import java.awt.Image;
import java.util.Map; import java.util.Map;
import javax.swing.ImageIcon; import javax.swing.ImageIcon;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.ScrollPaneConstants; import javax.swing.ScrollPaneConstants;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import forge.Command; import forge.Command;
import forge.Singletons; import forge.Singletons;
import forge.gui.WrapLayout; import forge.gui.WrapLayout;
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;
import forge.gui.home.EMenuGroup; import forge.gui.home.EMenuGroup;
import forge.gui.home.IVSubmenu; import forge.gui.home.IVSubmenu;
import forge.gui.home.VHomeUI; import forge.gui.home.VHomeUI;
import forge.gui.toolbox.FLabel; import forge.gui.toolbox.FLabel;
import forge.gui.toolbox.FScrollPane; import forge.gui.toolbox.FScrollPane;
import forge.gui.toolbox.FSkin; import forge.gui.toolbox.FSkin;
import forge.properties.ForgePreferences.FPref; import forge.properties.ForgePreferences.FPref;
/** /**
* Assembles Swing components of avatars submenu singleton. * Assembles Swing components of avatars submenu singleton.
*/ */
public enum VSubmenuAvatars implements IVSubmenu<CSubmenuAvatars> { public enum VSubmenuAvatars implements IVSubmenu<CSubmenuAvatars> {
SINGLETON_INSTANCE; SINGLETON_INSTANCE;
// Fields used with interface IVDoc // Fields used with interface IVDoc
private DragCell parentCell; private DragCell parentCell;
private final DragTab tab = new DragTab("Avatars"); private final DragTab tab = new DragTab("Avatars");
private final JPanel pnlAvatars = new JPanel(); private final JPanel pnlAvatars = new JPanel();
private final FScrollPane scrContent = new FScrollPane(pnlAvatars,
ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, private final FLabel lblAvatarHuman = new FLabel.Builder().hoverable(true).selectable(true)
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); .iconScaleFactor(0.99f).iconInBackground(true).build();
private final FLabel lblAvatarAI = new FLabel.Builder().hoverable(true).selectable(true)
private final FLabel lblAvatarHuman = new FLabel.Builder().hoverable(true).selectable(true) .iconScaleFactor(0.99f).iconInBackground(true).build();
.iconScaleFactor(0.99f).iconInBackground(true).build();
private final FLabel lblAvatarAI = new FLabel.Builder().hoverable(true).selectable(true) private VSubmenuAvatars() {
.iconScaleFactor(0.99f).iconInBackground(true).build(); populateAvatars();
}
private VSubmenuAvatars() {
populateAvatars(); public void focusHuman() {
scrContent.setBorder(null); lblAvatarHuman.requestFocusInWindow();
} }
public void focusHuman() { @Override
lblAvatarHuman.requestFocusInWindow(); public void populate() {
} VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().removeAll();
@Override VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().setLayout(new MigLayout("insets 0, gap 0"));
public void populate() { VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(pnlAvatars, "w 98%!, h 98%!, gap 1% 0 1% 0");
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().removeAll();
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().repaintSelf();
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().setLayout(new MigLayout("insets 0, gap 0")); VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().revalidate();
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(scrContent, "w 98%!, h 98%!, gap 1% 0 1% 0"); }
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().repaintSelf(); @Override
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().revalidate(); public EMenuGroup getGroupEnum() {
} return EMenuGroup.SETTINGS;
}
@Override
public EMenuGroup getGroupEnum() { @Override
return EMenuGroup.SETTINGS; public String getMenuTitle() {
} return "Avatars";
}
@Override
public String getMenuTitle() { @Override
return "Avatars"; public EDocID getItemEnum() {
} return EDocID.HOME_AVATARS;
}
@Override
public EDocID getItemEnum() { @SuppressWarnings("serial")
return EDocID.HOME_AVATARS; private void populateAvatars() {
} final Map<Integer, Image> avatarMap = FSkin.getAvatars();
final JPanel pnlAvatarPics = new JPanel(new WrapLayout());
@SuppressWarnings("serial") final JPanel pnlAvatarUsers = new JPanel(new MigLayout("insets 0, gap 0, align center"));
private void populateAvatars() {
final Map<Integer, Image> avatarMap = FSkin.getAvatars(); pnlAvatars.setOpaque(false);
final JPanel pnlAvatarPics = new JPanel(new WrapLayout()); pnlAvatarUsers.setOpaque(false);
final JPanel pnlAvatarUsers = new JPanel(new MigLayout("insets 0, gap 0, align center")); pnlAvatarPics.setOpaque(false);
pnlAvatars.setOpaque(false); pnlAvatarUsers.add(new FLabel.Builder().fontSize(12).text("Human").build(),
pnlAvatarUsers.setOpaque(false); "w 100px!, h 20px!, gap 0 20px 0 0");
pnlAvatarPics.setOpaque(false); pnlAvatarUsers.add(new FLabel.Builder().fontSize(12).text("AI").build(),
"w 100px!, h 20px!, wrap");
pnlAvatarUsers.add(new FLabel.Builder().fontSize(12).text("Human").build(),
"w 100px!, h 20px!, gap 0 20px 0 0"); pnlAvatarUsers.add(lblAvatarHuman, "w 100px!, h 100px!, gap 0 20px 0 0");
pnlAvatarUsers.add(new FLabel.Builder().fontSize(12).text("AI").build(), pnlAvatarUsers.add(lblAvatarAI, "w 100px!, h 100px!");
"w 100px!, h 20px!, wrap");
for (final Integer i : avatarMap.keySet()) {
pnlAvatarUsers.add(lblAvatarHuman, "w 100px!, h 100px!, gap 0 20px 0 0"); pnlAvatarPics.add(makeAvatarLabel(avatarMap.get(i), i));
pnlAvatarUsers.add(lblAvatarAI, "w 100px!, h 100px!"); }
for (final Integer i : avatarMap.keySet()) { pnlAvatars.removeAll();
pnlAvatarPics.add(makeAvatarLabel(avatarMap.get(i), i)); pnlAvatars.setLayout(new MigLayout("insets 0, gap 0"));
} pnlAvatars.add(pnlAvatarUsers, "w 90%!, h 150px!, wrap");
FScrollPane scroller = new FScrollPane(pnlAvatarPics);
pnlAvatars.removeAll(); scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
pnlAvatars.setLayout(new MigLayout("insets 0, gap 0")); pnlAvatars.add(scroller, "w 90%!, pushy, growy, gap 5% 0 0 0");
pnlAvatars.add(pnlAvatarUsers, "w 90%!, h 150px!, wrap");
pnlAvatars.add(new FScrollPane(pnlAvatarPics, final Command cmdHuman = new Command() { @Override
ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER), public void run() { lblAvatarAI.setSelected(false); lblAvatarHuman.requestFocusInWindow(); } };
"w 90%!, pushy, growy, gap 5% 0 0 0");
final Command cmdAI = new Command() { @Override
final Command cmdHuman = new Command() { @Override public void run() { lblAvatarHuman.setSelected(false); lblAvatarAI.requestFocusInWindow(); } };
public void run() { lblAvatarAI.setSelected(false); lblAvatarHuman.requestFocusInWindow(); } };
lblAvatarHuman.setCommand(cmdHuman);
final Command cmdAI = new Command() { @Override lblAvatarAI.setCommand(cmdAI);
public void run() { lblAvatarHuman.setSelected(false); lblAvatarAI.requestFocusInWindow(); } };
lblAvatarHuman.setSelected(true);
lblAvatarHuman.setCommand(cmdHuman);
lblAvatarAI.setCommand(cmdAI); final String[] indexes = Singletons.getModel().getPreferences().getPref(FPref.UI_AVATARS).split(",");
int humanIndex = Integer.parseInt(indexes[0]);
lblAvatarHuman.setSelected(true); int aiIndex = Integer.parseInt(indexes[1]);
final String[] indexes = Singletons.getModel().getPreferences().getPref(FPref.UI_AVATARS).split(","); if (humanIndex >= FSkin.getAvatars().size()) { humanIndex = 0; }
int humanIndex = Integer.parseInt(indexes[0]); if (aiIndex >= FSkin.getAvatars().size()) { aiIndex = 0; }
int aiIndex = Integer.parseInt(indexes[1]);
lblAvatarAI.setIcon(new ImageIcon(FSkin.getAvatars().get(aiIndex)));
if (humanIndex >= FSkin.getAvatars().size()) { humanIndex = 0; } lblAvatarHuman.setIcon(new ImageIcon(FSkin.getAvatars().get(humanIndex)));
if (aiIndex >= FSkin.getAvatars().size()) { aiIndex = 0; }
Singletons.getModel().getPreferences().setPref(FPref.UI_AVATARS, humanIndex + "," + aiIndex);
lblAvatarAI.setIcon(new ImageIcon(FSkin.getAvatars().get(aiIndex))); Singletons.getModel().getPreferences().save();
lblAvatarHuman.setIcon(new ImageIcon(FSkin.getAvatars().get(humanIndex))); }
Singletons.getModel().getPreferences().setPref(FPref.UI_AVATARS, humanIndex + "," + aiIndex); @SuppressWarnings("serial")
Singletons.getModel().getPreferences().save(); private FLabel makeAvatarLabel(final Image img0, final int index0) {
} final FLabel lbl = new FLabel.Builder().icon(new ImageIcon(img0)).iconScaleFactor(1.0)
.iconInBackground(true).hoverable(true).build();
@SuppressWarnings("serial")
private FLabel makeAvatarLabel(final Image img0, final int index0) { final Dimension size = new Dimension(100, 100);
final FLabel lbl = new FLabel.Builder().icon(new ImageIcon(img0)).iconScaleFactor(1.0) lbl.setPreferredSize(size);
.iconInBackground(true).hoverable(true).build(); lbl.setMaximumSize(size);
lbl.setMinimumSize(size);
final Dimension size = new Dimension(100, 100);
lbl.setPreferredSize(size); final Command cmd = new Command() {
lbl.setMaximumSize(size); @Override
lbl.setMinimumSize(size); public void run() {
String[] indices = Singletons.getModel().getPreferences()
final Command cmd = new Command() { .getPref(FPref.UI_AVATARS).split(",");
@Override
public void run() { if (lblAvatarAI.getSelected()) {
String[] indices = Singletons.getModel().getPreferences() lblAvatarAI.setIcon(new ImageIcon(FSkin.getAvatars().get(index0)));
.getPref(FPref.UI_AVATARS).split(","); lblAvatarAI.repaintSelf();
indices[1] = String.valueOf(index0);
if (lblAvatarAI.getSelected()) { }
lblAvatarAI.setIcon(new ImageIcon(FSkin.getAvatars().get(index0))); else {
lblAvatarAI.repaintSelf(); lblAvatarHuman.setIcon(new ImageIcon(FSkin.getAvatars().get(index0)));
indices[1] = String.valueOf(index0); lblAvatarHuman.repaintSelf();
} indices[0] = String.valueOf(index0);
else { }
lblAvatarHuman.setIcon(new ImageIcon(FSkin.getAvatars().get(index0)));
lblAvatarHuman.repaintSelf(); Singletons.getModel().getPreferences().setPref(FPref.UI_AVATARS, indices[0] + "," + indices[1]);
indices[0] = String.valueOf(index0); Singletons.getModel().getPreferences().save();
} }
};
Singletons.getModel().getPreferences().setPref(FPref.UI_AVATARS, indices[0] + "," + indices[1]);
Singletons.getModel().getPreferences().save(); lbl.setCommand(cmd);
} return lbl;
}; }
lbl.setCommand(cmd); //========== Overridden from IVDoc
return lbl;
} /* (non-Javadoc)
* @see forge.gui.framework.IVDoc#getDocumentID()
//========== Overridden from IVDoc */
@Override
/* (non-Javadoc) public EDocID getDocumentID() {
* @see forge.gui.framework.IVDoc#getDocumentID() return EDocID.HOME_AVATARS;
*/ }
@Override
public EDocID getDocumentID() { /* (non-Javadoc)
return EDocID.HOME_AVATARS; * @see forge.gui.framework.IVDoc#getTabLabel()
} */
@Override
/* (non-Javadoc) public DragTab getTabLabel() {
* @see forge.gui.framework.IVDoc#getTabLabel() return tab;
*/ }
@Override
public DragTab getTabLabel() { /* (non-Javadoc)
return tab; * @see forge.gui.framework.IVDoc#getLayoutControl()
} */
@Override
/* (non-Javadoc) public CSubmenuAvatars getLayoutControl() {
* @see forge.gui.framework.IVDoc#getLayoutControl() return CSubmenuAvatars.SINGLETON_INSTANCE;
*/ }
@Override
public CSubmenuAvatars getLayoutControl() { /* (non-Javadoc)
return CSubmenuAvatars.SINGLETON_INSTANCE; * @see forge.gui.framework.IVDoc#setParentCell(forge.gui.framework.DragCell)
} */
@Override
/* (non-Javadoc) public void setParentCell(DragCell cell0) {
* @see forge.gui.framework.IVDoc#setParentCell(forge.gui.framework.DragCell) this.parentCell = cell0;
*/ }
@Override
public void setParentCell(DragCell cell0) { /* (non-Javadoc)
this.parentCell = cell0; * @see forge.gui.framework.IVDoc#getParentCell()
} */
@Override
/* (non-Javadoc) public DragCell getParentCell() {
* @see forge.gui.framework.IVDoc#getParentCell() return parentCell;
*/ }
@Override }
public DragCell getParentCell() {
return parentCell;
}
}