DeckChooser from constructed home screen refactored as a component

This commit is contained in:
Maxmtg
2012-10-24 07:54:47 +00:00
parent eabbd50508
commit a426867c3e
6 changed files with 344 additions and 376 deletions

1
.gitattributes vendored
View File

@@ -12883,6 +12883,7 @@ src/main/java/forge/gui/toolbox/DeckLister.java -text
src/main/java/forge/gui/toolbox/ExperimentalLabel.java -text src/main/java/forge/gui/toolbox/ExperimentalLabel.java -text
src/main/java/forge/gui/toolbox/FButton.java -text src/main/java/forge/gui/toolbox/FButton.java -text
src/main/java/forge/gui/toolbox/FCheckBox.java -text src/main/java/forge/gui/toolbox/FCheckBox.java -text
src/main/java/forge/gui/toolbox/FDeckChooser.java -text
src/main/java/forge/gui/toolbox/FLabel.java -text src/main/java/forge/gui/toolbox/FLabel.java -text
src/main/java/forge/gui/toolbox/FList.java -text src/main/java/forge/gui/toolbox/FList.java -text
src/main/java/forge/gui/toolbox/FOverlay.java -text src/main/java/forge/gui/toolbox/FOverlay.java -text

View File

@@ -461,7 +461,6 @@ public class GameState {
do{ do{
iPlayer = ( iPlayer + 1 ) % allPlayers.size(); iPlayer = ( iPlayer + 1 ) % allPlayers.size();
iAlive = roIngamePlayers.indexOf(allPlayers.get(iPlayer)); iAlive = roIngamePlayers.indexOf(allPlayers.get(iPlayer));
} while(iAlive < 0); } while(iAlive < 0);
iPlayer = iAlive; iPlayer = iAlive;
} else { // for the case noone has died } else { // for the case noone has died

View File

@@ -216,8 +216,13 @@ public abstract class Player extends GameEntity implements Comparable<Player> {
* @return * @return
*/ */
public final List<Player> getOpponents() { public final List<Player> getOpponents() {
Predicate<Player> enemy = com.google.common.base.Predicates.not(Player.Predicates.isType(this.getType())); List<Player> result = new ArrayList<Player>();
return Lists.newArrayList(Iterables.filter(Singletons.getModel().getGame().getPlayers(), enemy)); for (Player p : Singletons.getModel().getGame().getPlayers()) {
if (p == this || p.getType() == this.getType())
continue;
result.add(p);
}
return result;
} }
/** /**
@@ -226,8 +231,13 @@ public abstract class Player extends GameEntity implements Comparable<Player> {
* @return * @return
*/ */
public final List<Player> getAllies() { public final List<Player> getAllies() {
Predicate<Player> enemy = Player.Predicates.isType(this.getType()); List<Player> result = new ArrayList<Player>();
return Lists.newArrayList(Iterables.filter(Singletons.getModel().getGame().getPlayers(), enemy)); for (Player p : Singletons.getModel().getGame().getPlayers()) {
if (p == this || p.getType() != this.getType())
continue;
result.add(p);
}
return result;
} }

View File

@@ -2,36 +2,21 @@ package forge.gui.home.sanctioned;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.swing.JList;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import javax.swing.SwingWorker; import javax.swing.SwingWorker;
import org.apache.commons.lang3.ArrayUtils;
import forge.Command; import forge.Command;
import forge.Singletons; import forge.Singletons;
import forge.control.Lobby; import forge.control.Lobby;
import forge.deck.Deck; import forge.deck.Deck;
import forge.deck.DeckgenUtil;
import forge.deck.generate.GenerateThemeDeck;
import forge.game.GameType; import forge.game.GameType;
import forge.game.MatchController; import forge.game.MatchController;
import forge.game.MatchStartHelper; import forge.game.MatchStartHelper;
import forge.game.player.PlayerType; import forge.game.player.PlayerType;
import forge.gui.SOverlayUtils; import forge.gui.SOverlayUtils;
import forge.gui.framework.ICDoc; import forge.gui.framework.ICDoc;
import forge.gui.toolbox.ExperimentalLabel;
import forge.properties.ForgePreferences; import forge.properties.ForgePreferences;
import forge.properties.ForgePreferences.FPref; import forge.properties.ForgePreferences.FPref;
import forge.quest.QuestController;
import forge.quest.QuestEvent;
import forge.util.IStorage;
/** /**
* Controls the constructed submenu in the home UI. * Controls the constructed submenu in the home UI.
@@ -39,40 +24,11 @@ import forge.util.IStorage;
* <br><br><i>(C at beginning of class name denotes a control class.)</i> * <br><br><i>(C at beginning of class name denotes a control class.)</i>
* *
*/ */
@SuppressWarnings("serial")
public enum CSubmenuConstructed implements ICDoc { public enum CSubmenuConstructed implements ICDoc {
/** */ /** */
SINGLETON_INSTANCE; SINGLETON_INSTANCE;
private final VSubmenuConstructed view = VSubmenuConstructed.SINGLETON_INSTANCE; private final VSubmenuConstructed view = VSubmenuConstructed.SINGLETON_INSTANCE;
private enum ESubmenuConstructedTypes { /** */
COLORS, /** */
THEMES, /** */
CUSTOM, /** */
QUESTEVENTS
}
private final MouseAdapter madDecklist = new MouseAdapter() {
@Override
public void mouseClicked(final MouseEvent e) {
if (e.getClickCount() == 2) {
final JList src = ((JList) e.getSource());
if (src.equals(view.getLstDecksAI())) {
if (view.getRadColorsAI().isSelected()) { return; }
if (view.getRadThemesAI().isSelected()) { return; }
}
else {
if (view.getRadColorsHuman().isSelected()) { return; }
if (view.getRadThemesHuman().isSelected()) { return; }
}
DeckgenUtil.showDecklist(src);
}
}
};
private final QuestController quest = Singletons.getModel().getQuest();
/* (non-Javadoc) /* (non-Javadoc)
* @see forge.gui.home.ICSubmenu#initialize() * @see forge.gui.home.ICSubmenu#initialize()
@@ -88,39 +44,8 @@ public enum CSubmenuConstructed implements ICDoc {
@Override @Override
public void initialize() { public void initialize() {
final ForgePreferences prefs = Singletons.getModel().getPreferences(); final ForgePreferences prefs = Singletons.getModel().getPreferences();
view.getDcAi().initialize();
// Radio button event handling view.getDcHuman().initialize();
view.getRadColorsAI().addActionListener(new ActionListener() { @Override
public void actionPerformed(final ActionEvent arg0) {
updateColors(PlayerType.COMPUTER); } });
view.getRadColorsHuman().addActionListener(new ActionListener() { @Override
public void actionPerformed(final ActionEvent arg0) {
updateColors(PlayerType.HUMAN); } });
view.getRadThemesAI().addActionListener(new ActionListener() { @Override
public void actionPerformed(final ActionEvent arg0) {
updateThemes(PlayerType.COMPUTER); } });
view.getRadThemesHuman().addActionListener(new ActionListener() { @Override
public void actionPerformed(final ActionEvent arg0) {
updateThemes(PlayerType.HUMAN); } });
view.getRadCustomAI().addActionListener(new ActionListener() { @Override
public void actionPerformed(final ActionEvent arg0) {
updateCustom(PlayerType.COMPUTER); } });
view.getRadCustomHuman().addActionListener(new ActionListener() { @Override
public void actionPerformed(final ActionEvent arg0) {
updateCustom(PlayerType.HUMAN); } });
view.getRadQuestsAI().addActionListener(new ActionListener() { @Override
public void actionPerformed(final ActionEvent arg0) {
updateQuestEvents(PlayerType.COMPUTER); } });
view.getRadQuestsHuman().addActionListener(new ActionListener() { @Override
public void actionPerformed(final ActionEvent arg0) {
updateQuestEvents(PlayerType.HUMAN); } });
// Checkbox event handling // Checkbox event handling
view.getBtnStart().addActionListener(new ActionListener() { view.getBtnStart().addActionListener(new ActionListener() {
@@ -162,128 +87,9 @@ public enum CSubmenuConstructed implements ICDoc {
view.getCbSingletons().setSelected(prefs.getPrefBoolean(FPref.DECKGEN_SINGLETONS)); view.getCbSingletons().setSelected(prefs.getPrefBoolean(FPref.DECKGEN_SINGLETONS));
view.getCbArtifacts().setSelected(prefs.getPrefBoolean(FPref.DECKGEN_ARTIFACTS)); view.getCbArtifacts().setSelected(prefs.getPrefBoolean(FPref.DECKGEN_ARTIFACTS));
view.getCbRemoveSmall().setSelected(prefs.getPrefBoolean(FPref.DECKGEN_NOSMALL)); view.getCbRemoveSmall().setSelected(prefs.getPrefBoolean(FPref.DECKGEN_NOSMALL));
// First run: colors
view.getRadColorsAI().setSelected(true);
view.getRadColorsHuman().setSelected(true);
updateColors(PlayerType.COMPUTER);
updateColors(PlayerType.HUMAN);
} }
/** Handles all control for "colors" radio button click. */
private void updateColors(final PlayerType player0) {
final JList lst = (player0.equals(PlayerType.HUMAN)
? VSubmenuConstructed.SINGLETON_INSTANCE.getLstUserDecks()
: VSubmenuConstructed.SINGLETON_INSTANCE.getLstDecksAI());
lst.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
lst.setListData(new String[] {"Random 1", "Random 2", "Random 3",
"Random 4", "Black", "Blue", "Green", "Red", "White"});
lst.setName(ESubmenuConstructedTypes.COLORS.toString());
lst.removeMouseListener(madDecklist);
lst.addMouseListener(madDecklist);
final ExperimentalLabel btn = (player0.equals(PlayerType.HUMAN)
? VSubmenuConstructed.SINGLETON_INSTANCE.getBtnHumanRandom()
: VSubmenuConstructed.SINGLETON_INSTANCE.getBtnAIRandom());
btn.setCommand(new Command() { @Override
public void execute() { lst.setSelectedIndices(
DeckgenUtil.randomSelectColors()); } });
// Init basic two color deck
lst.setSelectedIndices(new int[]{0, 1});
}
/** Handles all control for "themes" radio button click. */
private void updateThemes(final PlayerType player0) {
final JList lst = (player0.equals(PlayerType.HUMAN)
? VSubmenuConstructed.SINGLETON_INSTANCE.getLstUserDecks()
: VSubmenuConstructed.SINGLETON_INSTANCE.getLstDecksAI());
lst.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
lst.setName(ESubmenuConstructedTypes.COLORS.toString());
lst.removeMouseListener(madDecklist);
lst.addMouseListener(madDecklist);
final List<String> themeNames = new ArrayList<String>();
for (final String s : GenerateThemeDeck.getThemeNames()) { themeNames.add(s); }
lst.setListData(themeNames.toArray(ArrayUtils.EMPTY_STRING_ARRAY));
lst.setName(ESubmenuConstructedTypes.THEMES.toString());
lst.removeMouseListener(madDecklist);
final ExperimentalLabel btn = (player0.equals(PlayerType.HUMAN)
? VSubmenuConstructed.SINGLETON_INSTANCE.getBtnHumanRandom()
: VSubmenuConstructed.SINGLETON_INSTANCE.getBtnAIRandom());
btn.setCommand(new Command() { @Override
public void execute() { DeckgenUtil.randomSelect(lst); } });
// Init first in list
lst.setSelectedIndex(0);
}
/** Handles all control for "custom" radio button click. */
private void updateCustom(final PlayerType player0) {
final JList lst = (player0.equals(PlayerType.HUMAN)
? VSubmenuConstructed.SINGLETON_INSTANCE.getLstUserDecks()
: VSubmenuConstructed.SINGLETON_INSTANCE.getLstDecksAI());
lst.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
final List<String> customNames = new ArrayList<String>();
final IStorage<Deck> allDecks = Singletons.getModel().getDecks().getConstructed();
for (final Deck d : allDecks) { customNames.add(d.getName()); }
lst.setListData(customNames.toArray(ArrayUtils.EMPTY_STRING_ARRAY));
lst.setName(ESubmenuConstructedTypes.CUSTOM.toString());
lst.removeMouseListener(madDecklist);
lst.addMouseListener(madDecklist);
final ExperimentalLabel btn = (player0.equals(PlayerType.HUMAN)
? VSubmenuConstructed.SINGLETON_INSTANCE.getBtnHumanRandom()
: VSubmenuConstructed.SINGLETON_INSTANCE.getBtnAIRandom());
btn.setCommand(new Command() { @Override
public void execute() { DeckgenUtil.randomSelect(lst); } });
// Init first in list
lst.setSelectedIndex(0);
}
/** Handles all control for "quest event" radio button click. */
private void updateQuestEvents(final PlayerType player0) {
final JList lst = (player0.equals(PlayerType.HUMAN)
? VSubmenuConstructed.SINGLETON_INSTANCE.getLstUserDecks()
: VSubmenuConstructed.SINGLETON_INSTANCE.getLstDecksAI());
lst.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
final List<String> eventNames = new ArrayList<String>();
for (final QuestEvent e : quest.getDuelsManager().getAllDuels()) {
eventNames.add(e.getEventDeck().getName());
}
for (final QuestEvent e : quest.getChallengesManager().getAllChallenges()) {
eventNames.add(e.getEventDeck().getName());
}
lst.setListData(eventNames.toArray(ArrayUtils.EMPTY_STRING_ARRAY));
lst.setName(ESubmenuConstructedTypes.QUESTEVENTS.toString());
lst.removeMouseListener(madDecklist);
lst.addMouseListener(madDecklist);
final ExperimentalLabel btn = (player0.equals(PlayerType.HUMAN)
? VSubmenuConstructed.SINGLETON_INSTANCE.getBtnHumanRandom()
: VSubmenuConstructed.SINGLETON_INSTANCE.getBtnAIRandom());
btn.setCommand(new Command() { @Override
public void execute() { DeckgenUtil.randomSelect(lst); } });
// Init first in list
lst.setSelectedIndex(0);
}
/** @param lists0 &emsp; {@link java.util.List}<{@link javax.swing.JList}> */ /** @param lists0 &emsp; {@link java.util.List}<{@link javax.swing.JList}> */
private void startGame() { private void startGame() {
@@ -298,8 +104,8 @@ public enum CSubmenuConstructed implements ICDoc {
final SwingWorker<Object, Void> worker = new SwingWorker<Object, Void>() { final SwingWorker<Object, Void> worker = new SwingWorker<Object, Void>() {
@Override @Override
public Object doInBackground() { public Object doInBackground() {
Deck humanDeck = generateDeck(VSubmenuConstructed.SINGLETON_INSTANCE.getLstUserDecks(), PlayerType.HUMAN); Deck humanDeck = VSubmenuConstructed.SINGLETON_INSTANCE.getDcHuman().getDeck();
Deck aiDeck = generateDeck(VSubmenuConstructed.SINGLETON_INSTANCE.getLstDecksAI(), PlayerType.COMPUTER); Deck aiDeck = VSubmenuConstructed.SINGLETON_INSTANCE.getDcAi().getDeck();
MatchStartHelper starter = new MatchStartHelper(); MatchStartHelper starter = new MatchStartHelper();
Lobby lobby = Singletons.getControl().getLobby(); Lobby lobby = Singletons.getControl().getLobby();
@@ -321,35 +127,6 @@ public enum CSubmenuConstructed implements ICDoc {
worker.execute(); worker.execute();
} }
/** Generates deck from current list selection(s). */
private Deck generateDeck(final JList lst0, final PlayerType player0) {
final String[] selection = Arrays.copyOf(lst0.getSelectedValues(),
lst0.getSelectedValues().length, String[].class);
final Deck deck;
if (selection.length == 0) { return null; }
if (lst0.getName().equals(ESubmenuConstructedTypes.COLORS.toString()) && DeckgenUtil.colorCheck(selection)) {
deck = DeckgenUtil.buildColorDeck(selection, player0);
}
else if (lst0.getName().equals(ESubmenuConstructedTypes.THEMES.toString())) {
deck = DeckgenUtil.buildThemeDeck(selection);
}
else if (lst0.getName().equals(ESubmenuConstructedTypes.QUESTEVENTS.toString())) {
deck = DeckgenUtil.buildQuestDeck(selection);
}
// Custom deck
else if (lst0.getName().equals(ESubmenuConstructedTypes.CUSTOM.toString())) {
deck = DeckgenUtil.buildCustomDeck(selection);
}
// Failure, for some reason
else {
deck = null;
}
return deck;
}
/* (non-Javadoc) /* (non-Javadoc)
* @see forge.gui.framework.ICDoc#getCommandOnSelect() * @see forge.gui.framework.ICDoc#getCommandOnSelect()

View File

@@ -1,17 +1,10 @@
package forge.gui.home.sanctioned; package forge.gui.home.sanctioned;
import java.awt.Font;
import javax.swing.ButtonGroup;
import javax.swing.JButton; import javax.swing.JButton;
import javax.swing.JCheckBox; import javax.swing.JCheckBox;
import javax.swing.JList;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.SwingConstants;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import forge.game.player.PlayerType;
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;
@@ -20,12 +13,8 @@ import forge.gui.home.IVSubmenu;
import forge.gui.home.LblHeader; import forge.gui.home.LblHeader;
import forge.gui.home.StartButton; import forge.gui.home.StartButton;
import forge.gui.home.VHomeUI; import forge.gui.home.VHomeUI;
import forge.gui.toolbox.ExperimentalLabel;
import forge.gui.toolbox.FCheckBox; import forge.gui.toolbox.FCheckBox;
import forge.gui.toolbox.FLabel; import forge.gui.toolbox.FDeckChooser;
import forge.gui.toolbox.FList;
import forge.gui.toolbox.FRadioButton;
import forge.gui.toolbox.FScrollPane;
import forge.gui.toolbox.FSkin; import forge.gui.toolbox.FSkin;
/** /**
@@ -45,86 +34,21 @@ public enum VSubmenuConstructed implements IVSubmenu<CSubmenuConstructed> {
/** */ /** */
private final LblHeader lblTitle = new LblHeader("Sanctioned Format: Constructed"); private final LblHeader lblTitle = new LblHeader("Sanctioned Format: Constructed");
private final FLabel lblDecklist1 = new FLabel.Builder()
.text("Double click a non-random deck for its decklist.")
.fontSize(12).build();
private final FLabel lblDecklist2 = new FLabel.Builder()
.text("Double click a non-random deck for its decklist.")
.fontSize(12).build();
private final JPanel pnlRadiosHuman = new JPanel(new MigLayout("insets 0, gap 0, wrap"));
private final JPanel pnlRadiosAI = new JPanel(new MigLayout("insets 0, gap 0, wrap"));
private final JPanel pnlStart = new JPanel(new MigLayout("insets 0, gap 0, wrap 2")); private final JPanel pnlStart = new JPanel(new MigLayout("insets 0, gap 0, wrap 2"));
private final StartButton btnStart = new StartButton(); private final StartButton btnStart = new StartButton();
private final JList lstDecksUser = new FList();
private final JList lstDecksAI = new FList();
private final JRadioButton radColorsHuman = new FRadioButton("Fully random color deck");
private final JRadioButton radThemesHuman = new FRadioButton("Semi-random theme deck");
private final JRadioButton radCustomHuman = new FRadioButton("Custom user deck");
private final JRadioButton radQuestsHuman = new FRadioButton("Quest opponent deck");
private final JRadioButton radColorsAI = new FRadioButton("Fully random color deck");
private final JRadioButton radThemesAI = new FRadioButton("Semi-random theme deck");
private final JRadioButton radCustomAI = new FRadioButton("Custom user deck");
private final JRadioButton radQuestsAI = new FRadioButton("Quest opponent deck");
private final JCheckBox cbSingletons = new FCheckBox("Singleton Mode"); private final JCheckBox cbSingletons = new FCheckBox("Singleton Mode");
private final JCheckBox cbArtifacts = new FCheckBox("Remove Artifacts"); private final JCheckBox cbArtifacts = new FCheckBox("Remove Artifacts");
private final JCheckBox cbRemoveSmall = new FCheckBox("Remove Small Creatures"); private final JCheckBox cbRemoveSmall = new FCheckBox("Remove Small Creatures");
private final JScrollPane scrDecksUser = new FScrollPane(lstDecksUser, private final FDeckChooser dcHuman = new FDeckChooser("Select your deck:", PlayerType.HUMAN);
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); private final FDeckChooser dcAi = new FDeckChooser("Select AI deck:", PlayerType.COMPUTER);
private final JScrollPane scrDecksAI = new FScrollPane(lstDecksAI,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
private final ExperimentalLabel btnHumanRandom = new ExperimentalLabel("Random");
private final ExperimentalLabel btnAIRandom = new ExperimentalLabel("Random");
private VSubmenuConstructed() { private VSubmenuConstructed() {
// Radio button group: Human
final ButtonGroup grpRadiosHuman = new ButtonGroup();
grpRadiosHuman.add(radCustomHuman);
grpRadiosHuman.add(radQuestsHuman);
grpRadiosHuman.add(radColorsHuman);
grpRadiosHuman.add(radThemesHuman);
// Radio button group: AI
final ButtonGroup grpRadiosAI = new ButtonGroup();
grpRadiosAI.add(radCustomAI);
grpRadiosAI.add(radQuestsAI);
grpRadiosAI.add(radColorsAI);
grpRadiosAI.add(radThemesAI);
lblTitle.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2)); lblTitle.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2));
// Radio button panels: Human and AI
final String strRadioConstraints = "w 100%!, h 30px!";
pnlRadiosHuman.setOpaque(false);
pnlRadiosHuman.add(new FLabel.Builder().text("Select your deck:")
.fontStyle(Font.BOLD).fontSize(16)
.fontAlign(SwingConstants.LEFT).build(), strRadioConstraints);
pnlRadiosHuman.add(lblDecklist1, "h 20px!, gap 0 0 0 10px");
pnlRadiosHuman.add(radCustomHuman, strRadioConstraints);
pnlRadiosHuman.add(radQuestsHuman, strRadioConstraints);
pnlRadiosHuman.add(radColorsHuman, strRadioConstraints);
pnlRadiosHuman.add(radThemesHuman, strRadioConstraints);
pnlRadiosHuman.add(btnHumanRandom, "w 200px!, h 30px!, gap 0 0 10px 0, ax center");
pnlRadiosAI.setOpaque(false);
pnlRadiosAI.add(new FLabel.Builder().text("Select an AI deck:")
.fontStyle(Font.BOLD).fontSize(16)
.fontAlign(SwingConstants.LEFT).build(), strRadioConstraints);
pnlRadiosAI.add(lblDecklist2, "h 20px!, gap 0 0 0 10px");
pnlRadiosAI.add(radCustomAI, strRadioConstraints);
pnlRadiosAI.add(radQuestsAI, strRadioConstraints);
pnlRadiosAI.add(radColorsAI, strRadioConstraints);
pnlRadiosAI.add(radThemesAI, strRadioConstraints);
pnlRadiosAI.add(btnAIRandom, "w 200px!, h 30px!, gap 0 0 10px 0, ax center");
final String strCheckboxConstraints = "w 200px!, h 30px!, gap 0 20px 0 0"; final String strCheckboxConstraints = "w 200px!, h 30px!, gap 0 20px 0 0";
pnlStart.setOpaque(false); pnlStart.setOpaque(false);
@@ -142,6 +66,15 @@ public enum VSubmenuConstructed implements IVSubmenu<CSubmenuConstructed> {
return EMenuGroup.SANCTIONED; return EMenuGroup.SANCTIONED;
} }
public final FDeckChooser getDcHuman() {
return dcHuman;
}
public final FDeckChooser getDcAi() {
return dcAi;
}
/* (non-Javadoc) /* (non-Javadoc)
* @see forge.gui.home.IVSubmenu#getMenuTitle() * @see forge.gui.home.IVSubmenu#getMenuTitle()
*/ */
@@ -165,81 +98,25 @@ public enum VSubmenuConstructed implements IVSubmenu<CSubmenuConstructed> {
public void populate() { public void populate() {
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().removeAll(); VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().removeAll();
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().setLayout(new MigLayout("insets 0, gap 0, wrap 2, ax right")); VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().setLayout(new MigLayout("insets 0, gap 0, wrap 2, ax right"));
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(lblTitle, "w 80%!, h 40px!, gap 0 0 15px 15px, span 2, ax right"); VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(lblTitle, "w 80%!, h 40px!, gap 0 0 15px 15px, span 2, ax right");
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(pnlRadiosAI, "w 44%!, gap 0 0 20px 20px");
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(pnlRadiosHuman, "w 44%!, gap 4% 4% 20px 20px"); dcAi.populate();
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(scrDecksAI, "w 44%!, growy, pushy"); dcHuman.populate();
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(scrDecksUser, "w 44%!, gap 4% 4% 0 0, growy, pushy"); VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(dcAi, "w 44%!, gap 0 0 20px 20px, growy, pushy");
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(dcHuman, "w 44%!, gap 4% 4% 20px 20px, growy, pushy");
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(pnlStart, "span 2, gap 0 0 50px 50px, ax center"); VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(pnlStart, "span 2, gap 0 0 50px 50px, ax center");
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().revalidate(); VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().revalidate();
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().repaintSelf(); VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().repaintSelf();
} }
/** @return {@link javax.swing.JList} */
public JList getLstUserDecks() {
return this.lstDecksUser;
}
/** @return {@link javax.swing.JList} */
public JList getLstDecksAI() {
return this.lstDecksAI;
}
/** @return {@link javax.swing.JButton} */ /** @return {@link javax.swing.JButton} */
public JButton getBtnStart() { public JButton getBtnStart() {
return this.btnStart; return this.btnStart;
} }
/** @return {@link forge.gui.toolbox.ExperimentalLabel} */
public ExperimentalLabel getBtnHumanRandom() {
return this.btnHumanRandom;
}
/** @return {@link forge.gui.toolbox.ExperimentalLabel} */
public ExperimentalLabel getBtnAIRandom() {
return this.btnAIRandom;
}
/** @return {@link javax.swing.JRadioButton} */
public JRadioButton getRadColorsHuman() {
return this.radColorsHuman;
}
/** @return {@link javax.swing.JRadioButton} */
public JRadioButton getRadThemesHuman() {
return this.radThemesHuman;
}
/** @return {@link javax.swing.JRadioButton} */
public JRadioButton getRadCustomHuman() {
return this.radCustomHuman;
}
/** @return {@link javax.swing.JRadioButton} */
public JRadioButton getRadQuestsHuman() {
return this.radQuestsHuman;
}
/** @return {@link javax.swing.JRadioButton} */
public JRadioButton getRadColorsAI() {
return this.radColorsAI;
}
/** @return {@link javax.swing.JRadioButton} */
public JRadioButton getRadThemesAI() {
return this.radThemesAI;
}
/** @return {@link javax.swing.JRadioButton} */
public JRadioButton getRadCustomAI() {
return this.radCustomAI;
}
/** @return {@link javax.swing.JRadioButton} */
public JRadioButton getRadQuestsAI() {
return this.radQuestsAI;
}
/** @return {@link javax.swing.JCheckBox} */ /** @return {@link javax.swing.JCheckBox} */
public JCheckBox getCbSingletons() { public JCheckBox getCbSingletons() {

View File

@@ -0,0 +1,304 @@
package forge.gui.toolbox;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.swing.ButtonGroup;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import org.apache.commons.lang3.ArrayUtils;
import net.miginfocom.swing.MigLayout;
import forge.Command;
import forge.Singletons;
import forge.deck.Deck;
import forge.deck.DeckgenUtil;
import forge.deck.generate.GenerateThemeDeck;
import forge.game.player.PlayerType;
import forge.gui.home.VHomeUI;
import forge.quest.QuestController;
import forge.quest.QuestEvent;
import forge.util.IStorage;
/**
* TODO: Write javadoc for this type.
*
*/
@SuppressWarnings("serial")
public class FDeckChooser extends JPanel {
private enum ESubmenuConstructedTypes { /** */
COLORS, /** */
THEMES, /** */
CUSTOM, /** */
QUESTEVENTS
}
private final QuestController quest = Singletons.getModel().getQuest();
private final JRadioButton radColors = new FRadioButton("Fully random color deck");
private final JRadioButton radThemes = new FRadioButton("Semi-random theme deck");
private final JRadioButton radCustom = new FRadioButton("Custom user deck");
private final JRadioButton radQuests = new FRadioButton("Quest opponent deck");
private final JList lstDecks = new FList();
private final ExperimentalLabel btnRandom = new ExperimentalLabel("Random");
private final JScrollPane scrDecks = new FScrollPane(lstDecks, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
private final FLabel lblDecklist = new FLabel.Builder()
.text("Double click a non-random deck for its decklist.")
.fontSize(12).build();
private final JPanel pnlRadios = new JPanel(new MigLayout("insets 0, gap 0, wrap"));
private final PlayerType playerType;
private final MouseAdapter madDecklist = new MouseAdapter() {
@Override
public void mouseClicked(final MouseEvent e) {
if (e.getClickCount() == 2) {
final JList src = ((JList) e.getSource());
if (getRadColors().isSelected()) { return; }
if (getRadThemes().isSelected()) { return; }
DeckgenUtil.showDecklist(src);
}
}
};
public FDeckChooser(String titleText, PlayerType pt)
{
playerType = pt;
// Radio button panels: Human and AI
final String strRadioConstraints = "w 100%!, h 30px!";
this.setOpaque(false);
// Radio button group: Human
final ButtonGroup grpRadios = new ButtonGroup();
grpRadios.add(radCustom);
grpRadios.add(radQuests);
grpRadios.add(radColors);
grpRadios.add(radThemes);
pnlRadios.setOpaque(false);
pnlRadios.add(new FLabel.Builder().text(titleText)
.fontStyle(Font.BOLD).fontSize(16)
.fontAlign(SwingConstants.LEFT).build(), strRadioConstraints);
pnlRadios.add(lblDecklist, "h 20px!, gap 0 0 0 10px");
pnlRadios.add(radCustom, strRadioConstraints);
pnlRadios.add(radQuests, strRadioConstraints);
pnlRadios.add(radColors, strRadioConstraints);
pnlRadios.add(radThemes, strRadioConstraints);
pnlRadios.add(btnRandom, "w 200px!, h 30px!, gap 0 0 10px 0, ax center");
}
public void initialize() {
// Radio button event handling
getRadColors().addActionListener(new ActionListener() { @Override
public void actionPerformed(final ActionEvent arg0) {
updateColors(); } });
getRadThemes().addActionListener(new ActionListener() { @Override
public void actionPerformed(final ActionEvent arg0) {
updateThemes(); } });
getRadCustom().addActionListener(new ActionListener() { @Override
public void actionPerformed(final ActionEvent arg0) {
updateCustom(); } });
getRadQuests().addActionListener(new ActionListener() { @Override
public void actionPerformed(final ActionEvent arg0) {
updateQuestEvents(); } });
// First run: colors
getRadColors().setSelected(true);
updateColors();
}
/** @return {@link javax.swing.JList} */
public JList getLstDecks() {
return this.lstDecks;
}
/** @return {@link forge.gui.toolbox.ExperimentalLabel} */
public ExperimentalLabel getBtnRandom() {
return this.btnRandom;
}
/** @return {@link javax.swing.JRadioButton} */
public JRadioButton getRadColors() {
return this.radColors;
}
/** @return {@link javax.swing.JRadioButton} */
public JRadioButton getRadThemes() {
return this.radThemes;
}
/** @return {@link javax.swing.JRadioButton} */
public JRadioButton getRadCustom() {
return this.radCustom;
}
/** @return {@link javax.swing.JRadioButton} */
public JRadioButton getRadQuests() {
return this.radQuests;
}
/** Handles all control for "colors" radio button click. */
private void updateColors() {
final JList lst = getLstDecks();
lst.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
lst.setListData(new String[] {"Random 1", "Random 2", "Random 3",
"Random 4", "Black", "Blue", "Green", "Red", "White"});
lst.setName(ESubmenuConstructedTypes.COLORS.toString());
lst.removeMouseListener(madDecklist);
lst.addMouseListener(madDecklist);
final ExperimentalLabel btn = getBtnRandom();
btn.setCommand(new Command() { @Override public void execute() { lst.setSelectedIndices( DeckgenUtil.randomSelectColors()); } });
// Init basic two color deck
lst.setSelectedIndices(new int[]{0, 1});
}
/** Handles all control for "themes" radio button click. */
private void updateThemes() {
final JList lst = getLstDecks();
lst.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
lst.setName(ESubmenuConstructedTypes.COLORS.toString());
lst.removeMouseListener(madDecklist);
lst.addMouseListener(madDecklist);
final List<String> themeNames = new ArrayList<String>();
for (final String s : GenerateThemeDeck.getThemeNames()) { themeNames.add(s); }
lst.setListData(themeNames.toArray(ArrayUtils.EMPTY_STRING_ARRAY));
lst.setName(ESubmenuConstructedTypes.THEMES.toString());
lst.removeMouseListener(madDecklist);
final ExperimentalLabel btn = getBtnRandom();
btn.setCommand(new Command() { @Override public void execute() { DeckgenUtil.randomSelect(lst); } });
// Init first in list
lst.setSelectedIndex(0);
}
/** Handles all control for "custom" radio button click. */
private void updateCustom() {
final JList lst = getLstDecks();
lst.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
final List<String> customNames = new ArrayList<String>();
final IStorage<Deck> allDecks = Singletons.getModel().getDecks().getConstructed();
for (final Deck d : allDecks) { customNames.add(d.getName()); }
lst.setListData(customNames.toArray(ArrayUtils.EMPTY_STRING_ARRAY));
lst.setName(ESubmenuConstructedTypes.CUSTOM.toString());
lst.removeMouseListener(madDecklist);
lst.addMouseListener(madDecklist);
final ExperimentalLabel btn = getBtnRandom();
btn.setCommand(new Command() { @Override public void execute() { DeckgenUtil.randomSelect(lst); } });
// Init first in list
lst.setSelectedIndex(0);
}
/** Handles all control for "quest event" radio button click. */
private void updateQuestEvents() {
final JList lst = getLstDecks();
lst.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
final List<String> eventNames = new ArrayList<String>();
for (final QuestEvent e : quest.getDuelsManager().getAllDuels()) {
eventNames.add(e.getEventDeck().getName());
}
for (final QuestEvent e : quest.getChallengesManager().getAllChallenges()) {
eventNames.add(e.getEventDeck().getName());
}
lst.setListData(eventNames.toArray(ArrayUtils.EMPTY_STRING_ARRAY));
lst.setName(ESubmenuConstructedTypes.QUESTEVENTS.toString());
lst.removeMouseListener(madDecklist);
lst.addMouseListener(madDecklist);
final ExperimentalLabel btn = getBtnRandom();
btn.setCommand(new Command() { @Override public void execute() { DeckgenUtil.randomSelect(lst); } });
// Init first in list
lst.setSelectedIndex(0);
}
/** Generates deck from current list selection(s). */
public Deck getDeck() {
JList lst0 = getLstDecks();
final String[] selection = Arrays.copyOf(lst0.getSelectedValues(), lst0.getSelectedValues().length, String[].class);
final Deck deck;
if (selection.length == 0) { return null; }
if (lst0.getName().equals(ESubmenuConstructedTypes.COLORS.toString()) && DeckgenUtil.colorCheck(selection)) {
deck = DeckgenUtil.buildColorDeck(selection, getPlayerType());
}
else if (lst0.getName().equals(ESubmenuConstructedTypes.THEMES.toString())) {
deck = DeckgenUtil.buildThemeDeck(selection);
}
else if (lst0.getName().equals(ESubmenuConstructedTypes.QUESTEVENTS.toString())) {
deck = DeckgenUtil.buildQuestDeck(selection);
}
// Custom deck
else if (lst0.getName().equals(ESubmenuConstructedTypes.CUSTOM.toString())) {
deck = DeckgenUtil.buildCustomDeck(selection);
}
// Failure, for some reason
else {
deck = null;
}
return deck;
}
/**
* TODO: Write javadoc for this method.
* @return
*/
private PlayerType getPlayerType() {
return playerType;
}
/**
* TODO: Write javadoc for this method.
*/
public void populate() {
this.setLayout(new MigLayout("insets 0, gap 0, flowy, ax right"));
this.add(pnlRadios, "w 100%!, gap 0 0 20px 20px");
this.add(scrDecks, "w 100%!, growy, pushy");
}
}