mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-18 19:58:00 +00:00
Saving further progress on home screen rebuild.
This commit is contained in:
15
.gitattributes
vendored
15
.gitattributes
vendored
@@ -11218,7 +11218,6 @@ src/main/java/forge/control/home/ControlQuest.java -text
|
||||
src/main/java/forge/control/home/ControlSealed.java -text
|
||||
src/main/java/forge/control/home/ControlSettings.java -text
|
||||
src/main/java/forge/control/home/ControlUtilities.java -text
|
||||
src/main/java/forge/control/home/IControlSubmenu.java -text
|
||||
src/main/java/forge/control/home/constructed/ControlSubmenuColors.java -text
|
||||
src/main/java/forge/control/home/constructed/ControlSubmenuCustom.java -text
|
||||
src/main/java/forge/control/home/package-info.java -text svneol=native#text/plain
|
||||
@@ -11327,6 +11326,19 @@ src/main/java/forge/gui/game/CardDetailPanel.java svneol=native#text/plain
|
||||
src/main/java/forge/gui/game/CardPanel.java svneol=native#text/plain
|
||||
src/main/java/forge/gui/game/CardPicturePanel.java svneol=native#text/plain
|
||||
src/main/java/forge/gui/game/package-info.java svneol=native#text/plain
|
||||
src/main/java/forge/gui/home/EMenuGroup.java -text
|
||||
src/main/java/forge/gui/home/ICSubmenu.java -text
|
||||
src/main/java/forge/gui/home/IVSubmenu.java -text
|
||||
src/main/java/forge/gui/home/constructed/CSubmenuColors.java -text
|
||||
src/main/java/forge/gui/home/constructed/CSubmenuCustom.java -text
|
||||
src/main/java/forge/gui/home/constructed/CSubmenuQuestEvents.java -text
|
||||
src/main/java/forge/gui/home/constructed/CSubmenuThemes.java -text
|
||||
src/main/java/forge/gui/home/constructed/ESubmenuConstructedTypes.java -text
|
||||
src/main/java/forge/gui/home/constructed/SubmenuConstructedUtil.java -text
|
||||
src/main/java/forge/gui/home/constructed/VSubmenuColors.java -text
|
||||
src/main/java/forge/gui/home/constructed/VSubmenuCustom.java -text
|
||||
src/main/java/forge/gui/home/constructed/VSubmenuQuestEvents.java -text
|
||||
src/main/java/forge/gui/home/constructed/VSubmenuThemes.java -text
|
||||
src/main/java/forge/gui/package-info.java svneol=native#text/plain
|
||||
src/main/java/forge/item/BoosterPack.java -text
|
||||
src/main/java/forge/item/CardDb.java -text
|
||||
@@ -11418,7 +11430,6 @@ src/main/java/forge/view/bazaar/ViewStall.java svneol=native#text/plain
|
||||
src/main/java/forge/view/bazaar/package-info.java svneol=native#text/plain
|
||||
src/main/java/forge/view/editor/package-info.java svneol=native#text/plain
|
||||
src/main/java/forge/view/home/ConstructedDeckSelectPanel.java -text
|
||||
src/main/java/forge/view/home/IViewSubmenu.java -text
|
||||
src/main/java/forge/view/home/QuestFileLister.java -text
|
||||
src/main/java/forge/view/home/QuestPreferencesHandler.java -text
|
||||
src/main/java/forge/view/home/StartButton.java -text
|
||||
|
||||
15
src/main/java/forge/gui/home/EMenuGroup.java
Normal file
15
src/main/java/forge/gui/home/EMenuGroup.java
Normal file
@@ -0,0 +1,15 @@
|
||||
package forge.gui.home;
|
||||
|
||||
/**
|
||||
* Submenus each belong to a menu group, which
|
||||
* is used for several functions, such as expanding
|
||||
* and collapsing in the menu.
|
||||
*/
|
||||
public enum EMenuGroup { /** */
|
||||
CONSTRUCTED, /** */
|
||||
SEALED, /** */
|
||||
DRAFT, /** */
|
||||
QUEST, /** */
|
||||
SETTINGS, /** */
|
||||
UTILITIES;
|
||||
}
|
||||
@@ -1,9 +1,9 @@
|
||||
package forge.control.home;
|
||||
package forge.gui.home;
|
||||
|
||||
import forge.Command;
|
||||
|
||||
/** Dictates methods required for a submenu controller. */
|
||||
public interface IControlSubmenu {
|
||||
public interface ICSubmenu {
|
||||
/** @return {@link forge.Command} */
|
||||
Command getMenuCommand();
|
||||
|
||||
@@ -1,15 +1,9 @@
|
||||
package forge.view.home;
|
||||
package forge.gui.home;
|
||||
|
||||
import javax.swing.JPanel;
|
||||
|
||||
import forge.control.home.IControlSubmenu;
|
||||
import forge.model.home.MenuGroup;
|
||||
|
||||
/** Dictates methods required for a submenu view. */
|
||||
public interface IViewSubmenu {
|
||||
/** @return {@link forge.control.home.IControlSubmenu} */
|
||||
IControlSubmenu getControl();
|
||||
|
||||
public interface IVSubmenu {
|
||||
/** Allows static factory creation by decoupling UI components.
|
||||
* @return {@link javax.swing.JPanel} */
|
||||
JPanel getPanel();
|
||||
@@ -18,7 +12,7 @@ public interface IViewSubmenu {
|
||||
* functions such as expanding and collapsing in the menu area.
|
||||
*
|
||||
* @return {@link javax.swing.JPanel} */
|
||||
MenuGroup getGroup();
|
||||
EMenuGroup getGroup();
|
||||
|
||||
/** Removes all children and (re)populates panel components, independent of constructor.*/
|
||||
void populate();
|
||||
81
src/main/java/forge/gui/home/constructed/CSubmenuColors.java
Normal file
81
src/main/java/forge/gui/home/constructed/CSubmenuColors.java
Normal file
@@ -0,0 +1,81 @@
|
||||
package forge.gui.home.constructed;
|
||||
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.swing.JList;
|
||||
import javax.swing.SwingUtilities;
|
||||
|
||||
import forge.Command;
|
||||
import forge.gui.home.ICSubmenu;
|
||||
|
||||
/**
|
||||
* TODO: Write javadoc for this type.
|
||||
*
|
||||
*/
|
||||
public enum CSubmenuColors implements ICSubmenu {
|
||||
/** */
|
||||
SINGLETON_INSTANCE;
|
||||
|
||||
private final Map<String, String> colorVals = new HashMap<String, String>();
|
||||
|
||||
private CSubmenuColors() {
|
||||
colorVals.clear();
|
||||
colorVals.put("Random 1", "AI");
|
||||
colorVals.put("Random 2", "AI");
|
||||
colorVals.put("Random 3", "AI");
|
||||
colorVals.put("Random 4", "AI");
|
||||
colorVals.put("Black", "black");
|
||||
colorVals.put("Blue", "blue");
|
||||
colorVals.put("Green", "green");
|
||||
colorVals.put("Red", "red");
|
||||
colorVals.put("White", "white");
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.control.home.IControlSubmenu#update()
|
||||
*/
|
||||
@Override
|
||||
public void initialize() {
|
||||
VSubmenuColors.SINGLETON_INSTANCE.populate();
|
||||
CSubmenuColors.SINGLETON_INSTANCE.update();
|
||||
|
||||
for (final JList lst : VSubmenuColors.SINGLETON_INSTANCE.getLists()) {
|
||||
SubmenuConstructedUtil.randomSelect(lst);
|
||||
}
|
||||
|
||||
VSubmenuColors.SINGLETON_INSTANCE.getBtnStart().addMouseListener(
|
||||
new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseReleased(final MouseEvent e) {
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
SubmenuConstructedUtil.startGame(VSubmenuColors.SINGLETON_INSTANCE.getLists());
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.control.home.IControlSubmenu#getCommand()
|
||||
*/
|
||||
@Override
|
||||
public Command getMenuCommand() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.control.home.IControlSubmenu#update()
|
||||
*/
|
||||
@Override
|
||||
public void update() {
|
||||
for (final JList lst : VSubmenuColors.SINGLETON_INSTANCE.getLists()) {
|
||||
lst.setListData(new String[] {"Random 1", "Random 2", "Random 3",
|
||||
"Random 4", "Black", "Blue", "Green", "Red", "White"});
|
||||
}
|
||||
}
|
||||
}
|
||||
78
src/main/java/forge/gui/home/constructed/CSubmenuCustom.java
Normal file
78
src/main/java/forge/gui/home/constructed/CSubmenuCustom.java
Normal file
@@ -0,0 +1,78 @@
|
||||
package forge.gui.home.constructed;
|
||||
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.JList;
|
||||
import javax.swing.SwingUtilities;
|
||||
|
||||
import forge.Command;
|
||||
import forge.Singletons;
|
||||
import forge.deck.Deck;
|
||||
import forge.gui.home.ICSubmenu;
|
||||
import forge.util.IFolderMap;
|
||||
|
||||
/**
|
||||
* TODO: Write javadoc for this type.
|
||||
*
|
||||
*/
|
||||
public enum CSubmenuCustom implements ICSubmenu {
|
||||
/** */
|
||||
SINGLETON_INSTANCE;
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.control.home.IControlSubmenu#getMenuCommand()
|
||||
*/
|
||||
@Override
|
||||
public Command getMenuCommand() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.control.home.IControlSubmenu#initialize()
|
||||
*/
|
||||
@Override
|
||||
public void initialize() {
|
||||
VSubmenuCustom.SINGLETON_INSTANCE.populate();
|
||||
CSubmenuCustom.SINGLETON_INSTANCE.update();
|
||||
|
||||
for (JList lst : VSubmenuCustom.SINGLETON_INSTANCE.getLists()) {
|
||||
SubmenuConstructedUtil.randomSelect(lst);
|
||||
|
||||
lst.addMouseListener(new MouseAdapter() { @Override
|
||||
public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) {
|
||||
final String deckName = ((JList) e.getSource()).getSelectedValue().toString();
|
||||
SubmenuConstructedUtil.showDecklist(Singletons.getModel().getDecks().getConstructed().get(deckName));
|
||||
} } });
|
||||
}
|
||||
|
||||
VSubmenuCustom.SINGLETON_INSTANCE.getBtnStart().addMouseListener(
|
||||
new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseReleased(final MouseEvent e) {
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
SubmenuConstructedUtil.startGame(VSubmenuCustom.SINGLETON_INSTANCE.getLists());
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.control.home.IControlSubmenu#update()
|
||||
*/
|
||||
@Override
|
||||
public void update() {
|
||||
final List<String> customNames = new ArrayList<String>();
|
||||
final IFolderMap<Deck> allDecks = Singletons.getModel().getDecks().getConstructed();
|
||||
for (final Deck d : allDecks) { customNames.add(d.getName()); }
|
||||
|
||||
for (JList lst : VSubmenuCustom.SINGLETON_INSTANCE.getLists()) {
|
||||
lst.setListData(SubmenuConstructedUtil.oa2sa(customNames.toArray()));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
package forge.gui.home.constructed;
|
||||
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.JList;
|
||||
import javax.swing.SwingUtilities;
|
||||
|
||||
import forge.Command;
|
||||
import forge.Singletons;
|
||||
import forge.gui.home.ICSubmenu;
|
||||
import forge.quest.data.QuestEvent;
|
||||
|
||||
/**
|
||||
* TODO: Write javadoc for this type.
|
||||
*
|
||||
*/
|
||||
public enum CSubmenuQuestEvents implements ICSubmenu {
|
||||
/** */
|
||||
SINGLETON_INSTANCE;
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.control.home.IControlSubmenu#getMenuCommand()
|
||||
*/
|
||||
@Override
|
||||
public Command getMenuCommand() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.control.home.IControlSubmenu#initialize()
|
||||
*/
|
||||
@Override
|
||||
public void initialize() {
|
||||
VSubmenuQuestEvents.SINGLETON_INSTANCE.populate();
|
||||
CSubmenuQuestEvents.SINGLETON_INSTANCE.update();
|
||||
|
||||
for (JList lst : VSubmenuQuestEvents.SINGLETON_INSTANCE.getLists()) {
|
||||
SubmenuConstructedUtil.randomSelect(lst);
|
||||
|
||||
lst.addMouseListener(new MouseAdapter() { @Override
|
||||
public void mouseClicked(MouseEvent e) {
|
||||
if (e.getClickCount() == 2) {
|
||||
final String deckName = ((JList) e.getSource()).getSelectedValue().toString();
|
||||
Singletons.getModel().getQuestEventManager().getEvent(deckName);
|
||||
SubmenuConstructedUtil.showDecklist(Singletons.getModel().getQuestEventManager().getEvent(deckName).getEventDeck());
|
||||
} } });
|
||||
}
|
||||
|
||||
VSubmenuQuestEvents.SINGLETON_INSTANCE.getBtnStart().addMouseListener(
|
||||
new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseReleased(final MouseEvent e) {
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
SubmenuConstructedUtil.startGame(VSubmenuQuestEvents.SINGLETON_INSTANCE.getLists());
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.control.home.IControlSubmenu#update()
|
||||
*/
|
||||
@Override
|
||||
public void update() {
|
||||
final List<String> eventNames = new ArrayList<String>();
|
||||
|
||||
for (final QuestEvent e : Singletons.getModel().getQuestEventManager().getAllChallenges()) {
|
||||
eventNames.add(e.getEventDeck().getName());
|
||||
}
|
||||
|
||||
for (final QuestEvent e : Singletons.getModel().getQuestEventManager().getAllDuels()) {
|
||||
eventNames.add(e.getEventDeck().getName());
|
||||
}
|
||||
|
||||
for (JList lst : VSubmenuQuestEvents.SINGLETON_INSTANCE.getLists()) {
|
||||
lst.setListData(SubmenuConstructedUtil.oa2sa(eventNames.toArray()));
|
||||
}
|
||||
}
|
||||
}
|
||||
68
src/main/java/forge/gui/home/constructed/CSubmenuThemes.java
Normal file
68
src/main/java/forge/gui/home/constructed/CSubmenuThemes.java
Normal file
@@ -0,0 +1,68 @@
|
||||
package forge.gui.home.constructed;
|
||||
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.JList;
|
||||
import javax.swing.SwingUtilities;
|
||||
|
||||
import forge.Command;
|
||||
import forge.deck.generate.GenerateThemeDeck;
|
||||
import forge.gui.home.ICSubmenu;
|
||||
/**
|
||||
* TODO: Write javadoc for this type.
|
||||
*
|
||||
*/
|
||||
public enum CSubmenuThemes implements ICSubmenu {
|
||||
/** */
|
||||
SINGLETON_INSTANCE;
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.control.home.IControlSubmenu#getMenuCommand()
|
||||
*/
|
||||
@Override
|
||||
public Command getMenuCommand() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.control.home.IControlSubmenu#initialize()
|
||||
*/
|
||||
@Override
|
||||
public void initialize() {
|
||||
VSubmenuThemes.SINGLETON_INSTANCE.populate();
|
||||
CSubmenuThemes.SINGLETON_INSTANCE.update();
|
||||
|
||||
for (final JList lst : VSubmenuThemes.SINGLETON_INSTANCE.getLists()) {
|
||||
SubmenuConstructedUtil.randomSelect(lst);
|
||||
}
|
||||
|
||||
VSubmenuThemes.SINGLETON_INSTANCE.getBtnStart().addMouseListener(
|
||||
new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseReleased(final MouseEvent e) {
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
SubmenuConstructedUtil.startGame(VSubmenuThemes.SINGLETON_INSTANCE.getLists());
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.control.home.IControlSubmenu#update()
|
||||
*/
|
||||
@Override
|
||||
public void update() {
|
||||
final List<String> themeNames = new ArrayList<String>();
|
||||
for (final String s : GenerateThemeDeck.getThemeNames()) { themeNames.add(s); }
|
||||
|
||||
for (JList lst : VSubmenuThemes.SINGLETON_INSTANCE.getLists()) {
|
||||
lst.setListData(SubmenuConstructedUtil.oa2sa(themeNames.toArray()));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
package forge.gui.home.constructed;
|
||||
|
||||
/**
|
||||
* TODO: Write javadoc for this type.
|
||||
*
|
||||
*/
|
||||
public enum ESubmenuConstructedTypes { /** */
|
||||
COLORS, /** */
|
||||
THEMES, /** */
|
||||
CUSTOM, /** */
|
||||
QUESTEVENTS
|
||||
}
|
||||
@@ -0,0 +1,387 @@
|
||||
package forge.gui.home.constructed;
|
||||
|
||||
import java.awt.Toolkit;
|
||||
import java.awt.datatransfer.StringSelection;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Random;
|
||||
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JList;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.ListSelectionModel;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import forge.AllZone;
|
||||
import forge.CardList;
|
||||
import forge.Command;
|
||||
import forge.Player;
|
||||
import forge.PlayerType;
|
||||
import forge.Singletons;
|
||||
import forge.deck.Deck;
|
||||
import forge.deck.generate.Generate2ColorDeck;
|
||||
import forge.deck.generate.Generate3ColorDeck;
|
||||
import forge.deck.generate.Generate5ColorDeck;
|
||||
import forge.deck.generate.GenerateThemeDeck;
|
||||
import forge.game.GameNew;
|
||||
import forge.item.CardPrinted;
|
||||
import forge.properties.ForgePreferences.FPref;
|
||||
import forge.view.toolbox.FCheckBox;
|
||||
import forge.view.toolbox.FLabel;
|
||||
import forge.view.toolbox.FList;
|
||||
import forge.view.toolbox.FOverlay;
|
||||
import forge.view.toolbox.FPanel;
|
||||
import forge.view.toolbox.FScrollPane;
|
||||
import forge.view.toolbox.FSkin;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Utilities for the constructed submenu, all over the MVC spectrum.
|
||||
*
|
||||
*/
|
||||
public class SubmenuConstructedUtil {
|
||||
/**
|
||||
* @param pnlParent   JPanel, where to put the finished lists
|
||||
* @param btnStart   Start button for the panel
|
||||
* @return List<JList> completed collection of JLists
|
||||
*/
|
||||
public static List<JList> populateConstructedSubmenuView(final JPanel pnlParent, final JButton btnStart) {
|
||||
final List<JList> generatedJLists = new ArrayList<JList>();
|
||||
final String constraintsLst = "w 41%!, h 320px, gap 6% 0 4% 2%";
|
||||
final String constraintsBtn = "newline, ax center, gap 6% 0 0 0, span 2 1";
|
||||
final List<Player> players = AllZone.getPlayersInGame();
|
||||
pnlParent.removeAll();
|
||||
|
||||
pnlParent.setOpaque(false);
|
||||
pnlParent.setLayout(new MigLayout("insets 0, gap 0"));
|
||||
|
||||
final List<CustomSelectPanel> storage = new ArrayList<CustomSelectPanel>();
|
||||
for (int i = 0; i < players.size(); i++) {
|
||||
storage.add(new CustomSelectPanel(players.get(i)));
|
||||
generatedJLists.add(storage.get(storage.size() - 1).getList());
|
||||
|
||||
if (i % 2 == 1) {
|
||||
pnlParent.add(storage.get(storage.size() - 1), constraintsLst + ", wrap");
|
||||
}
|
||||
else {
|
||||
pnlParent.add(storage.get(storage.size() - 1), constraintsLst);
|
||||
}
|
||||
}
|
||||
storage.clear();
|
||||
|
||||
if (pnlParent.getName().equals(ESubmenuConstructedTypes.COLORS.toString())
|
||||
|| pnlParent.getName() .equals(ESubmenuConstructedTypes.THEMES.toString())) {
|
||||
final JPanel pnlOptions = new JPanel();
|
||||
pnlOptions.setOpaque(false);
|
||||
SubmenuConstructedUtil.populateOptionsPanel(pnlOptions);
|
||||
pnlParent.add(pnlOptions, "span 2 1, align center, gap 6% 0 0 0");
|
||||
}
|
||||
|
||||
pnlParent.add(btnStart, constraintsBtn);
|
||||
|
||||
return generatedJLists;
|
||||
}
|
||||
|
||||
/** Shows decklist dialog for a given deck.
|
||||
* @param d0   {@link forge.deck.Deck} */
|
||||
public static void showDecklist(final Deck d0) {
|
||||
final HashMap<String, Integer> deckMap = new HashMap<String, Integer>();
|
||||
|
||||
for (final Entry<CardPrinted, Integer> s : d0.getMain()) {
|
||||
deckMap.put(s.getKey().getName(), s.getValue());
|
||||
}
|
||||
|
||||
final String nl = System.getProperty("line.separator");
|
||||
final StringBuilder deckList = new StringBuilder();
|
||||
final String dName = d0.getName();
|
||||
|
||||
deckList.append(dName == null ? "" : dName + nl + nl);
|
||||
|
||||
final ArrayList<String> dmKeys = new ArrayList<String>();
|
||||
for (final String s : deckMap.keySet()) {
|
||||
dmKeys.add(s);
|
||||
}
|
||||
|
||||
Collections.sort(dmKeys);
|
||||
|
||||
for (final String s : dmKeys) {
|
||||
deckList.append(deckMap.get(s) + " x " + s + nl);
|
||||
}
|
||||
|
||||
final StringBuilder msg = new StringBuilder();
|
||||
if (deckMap.keySet().size() <= 32) {
|
||||
msg.append(deckList.toString() + nl);
|
||||
} else {
|
||||
msg.append("Decklist too long for dialog." + nl + nl);
|
||||
}
|
||||
|
||||
msg.append("Copy Decklist to Clipboard?");
|
||||
|
||||
// Output
|
||||
final int rcMsg = JOptionPane.showConfirmDialog(null, msg, "Decklist", JOptionPane.OK_CANCEL_OPTION);
|
||||
if (rcMsg == JOptionPane.OK_OPTION) {
|
||||
final StringSelection ss = new StringSelection(deckList.toString());
|
||||
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null);
|
||||
}
|
||||
} // End showDecklist
|
||||
|
||||
/**
|
||||
* Exhaustively converts object array to string array.
|
||||
* Probably a much easier way to do this.
|
||||
* And, there must be a better place for this.
|
||||
*
|
||||
* @param o0   Object[]
|
||||
* @return String[]
|
||||
*/
|
||||
public static String[] oa2sa(final Object[] o0) {
|
||||
final String[] output = new String[o0.length];
|
||||
|
||||
for (int i = 0; i < o0.length; i++) {
|
||||
output[i] = o0[i].toString();
|
||||
}
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
/** @param lst0   {@link javax.swing.JList} */
|
||||
public static void randomSelect(final JList lst0) {
|
||||
if (lst0.getName().equals(ESubmenuConstructedTypes.COLORS.toString())) {
|
||||
// Color select algorithm
|
||||
int x = -1;
|
||||
// HACK because 1 and 4 color decks are not supported yet. :(
|
||||
while (x == -1 || x == 1 || x == 4) {
|
||||
x = (int) Math.ceil(Math.random() * 5);
|
||||
}
|
||||
final int colorCount = x;
|
||||
|
||||
final int maxCount = lst0.getModel().getSize();
|
||||
int[] selectedIndices = new int[colorCount];
|
||||
|
||||
x = -1;
|
||||
for (int i = 0; i < colorCount; i++) {
|
||||
while (x == -1) {
|
||||
x = (int) Math.floor(Math.random() * maxCount);
|
||||
if (Arrays.asList(selectedIndices).contains(x)) { x = -1; }
|
||||
else { selectedIndices[i] = x; }
|
||||
}
|
||||
x = -1;
|
||||
}
|
||||
lst0.setSelectedIndices(selectedIndices);
|
||||
selectedIndices = null;
|
||||
}
|
||||
else {
|
||||
final int size = lst0.getModel().getSize();
|
||||
|
||||
if (size > 0) {
|
||||
final Random r = new Random();
|
||||
final int i = r.nextInt(size);
|
||||
|
||||
lst0.setSelectedIndex(i);
|
||||
lst0.ensureIndexIsVisible(lst0.getSelectedIndex());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Generates deck from current list selection(s). */
|
||||
private static Deck generateDeck(final JList lst0, final PlayerType player0) {
|
||||
CardList cards = null;
|
||||
final String[] selection = oa2sa(lst0.getSelectedValuesList().toArray());
|
||||
final Deck deck;
|
||||
|
||||
// Color deck
|
||||
if (lst0.getName().equals("lstColor") && colorCheck(selection)) {
|
||||
final Map<String, String> colorVals = new HashMap<String, String>();
|
||||
colorVals.put("Random 1", "AI");
|
||||
colorVals.put("Random 2", "AI");
|
||||
colorVals.put("Random 3", "AI");
|
||||
colorVals.put("Random 4", "AI");
|
||||
colorVals.put("Black", "black");
|
||||
colorVals.put("Blue", "blue");
|
||||
colorVals.put("Green", "green");
|
||||
colorVals.put("Red", "red");
|
||||
colorVals.put("White", "white");
|
||||
|
||||
// Replace "random" with "AI" for deck generation code
|
||||
for (int i = 0; i < selection.length; i++) {
|
||||
selection[i] = colorVals.get(selection[i]);
|
||||
}
|
||||
|
||||
// 2, 3, and 5 colors.
|
||||
if (selection.length == 2) {
|
||||
final Generate2ColorDeck gen = new Generate2ColorDeck(
|
||||
selection[0], selection[1]);
|
||||
cards = gen.get2ColorDeck(60, player0);
|
||||
}
|
||||
else if (selection.length == 3) {
|
||||
final Generate3ColorDeck gen = new Generate3ColorDeck(
|
||||
selection[0], selection[1], selection[2]);
|
||||
cards = gen.get3ColorDeck(60, player0);
|
||||
}
|
||||
else {
|
||||
final Generate5ColorDeck gen = new Generate5ColorDeck(
|
||||
selection[0], selection[1], selection[2], selection[3], selection[4]);
|
||||
cards = gen.get5ColorDeck(60, player0);
|
||||
}
|
||||
|
||||
// After generating card lists, build deck.
|
||||
deck = new Deck();
|
||||
deck.getMain().add(cards);
|
||||
colorVals.clear();
|
||||
}
|
||||
|
||||
// Theme deck
|
||||
else if (lst0.getName().equals(ESubmenuConstructedTypes.THEMES.toString())) {
|
||||
final GenerateThemeDeck gen = new GenerateThemeDeck();
|
||||
cards = gen.getThemeDeck(selection[0], 60);
|
||||
|
||||
// After generating card lists, build deck.
|
||||
deck = new Deck();
|
||||
deck.getMain().add(cards);
|
||||
}
|
||||
else if (lst0.getName().equals(ESubmenuConstructedTypes.QUESTEVENTS.toString())) {
|
||||
deck = Singletons.getModel().getQuestEventManager().getEvent(selection[0]).getEventDeck();
|
||||
}
|
||||
// Custom deck
|
||||
else {
|
||||
deck = Singletons.getModel().getDecks().getConstructed().get(selection[0]);
|
||||
}
|
||||
|
||||
return deck;
|
||||
}
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
private static void populateOptionsPanel(final JPanel pnlParent) {
|
||||
final FCheckBox cbSingletons = new FCheckBox("Singleton Mode");
|
||||
final FCheckBox cbArtifacts = new FCheckBox("Remove Artifacts");
|
||||
final FCheckBox cbRemoveSmall = new FCheckBox("Remove Small Creatures");
|
||||
final String constraints = "ax center, gap 0 0 0 5px";
|
||||
|
||||
cbSingletons.setSelected(Singletons.getModel()
|
||||
.getPreferences().getPrefBoolean(FPref.DECKGEN_SINGLETONS));
|
||||
cbArtifacts.setSelected(Singletons.getModel()
|
||||
.getPreferences().getPrefBoolean(FPref.DECKGEN_ARTIFACTS));
|
||||
cbRemoveSmall.setSelected(Singletons.getModel()
|
||||
.getPreferences().getPrefBoolean(FPref.DECKGEN_NOSMALL));
|
||||
|
||||
// Event handling must occur here, unfortunately.
|
||||
cbSingletons.setCommand(new Command() {
|
||||
@Override
|
||||
public void execute() {
|
||||
Singletons.getModel().getPreferences().setPref(
|
||||
FPref.DECKGEN_SINGLETONS, String.valueOf(cbSingletons.isSelected()));
|
||||
}
|
||||
});
|
||||
|
||||
cbArtifacts.setCommand(new Command() {
|
||||
@Override
|
||||
public void execute() {
|
||||
Singletons.getModel().getPreferences().setPref(
|
||||
FPref.DECKGEN_ARTIFACTS, String.valueOf(cbArtifacts.isSelected()));
|
||||
}
|
||||
});
|
||||
|
||||
cbRemoveSmall.setCommand(new Command() {
|
||||
@Override
|
||||
public void execute() {
|
||||
Singletons.getModel().getPreferences().setPref(
|
||||
FPref.DECKGEN_NOSMALL, String.valueOf(cbRemoveSmall.isSelected()));
|
||||
}
|
||||
});
|
||||
|
||||
pnlParent.removeAll();
|
||||
pnlParent.setLayout(new MigLayout("inset 0, gap 0, wrap"));
|
||||
pnlParent.add(cbSingletons, constraints);
|
||||
pnlParent.add(cbArtifacts, constraints);
|
||||
pnlParent.add(cbRemoveSmall, constraints);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks lengths of selected values for color lists
|
||||
* to see if a deck generator exists. Alert and visual reminder if fail.
|
||||
*
|
||||
* @param colors0   String[] of color names
|
||||
* @return boolean
|
||||
*/
|
||||
private static boolean colorCheck(final String[] colors0) {
|
||||
boolean result = true;
|
||||
|
||||
if (colors0.length == 1) {
|
||||
JOptionPane.showMessageDialog(null,
|
||||
"Sorry, single color generated decks aren't supported yet."
|
||||
+ "\n\rPlease choose at least one more color for this deck.",
|
||||
"Generate deck: 1 color", JOptionPane.ERROR_MESSAGE);
|
||||
result = false;
|
||||
}
|
||||
else if (colors0.length == 4) {
|
||||
JOptionPane.showMessageDialog(null,
|
||||
"Sorry, four color generated decks aren't supported yet."
|
||||
+ "\n\rPlease use 2, 3, or 5 colors for this deck.",
|
||||
"Generate deck: 4 colors", JOptionPane.ERROR_MESSAGE);
|
||||
result = false;
|
||||
}
|
||||
else if (colors0.length > 5) {
|
||||
JOptionPane.showMessageDialog(null,
|
||||
"Generate deck: maximum five colors!",
|
||||
"Generate deck: too many colors", JOptionPane.ERROR_MESSAGE);
|
||||
result = false;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/** @param lists0   {@link java.util.List}<{@link javax.swing.JList}> */
|
||||
public static void startGame(final List<JList> lists0) {
|
||||
final Deck deckHuman = generateDeck(lists0.get(0), PlayerType.HUMAN);
|
||||
final Deck deckAI = generateDeck(lists0.get(1), PlayerType.COMPUTER);
|
||||
|
||||
final FOverlay overlay = Singletons.getView().getOverlay();
|
||||
overlay.setLayout(new MigLayout("insets 0, gap 0, align center"));
|
||||
|
||||
final FPanel pnl = new FPanel();
|
||||
pnl.setLayout(new MigLayout("insets 0, gap 0, ax center, wrap"));
|
||||
pnl.setBackground(FSkin.getColor(FSkin.Colors.CLR_ACTIVE));
|
||||
|
||||
pnl.add(new FLabel.Builder().icon(FSkin.getIcon(FSkin.ForgeIcons.ICO_LOGO)).build(),
|
||||
"h 200px!, align center");
|
||||
pnl.add(new FLabel.Builder().text("Loading new game...")
|
||||
.fontScaleAuto(false).fontSize(22).build(), "h 40px!, align center");
|
||||
|
||||
overlay.add(pnl, "h 300px!, w 400px!");
|
||||
|
||||
overlay.showOverlay();
|
||||
GameNew.newGame(deckHuman, deckAI);
|
||||
overlay.hideOverlay();
|
||||
}
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
private static class CustomSelectPanel extends JPanel {
|
||||
private final FList lst;
|
||||
private final Command cmd = new Command() { @Override
|
||||
public void execute() { randomSelect(lst); } };
|
||||
|
||||
public CustomSelectPanel(final Player p0) {
|
||||
lst = new FList();
|
||||
lst.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
|
||||
|
||||
this.setOpaque(false);
|
||||
this.setLayout(new MigLayout("insets 0, gap 0, wrap"));
|
||||
this.add(new FLabel.Builder().text(p0.getName()).fontSize(14)
|
||||
.fontScaleAuto(false).build(),
|
||||
"w 100%!, h 25px!, gap 0 0 0 8px");
|
||||
this.add(new FScrollPane(lst), "w 100%!, pushy, growy");
|
||||
this.add(new FLabel.Builder().text("Random").fontSize(14).opaque(true)
|
||||
.cmdClick(cmd).hoverable(true).fontScaleAuto(false).build(),
|
||||
"w 100%!, h 25px!, gap 0 0 8px 0");
|
||||
}
|
||||
|
||||
public FList getList() {
|
||||
return lst;
|
||||
}
|
||||
}
|
||||
}
|
||||
70
src/main/java/forge/gui/home/constructed/VSubmenuColors.java
Normal file
70
src/main/java/forge/gui/home/constructed/VSubmenuColors.java
Normal file
@@ -0,0 +1,70 @@
|
||||
package forge.gui.home.constructed;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JList;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.ListSelectionModel;
|
||||
|
||||
import forge.gui.home.EMenuGroup;
|
||||
import forge.gui.home.IVSubmenu;
|
||||
import forge.view.home.StartButton;
|
||||
|
||||
/**
|
||||
* Singleton instance of "Colors" submenu in "Constructed" group.
|
||||
*
|
||||
*/
|
||||
public enum VSubmenuColors implements IVSubmenu {
|
||||
/** */
|
||||
SINGLETON_INSTANCE;
|
||||
|
||||
/** */
|
||||
private final JPanel pnl = new JPanel();
|
||||
private final StartButton btnStart = new StartButton();
|
||||
private final List<JList> allLists = new ArrayList<JList>();
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.view.home.IViewSubmenu#populate()
|
||||
*/
|
||||
@Override
|
||||
public void populate() {
|
||||
pnl.setName(ESubmenuConstructedTypes.COLORS.toString());
|
||||
final List<JList> generatedLists =
|
||||
SubmenuConstructedUtil.populateConstructedSubmenuView(pnl, btnStart);
|
||||
|
||||
allLists.clear();
|
||||
for (JList lst : generatedLists) {
|
||||
lst.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
|
||||
lst.setName(ESubmenuConstructedTypes.COLORS.toString());
|
||||
allLists.add(lst);
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.view.home.IViewSubmenu#getGroup()
|
||||
*/
|
||||
@Override
|
||||
public EMenuGroup getGroup() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.view.home.IViewSubmenu#getPanel()
|
||||
*/
|
||||
@Override
|
||||
public JPanel getPanel() {
|
||||
return pnl;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JButton} */
|
||||
public JButton getBtnStart() {
|
||||
return this.btnStart;
|
||||
}
|
||||
|
||||
/** @return {@link java.util.List}<{@link javax.swing.JList}> */
|
||||
public List<JList> getLists() {
|
||||
return allLists;
|
||||
}
|
||||
}
|
||||
68
src/main/java/forge/gui/home/constructed/VSubmenuCustom.java
Normal file
68
src/main/java/forge/gui/home/constructed/VSubmenuCustom.java
Normal file
@@ -0,0 +1,68 @@
|
||||
package forge.gui.home.constructed;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JList;
|
||||
import javax.swing.JPanel;
|
||||
|
||||
import forge.gui.home.EMenuGroup;
|
||||
import forge.gui.home.IVSubmenu;
|
||||
import forge.view.home.StartButton;
|
||||
|
||||
/**
|
||||
* Singleton instance of "Colors" submenu in "Constructed" group.
|
||||
*
|
||||
*/
|
||||
public enum VSubmenuCustom implements IVSubmenu {
|
||||
/** */
|
||||
SINGLETON_INSTANCE;
|
||||
|
||||
/** */
|
||||
private final JPanel pnl = new JPanel();
|
||||
private final StartButton btnStart = new StartButton();
|
||||
private final List<JList> allLists = new ArrayList<JList>();
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.view.home.IViewSubmenu#populate()
|
||||
*/
|
||||
@Override
|
||||
public void populate() {
|
||||
pnl.setName(ESubmenuConstructedTypes.CUSTOM.toString());
|
||||
final List<JList> generatedLists =
|
||||
SubmenuConstructedUtil.populateConstructedSubmenuView(pnl, btnStart);
|
||||
|
||||
allLists.clear();
|
||||
for (JList lst : generatedLists) {
|
||||
lst.setName(ESubmenuConstructedTypes.CUSTOM.toString());
|
||||
allLists.add(lst);
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.view.home.IViewSubmenu#getGroup()
|
||||
*/
|
||||
@Override
|
||||
public EMenuGroup getGroup() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.view.home.IViewSubmenu#getPanel()
|
||||
*/
|
||||
@Override
|
||||
public JPanel getPanel() {
|
||||
return pnl;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JButton} */
|
||||
public JButton getBtnStart() {
|
||||
return this.btnStart;
|
||||
}
|
||||
|
||||
/** @return {@link java.util.List}<{@link javax.swing.JList}> */
|
||||
public List<JList> getLists() {
|
||||
return allLists;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
package forge.gui.home.constructed;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JList;
|
||||
import javax.swing.JPanel;
|
||||
|
||||
import forge.gui.home.EMenuGroup;
|
||||
import forge.gui.home.IVSubmenu;
|
||||
import forge.view.home.StartButton;
|
||||
|
||||
/**
|
||||
* Singleton instance of "Colors" submenu in "Constructed" group.
|
||||
*
|
||||
*/
|
||||
public enum VSubmenuQuestEvents implements IVSubmenu {
|
||||
/** */
|
||||
SINGLETON_INSTANCE;
|
||||
|
||||
/** */
|
||||
private final JPanel pnl = new JPanel();
|
||||
private final StartButton btnStart = new StartButton();
|
||||
private final List<JList> allLists = new ArrayList<JList>();
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.view.home.IViewSubmenu#populate()
|
||||
*/
|
||||
@Override
|
||||
public void populate() {
|
||||
pnl.setName(ESubmenuConstructedTypes.QUESTEVENTS.toString());
|
||||
final List<JList> generatedLists =
|
||||
SubmenuConstructedUtil.populateConstructedSubmenuView(pnl, btnStart);
|
||||
|
||||
allLists.clear();
|
||||
for (final JList lst : generatedLists) {
|
||||
lst.setName(ESubmenuConstructedTypes.QUESTEVENTS.toString());
|
||||
allLists.add(lst);
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.view.home.IViewSubmenu#getGroup()
|
||||
*/
|
||||
@Override
|
||||
public EMenuGroup getGroup() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.view.home.IViewSubmenu#getPanel()
|
||||
*/
|
||||
@Override
|
||||
public JPanel getPanel() {
|
||||
return pnl;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JButton} */
|
||||
public JButton getBtnStart() {
|
||||
return this.btnStart;
|
||||
}
|
||||
|
||||
/** @return {@link java.util.List}<{@link javax.swing.JList}> */
|
||||
public List<JList> getLists() {
|
||||
return allLists;
|
||||
}
|
||||
}
|
||||
69
src/main/java/forge/gui/home/constructed/VSubmenuThemes.java
Normal file
69
src/main/java/forge/gui/home/constructed/VSubmenuThemes.java
Normal file
@@ -0,0 +1,69 @@
|
||||
package forge.gui.home.constructed;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JList;
|
||||
import javax.swing.JPanel;
|
||||
|
||||
import forge.gui.home.EMenuGroup;
|
||||
import forge.gui.home.IVSubmenu;
|
||||
import forge.view.home.StartButton;
|
||||
|
||||
/**
|
||||
* Singleton instance of "Colors" submenu in "Constructed" group.
|
||||
*
|
||||
*/
|
||||
public enum VSubmenuThemes implements IVSubmenu {
|
||||
/** */
|
||||
SINGLETON_INSTANCE;
|
||||
|
||||
/** */
|
||||
private final JPanel pnl = new JPanel();
|
||||
private final StartButton btnStart = new StartButton();
|
||||
private final List<JList> allLists = new ArrayList<JList>();
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.view.home.IViewSubmenu#populate()
|
||||
*/
|
||||
@Override
|
||||
public void populate() {
|
||||
pnl.setName(ESubmenuConstructedTypes.THEMES.toString());
|
||||
final List<JList> generatedLists =
|
||||
SubmenuConstructedUtil.populateConstructedSubmenuView(pnl, btnStart);
|
||||
|
||||
allLists.clear();
|
||||
for (JList lst : generatedLists) {
|
||||
lst.setName(ESubmenuConstructedTypes.THEMES.toString());
|
||||
allLists.add(lst);
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.view.home.IViewSubmenu#getGroup()
|
||||
*/
|
||||
@Override
|
||||
public EMenuGroup getGroup() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.view.home.IViewSubmenu#getPanel()
|
||||
*/
|
||||
@Override
|
||||
public JPanel getPanel() {
|
||||
return pnl;
|
||||
}
|
||||
|
||||
|
||||
/** @return {@link javax.swing.JButton} */
|
||||
public JButton getBtnStart() {
|
||||
return this.btnStart;
|
||||
}
|
||||
|
||||
/** @return {@link java.util.List}<{@link javax.swing.JList}> */
|
||||
public List<JList> getLists() {
|
||||
return allLists;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user