mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 11:18:01 +00:00
DeckChooser from constructed home screen refactored as a component
This commit is contained in:
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -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/FButton.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/FList.java -text
|
||||
src/main/java/forge/gui/toolbox/FOverlay.java -text
|
||||
|
||||
@@ -461,7 +461,6 @@ public class GameState {
|
||||
do{
|
||||
iPlayer = ( iPlayer + 1 ) % allPlayers.size();
|
||||
iAlive = roIngamePlayers.indexOf(allPlayers.get(iPlayer));
|
||||
|
||||
} while(iAlive < 0);
|
||||
iPlayer = iAlive;
|
||||
} else { // for the case noone has died
|
||||
|
||||
@@ -216,8 +216,13 @@ public abstract class Player extends GameEntity implements Comparable<Player> {
|
||||
* @return
|
||||
*/
|
||||
public final List<Player> getOpponents() {
|
||||
Predicate<Player> enemy = com.google.common.base.Predicates.not(Player.Predicates.isType(this.getType()));
|
||||
return Lists.newArrayList(Iterables.filter(Singletons.getModel().getGame().getPlayers(), enemy));
|
||||
List<Player> result = new ArrayList<Player>();
|
||||
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
|
||||
*/
|
||||
public final List<Player> getAllies() {
|
||||
Predicate<Player> enemy = Player.Predicates.isType(this.getType());
|
||||
return Lists.newArrayList(Iterables.filter(Singletons.getModel().getGame().getPlayers(), enemy));
|
||||
List<Player> result = new ArrayList<Player>();
|
||||
for (Player p : Singletons.getModel().getGame().getPlayers()) {
|
||||
if (p == this || p.getType() != this.getType())
|
||||
continue;
|
||||
result.add(p);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -2,36 +2,21 @@ package forge.gui.home.sanctioned;
|
||||
|
||||
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.JList;
|
||||
import javax.swing.ListSelectionModel;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.SwingWorker;
|
||||
|
||||
import org.apache.commons.lang3.ArrayUtils;
|
||||
|
||||
import forge.Command;
|
||||
import forge.Singletons;
|
||||
import forge.control.Lobby;
|
||||
import forge.deck.Deck;
|
||||
import forge.deck.DeckgenUtil;
|
||||
import forge.deck.generate.GenerateThemeDeck;
|
||||
import forge.game.GameType;
|
||||
import forge.game.MatchController;
|
||||
import forge.game.MatchStartHelper;
|
||||
import forge.game.player.PlayerType;
|
||||
import forge.gui.SOverlayUtils;
|
||||
import forge.gui.framework.ICDoc;
|
||||
import forge.gui.toolbox.ExperimentalLabel;
|
||||
import forge.properties.ForgePreferences;
|
||||
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.
|
||||
@@ -39,40 +24,11 @@ import forge.util.IStorage;
|
||||
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
|
||||
*
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public enum CSubmenuConstructed implements ICDoc {
|
||||
/** */
|
||||
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)
|
||||
* @see forge.gui.home.ICSubmenu#initialize()
|
||||
@@ -88,39 +44,8 @@ public enum CSubmenuConstructed implements ICDoc {
|
||||
@Override
|
||||
public void initialize() {
|
||||
final ForgePreferences prefs = Singletons.getModel().getPreferences();
|
||||
|
||||
// Radio button event handling
|
||||
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); } });
|
||||
view.getDcAi().initialize();
|
||||
view.getDcHuman().initialize();
|
||||
|
||||
// Checkbox event handling
|
||||
view.getBtnStart().addActionListener(new ActionListener() {
|
||||
@@ -162,128 +87,9 @@ public enum CSubmenuConstructed implements ICDoc {
|
||||
view.getCbSingletons().setSelected(prefs.getPrefBoolean(FPref.DECKGEN_SINGLETONS));
|
||||
view.getCbArtifacts().setSelected(prefs.getPrefBoolean(FPref.DECKGEN_ARTIFACTS));
|
||||
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   {@link java.util.List}<{@link javax.swing.JList}> */
|
||||
private void startGame() {
|
||||
@@ -298,8 +104,8 @@ public enum CSubmenuConstructed implements ICDoc {
|
||||
final SwingWorker<Object, Void> worker = new SwingWorker<Object, Void>() {
|
||||
@Override
|
||||
public Object doInBackground() {
|
||||
Deck humanDeck = generateDeck(VSubmenuConstructed.SINGLETON_INSTANCE.getLstUserDecks(), PlayerType.HUMAN);
|
||||
Deck aiDeck = generateDeck(VSubmenuConstructed.SINGLETON_INSTANCE.getLstDecksAI(), PlayerType.COMPUTER);
|
||||
Deck humanDeck = VSubmenuConstructed.SINGLETON_INSTANCE.getDcHuman().getDeck();
|
||||
Deck aiDeck = VSubmenuConstructed.SINGLETON_INSTANCE.getDcAi().getDeck();
|
||||
|
||||
MatchStartHelper starter = new MatchStartHelper();
|
||||
Lobby lobby = Singletons.getControl().getLobby();
|
||||
@@ -321,35 +127,6 @@ public enum CSubmenuConstructed implements ICDoc {
|
||||
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)
|
||||
* @see forge.gui.framework.ICDoc#getCommandOnSelect()
|
||||
|
||||
@@ -1,17 +1,10 @@
|
||||
package forge.gui.home.sanctioned;
|
||||
|
||||
import java.awt.Font;
|
||||
|
||||
import javax.swing.ButtonGroup;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JCheckBox;
|
||||
import javax.swing.JList;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JRadioButton;
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.SwingConstants;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import forge.game.player.PlayerType;
|
||||
import forge.gui.framework.DragCell;
|
||||
import forge.gui.framework.DragTab;
|
||||
import forge.gui.framework.EDocID;
|
||||
@@ -20,12 +13,8 @@ import forge.gui.home.IVSubmenu;
|
||||
import forge.gui.home.LblHeader;
|
||||
import forge.gui.home.StartButton;
|
||||
import forge.gui.home.VHomeUI;
|
||||
import forge.gui.toolbox.ExperimentalLabel;
|
||||
import forge.gui.toolbox.FCheckBox;
|
||||
import forge.gui.toolbox.FLabel;
|
||||
import forge.gui.toolbox.FList;
|
||||
import forge.gui.toolbox.FRadioButton;
|
||||
import forge.gui.toolbox.FScrollPane;
|
||||
import forge.gui.toolbox.FDeckChooser;
|
||||
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 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 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 cbArtifacts = new FCheckBox("Remove Artifacts");
|
||||
private final JCheckBox cbRemoveSmall = new FCheckBox("Remove Small Creatures");
|
||||
|
||||
private final JScrollPane scrDecksUser = new FScrollPane(lstDecksUser,
|
||||
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
|
||||
|
||||
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 final FDeckChooser dcHuman = new FDeckChooser("Select your deck:", PlayerType.HUMAN);
|
||||
private final FDeckChooser dcAi = new FDeckChooser("Select AI deck:", PlayerType.COMPUTER);
|
||||
|
||||
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));
|
||||
|
||||
// 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";
|
||||
pnlStart.setOpaque(false);
|
||||
@@ -142,6 +66,15 @@ public enum VSubmenuConstructed implements IVSubmenu<CSubmenuConstructed> {
|
||||
return EMenuGroup.SANCTIONED;
|
||||
}
|
||||
|
||||
public final FDeckChooser getDcHuman() {
|
||||
return dcHuman;
|
||||
}
|
||||
|
||||
public final FDeckChooser getDcAi() {
|
||||
return dcAi;
|
||||
}
|
||||
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getMenuTitle()
|
||||
*/
|
||||
@@ -165,81 +98,25 @@ public enum VSubmenuConstructed implements IVSubmenu<CSubmenuConstructed> {
|
||||
public void populate() {
|
||||
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().removeAll();
|
||||
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(pnlRadiosAI, "w 44%!, gap 0 0 20px 20px");
|
||||
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(pnlRadiosHuman, "w 44%!, gap 4% 4% 20px 20px");
|
||||
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(scrDecksAI, "w 44%!, growy, pushy");
|
||||
VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(scrDecksUser, "w 44%!, gap 4% 4% 0 0, growy, pushy");
|
||||
|
||||
dcAi.populate();
|
||||
dcHuman.populate();
|
||||
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().revalidate();
|
||||
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} */
|
||||
public JButton getBtnStart() {
|
||||
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} */
|
||||
public JCheckBox getCbSingletons() {
|
||||
|
||||
304
src/main/java/forge/gui/toolbox/FDeckChooser.java
Normal file
304
src/main/java/forge/gui/toolbox/FDeckChooser.java
Normal 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");
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user