mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 12:18:00 +00:00
Full home UI rebuild: singleton design pattern, better menu structure, improved resizing dynamics, constructed mode rebuild.
This commit is contained in:
38
.gitattributes
vendored
38
.gitattributes
vendored
@@ -11330,15 +11330,9 @@ src/main/java/forge/control/ControlHomeUI.java -text
|
||||
src/main/java/forge/control/ControlMatchUI.java -text
|
||||
src/main/java/forge/control/FControl.java -text
|
||||
src/main/java/forge/control/KeyboardShortcuts.java -text
|
||||
src/main/java/forge/control/RestartUtil.java -text
|
||||
src/main/java/forge/control/bazaar/ControlStall.java -text
|
||||
src/main/java/forge/control/bazaar/package-info.java -text svneol=native#text/plain
|
||||
src/main/java/forge/control/home/ControlConstructed.java -text
|
||||
src/main/java/forge/control/home/ControlDraft.java -text
|
||||
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/package-info.java -text svneol=native#text/plain
|
||||
src/main/java/forge/control/input/Input.java svneol=native#text/plain
|
||||
src/main/java/forge/control/input/InputAttack.java svneol=native#text/plain
|
||||
src/main/java/forge/control/input/InputBlock.java svneol=native#text/plain
|
||||
@@ -11443,21 +11437,14 @@ 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/EMenuItem.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/home/constructed/package-info.java svneol=native#text/plain
|
||||
src/main/java/forge/gui/home/StartButton.java -text
|
||||
src/main/java/forge/gui/home/limited/CSubmenuConstructed.java -text
|
||||
src/main/java/forge/gui/home/limited/CSubmenuDraft.java -text
|
||||
src/main/java/forge/gui/home/limited/CSubmenuSealed.java -text
|
||||
src/main/java/forge/gui/home/limited/VSubmenuConstructed.java -text
|
||||
src/main/java/forge/gui/home/limited/VSubmenuDraft.java -text
|
||||
src/main/java/forge/gui/home/limited/VSubmenuSealed.java -text
|
||||
src/main/java/forge/gui/home/limited/package-info.java svneol=native#text/plain
|
||||
@@ -11467,6 +11454,9 @@ src/main/java/forge/gui/home/quest/CSubmenuDuels.java -text
|
||||
src/main/java/forge/gui/home/quest/CSubmenuQuestData.java -text
|
||||
src/main/java/forge/gui/home/quest/CSubmenuQuestDecks.java -text
|
||||
src/main/java/forge/gui/home/quest/CSubmenuQuestPrefs.java -text
|
||||
src/main/java/forge/gui/home/quest/IStatsAndPet.java -text
|
||||
src/main/java/forge/gui/home/quest/QuestFileLister.java -text
|
||||
src/main/java/forge/gui/home/quest/QuestPreferencesHandler.java -text
|
||||
src/main/java/forge/gui/home/quest/SubmenuQuestUtil.java -text
|
||||
src/main/java/forge/gui/home/quest/VSubmenuChallenges.java -text
|
||||
src/main/java/forge/gui/home/quest/VSubmenuDuels.java -text
|
||||
@@ -11576,18 +11566,6 @@ src/main/java/forge/view/ViewMatchUI.java -text
|
||||
src/main/java/forge/view/bazaar/ViewItem.java -text
|
||||
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/QuestFileLister.java -text
|
||||
src/main/java/forge/view/home/QuestPreferencesHandler.java -text
|
||||
src/main/java/forge/view/home/StartButton.java -text
|
||||
src/main/java/forge/view/home/ViewConstructed.java -text
|
||||
src/main/java/forge/view/home/ViewDraft.java -text
|
||||
src/main/java/forge/view/home/ViewQuest.java -text
|
||||
src/main/java/forge/view/home/ViewSealed.java -text
|
||||
src/main/java/forge/view/home/ViewSettings.java -text
|
||||
src/main/java/forge/view/home/ViewUtilities.java -text
|
||||
src/main/java/forge/view/home/package-info.java svneol=native#text/plain
|
||||
src/main/java/forge/view/match/QuestWinLoseCardViewer.java -text
|
||||
src/main/java/forge/view/match/QuestWinLoseHandler.java -text
|
||||
src/main/java/forge/view/match/ViewBattlefield.java -text
|
||||
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -266,6 +266,7 @@ res/decks/Zac[!!-~]Hill's[!!-~]Kuldotha[!!-~]Red.dck
|
||||
res/decks/Zack[!!-~]Shaffner's[!!-~]Creatureless[!!-~]Control.dck
|
||||
res/decks/Zemox's[!!-~]Mono-Green[!!-~]Infect.dck
|
||||
res/decks/Zvi[!!-~]Mowshowitz's[!!-~]Mono-Black[!!-~]Control.dck
|
||||
res/decks/constructed/*.dck
|
||||
res/decks/o1.bdk
|
||||
res/images/themes
|
||||
res/oracleScript.log
|
||||
|
||||
@@ -1,10 +1,5 @@
|
||||
package forge.control;
|
||||
|
||||
import forge.control.home.ControlConstructed;
|
||||
import forge.control.home.ControlDraft;
|
||||
import forge.control.home.ControlQuest;
|
||||
import forge.control.home.ControlSealed;
|
||||
import forge.control.home.ControlUtilities;
|
||||
import forge.view.ViewHomeUI;
|
||||
|
||||
/**
|
||||
@@ -28,29 +23,4 @@ public class ControlHomeUI {
|
||||
public ViewHomeUI getView() {
|
||||
return view;
|
||||
}
|
||||
|
||||
/** @return ControlConstructed */
|
||||
public ControlConstructed getControlConstructed() {
|
||||
return view.getViewConstructed().getControl();
|
||||
}
|
||||
|
||||
/** @return ControlDraft */
|
||||
public ControlDraft getControlDraft() {
|
||||
return view.getViewDraft().getControl();
|
||||
}
|
||||
|
||||
/** @return ControlSealed */
|
||||
public ControlSealed getControlSealed() {
|
||||
return view.getViewSealed().getControl();
|
||||
}
|
||||
|
||||
/** @return ControlQuest */
|
||||
public ControlQuest getControlQuest() {
|
||||
return view.getViewQuest().getControl();
|
||||
}
|
||||
|
||||
/** @return ControlUtilities */
|
||||
public ControlUtilities getControlUtilities() {
|
||||
return view.getViewUtilities().getControl();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,6 +31,8 @@ import javax.swing.WindowConstants;
|
||||
import forge.AllZone;
|
||||
import forge.Singletons;
|
||||
import forge.control.KeyboardShortcuts.Shortcut;
|
||||
import forge.gui.home.quest.SubmenuQuestUtil;
|
||||
import forge.view.ViewHomeUI;
|
||||
import forge.view.toolbox.CardFaceSymbols;
|
||||
import forge.view.toolbox.FSkin;
|
||||
|
||||
@@ -85,8 +87,7 @@ public enum FControl {
|
||||
public void windowClosing(final WindowEvent e) {
|
||||
Singletons.getView().getFrame().setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
|
||||
changeState(0);
|
||||
Singletons.getControl().getControlHome().getControlQuest().refreshStats();
|
||||
Singletons.getView().getViewHome().showQuestMenu();
|
||||
SubmenuQuestUtil.updateStatsAndPet();
|
||||
}
|
||||
};
|
||||
|
||||
@@ -146,7 +147,7 @@ public enum FControl {
|
||||
// Fire up new state
|
||||
switch (i0) {
|
||||
case HOME_SCREEN:
|
||||
display.add(Singletons.getView().getViewHome(), JLayeredPane.DEFAULT_LAYER);
|
||||
display.add(ViewHomeUI.SINGLETON_INSTANCE.getPanel(), JLayeredPane.DEFAULT_LAYER);
|
||||
sizeChildren();
|
||||
break;
|
||||
|
||||
@@ -189,7 +190,7 @@ public enum FControl {
|
||||
+ "may only be called while the home UI is showing.");
|
||||
}
|
||||
|
||||
return Singletons.getView().getViewHome().getControl();
|
||||
throw new NullPointerException("Fix Me"); //return Singletons.getView().getViewHome().getControl();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -16,8 +16,8 @@ import javax.swing.KeyStroke;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import forge.Singletons;
|
||||
import forge.gui.home.settings.VSubmenuPreferences.KeyboardShortcutField;
|
||||
import forge.properties.ForgePreferences.FPref;
|
||||
import forge.view.home.ViewSettings.KeyboardShortcutField;
|
||||
|
||||
/**
|
||||
* Consolidates keyboard shortcut assembly into one location
|
||||
|
||||
80
src/main/java/forge/control/RestartUtil.java
Normal file
80
src/main/java/forge/control/RestartUtil.java
Normal file
@@ -0,0 +1,80 @@
|
||||
package forge.control;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.lang.management.ManagementFactory;
|
||||
import java.util.List;
|
||||
|
||||
import forge.error.ErrorViewer;
|
||||
|
||||
/**
|
||||
* Restarts a java app.
|
||||
* Credit: http://leolewis.website.org/wordpress/2011/07/06/programmatically-restart-a-java-application/
|
||||
*/
|
||||
public class RestartUtil {
|
||||
/**
|
||||
* Sun property pointing the main class and its arguments.
|
||||
* Might not be defined on non Hotspot VM implementations.
|
||||
*/
|
||||
public static final String SUN_JAVA_COMMAND = "sun.java.command";
|
||||
|
||||
/**
|
||||
* Restart the current Java application.
|
||||
* @param runBeforeRestart some custom code to be run before restarting
|
||||
*/
|
||||
public static void restartApplication(final Runnable runBeforeRestart) {
|
||||
try {
|
||||
// java binary
|
||||
final String java = System.getProperty("java.home") + "/bin/java";
|
||||
// vm arguments
|
||||
final List<String> vmArguments = ManagementFactory.getRuntimeMXBean().getInputArguments();
|
||||
final StringBuffer vmArgsOneLine = new StringBuffer();
|
||||
for (final String arg : vmArguments) {
|
||||
// if it's the agent argument : we ignore it otherwise the
|
||||
// address of the old application and the new one will be in conflict
|
||||
if (!arg.contains("-agentlib")) {
|
||||
vmArgsOneLine.append(arg);
|
||||
vmArgsOneLine.append(" ");
|
||||
}
|
||||
}
|
||||
// init the command to execute, add the vm args
|
||||
final StringBuffer cmd = new StringBuffer("\"" + java + "\" " + vmArgsOneLine);
|
||||
|
||||
// program main and program arguments
|
||||
final String[] mainCommand = System.getProperty(SUN_JAVA_COMMAND).split(" ");
|
||||
// program main is a jar
|
||||
if (mainCommand[0].endsWith(".jar")) {
|
||||
// if it's a jar, add -jar mainJar
|
||||
cmd.append("-jar " + new File(mainCommand[0]).getPath());
|
||||
} else {
|
||||
// else it's a .class, add the classpath and mainClass
|
||||
cmd.append("-cp \"" + System.getProperty("java.class.path") + "\" " + mainCommand[0]);
|
||||
}
|
||||
// finally add program arguments
|
||||
for (int i = 1; i < mainCommand.length; i++) {
|
||||
cmd.append(" ");
|
||||
cmd.append(mainCommand[i]);
|
||||
}
|
||||
// execute the command in a shutdown hook, to be sure that all the
|
||||
// resources have been disposed before restarting the application
|
||||
Runtime.getRuntime().addShutdownHook(new Thread() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
Runtime.getRuntime().exec(cmd.toString());
|
||||
} catch (final IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
});
|
||||
// execute some custom code before restarting
|
||||
if (runBeforeRestart != null) {
|
||||
runBeforeRestart.run();
|
||||
}
|
||||
// exit
|
||||
System.exit(0);
|
||||
} catch (final Exception ex) {
|
||||
ErrorViewer.showError(ex, "Restart \"%s\" exception", "");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,382 +0,0 @@
|
||||
package forge.control.home;
|
||||
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.awt.event.MouseListener;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.swing.JList;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.SwingUtilities;
|
||||
|
||||
import org.apache.commons.lang3.ArrayUtils;
|
||||
|
||||
import forge.CardList;
|
||||
import forge.Constant;
|
||||
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.game.GameType;
|
||||
import forge.properties.ForgePreferences.FPref;
|
||||
import forge.quest.data.QuestEvent;
|
||||
import forge.quest.data.QuestEventManager;
|
||||
import forge.util.IStorage;
|
||||
import forge.view.home.ViewConstructed;
|
||||
|
||||
/**
|
||||
* Controls logic and listeners for Constructed mode in home screen.
|
||||
*
|
||||
*/
|
||||
public class ControlConstructed {
|
||||
private final ViewConstructed view;
|
||||
private JPanel selectedTab;
|
||||
private final MouseListener madStartGame, madTabHuman, madTabAI, madSingletons, madArtifacts, madRemoveSmall;
|
||||
|
||||
/**
|
||||
*
|
||||
* Controls logic and listeners for "constructed" mode in home screen.
|
||||
*
|
||||
* @param v0   ViewConstructed
|
||||
*/
|
||||
public ControlConstructed(final ViewConstructed v0) {
|
||||
this.view = v0;
|
||||
|
||||
// Set action listeners
|
||||
madTabHuman = new MouseAdapter() { @Override
|
||||
public void mouseClicked(final MouseEvent e) { view.showHumanTab(); } };
|
||||
|
||||
madTabAI = new MouseAdapter() { @Override
|
||||
public void mouseClicked(final MouseEvent e) { view.showAITab(); } };
|
||||
|
||||
// Game start logic must happen outside of the EDT.
|
||||
madStartGame = new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseReleased(final MouseEvent e) {
|
||||
final Thread t = new Thread() {
|
||||
@Override
|
||||
public void run() {
|
||||
startGame();
|
||||
}
|
||||
};
|
||||
t.start();
|
||||
}
|
||||
};
|
||||
|
||||
madSingletons = new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseClicked(final MouseEvent e) {
|
||||
Singletons.getModel().getPreferences().setPref(
|
||||
FPref.DECKGEN_SINGLETONS, String.valueOf(view.getCbSingletons().isSelected()));
|
||||
}
|
||||
};
|
||||
|
||||
madArtifacts = new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseClicked(final MouseEvent e) {
|
||||
Singletons.getModel().getPreferences().setPref(
|
||||
FPref.DECKGEN_ARTIFACTS, String.valueOf(view.getCbArtifacts().isSelected()));
|
||||
}
|
||||
};
|
||||
|
||||
madRemoveSmall = new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseClicked(final MouseEvent e) {
|
||||
Singletons.getModel().getPreferences().setPref(
|
||||
FPref.DECKGEN_NOSMALL, String.valueOf(view.getCbRemoveSmall().isSelected()));
|
||||
}
|
||||
};
|
||||
|
||||
//Everything is defined; can now init.
|
||||
updateDeckLists();
|
||||
addListeners();
|
||||
|
||||
view.getPnlHuman().getLstColorDecks().setSelectedIndices(new int[] {0, 1});
|
||||
view.getPnlHuman().listSelectManager(view.getPnlHuman().getLstColorDecks());
|
||||
|
||||
view.getPnlAI().getLstColorDecks().setSelectedIndices(new int[] {0, 1});
|
||||
view.getPnlAI().listSelectManager(view.getPnlAI().getLstColorDecks());
|
||||
}
|
||||
|
||||
/** @return ViewConstructed */
|
||||
public ViewConstructed getView() {
|
||||
return view;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates visual state of tabber.
|
||||
* @param tab0   JPanel tab object (can pass SubTab too).
|
||||
*/
|
||||
public void updateTabber(final JPanel tab0) {
|
||||
if (selectedTab != null) {
|
||||
selectedTab.setEnabled(false);
|
||||
}
|
||||
|
||||
tab0.setEnabled(true);
|
||||
selectedTab = tab0;
|
||||
}
|
||||
|
||||
/** */
|
||||
public void updateDeckSelectionCheckboxes() {
|
||||
view.getCbSingletons().setSelected(
|
||||
Singletons.getModel().getPreferences().getPrefBoolean(FPref.DECKGEN_SINGLETONS));
|
||||
view.getCbArtifacts().setSelected(
|
||||
Singletons.getModel().getPreferences().getPrefBoolean(FPref.DECKGEN_ARTIFACTS));
|
||||
view.getCbRemoveSmall().setSelected(
|
||||
Singletons.getModel().getPreferences().getPrefBoolean(FPref.DECKGEN_NOSMALL));
|
||||
}
|
||||
|
||||
/** */
|
||||
public void addListeners() {
|
||||
view.getBtnStart().removeMouseListener(madStartGame);
|
||||
view.getBtnStart().addMouseListener(madStartGame);
|
||||
|
||||
view.getTabHuman().removeMouseListener(madTabHuman);
|
||||
view.getTabHuman().addMouseListener(madTabHuman);
|
||||
|
||||
view.getTabAI().removeMouseListener(madTabAI);
|
||||
view.getTabAI().addMouseListener(madTabAI);
|
||||
|
||||
view.getCbSingletons().removeMouseListener(madSingletons);
|
||||
view.getCbArtifacts().removeMouseListener(madArtifacts);
|
||||
view.getCbRemoveSmall().removeMouseListener(madRemoveSmall);
|
||||
|
||||
view.getCbSingletons().addMouseListener(madSingletons);
|
||||
view.getCbArtifacts().addMouseListener(madArtifacts);
|
||||
view.getCbRemoveSmall().addMouseListener(madRemoveSmall);
|
||||
}
|
||||
|
||||
/** */
|
||||
public void updateDeckLists() {
|
||||
view.getPnlHuman().getLstColorDecks().setListData(getColorNames());
|
||||
view.getPnlAI().getLstColorDecks().setListData(getColorNames());
|
||||
|
||||
view.getPnlHuman().getLstThemeDecks().setListData(getThemeNames());
|
||||
view.getPnlAI().getLstThemeDecks().setListData(getThemeNames());
|
||||
|
||||
view.getPnlHuman().getLstCustomDecks().setListData(getCustomNames());
|
||||
view.getPnlAI().getLstCustomDecks().setListData(getCustomNames());
|
||||
|
||||
view.getPnlHuman().getLstQuestDecks().setListData(getEventNames());
|
||||
view.getPnlAI().getLstQuestDecks().setListData(getEventNames());
|
||||
}
|
||||
|
||||
//========= DECK GENERATION
|
||||
|
||||
/** Generates deck from current list selection(s). */
|
||||
private Deck generateDeck(final JList lst0, final PlayerType player0) {
|
||||
CardList cards = null;
|
||||
final String[] selection = Arrays.copyOf(lst0.getSelectedValues(), lst0.getSelectedValues().length, String[].class);
|
||||
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("lstTheme")) {
|
||||
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("lstQuest")) {
|
||||
deck = Singletons.getModel().getQuestEventManager().getEvent(selection[0]).getEventDeck();
|
||||
}
|
||||
// Custom deck
|
||||
else {
|
||||
deck = Singletons.getModel().getDecks().getConstructed().get(selection[0]);
|
||||
}
|
||||
|
||||
return deck;
|
||||
}
|
||||
|
||||
/** Fired when start button is pressed; checks various conditions from lists and starts game. */
|
||||
private void startGame() {
|
||||
if (SwingUtilities.isEventDispatchThread()) {
|
||||
throw new IllegalStateException(
|
||||
"ControlConstructed() > startGame() must be accessed from outside the event dispatch thread.");
|
||||
}
|
||||
|
||||
// If everything is OK, show progress bar and start inits.
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
view.getBarProgress().setMaximum(2);
|
||||
view.getBarProgress().reset();
|
||||
view.getBarProgress().setShowETA(false);
|
||||
view.getBarProgress().setShowCount(false);
|
||||
view.getBarProgress().setDescription("Starting New Game");
|
||||
view.getBarProgress().setVisible(true);
|
||||
view.getBtnStart().setVisible(false);
|
||||
}
|
||||
});
|
||||
|
||||
SwingUtilities.invokeLater(new Runnable() { @Override
|
||||
public void run() { view.getBarProgress().increment(); } });
|
||||
|
||||
Constant.Runtime.HUMAN_DECK[0] = generateDeck(view.getPnlHuman().getLstCurrentSelected(), PlayerType.HUMAN);
|
||||
|
||||
SwingUtilities.invokeLater(new Runnable() { @Override
|
||||
public void run() { view.getBarProgress().increment(); } });
|
||||
|
||||
Constant.Runtime.COMPUTER_DECK[0] = generateDeck(view.getPnlAI().getLstCurrentSelected(), PlayerType.COMPUTER);
|
||||
|
||||
Constant.Runtime.setGameType(GameType.Constructed);
|
||||
|
||||
if (Constant.Runtime.COMPUTER_DECK[0] == null || Constant.Runtime.HUMAN_DECK[0] == null) {
|
||||
SwingUtilities.invokeLater(new Runnable() { @Override
|
||||
public void run() {
|
||||
view.getBarProgress().setVisible(false);
|
||||
view.getBtnStart().setVisible(true);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
view.getBtnStart().setVisible(true);
|
||||
view.getBarProgress().setVisible(false);
|
||||
|
||||
GameNew.newGame(Constant.Runtime.HUMAN_DECK[0], Constant.Runtime.COMPUTER_DECK[0],
|
||||
new CardList(), new CardList(), 20, 20);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* Array of color selections present in list boxes. Values
|
||||
* correspond to colorVals hash map.
|
||||
*
|
||||
* @return Object[]
|
||||
*/
|
||||
// Four randoms are included which should cover all possibilities.
|
||||
private String[] getColorNames() {
|
||||
return new String[] {"Random 1", "Random 2", "Random 3",
|
||||
"Random 4", "Black", "Blue", "Green", "Red", "White"};
|
||||
}
|
||||
|
||||
/**
|
||||
* Array of theme names, usually used in list boxes.
|
||||
*
|
||||
* @return Object[]
|
||||
*/
|
||||
private String[] getThemeNames() {
|
||||
final List<String> themeNames = new ArrayList<String>();
|
||||
themeNames.clear();
|
||||
|
||||
for (final String s : GenerateThemeDeck.getThemeNames()) {
|
||||
themeNames.add(s);
|
||||
}
|
||||
|
||||
return themeNames.toArray(ArrayUtils.EMPTY_STRING_ARRAY);
|
||||
}
|
||||
|
||||
private String[] getCustomNames() {
|
||||
final List<String> customNames = new ArrayList<String>();
|
||||
customNames.clear();
|
||||
|
||||
final IStorage<Deck> allDecks = Singletons.getModel().getDecks().getConstructed();
|
||||
for (final Deck d : allDecks) { customNames.add(d.getName()); }
|
||||
|
||||
return customNames.toArray(ArrayUtils.EMPTY_STRING_ARRAY);
|
||||
}
|
||||
|
||||
private String[] getEventNames() {
|
||||
final List<String> eventNames = new ArrayList<String>();
|
||||
final QuestEventManager qm = Singletons.getModel().getQuestEventManager();
|
||||
|
||||
for (final QuestEvent e : qm.getAllChallenges()) {
|
||||
eventNames.add(e.getEventDeck().getName());
|
||||
}
|
||||
|
||||
for (final QuestEvent e : qm.getAllDuels()) {
|
||||
eventNames.add(e.getEventDeck().getName());
|
||||
}
|
||||
|
||||
return eventNames.toArray(ArrayUtils.EMPTY_STRING_ARRAY);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 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;
|
||||
}
|
||||
}
|
||||
@@ -1,189 +0,0 @@
|
||||
package forge.control.home;
|
||||
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.awt.event.MouseListener;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.SwingUtilities;
|
||||
|
||||
import forge.Constant;
|
||||
import forge.Singletons;
|
||||
import forge.deck.Deck;
|
||||
import forge.deck.DeckGroup;
|
||||
import forge.game.GameNew;
|
||||
import forge.game.GameType;
|
||||
import forge.game.limited.BoosterDraft;
|
||||
import forge.game.limited.CardPoolLimitation;
|
||||
import forge.gui.GuiUtils;
|
||||
import forge.gui.deckeditor.DraftingProcess;
|
||||
import forge.view.home.ViewDraft;
|
||||
import forge.view.toolbox.FSkin;
|
||||
|
||||
/**
|
||||
* TODO: Write javadoc for this type.
|
||||
*
|
||||
*/
|
||||
public class ControlDraft {
|
||||
private final ViewDraft view;
|
||||
private final MouseListener madBuildDeck, madDirections, madStartGame;
|
||||
|
||||
/** @param v0   ViewDraft */
|
||||
public ControlDraft(ViewDraft v0) {
|
||||
this.view = v0;
|
||||
updateHumanDecks();
|
||||
view.getLstAIDecks().setSelectedIndex(0);
|
||||
|
||||
// Action listeners
|
||||
madDirections = new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseClicked(MouseEvent e) {
|
||||
view.showDirections();
|
||||
}
|
||||
@Override
|
||||
public void mouseEntered(MouseEvent e) {
|
||||
view.getLblDirections().setForeground(FSkin.getColor(FSkin.Colors.CLR_HOVER));
|
||||
}
|
||||
@Override
|
||||
public void mouseExited(MouseEvent e) {
|
||||
view.getLblDirections().setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT));
|
||||
}
|
||||
};
|
||||
|
||||
madBuildDeck = new MouseAdapter() {
|
||||
@Override
|
||||
public void mousePressed(MouseEvent e) { setupDraft(); }
|
||||
};
|
||||
|
||||
madStartGame = new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseReleased(MouseEvent e) {
|
||||
final Thread t = new Thread() {
|
||||
@Override
|
||||
public void run() {
|
||||
startGame();
|
||||
}
|
||||
};
|
||||
t.start();
|
||||
}
|
||||
};
|
||||
|
||||
addListeners();
|
||||
}
|
||||
|
||||
private void addListeners() {
|
||||
view.getBtnBuildDeck().removeMouseListener(madBuildDeck);
|
||||
view.getBtnBuildDeck().addMouseListener(madBuildDeck);
|
||||
|
||||
view.getLblDirections().removeMouseListener(madDirections);
|
||||
view.getLblDirections().addMouseListener(madDirections);
|
||||
|
||||
view.getBtnStart().removeMouseListener(madStartGame);
|
||||
view.getBtnStart().addMouseListener(madStartGame);
|
||||
}
|
||||
|
||||
/** */
|
||||
private void startGame() {
|
||||
if (SwingUtilities.isEventDispatchThread()) {
|
||||
throw new IllegalStateException(
|
||||
"ControlDraft() > startGame() must be accessed from outside the event dispatch thread.");
|
||||
}
|
||||
|
||||
Deck human = view.getLstHumanDecks().getSelectedDeck();
|
||||
int aiIndex = view.getLstAIDecks().getSelectedIndex();
|
||||
|
||||
if (human == null) {
|
||||
JOptionPane.showMessageDialog(null,
|
||||
"No deck selected for human!\r\n(You may need to build a new deck.)",
|
||||
"No deck", JOptionPane.ERROR_MESSAGE);
|
||||
return;
|
||||
}
|
||||
else if (human.getMain().countAll() < 40) {
|
||||
JOptionPane.showMessageDialog(null,
|
||||
"The selected deck doesn't have enough cards to play (minimum 40)."
|
||||
+ "\r\nUse the deck editor to choose the cards you want before starting.",
|
||||
"No deck", JOptionPane.ERROR_MESSAGE);
|
||||
return;
|
||||
}
|
||||
|
||||
// If everything is OK, show progress bar and start inits.
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
view.getBarProgress().setMaximum(2);
|
||||
view.getBarProgress().reset();
|
||||
view.getBarProgress().setShowETA(false);
|
||||
view.getBarProgress().setShowCount(false);
|
||||
view.getBarProgress().setDescription("Starting New Game");
|
||||
view.getBarProgress().setVisible(true);
|
||||
view.getBtnStart().setVisible(false);
|
||||
}
|
||||
});
|
||||
|
||||
DeckGroup opponentDecks = Singletons.getModel().getDecks().getDraft().get(human.getName());
|
||||
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
view.getBarProgress().increment();
|
||||
}
|
||||
});
|
||||
|
||||
Constant.Runtime.HUMAN_DECK[0] = human;
|
||||
Constant.Runtime.COMPUTER_DECK[0] = opponentDecks.getAiDecks().get(aiIndex); //zero is human deck, so it must be +1
|
||||
|
||||
if (Constant.Runtime.COMPUTER_DECK[0] == null) {
|
||||
throw new IllegalStateException("startButton() error - computer deck is null");
|
||||
}
|
||||
|
||||
Constant.Runtime.setGameType(GameType.Draft);
|
||||
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
view.getBtnStart().setVisible(true);
|
||||
view.getBarProgress().setVisible(false);
|
||||
GameNew.newGame(Constant.Runtime.HUMAN_DECK[0], Constant.Runtime.COMPUTER_DECK[0]);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/** */
|
||||
public void setupDraft() {
|
||||
final DraftingProcess draft = new DraftingProcess();
|
||||
|
||||
// Determine what kind of booster draft to run
|
||||
final ArrayList<String> draftTypes = new ArrayList<String>();
|
||||
draftTypes.add("Full Cardpool");
|
||||
draftTypes.add("Block / Set");
|
||||
draftTypes.add("Custom");
|
||||
|
||||
final String prompt = "Choose Draft Format:";
|
||||
final Object o = GuiUtils.chooseOne(prompt, draftTypes.toArray());
|
||||
|
||||
if (o.toString().equals(draftTypes.get(0))) {
|
||||
draft.showGui(new BoosterDraft(CardPoolLimitation.Full));
|
||||
}
|
||||
|
||||
else if (o.toString().equals(draftTypes.get(1))) {
|
||||
draft.showGui(new BoosterDraft(CardPoolLimitation.Block));
|
||||
}
|
||||
|
||||
else if (o.toString().equals(draftTypes.get(2))) {
|
||||
draft.showGui(new BoosterDraft(CardPoolLimitation.Custom));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/** Updates deck list in view. */
|
||||
public void updateHumanDecks() {
|
||||
|
||||
List<Deck> human = new ArrayList<Deck>();
|
||||
for (DeckGroup d : Singletons.getModel().getDecks().getDraft()) {
|
||||
human.add(d.getHumanDeck());
|
||||
}
|
||||
view.getLstHumanDecks().setDecks(human);
|
||||
}
|
||||
}
|
||||
@@ -1,647 +0,0 @@
|
||||
package forge.control.home;
|
||||
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.awt.event.MouseListener;
|
||||
import java.io.File;
|
||||
import java.io.FilenameFilter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.SwingUtilities;
|
||||
|
||||
import forge.AllZone;
|
||||
import forge.Command;
|
||||
import forge.Constant;
|
||||
import forge.Singletons;
|
||||
import forge.control.FControl;
|
||||
import forge.deck.Deck;
|
||||
import forge.game.GameNew;
|
||||
import forge.game.GameType;
|
||||
import forge.gui.GuiUtils;
|
||||
import forge.gui.deckeditor.DeckEditorQuest;
|
||||
import forge.gui.deckeditor.QuestCardShop;
|
||||
import forge.properties.ForgeProps;
|
||||
import forge.properties.NewConstants;
|
||||
import forge.quest.data.QuestChallenge;
|
||||
import forge.quest.data.QuestData;
|
||||
import forge.quest.data.QuestDataIO;
|
||||
import forge.quest.data.QuestEvent;
|
||||
import forge.quest.data.QuestEventManager;
|
||||
import forge.quest.data.QuestPreferences;
|
||||
import forge.quest.data.QuestPreferences.QPref;
|
||||
import forge.quest.data.QuestUtil;
|
||||
import forge.quest.data.item.QuestItemZeppelin;
|
||||
import forge.quest.data.pet.QuestPetAbstract;
|
||||
import forge.view.home.ViewQuest;
|
||||
|
||||
/**
|
||||
* Controls logic and listeners for Quest mode in home screen.
|
||||
*
|
||||
*/
|
||||
public class ControlQuest {
|
||||
private final ViewQuest view;
|
||||
private QuestEvent event;
|
||||
private QuestData qData;
|
||||
private final QuestPreferences qPrefs;
|
||||
private final QuestEventManager qem;
|
||||
private JPanel selectedTab;
|
||||
|
||||
private final MouseListener madStartGame, madDuels, madChallenges,
|
||||
madQuests, madDecks, madPreferences;
|
||||
private final ActionListener actPetSelect, actPlantSelect;
|
||||
private final Command cmdSpellShop, cmdBazaar,
|
||||
cmdEmbark, cmdNewDeck, cmdCurrentDeck, cmdResetPrefs, cmdDeckExit,
|
||||
cmdDeckDelete, cmdDeckSelect, cmdQuestSelect, cmdQuestDelete;
|
||||
private Deck currentDeck;
|
||||
private Map<String, QuestData> arrQuests;
|
||||
|
||||
/**
|
||||
* Controls logic and listeners for quest mode in home screen.
|
||||
*
|
||||
* @param v0   ViewQuest
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public ControlQuest(ViewQuest v0) {
|
||||
// Inits
|
||||
this.view = v0;
|
||||
this.qem = Singletons.getModel().getQuestEventManager();
|
||||
this.qPrefs = Singletons.getModel().getQuestPreferences();
|
||||
|
||||
//========= Listener inits
|
||||
|
||||
// Game start logic must happen outside of the EDT.
|
||||
madStartGame = new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseReleased(MouseEvent e) {
|
||||
final Thread t = new Thread() {
|
||||
@Override
|
||||
public void run() {
|
||||
startGame();
|
||||
}
|
||||
};
|
||||
t.start();
|
||||
}
|
||||
};
|
||||
|
||||
madDuels = new MouseAdapter() { @Override
|
||||
public void mouseClicked(MouseEvent e) { view.showDuelsTab(); } };
|
||||
|
||||
madChallenges = new MouseAdapter() { @Override
|
||||
public void mouseClicked(MouseEvent e) { view.showChallengesTab(); } };
|
||||
|
||||
madQuests = new MouseAdapter() { @Override
|
||||
public void mouseClicked(MouseEvent e) { view.showQuestsTab(); } };
|
||||
|
||||
madDecks = new MouseAdapter() { @Override
|
||||
public void mouseClicked(MouseEvent e) {
|
||||
view.showDecksTab();
|
||||
if (ControlQuest.this.qem != null) { refreshDecks(); }
|
||||
}
|
||||
};
|
||||
|
||||
madPreferences = new MouseAdapter() { @Override
|
||||
public void mouseClicked(MouseEvent e) { view.showPrefsTab(); } };
|
||||
|
||||
actPetSelect = new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(final ActionEvent actionEvent) {
|
||||
if (view.getCbxPet().getSelectedIndex() > 0) {
|
||||
qData.getPetManager().setSelectedPet(
|
||||
view.getCbxPet().getSelectedItem().toString().substring(7));
|
||||
} else {
|
||||
qData.getPetManager().setSelectedPet(null);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
actPlantSelect = new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(final ActionEvent actionEvent) {
|
||||
qData.getPetManager()
|
||||
.setUsePlant(view.getCbPlant().isSelected());
|
||||
}
|
||||
};
|
||||
|
||||
cmdSpellShop = new Command() { @Override
|
||||
public void execute() { showSpellShop(); } };
|
||||
|
||||
cmdBazaar = new Command() { @Override
|
||||
public void execute() { showBazaar(); } };
|
||||
|
||||
cmdEmbark = new Command() { @Override
|
||||
public void execute() { newQuest(); } };
|
||||
|
||||
cmdCurrentDeck = new Command() { @Override
|
||||
public void execute() { view.showDecksTab(); } };
|
||||
|
||||
cmdNewDeck = new Command() { @Override
|
||||
public void execute() {
|
||||
final DeckEditorQuest editor = new DeckEditorQuest(qData);
|
||||
editor.show(cmdDeckExit);
|
||||
editor.setVisible(true);
|
||||
}
|
||||
};
|
||||
|
||||
cmdResetPrefs = new Command() {
|
||||
@Override
|
||||
public void execute() {
|
||||
qPrefs.reset();
|
||||
qPrefs.save();
|
||||
view.resetPrefs();
|
||||
}
|
||||
};
|
||||
|
||||
cmdDeckExit = new Command() {
|
||||
@Override
|
||||
public void execute() {
|
||||
AllZone.getQuestData().saveData();
|
||||
refreshDecks();
|
||||
Singletons.getView().getViewHome().getBtnQuest().grabFocus();
|
||||
}
|
||||
};
|
||||
|
||||
cmdDeckSelect = new Command() {
|
||||
@Override
|
||||
public void execute() {
|
||||
currentDeck = view.getLstDecks().getSelectedDeck();
|
||||
qPrefs.setPreference(QPref.CURRENT_DECK, currentDeck.toString());
|
||||
qPrefs.save();
|
||||
view.setCurrentDeckStatus();
|
||||
}
|
||||
};
|
||||
|
||||
cmdDeckDelete = new Command() { @Override
|
||||
public void execute() { refreshDecks(); } };
|
||||
|
||||
cmdQuestSelect = new Command() { @Override
|
||||
public void execute() { changeQuest(); } };
|
||||
|
||||
cmdQuestDelete = new Command() { @Override
|
||||
public void execute() { refreshQuests(); } };
|
||||
|
||||
addListeners();
|
||||
}
|
||||
|
||||
/** @return ViewQuest */
|
||||
public ViewQuest getView() {
|
||||
return view;
|
||||
}
|
||||
|
||||
/** @return {@link forge.quest.gui.main.QuestEventManager} */
|
||||
public QuestEventManager getQEM() {
|
||||
return this.qem;
|
||||
}
|
||||
|
||||
/** @return {@link forge.Command} What to do when the deck editor exits. */
|
||||
public Command getExitCommand() {
|
||||
return cmdDeckExit;
|
||||
}
|
||||
|
||||
/** @return String   indicates the rank of this current quest */
|
||||
public String getRankString() {
|
||||
return qData.getRank();
|
||||
}
|
||||
|
||||
/** @return forge.deck.Deck */
|
||||
public Deck getCurrentDeck() {
|
||||
return this.currentDeck;
|
||||
}
|
||||
|
||||
/** @return */
|
||||
public Map<String, QuestData> getAllQuests() {
|
||||
return arrQuests;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates visual state of tabber.
|
||||
* @param tab0   JPanel tab object (can pass SubTab too).
|
||||
*/
|
||||
public void updateTabber(JPanel tab0) {
|
||||
if (selectedTab != null) {
|
||||
selectedTab.setEnabled(false);
|
||||
}
|
||||
|
||||
tab0.setEnabled(true);
|
||||
selectedTab = tab0;
|
||||
}
|
||||
|
||||
private void addListeners() {
|
||||
view.getTabDuels().removeMouseListener(madDuels);
|
||||
view.getTabDuels().addMouseListener(madDuels);
|
||||
|
||||
view.getTabChallenges().removeMouseListener(madChallenges);
|
||||
view.getTabChallenges().addMouseListener(madChallenges);
|
||||
|
||||
view.getTabDecks().removeMouseListener(madDecks);
|
||||
view.getTabDecks().addMouseListener(madDecks);
|
||||
|
||||
view.getTabQuests().removeMouseListener(madQuests);
|
||||
view.getTabQuests().addMouseListener(madQuests);
|
||||
|
||||
view.getTabPreferences().removeMouseListener(madPreferences);
|
||||
view.getTabPreferences().addMouseListener(madPreferences);
|
||||
|
||||
view.getLstQuests().setSelectCommand(cmdQuestSelect);
|
||||
view.getLstQuests().setEditCommand(cmdQuestDelete);
|
||||
view.getLstQuests().setDeleteCommand(cmdQuestDelete);
|
||||
|
||||
view.getBtnEmbark().setCommand(cmdEmbark);
|
||||
view.getBtnResetPrefs().setCommand(cmdResetPrefs);
|
||||
|
||||
if (this.qem != null) {
|
||||
view.getBtnStart().removeMouseListener(madStartGame);
|
||||
view.getBtnStart().addMouseListener(madStartGame);
|
||||
|
||||
view.getBtnBazaar().setCommand(cmdBazaar);
|
||||
|
||||
view.getBtnNewDeck().setCommand(cmdNewDeck);
|
||||
|
||||
view.getBtnCurrentDeck().setCommand(cmdCurrentDeck);
|
||||
|
||||
view.getBtnSpellShop().setCommand(cmdSpellShop);
|
||||
|
||||
view.getCbxPet().addActionListener(actPetSelect);
|
||||
|
||||
view.getCbPlant().addActionListener(actPlantSelect);
|
||||
|
||||
view.getLstDecks().setSelectCommand(cmdDeckSelect);
|
||||
view.getLstDecks().setDeleteCommand(cmdDeckDelete);
|
||||
|
||||
view.getLstDecks().setExitCommand(cmdDeckExit);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The actuator for new quests.
|
||||
*/
|
||||
private void newQuest() {
|
||||
int difficulty = 0;
|
||||
QuestData newdata = new QuestData();
|
||||
|
||||
final String mode = view.getRadFantasy().isSelected()
|
||||
? forge.quest.data.QuestData.FANTASY
|
||||
: forge.quest.data.QuestData.CLASSIC;
|
||||
|
||||
if (view.getRadEasy().isSelected()) {
|
||||
difficulty = 0;
|
||||
} else if (view.getRadMedium().isSelected()) {
|
||||
difficulty = 1;
|
||||
} else if (view.getRadHard().isSelected()) {
|
||||
difficulty = 2;
|
||||
} else if (view.getRadExpert().isSelected()) {
|
||||
difficulty = 3;
|
||||
} else {
|
||||
throw new IllegalStateException(
|
||||
"ControlQuest() > newQuest(): Error starting new quest!");
|
||||
}
|
||||
|
||||
final Object o = JOptionPane.showInputDialog(null, "Poets will remember your quest as:", "Quest Name", JOptionPane.OK_CANCEL_OPTION);
|
||||
|
||||
if (o == null) { return; }
|
||||
|
||||
final String questName = GuiUtils.cleanString(o.toString());
|
||||
|
||||
if (getAllQuests().get(questName) != null || questName.equals("")) {
|
||||
JOptionPane.showMessageDialog(null, "Please pick another quest name, a quest already has that name.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Give the user a few cards to build a deck
|
||||
newdata.newGame(difficulty, mode, view.getCbStandardStart().isSelected());
|
||||
newdata.setName(questName);
|
||||
newdata.saveData();
|
||||
|
||||
// Save in preferences.
|
||||
qPrefs.setPreference(QPref.CURRENT_QUEST, questName + ".dat");
|
||||
Singletons.getModel().getQuestPreferences().save();
|
||||
|
||||
Singletons.getView().getViewHome().resetQuest();
|
||||
} // New Quest
|
||||
|
||||
/** Changes between quest data files. */
|
||||
private void changeQuest() {
|
||||
AllZone.setQuestData(view.getLstQuests().getSelectedQuest());
|
||||
this.qData = AllZone.getQuestData();
|
||||
|
||||
// Save in preferences.
|
||||
qPrefs.setPreference(QPref.CURRENT_QUEST, qData.getName() + ".dat");
|
||||
Singletons.getModel().getQuestPreferences().save();
|
||||
|
||||
refreshDecks();
|
||||
refreshStats();
|
||||
}
|
||||
|
||||
/** Resets quests, then retrieves and sets current quest. */
|
||||
public void refreshQuests() {
|
||||
File dirQuests = ForgeProps.getFile(NewConstants.Quest.DATA_DIR);
|
||||
|
||||
// Temporary transition code between v1.2.2 and v1.2.3.
|
||||
// Can be safely deleted after release of 1.2.3.
|
||||
if (!dirQuests.exists()) {
|
||||
dirQuests.mkdirs();
|
||||
}
|
||||
File olddata = new File("res/quest/questData.dat");
|
||||
File newpath = new File(dirQuests.getPath() + "/questData.dat");
|
||||
|
||||
if (olddata.exists()) { olddata.renameTo(newpath); }
|
||||
// end block which can be deleted
|
||||
|
||||
// Iterate over files and load quest datas for each.
|
||||
FilenameFilter takeDatFiles = new FilenameFilter() {
|
||||
@Override
|
||||
public boolean accept(final File dir, final String name) {
|
||||
return name.endsWith(".dat");
|
||||
}
|
||||
};
|
||||
File[] arrFiles = dirQuests.listFiles(takeDatFiles);
|
||||
arrQuests = new HashMap<String, QuestData>();
|
||||
for (File f : arrFiles) {
|
||||
arrQuests.put(f.getName(), QuestDataIO.loadData(f));
|
||||
}
|
||||
|
||||
// Populate list with available quest datas.
|
||||
view.getLstQuests().setQuests(arrQuests.values().toArray(new QuestData[0]));
|
||||
|
||||
// If there are quests available, force select.
|
||||
if (arrQuests.size() > 0) {
|
||||
final String questname = qPrefs.getPreference(QPref.CURRENT_QUEST);
|
||||
|
||||
// Attempt to select previous quest.
|
||||
if (arrQuests.get(questname) != null) {
|
||||
view.getLstQuests().setSelectedQuestData(arrQuests.get(questname));
|
||||
}
|
||||
else {
|
||||
view.getLstQuests().setSelectedIndex(0);
|
||||
}
|
||||
|
||||
// Drop into AllZone.
|
||||
AllZone.setQuestData(view.getLstQuests().getSelectedQuest());
|
||||
}
|
||||
else {
|
||||
AllZone.setQuestData(null);
|
||||
}
|
||||
|
||||
this.qData = AllZone.getQuestData();
|
||||
}
|
||||
|
||||
/** Resets decks, then retrieves and sets current deck. */
|
||||
public void refreshDecks() {
|
||||
// Retrieve and set all decks
|
||||
view.getLstDecks().setDecks(qData != null ? qData.getMyDecks() : new ArrayList<Deck>());
|
||||
|
||||
// Look through list for preferred deck from prefs
|
||||
currentDeck = null;
|
||||
|
||||
if (qData != null) {
|
||||
final String cd = qPrefs.getPreference(QPref.CURRENT_DECK);
|
||||
for (Deck d : qData.getMyDecks()) {
|
||||
if (d.getName().equals(cd)) {
|
||||
currentDeck = d;
|
||||
view.getLstDecks().setSelectedDeck(d);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Not found? Set first one. Still not found? OK, throw to setCurrentDeckStatus().
|
||||
if (currentDeck == null) { view.getLstDecks().setSelectedIndex(0); }
|
||||
view.setCurrentDeckStatus();
|
||||
}
|
||||
|
||||
/** Updates all statistics in several panels. */
|
||||
public void refreshStats() {
|
||||
if (qData == null) { return; }
|
||||
|
||||
// Stats panel
|
||||
view.getLblCredits().setText("Credits: " + qData.getCredits());
|
||||
view.getLblLife().setText("Life: " + qData.getLife());
|
||||
view.getLblWins().setText("Wins: " + qData.getWin());
|
||||
view.getLblLosses().setText("Losses: " + qData.getLost());
|
||||
view.getBarProgress().setVisible(false);
|
||||
view.setCurrentDeckStatus();
|
||||
|
||||
final int num = nextChallengeInWins();
|
||||
if (num == 0) {
|
||||
view.getLblNextChallengeInWins().setText("Next challenge available now.");
|
||||
}
|
||||
else {
|
||||
view.getLblNextChallengeInWins().setText("Next challenge available in " + num + " wins.");
|
||||
}
|
||||
|
||||
view.getLblWinStreak().setText(
|
||||
"Win streak: " + qData.getWinStreakCurrent()
|
||||
+ " (Best:" + qData.getWinStreakBest() + ")");
|
||||
|
||||
// Start panel: pet, plant, zep.
|
||||
if (this.qData.getMode().equals(QuestData.FANTASY)) {
|
||||
final Set<String> petList = this.qData.getPetManager().getAvailablePetNames();
|
||||
final QuestPetAbstract currentPet = this.qData.getPetManager().getSelectedPet();
|
||||
|
||||
view.getCbxPet().removeAllItems();
|
||||
// Pet list visibility
|
||||
if (petList.size() > 0) {
|
||||
view.getCbxPet().setEnabled(true);
|
||||
view.getCbxPet().addItem("Don't summon a pet");
|
||||
for (final String pet : petList) {
|
||||
view.getCbxPet().addItem("Summon " + pet);
|
||||
}
|
||||
|
||||
if (currentPet != null) { view.getCbxPet().setSelectedItem("Summon " + currentPet.getName()); }
|
||||
} else {
|
||||
view.getCbxPet().setVisible(false);
|
||||
}
|
||||
|
||||
// Plant visiblity
|
||||
if (this.qData.getPetManager().getPlant().getLevel() == 0) {
|
||||
view.getCbPlant().setVisible(false);
|
||||
}
|
||||
else {
|
||||
view.getCbPlant().setVisible(true);
|
||||
view.getCbPlant().setSelected(this.qData.getPetManager().shouldPlantBeUsed());
|
||||
}
|
||||
|
||||
// Zeppelin visibility
|
||||
final QuestItemZeppelin zeppelin = (QuestItemZeppelin) this.qData.getInventory().getItem("Zeppelin");
|
||||
view.getCbZep().setVisible(zeppelin.hasBeenUsed());
|
||||
}
|
||||
else {
|
||||
view.getCbxPet().setVisible(false);
|
||||
view.getCbPlant().setVisible(false);
|
||||
view.getCbZep().setVisible(false);
|
||||
}
|
||||
}
|
||||
|
||||
/** */
|
||||
@SuppressWarnings("serial")
|
||||
private void showSpellShop() {
|
||||
final Command exit = new Command() {
|
||||
@Override
|
||||
public void execute() {
|
||||
AllZone.getQuestData().saveData();
|
||||
refreshStats();
|
||||
}
|
||||
};
|
||||
|
||||
QuestCardShop g = new QuestCardShop(AllZone.getQuestData());
|
||||
g.show(exit);
|
||||
g.setVisible(true);
|
||||
}
|
||||
|
||||
/** */
|
||||
private void showBazaar() {
|
||||
Singletons.getControl().changeState(FControl.QUEST_BAZAAR);
|
||||
Singletons.getView().getFrame().validate();
|
||||
}
|
||||
|
||||
/** */
|
||||
private void startGame() {
|
||||
if (SwingUtilities.isEventDispatchThread()) {
|
||||
throw new IllegalStateException(
|
||||
"ControlQuest() > startGame() must be accessed from outside the event dispatch thread.");
|
||||
}
|
||||
|
||||
if (currentDeck == null) {
|
||||
JOptionPane.showMessageDialog(null,
|
||||
"A mysterious wall blocks your way."
|
||||
+ "\n\rAn unseen sepulchral voice booms:"
|
||||
+ "\n\r\"Entrance Forbidden Without A Deck\"",
|
||||
"No deck", JOptionPane.ERROR_MESSAGE);
|
||||
return;
|
||||
}
|
||||
|
||||
view.getBarProgress().setVisible(true);
|
||||
|
||||
// If everything is OK, show progress bar and start inits.
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
view.getBarProgress().setMaximum(2);
|
||||
view.getBarProgress().reset();
|
||||
view.getBarProgress().setShowETA(false);
|
||||
view.getBarProgress().setShowCount(false);
|
||||
view.getBarProgress().setDescription("Starting New Game");
|
||||
view.getBarProgress().setVisible(true);
|
||||
view.getBtnStart().setVisible(false);
|
||||
}
|
||||
});
|
||||
|
||||
event = view.getSelectedOpponent().getEvent();
|
||||
AllZone.getQuestData().setCurrentEvent(event);
|
||||
Constant.Runtime.setGameType(GameType.Quest);
|
||||
final QuestItemZeppelin zeppelin = (QuestItemZeppelin) qData.getInventory().getItem("Zeppelin");
|
||||
zeppelin.setZeppelinUsed(false);
|
||||
qData.randomizeOpponents();
|
||||
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
view.getBarProgress().increment();
|
||||
}
|
||||
});
|
||||
|
||||
Constant.Runtime.HUMAN_DECK[0] = currentDeck;
|
||||
Constant.Runtime.COMPUTER_DECK[0] = event.getEventDeck();
|
||||
Constant.Quest.OPP_ICON_NAME[0] = event.getIconFilename();
|
||||
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
view.getBarProgress().increment();
|
||||
}
|
||||
});
|
||||
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
view.getBtnStart().setVisible(true);
|
||||
view.getBarProgress().setVisible(false);
|
||||
|
||||
if (event.getEventType().equals("challenge")) {
|
||||
setupChallenge(currentDeck);
|
||||
} else {
|
||||
setupDuel(currentDeck);
|
||||
}
|
||||
qData.saveData();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* setupDuel.
|
||||
* </p>
|
||||
*
|
||||
* @param humanDeck
|
||||
* a {@link forge.deck.Deck} object.
|
||||
*/
|
||||
private void setupDuel(final Deck humanDeck) {
|
||||
final Deck computer = event.getEventDeck();
|
||||
Constant.Runtime.COMPUTER_DECK[0] = computer;
|
||||
|
||||
GameNew.newGame(
|
||||
Constant.Runtime.HUMAN_DECK[0], Constant.Runtime.COMPUTER_DECK[0],
|
||||
QuestUtil.getHumanStartingCards(qData),
|
||||
QuestUtil.getComputerStartingCards(qData),
|
||||
qData.getLife(), 20);
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* setupChallenge.
|
||||
* </p>
|
||||
*
|
||||
* @param humanDeck
|
||||
* a {@link forge.deck.Deck} object.
|
||||
*/
|
||||
private void setupChallenge(final Deck humanDeck) {
|
||||
int extraLife = 0;
|
||||
|
||||
if (qData.getInventory().getItemLevel("Gear") == 2) {
|
||||
extraLife = 3;
|
||||
}
|
||||
|
||||
GameNew.newGame(
|
||||
Constant.Runtime.HUMAN_DECK[0], Constant.Runtime.COMPUTER_DECK[0],
|
||||
QuestUtil.getHumanStartingCards(qData, event),
|
||||
QuestUtil.getComputerStartingCards(qData, event),
|
||||
qData.getLife() + extraLife, ((QuestChallenge) event).getAILife());
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* nextChallengeInWins.
|
||||
* </p>
|
||||
*
|
||||
* @return a int.
|
||||
*/
|
||||
private int nextChallengeInWins() {
|
||||
// Number of wins was 25, lowering the number to 20 to help short term
|
||||
// questers.
|
||||
if (qData.getWin() < 20) {
|
||||
return 20 - qData.getWin();
|
||||
}
|
||||
|
||||
// The int mul has been lowered by one, should face special opps more
|
||||
// frequently.
|
||||
final int challengesPlayed = qData.getChallengesPlayed();
|
||||
int mul = 5;
|
||||
|
||||
if (qData.getInventory().hasItem("Zeppelin")) {
|
||||
mul = 3;
|
||||
} else if (qData.getInventory().hasItem("Map")) {
|
||||
mul = 4;
|
||||
}
|
||||
|
||||
final int delta = (challengesPlayed * mul) - qData.getWin();
|
||||
|
||||
return (delta > 0) ? delta : 0;
|
||||
}
|
||||
}
|
||||
@@ -1,220 +0,0 @@
|
||||
package forge.control.home;
|
||||
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.awt.event.MouseListener;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.SwingUtilities;
|
||||
|
||||
import net.slightlymagic.braids.util.UtilFunctions;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import forge.Command;
|
||||
import forge.Constant;
|
||||
import forge.Singletons;
|
||||
import forge.deck.Deck;
|
||||
import forge.deck.DeckGroup;
|
||||
import forge.game.GameNew;
|
||||
import forge.game.GameType;
|
||||
import forge.game.limited.SealedDeck;
|
||||
import forge.gui.GuiUtils;
|
||||
import forge.item.CardPrinted;
|
||||
import forge.item.ItemPool;
|
||||
import forge.properties.ForgeProps;
|
||||
import forge.properties.NewConstants;
|
||||
import forge.view.home.ViewSealed;
|
||||
|
||||
/**
|
||||
* Controls behavior of swing components in "sealed" mode menu.
|
||||
*
|
||||
*/
|
||||
public class ControlSealed {
|
||||
private ViewSealed view;
|
||||
private Map<String, Deck> aiDecks;
|
||||
private final MouseListener madBuildDeck, madStartGame;
|
||||
|
||||
/**
|
||||
* Controls behavior of swing components in "sealed" mode menu.
|
||||
*
|
||||
* @param v0   ViewSealed
|
||||
*/
|
||||
public ControlSealed(ViewSealed v0) {
|
||||
view = v0;
|
||||
Constant.Runtime.setGameType(GameType.Sealed);
|
||||
|
||||
madBuildDeck = new MouseAdapter() {
|
||||
@Override
|
||||
public void mousePressed(MouseEvent e) { setupSealed(); }
|
||||
};
|
||||
|
||||
// Game start logic must happen outside of the EDT.
|
||||
madStartGame = new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseReleased(MouseEvent e) {
|
||||
final Thread t = new Thread() {
|
||||
@Override
|
||||
public void run() {
|
||||
startGame();
|
||||
}
|
||||
};
|
||||
t.start();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/** */
|
||||
public void addListeners() {
|
||||
view.getBtnBuild().removeMouseListener(madBuildDeck);
|
||||
view.getBtnBuild().addMouseListener(madBuildDeck);
|
||||
|
||||
view.getBtnStart().removeMouseListener(madStartGame);
|
||||
view.getBtnStart().addMouseListener(madStartGame);
|
||||
}
|
||||
|
||||
/** Start button has been pressed. */
|
||||
public void startGame() {
|
||||
if (SwingUtilities.isEventDispatchThread()) {
|
||||
throw new IllegalStateException(
|
||||
"ControlSealed() > startGame() must be accessed from outside the event dispatch thread.");
|
||||
}
|
||||
|
||||
Deck human = view.getLstHumanDecks().getSelectedDeck();
|
||||
|
||||
if (human == null) {
|
||||
JOptionPane.showMessageDialog(null,
|
||||
"Please build and/or select a deck for yourself.",
|
||||
"No deck", JOptionPane.ERROR_MESSAGE);
|
||||
return;
|
||||
}
|
||||
|
||||
// If everything is OK, show progress bar and start inits.
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
view.getBarProgress().setMaximum(2);
|
||||
view.getBarProgress().reset();
|
||||
view.getBarProgress().setShowETA(false);
|
||||
view.getBarProgress().setShowCount(false);
|
||||
view.getBarProgress().setDescription("Starting New Game");
|
||||
view.getBarProgress().setVisible(true);
|
||||
view.getBtnStart().setVisible(false);
|
||||
}
|
||||
});
|
||||
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
view.getBarProgress().increment();
|
||||
}
|
||||
});
|
||||
|
||||
Constant.Runtime.HUMAN_DECK[0] = human;
|
||||
Constant.Runtime.COMPUTER_DECK[0] = Singletons.getModel().getDecks().getSealed().get(human.getName()).getAiDecks().get(0);
|
||||
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
view.getBtnStart().setVisible(true);
|
||||
view.getBarProgress().setVisible(false);
|
||||
|
||||
GameNew.newGame(Constant.Runtime.HUMAN_DECK[0], Constant.Runtime.COMPUTER_DECK[0]);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/** */
|
||||
public void updateDeckLists() {
|
||||
List<Deck> humanDecks = new ArrayList<Deck>();
|
||||
aiDecks = new HashMap<String, Deck>();
|
||||
|
||||
// Since AI decks are tied directly to the human choice,
|
||||
// they're just mapped in a parallel map and grabbed when the game starts.
|
||||
for (DeckGroup d : Singletons.getModel().getDecks().getSealed()) {
|
||||
aiDecks.put(d.getName(), d.getAiDecks().get(0));
|
||||
humanDecks.add(d.getHumanDeck());
|
||||
}
|
||||
|
||||
view.getLstHumanDecks().setDecks(humanDecks);
|
||||
}
|
||||
|
||||
/** Build button has been pressed. */
|
||||
public void setupSealed() {
|
||||
ArrayList<String> sealedTypes = new ArrayList<String>();
|
||||
sealedTypes.add("Full Cardpool");
|
||||
sealedTypes.add("Block / Set");
|
||||
sealedTypes.add("Custom");
|
||||
|
||||
final String prompt = "Choose Sealed Deck Format:";
|
||||
final Object o = GuiUtils.chooseOne(prompt, sealedTypes.toArray());
|
||||
|
||||
SealedDeck sd = null;
|
||||
|
||||
if (o.toString().equals(sealedTypes.get(0))) {
|
||||
sd = new SealedDeck("Full");
|
||||
}
|
||||
|
||||
else if (o.toString().equals(sealedTypes.get(1))) {
|
||||
sd = new SealedDeck("Block");
|
||||
}
|
||||
|
||||
else if (o.toString().equals(sealedTypes.get(2))) {
|
||||
sd = new SealedDeck("Custom");
|
||||
}
|
||||
else {
|
||||
throw new IllegalStateException("choice <<" + UtilFunctions.safeToString(o)
|
||||
+ ">> does not equal any of the sealedTypes.");
|
||||
}
|
||||
|
||||
if (sd.getCardpool().isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
final String sDeckName = JOptionPane.showInputDialog(null,
|
||||
ForgeProps.getLocalized(NewConstants.Lang.OldGuiNewGame.NewGameText.SAVE_SEALED_MSG),
|
||||
ForgeProps.getLocalized(NewConstants.Lang.OldGuiNewGame.NewGameText.SAVE_SEALED_TTL),
|
||||
JOptionPane.QUESTION_MESSAGE);
|
||||
|
||||
if (StringUtils.isBlank(sDeckName)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// May check for name uniqueness here
|
||||
|
||||
final ItemPool<CardPrinted> sDeck = sd.getCardpool();
|
||||
|
||||
Deck deck = new Deck(sDeckName);
|
||||
deck.getSideboard().addAll(sDeck);
|
||||
|
||||
for (final String element : Constant.Color.BASIC_LANDS) {
|
||||
deck.getSideboard().add(element, sd.getLandSetCode()[0], 18);
|
||||
}
|
||||
|
||||
DeckGroup sealed = new DeckGroup(sDeckName);
|
||||
sealed.setHumanDeck(deck);
|
||||
sealed.addAiDeck(sd.buildAIDeck(sDeck.toForgeCardList()));
|
||||
Singletons.getModel().getDecks().getSealed().add(sealed);
|
||||
|
||||
Singletons.getControl().getControlHome().getControlUtilities().showDeckEditor(GameType.Sealed, sealed);
|
||||
|
||||
}
|
||||
|
||||
/** @return {@link forge.Command} What to do when the deck editor exits. */
|
||||
public Command getExitCommand() {
|
||||
Command exit = new Command() {
|
||||
private static final long serialVersionUID = -9133358399503226853L;
|
||||
|
||||
@Override
|
||||
public void execute() {
|
||||
updateDeckLists();
|
||||
}
|
||||
};
|
||||
|
||||
return exit;
|
||||
}
|
||||
}
|
||||
@@ -1,238 +0,0 @@
|
||||
package forge.control.home;
|
||||
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.awt.event.MouseListener;
|
||||
|
||||
import javax.swing.ImageIcon;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.SwingWorker;
|
||||
import javax.swing.event.ListSelectionEvent;
|
||||
import javax.swing.event.ListSelectionListener;
|
||||
|
||||
import forge.Command;
|
||||
import forge.Constant;
|
||||
import forge.Singletons;
|
||||
import forge.control.FControl;
|
||||
import forge.properties.ForgePreferences;
|
||||
import forge.properties.ForgePreferences.FPref;
|
||||
import forge.view.home.ViewSettings;
|
||||
import forge.view.toolbox.FSkin;
|
||||
|
||||
/**
|
||||
* Controls logic and listeners for Settings panel of the home screen.
|
||||
*
|
||||
* Saving of preferences happens at every state change in FControl.
|
||||
*/
|
||||
public class ControlSettings {
|
||||
private ViewSettings view;
|
||||
private ForgePreferences prefs;
|
||||
private JPanel selectedTab;
|
||||
private final MouseListener madPreferences, madAvatars;
|
||||
|
||||
/**
|
||||
*
|
||||
* Controls logic and listeners for Settings panel of the home screen.
|
||||
*
|
||||
* @param v0   ViewSettings
|
||||
*/
|
||||
public ControlSettings(ViewSettings v0) {
|
||||
this.view = v0;
|
||||
view.updateSkinNames();
|
||||
|
||||
addListeners();
|
||||
prefs = Singletons.getModel().getPreferences();
|
||||
|
||||
view.getCbRemoveSmall().setSelected(prefs.getPrefBoolean(FPref.DECKGEN_NOSMALL));
|
||||
view.getCbSingletons().setSelected(prefs.getPrefBoolean(FPref.DECKGEN_SINGLETONS));
|
||||
view.getCbRemoveArtifacts().setSelected(prefs.getPrefBoolean(FPref.DECKGEN_ARTIFACTS));
|
||||
view.getCbAnte().setSelected(prefs.getPrefBoolean(FPref.UI_ANTE));
|
||||
view.getCbUploadDraft().setSelected(prefs.getPrefBoolean(FPref.UI_UPLOAD_DRAFT));
|
||||
view.getCbStackLand().setSelected(prefs.getPrefBoolean(FPref.UI_SMOOTH_LAND));
|
||||
view.getCbDevMode().setSelected(prefs.getPrefBoolean(FPref.DEV_MODE_ENABLED));
|
||||
view.getCbRandomFoil().setSelected(prefs.getPrefBoolean(FPref.UI_RANDOM_FOIL));
|
||||
view.getCbScaleLarger().setSelected(prefs.getPrefBoolean(FPref.UI_SCALE_LARGER));
|
||||
view.getCbTextMana().setSelected(prefs.getPrefBoolean(FPref.UI_CARD_OVERLAY));
|
||||
|
||||
madPreferences = new MouseAdapter() { @Override
|
||||
public void mouseClicked(MouseEvent e) { view.showPrefsTab(); } };
|
||||
|
||||
madAvatars = new MouseAdapter() { @Override
|
||||
public void mouseClicked(MouseEvent e) { view.showAvatarsTab(); } };
|
||||
|
||||
view.getTabPrefs().removeMouseListener(madPreferences);
|
||||
view.getTabPrefs().addMouseListener(madPreferences);
|
||||
|
||||
view.getTabAvatars().removeMouseListener(madAvatars);
|
||||
view.getTabAvatars().addMouseListener(madAvatars);
|
||||
}
|
||||
|
||||
/** @return ViewSettings */
|
||||
public ViewSettings getView() {
|
||||
return view;
|
||||
}
|
||||
|
||||
/** */
|
||||
@SuppressWarnings("serial")
|
||||
public void addListeners() {
|
||||
this.view.getLstChooseSkin().addListSelectionListener(new ListSelectionListener() {
|
||||
@Override
|
||||
public void valueChanged(ListSelectionEvent e) {
|
||||
if (e.getValueIsAdjusting()) { return; }
|
||||
updateSkin();
|
||||
}
|
||||
});
|
||||
|
||||
this.view.getCbAnte().addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(final ActionEvent arg0) {
|
||||
final boolean toggle = ControlSettings.this.view.getCbAnte().isSelected();
|
||||
prefs.setPref(FPref.UI_ANTE, String.valueOf(toggle));
|
||||
prefs.save();
|
||||
}
|
||||
});
|
||||
|
||||
this.view.getCbScaleLarger().addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(final ActionEvent arg0) {
|
||||
final boolean toggle = ControlSettings.this.view.getCbScaleLarger().isSelected();
|
||||
prefs.setPref(FPref.UI_SCALE_LARGER, String.valueOf(toggle));
|
||||
prefs.save();
|
||||
}
|
||||
});
|
||||
|
||||
this.view.getCbDevMode().addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(final ActionEvent arg0) {
|
||||
final boolean toggle = ControlSettings.this.view.getCbDevMode().isSelected();
|
||||
prefs.setPref(FPref.DEV_MODE_ENABLED, String.valueOf(toggle));
|
||||
Constant.Runtime.DEV_MODE[0] = toggle;
|
||||
prefs.save();
|
||||
}
|
||||
});
|
||||
|
||||
this.view.getCbRemoveSmall().addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(final ActionEvent arg0) {
|
||||
final boolean toggle = ControlSettings.this.view.getCbRemoveSmall().isSelected();
|
||||
prefs.setPref(FPref.DECKGEN_NOSMALL, String.valueOf(toggle));
|
||||
prefs.save();
|
||||
}
|
||||
});
|
||||
|
||||
this.view.getCbRemoveArtifacts().addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(final ActionEvent arg0) {
|
||||
final boolean toggle = ControlSettings.this.view.getCbRemoveArtifacts().isSelected();
|
||||
prefs.setPref(FPref.DECKGEN_ARTIFACTS, String.valueOf(toggle));
|
||||
prefs.save();
|
||||
}
|
||||
});
|
||||
|
||||
this.view.getCbSingletons().addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(final ActionEvent arg0) {
|
||||
final boolean toggle = ControlSettings.this.view.getCbSingletons().isSelected();
|
||||
prefs.setPref(FPref.DECKGEN_SINGLETONS, String.valueOf(toggle));
|
||||
prefs.save();
|
||||
}
|
||||
});
|
||||
|
||||
this.view.getCbUploadDraft().addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(final ActionEvent arg0) {
|
||||
final boolean toggle = ControlSettings.this.view.getCbUploadDraft().isSelected();
|
||||
prefs.setPref(FPref.UI_UPLOAD_DRAFT , String.valueOf(toggle));
|
||||
Constant.Runtime.UPLOAD_DRAFT[0] = toggle;
|
||||
prefs.save();
|
||||
}
|
||||
});
|
||||
|
||||
this.view.getCbStackLand().addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(final ActionEvent arg0) {
|
||||
final boolean toggle = ControlSettings.this.view.getCbStackLand().isSelected();
|
||||
prefs.setPref(FPref.UI_SMOOTH_LAND, String.valueOf(toggle));
|
||||
Constant.Runtime.SMOOTH[0] = toggle;
|
||||
prefs.save();
|
||||
}
|
||||
});
|
||||
|
||||
this.view.getCbRandomFoil().addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(final ActionEvent arg0) {
|
||||
final boolean toggle = ControlSettings.this.view.getCbRandomFoil().isSelected();
|
||||
prefs.setPref(FPref.UI_RANDOM_FOIL, String.valueOf(toggle));
|
||||
Constant.Runtime.RANDOM_FOIL[0] = toggle;
|
||||
prefs.save();
|
||||
}
|
||||
});
|
||||
|
||||
this.view.getCbTextMana().addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(final ActionEvent arg0) {
|
||||
final boolean toggle = ControlSettings.this.view.getCbTextMana().isSelected();
|
||||
prefs.setPref(FPref.UI_CARD_OVERLAY, String.valueOf(toggle));
|
||||
prefs.save();
|
||||
}
|
||||
});
|
||||
|
||||
this.view.getBtnReset().setCommand(new Command() {
|
||||
@Override
|
||||
public void execute() {
|
||||
Singletons.getModel().getPreferences().reset();
|
||||
Singletons.getView().getViewHome().resetSettings();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates visual state of tabber.
|
||||
* @param tab0   JPanel tab object (can pass SubTab too).
|
||||
*/
|
||||
public void updateTabber(JPanel tab0) {
|
||||
if (selectedTab != null) {
|
||||
selectedTab.setEnabled(false);
|
||||
}
|
||||
|
||||
tab0.setEnabled(true);
|
||||
selectedTab = tab0;
|
||||
}
|
||||
|
||||
private void updateSkin() {
|
||||
view.getLblTitleSkin().setText(" Loading...");
|
||||
view.getLblTitleSkin().setIcon(new ImageIcon("res/images/skins/default/loader.gif"));
|
||||
|
||||
final String name = view.getLstChooseSkin().getSelectedValue().toString();
|
||||
|
||||
final SwingWorker<Object, Object> w = new SwingWorker<Object, Object>() {
|
||||
@Override
|
||||
public String doInBackground() {
|
||||
FSkin.loadLight(name);
|
||||
FSkin.loadFull();
|
||||
|
||||
prefs.setPref(FPref.UI_SKIN, name);
|
||||
prefs.save();
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void done() {
|
||||
Singletons.getView().instantiateCachedUIStates();
|
||||
Singletons.getControl().changeState(FControl.HOME_SCREEN);
|
||||
Singletons.getView().getViewHome().showSettingsMenu();
|
||||
}
|
||||
};
|
||||
w.execute();
|
||||
}
|
||||
|
||||
/** @param rad0   JRadioButton
|
||||
* @throws Exception */
|
||||
/*public void updateCardSize(JRadioButton rad0) throws Exception {
|
||||
CardSizeType cst = CardSizeType.valueOf(rad0.getText().toLowerCase());
|
||||
Singletons.getModel().getPreferences().setPref(FPref.UI_CARD_SIZE, cst.toString());
|
||||
prefs.save();
|
||||
}*/
|
||||
}
|
||||
@@ -1,230 +0,0 @@
|
||||
/*
|
||||
* Forge: Play Magic: the Gathering.
|
||||
* Copyright (C) 2011 Nate
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package forge.control.home;
|
||||
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.awt.event.MouseListener;
|
||||
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.JTextArea;
|
||||
|
||||
import forge.Command;
|
||||
import forge.GuiDownloadPicturesLQ;
|
||||
import forge.GuiDownloadPrices;
|
||||
import forge.GuiDownloadQuestImages;
|
||||
import forge.GuiDownloadSetPicturesLQ;
|
||||
import forge.GuiImportPicture;
|
||||
import forge.Singletons;
|
||||
import forge.deck.DeckBase;
|
||||
import forge.error.BugzReporter;
|
||||
import forge.game.GameType;
|
||||
import forge.gui.deckeditor.DeckEditorBase;
|
||||
import forge.gui.deckeditor.DeckEditorConstructed;
|
||||
import forge.gui.deckeditor.DeckEditorLimited;
|
||||
import forge.properties.ForgeProps;
|
||||
import forge.properties.NewConstants.Lang;
|
||||
import forge.view.home.ViewUtilities;
|
||||
import forge.view.toolbox.FSkin;
|
||||
|
||||
/**
|
||||
* Controls logic and listeners for Utilities panel of the home screen.
|
||||
*
|
||||
*/
|
||||
public class ControlUtilities {
|
||||
private final ViewUtilities view;
|
||||
private final MouseListener madLicensing;
|
||||
private final Command cmdDeckEditor, cmdPicDownload, cmdSetDownload, cmdQuestImages, cmdReportBug,
|
||||
cmdImportPictures, cmdHowToPlay, cmdDownloadPrices;
|
||||
|
||||
/**
|
||||
*
|
||||
* Controls logic and listeners for Utilities panel of the home screen.
|
||||
*
|
||||
* @param v0
|
||||
*   ViewUtilities
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public ControlUtilities(final ViewUtilities v0) {
|
||||
this.view = v0;
|
||||
|
||||
this.madLicensing = new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseClicked(final MouseEvent e) {
|
||||
ControlUtilities.this.view.showLicensing();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseEntered(final MouseEvent e) {
|
||||
ControlUtilities.this.view.getLblLicensing().setForeground(FSkin.getColor(FSkin.Colors.CLR_HOVER));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseExited(final MouseEvent e) {
|
||||
ControlUtilities.this.view.getLblLicensing().setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT));
|
||||
}
|
||||
};
|
||||
|
||||
this.cmdDeckEditor = new Command() {
|
||||
@Override
|
||||
public void execute() {
|
||||
ControlUtilities.this.showDeckEditor(GameType.Constructed, null);
|
||||
}
|
||||
};
|
||||
|
||||
this.cmdPicDownload = new Command() {
|
||||
@Override
|
||||
public void execute() {
|
||||
ControlUtilities.this.doDownloadPics();
|
||||
}
|
||||
};
|
||||
|
||||
this.cmdSetDownload = new Command() {
|
||||
@Override
|
||||
public void execute() {
|
||||
ControlUtilities.this.doDownloadSetPics();
|
||||
}
|
||||
};
|
||||
|
||||
this.cmdQuestImages = new Command() {
|
||||
@Override
|
||||
public void execute() {
|
||||
ControlUtilities.this.doDownloadQuestImages();
|
||||
}
|
||||
};
|
||||
|
||||
this.cmdReportBug = new Command() {
|
||||
@Override
|
||||
public void execute() {
|
||||
final BugzReporter br = new BugzReporter();
|
||||
br.setVisible(true);
|
||||
}
|
||||
};
|
||||
|
||||
this.cmdImportPictures = new Command() {
|
||||
@Override
|
||||
public void execute() {
|
||||
final GuiImportPicture ip = new GuiImportPicture(null);
|
||||
ip.setVisible(true);
|
||||
}
|
||||
};
|
||||
|
||||
this.cmdHowToPlay = new Command() {
|
||||
@Override
|
||||
public void execute() {
|
||||
final String text = ForgeProps.getLocalized(Lang.HowTo.MESSAGE);
|
||||
|
||||
final JTextArea area = new JTextArea(text, 25, 40);
|
||||
area.setWrapStyleWord(true);
|
||||
area.setLineWrap(true);
|
||||
area.setEditable(false);
|
||||
area.setOpaque(false);
|
||||
|
||||
JOptionPane.showMessageDialog(null, new JScrollPane(area), ForgeProps.getLocalized(Lang.HowTo.TITLE),
|
||||
JOptionPane.INFORMATION_MESSAGE);
|
||||
}
|
||||
};
|
||||
|
||||
this.cmdDownloadPrices = new Command() {
|
||||
@Override
|
||||
public void execute() {
|
||||
final GuiDownloadPrices gdp = new GuiDownloadPrices();
|
||||
gdp.setVisible(true);
|
||||
}
|
||||
};
|
||||
|
||||
this.addListeners();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the view.
|
||||
*
|
||||
* @return ViewUtilities
|
||||
*/
|
||||
public ViewUtilities getView() {
|
||||
return this.view;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the listeners.
|
||||
*/
|
||||
public void addListeners() {
|
||||
this.view.getBtnDownloadPics().setCommand(this.cmdPicDownload);
|
||||
this.view.getBtnDownloadSetPics().setCommand(this.cmdSetDownload);
|
||||
this.view.getBtnDownloadQuestImages().setCommand(this.cmdQuestImages);
|
||||
this.view.getBtnReportBug().setCommand(this.cmdReportBug);
|
||||
this.view.getBtnImportPictures().setCommand(this.cmdImportPictures);
|
||||
this.view.getBtnHowToPlay().setCommand(this.cmdHowToPlay);
|
||||
this.view.getBtnDownloadPrices().setCommand(this.cmdDownloadPrices);
|
||||
this.view.getBtnDeckEditor().setCommand(this.cmdDeckEditor);
|
||||
|
||||
this.view.getLblLicensing().removeMouseListener(this.madLicensing);
|
||||
this.view.getLblLicensing().addMouseListener(this.madLicensing);
|
||||
}
|
||||
|
||||
private void doDownloadPics() {
|
||||
new GuiDownloadPicturesLQ(null);
|
||||
}
|
||||
|
||||
private void doDownloadSetPics() {
|
||||
new GuiDownloadSetPicturesLQ(null);
|
||||
}
|
||||
|
||||
private void doDownloadQuestImages() {
|
||||
new GuiDownloadQuestImages(null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Show deck editor.
|
||||
*
|
||||
* @param <T> the generic type
|
||||
* @param gt0   GameType
|
||||
* @param d0   Deck
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public <T extends DeckBase> void showDeckEditor(final GameType gt0, final T d0) {
|
||||
|
||||
DeckEditorBase<?, T> editor = null;
|
||||
if (gt0 == GameType.Constructed) {
|
||||
editor = (DeckEditorBase<?, T>) new DeckEditorConstructed();
|
||||
} else if (gt0 == GameType.Draft) {
|
||||
editor = (DeckEditorBase<?, T>) new DeckEditorLimited(Singletons.getModel().getDecks().getDraft());
|
||||
} else if (gt0 == GameType.Sealed) {
|
||||
editor = (DeckEditorBase<?, T>) new DeckEditorLimited(Singletons.getModel().getDecks().getSealed());
|
||||
}
|
||||
|
||||
final Command exit = new Command() {
|
||||
private static final long serialVersionUID = -9133358399503226853L;
|
||||
|
||||
@Override
|
||||
public void execute() {
|
||||
Singletons.getControl().getControlHome().getControlConstructed().updateDeckLists();
|
||||
// view.getParentView().getControlSealed().updateDeckLists();
|
||||
}
|
||||
};
|
||||
|
||||
editor.show(exit);
|
||||
|
||||
if (d0 != null) {
|
||||
editor.getController().setModel(d0);
|
||||
}
|
||||
|
||||
editor.setVisible(true);
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
/** Controller (as in model-view-controller) for Forge. */
|
||||
package forge.control.home;
|
||||
|
||||
@@ -423,7 +423,7 @@ public class SealedDeck {
|
||||
if (deck.get(i).getName().equals("Plains") || deck.get(i).getName().equals("Island")
|
||||
|| deck.get(i).getName().equals("Swamp") || deck.get(i).getName().equals("Mountain")
|
||||
|| deck.get(i).getName().equals("Forest")) {
|
||||
System.out.println("Heyo!");
|
||||
//System.out.println("Heyo!");
|
||||
}
|
||||
aiDeck.getMain().add(deck.get(i));
|
||||
}
|
||||
|
||||
@@ -36,9 +36,11 @@ import java.util.List;
|
||||
import javax.swing.Box;
|
||||
import javax.swing.ImageIcon;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JList;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.Timer;
|
||||
import javax.swing.border.LineBorder;
|
||||
import javax.swing.event.ListSelectionEvent;
|
||||
import javax.swing.event.ListSelectionListener;
|
||||
@@ -62,6 +64,7 @@ import forge.view.toolbox.FSkin;
|
||||
* @version $Id$
|
||||
*/
|
||||
public final class GuiUtils {
|
||||
private static int counter = 0;
|
||||
|
||||
private GuiUtils() {
|
||||
throw new AssertionError();
|
||||
@@ -427,6 +430,43 @@ public final class GuiUtils {
|
||||
return overlay;
|
||||
}
|
||||
|
||||
/** @param msg0   {@link java.lang.String}
|
||||
@return {@forge.view.toolbox.FOverlay} */
|
||||
// NOTE: This animation happens on the EDT; if the EDT is tied up doing something
|
||||
// else, the animation is effectively frozen. So, this needs some work.
|
||||
public static FOverlay loadingOverlay(final String msg0) {
|
||||
final FOverlay overlay = GuiUtils.genericOverlay();
|
||||
final FPanel pnlLoading = new FPanel();
|
||||
final int w = overlay.getWidth();
|
||||
final int h = overlay.getHeight();
|
||||
|
||||
final JLabel lblLoading = new JLabel("");
|
||||
lblLoading.setOpaque(true);
|
||||
lblLoading.setBackground(FSkin.getColor(FSkin.Colors.CLR_TEXT));
|
||||
lblLoading.setMinimumSize(new Dimension(0, 20));
|
||||
|
||||
pnlLoading.setBounds((int) ((w - 170) / 2), (int) ((h - 80) / 2), 170, 80);
|
||||
pnlLoading.setLayout(new MigLayout("wrap, align center"));
|
||||
pnlLoading.add(new FLabel.Builder().fontSize(18)
|
||||
.fontScaleAuto(false).text(msg0).build(), "h 20px!, w 140px!, gap 0 0 5px 0");
|
||||
pnlLoading.add(lblLoading, "gap 0 0 0 10px");
|
||||
|
||||
overlay.add(pnlLoading);
|
||||
|
||||
GuiUtils.counter = 0;
|
||||
final Timer timer = new Timer(300, new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent arg0) {
|
||||
lblLoading.setMinimumSize(new Dimension(10 * (GuiUtils.counter++), 20));
|
||||
lblLoading.revalidate();
|
||||
if (GuiUtils.counter > 13) { GuiUtils.counter = 0; }
|
||||
}
|
||||
});
|
||||
timer.start();
|
||||
|
||||
return overlay;
|
||||
}
|
||||
|
||||
/** @return {@forge.view.toolbox.FOverlay} */
|
||||
public static FOverlay genericOverlay() {
|
||||
final FOverlay overlay = Singletons.getView().getOverlay();
|
||||
|
||||
@@ -91,8 +91,10 @@ public final class DeckEditorConstructed extends DeckEditorBase<CardPrinted, Dec
|
||||
@Override
|
||||
public void execute() {
|
||||
DeckEditorConstructed.this.dispose();
|
||||
if (exitCommand != null) {
|
||||
exitCommand.execute();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
final MenuCommon menu = new MenuCommon(this.getController(), exit);
|
||||
|
||||
@@ -36,7 +36,6 @@ import javax.swing.JOptionPane;
|
||||
import javax.swing.JTable;
|
||||
import javax.swing.WindowConstants;
|
||||
|
||||
|
||||
import forge.Command;
|
||||
import forge.Constant;
|
||||
import forge.Singletons;
|
||||
@@ -49,6 +48,7 @@ import forge.gui.deckeditor.elements.CardPanelLite;
|
||||
import forge.gui.deckeditor.elements.ManaCostRenderer;
|
||||
import forge.gui.deckeditor.elements.TableColumnInfo;
|
||||
import forge.gui.deckeditor.elements.TableView;
|
||||
import forge.gui.home.limited.CSubmenuDraft;
|
||||
import forge.item.CardDb;
|
||||
import forge.item.CardPrinted;
|
||||
import forge.item.InventoryItem;
|
||||
@@ -128,7 +128,8 @@ public class DraftingProcess extends DeckEditorBase<CardPrinted, DeckGroup> {
|
||||
ForgeProps.getLocalized(GuiBoosterDraft.CLOSE_MESSAGE), "", JOptionPane.YES_NO_OPTION);
|
||||
if (n == JOptionPane.YES_OPTION) {
|
||||
DraftingProcess.this.dispose();
|
||||
Singletons.getControl().getControlHome().getControlDraft().updateHumanDecks();
|
||||
CSubmenuDraft.SINGLETON_INSTANCE.update();
|
||||
GuiUtils.closeOverlay();
|
||||
}
|
||||
} // windowClosing()
|
||||
});
|
||||
@@ -336,10 +337,9 @@ public class DraftingProcess extends DeckEditorBase<CardPrinted, DeckGroup> {
|
||||
// here
|
||||
|
||||
// close and open next screen
|
||||
this.dispose();
|
||||
|
||||
Singletons.getControl().getControlHome().getControlDraft().updateHumanDecks();
|
||||
|
||||
DraftingProcess.this.dispose();
|
||||
CSubmenuDraft.SINGLETON_INSTANCE.update();
|
||||
GuiUtils.closeOverlay();
|
||||
} /* saveDraft() */
|
||||
|
||||
/*
|
||||
@@ -386,5 +386,6 @@ public class DraftingProcess extends DeckEditorBase<CardPrinted, DeckGroup> {
|
||||
this.getBottomTableWithCards().sort(1, true);
|
||||
|
||||
this.setVisible(true);
|
||||
this.setAlwaysOnTop(true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,9 +6,16 @@ package forge.gui.home;
|
||||
* and collapsing in the menu.
|
||||
*/
|
||||
public enum EMenuGroup { /** */
|
||||
CONSTRUCTED, /** */
|
||||
LIMITED, /** */
|
||||
QUEST, /** */
|
||||
SETTINGS, /** */
|
||||
UTILITIES;
|
||||
SANCTIONED ("Sanctioned Game Formats"), /** */
|
||||
QUEST ("Quest Mode"), /** */
|
||||
SETTINGS ("Game Settings"), /** */
|
||||
UTILITIES ("Tools");
|
||||
|
||||
private final String strTitle;
|
||||
|
||||
/** @param {@link java.lang.String} */
|
||||
private EMenuGroup(final String s0) { strTitle = s0; }
|
||||
|
||||
/** @return {@link java.lang.String} */
|
||||
public String getTitle() { return this.strTitle; }
|
||||
}
|
||||
|
||||
23
src/main/java/forge/gui/home/EMenuItem.java
Normal file
23
src/main/java/forge/gui/home/EMenuItem.java
Normal file
@@ -0,0 +1,23 @@
|
||||
package forge.gui.home;
|
||||
|
||||
/**
|
||||
* TODO: Write javadoc for this type.
|
||||
*
|
||||
*/
|
||||
public enum EMenuItem { /** */
|
||||
CONSTRUCTED, /** */
|
||||
LIMITED_DRAFT, /** */
|
||||
LIMITED_SEALED, /** */
|
||||
|
||||
QUEST_CHALLENGES, /** */
|
||||
QUEST_DUELS, /** */
|
||||
QUEST_DATA, /** */
|
||||
QUEST_DECKS, /** */
|
||||
QUEST_PREFS, /** */
|
||||
|
||||
SETTINGS_PREFS, /** */
|
||||
SETTINGS_AVATARS, /** */
|
||||
|
||||
UTILITIES_EDITOR, /** */
|
||||
UTILITIES_DOWNLOADS
|
||||
}
|
||||
@@ -2,9 +2,15 @@ package forge.gui.home;
|
||||
|
||||
import forge.Command;
|
||||
|
||||
|
||||
/** Dictates methods required for a submenu controller. */
|
||||
public interface ICSubmenu {
|
||||
/** @return {@link forge.Command} */
|
||||
/** Fires when a menu is selected. Avoid any reference
|
||||
* referring to ViewHomeUI in this method, because
|
||||
* it is triggered when ViewHomeUI is initialized, which
|
||||
* will create an NPE.
|
||||
*
|
||||
* @return {@link forge.Command} */
|
||||
Command getMenuCommand();
|
||||
|
||||
/** Call this method after the view singleton has been fully realized
|
||||
|
||||
@@ -8,11 +8,24 @@ public interface IVSubmenu {
|
||||
* @return {@link javax.swing.JPanel} */
|
||||
JPanel getPanel();
|
||||
|
||||
/** Retrives control object associated with this instance.
|
||||
* @return {@link forge.gui.home.ICSubmenu}
|
||||
*/
|
||||
ICSubmenu getControl();
|
||||
|
||||
/** Returns parent menu grouping of this submenu, useful for
|
||||
* functions such as expanding and collapsing in the menu area.
|
||||
*
|
||||
* @return {@link javax.swing.JPanel} */
|
||||
EMenuGroup getGroup();
|
||||
EMenuGroup getGroupEnum();
|
||||
|
||||
/** Display title string for this menu item.
|
||||
* @return {@link java.lang.String} */
|
||||
String getMenuTitle();
|
||||
|
||||
/** Enum registration for this menu item, in EMenuItem.
|
||||
* @return {@link java.lang.String} */
|
||||
String getItemEnum();
|
||||
|
||||
/** Removes all children and (re)populates panel components, independent of constructor.*/
|
||||
void populate();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package forge.view.home;
|
||||
package forge.gui.home;
|
||||
|
||||
import javax.swing.JButton;
|
||||
|
||||
@@ -1,81 +0,0 @@
|
||||
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"});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,78 +0,0 @@
|
||||
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.IStorage;
|
||||
|
||||
/**
|
||||
* 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 IStorage<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()));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,85 +0,0 @@
|
||||
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()));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,68 +0,0 @@
|
||||
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()));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
package forge.gui.home.constructed;
|
||||
|
||||
/**
|
||||
* TODO: Write javadoc for this type.
|
||||
*
|
||||
*/
|
||||
public enum ESubmenuConstructedTypes { /** */
|
||||
COLORS, /** */
|
||||
THEMES, /** */
|
||||
CUSTOM, /** */
|
||||
QUESTEVENTS
|
||||
}
|
||||
@@ -1,386 +0,0 @@
|
||||
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.
|
||||
* If a piece of code can be reused, it's dumped here.
|
||||
*/
|
||||
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.getSelectedValues());
|
||||
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 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(
|
||||
generateDeck(lists0.get(0), PlayerType.HUMAN),
|
||||
generateDeck(lists0.get(1), PlayerType.COMPUTER));
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,70 +0,0 @@
|
||||
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 EMenuGroup.CONSTRUCTED;
|
||||
}
|
||||
|
||||
/* (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;
|
||||
}
|
||||
}
|
||||
@@ -1,68 +0,0 @@
|
||||
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 EMenuGroup.CONSTRUCTED;
|
||||
}
|
||||
|
||||
/* (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;
|
||||
}
|
||||
}
|
||||
@@ -1,68 +0,0 @@
|
||||
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 EMenuGroup.CONSTRUCTED;
|
||||
}
|
||||
|
||||
/* (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;
|
||||
}
|
||||
}
|
||||
@@ -1,69 +0,0 @@
|
||||
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 EMenuGroup.CONSTRUCTED;
|
||||
}
|
||||
|
||||
/* (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;
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
/** Forge Card Game. */
|
||||
package forge.gui.home.constructed;
|
||||
|
||||
515
src/main/java/forge/gui/home/limited/CSubmenuConstructed.java
Normal file
515
src/main/java/forge/gui/home/limited/CSubmenuConstructed.java
Normal file
@@ -0,0 +1,515 @@
|
||||
package forge.gui.home.limited;
|
||||
|
||||
import java.awt.Toolkit;
|
||||
import java.awt.datatransfer.StringSelection;
|
||||
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.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.JList;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.ListSelectionModel;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
|
||||
import org.apache.commons.lang3.ArrayUtils;
|
||||
|
||||
import forge.CardList;
|
||||
import forge.Command;
|
||||
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.gui.home.ICSubmenu;
|
||||
import forge.item.CardPrinted;
|
||||
import forge.properties.ForgePreferences;
|
||||
import forge.properties.ForgePreferences.FPref;
|
||||
import forge.quest.data.QuestEvent;
|
||||
import forge.util.IStorage;
|
||||
import forge.view.toolbox.FLabel;
|
||||
import forge.view.toolbox.FOverlay;
|
||||
import forge.view.toolbox.FPanel;
|
||||
import forge.view.toolbox.FSkin;
|
||||
|
||||
/**
|
||||
* TODO: Write javadoc for this type.
|
||||
*
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public enum CSubmenuConstructed implements ICSubmenu {
|
||||
/** */
|
||||
SINGLETON_INSTANCE;
|
||||
|
||||
private enum ESubmenuConstructedTypes { /** */
|
||||
COLORS, /** */
|
||||
THEMES, /** */
|
||||
CUSTOM, /** */
|
||||
QUESTEVENTS
|
||||
}
|
||||
|
||||
private static final Map<String, String> COLOR_VALS = new HashMap<String, String>();
|
||||
|
||||
private final MouseAdapter madDecklist = new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseClicked(final MouseEvent e) {
|
||||
if (e.getClickCount() == 2) { showDecklist(((JList) e.getSource())); }
|
||||
}
|
||||
};
|
||||
|
||||
static {
|
||||
COLOR_VALS.clear();
|
||||
COLOR_VALS.put("Random 1", "AI");
|
||||
COLOR_VALS.put("Random 2", "AI");
|
||||
COLOR_VALS.put("Random 3", "AI");
|
||||
COLOR_VALS.put("Random 4", "AI");
|
||||
COLOR_VALS.put("Black", "black");
|
||||
COLOR_VALS.put("Blue", "blue");
|
||||
COLOR_VALS.put("Green", "green");
|
||||
COLOR_VALS.put("Red", "red");
|
||||
COLOR_VALS.put("White", "white");
|
||||
}
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.ICSubmenu#getMenuCommand()
|
||||
*/
|
||||
@Override
|
||||
public Command getMenuCommand() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.ICSubmenu#initialize()
|
||||
*/
|
||||
@Override
|
||||
public void update() {
|
||||
// Nothing to see here...
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.ICSubmenu#initialize()
|
||||
*/
|
||||
@Override
|
||||
public void initialize() {
|
||||
final ForgePreferences prefs = Singletons.getModel().getPreferences();
|
||||
final VSubmenuConstructed view = VSubmenuConstructed.SINGLETON_INSTANCE;
|
||||
|
||||
VSubmenuConstructed.SINGLETON_INSTANCE.populate();
|
||||
CSubmenuConstructed.SINGLETON_INSTANCE.update();
|
||||
|
||||
// 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); } });
|
||||
|
||||
// Checkbox event handling
|
||||
view.getBtnStart().addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(final ActionEvent arg0) {
|
||||
startGame();
|
||||
}
|
||||
});
|
||||
|
||||
// Checkbox event handling
|
||||
view.getCbSingletons().addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(final ActionEvent arg0) {
|
||||
prefs.setPref(FPref.DECKGEN_SINGLETONS,
|
||||
String.valueOf(view.getCbSingletons().isSelected()));
|
||||
prefs.save();
|
||||
}
|
||||
});
|
||||
|
||||
view.getCbArtifacts().addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(final ActionEvent arg0) {
|
||||
prefs.setPref(
|
||||
FPref.DECKGEN_ARTIFACTS, String.valueOf(view.getCbArtifacts().isSelected()));
|
||||
prefs.save();
|
||||
}
|
||||
});
|
||||
|
||||
view.getCbRemoveSmall().addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(final ActionEvent arg0) {
|
||||
prefs.setPref(
|
||||
FPref.DECKGEN_NOSMALL, String.valueOf(view.getCbRemoveSmall().isSelected()));
|
||||
prefs.save();
|
||||
}
|
||||
});
|
||||
|
||||
// Pre-select checkboxes
|
||||
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.getLstHumanDecks()
|
||||
: VSubmenuConstructed.SINGLETON_INSTANCE.getLstAIDecks());
|
||||
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 FLabel btn = (player0.equals(PlayerType.HUMAN)
|
||||
? VSubmenuConstructed.SINGLETON_INSTANCE.getBtnHumanRandom()
|
||||
: VSubmenuConstructed.SINGLETON_INSTANCE.getBtnAIRandom());
|
||||
|
||||
btn.setCommand(new Command() { @Override
|
||||
public void execute() { randomSelectColors(lst); } });
|
||||
|
||||
// Init with a random select.
|
||||
randomSelectColors(lst);
|
||||
}
|
||||
|
||||
/** Handles all control for "themes" radio button click. */
|
||||
private void updateThemes(final PlayerType player0) {
|
||||
final JList lst = (player0.equals(PlayerType.HUMAN)
|
||||
? VSubmenuConstructed.SINGLETON_INSTANCE.getLstHumanDecks()
|
||||
: VSubmenuConstructed.SINGLETON_INSTANCE.getLstAIDecks());
|
||||
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 FLabel btn = (player0.equals(PlayerType.HUMAN)
|
||||
? VSubmenuConstructed.SINGLETON_INSTANCE.getBtnHumanRandom()
|
||||
: VSubmenuConstructed.SINGLETON_INSTANCE.getBtnAIRandom());
|
||||
|
||||
btn.setCommand(new Command() { @Override
|
||||
public void execute() { randomSelectRegular(lst); } });
|
||||
|
||||
// Init with a random select.
|
||||
randomSelectRegular(lst);
|
||||
}
|
||||
|
||||
/** Handles all control for "custom" radio button click. */
|
||||
private void updateCustom(final PlayerType player0) {
|
||||
final JList lst = (player0.equals(PlayerType.HUMAN)
|
||||
? VSubmenuConstructed.SINGLETON_INSTANCE.getLstHumanDecks()
|
||||
: VSubmenuConstructed.SINGLETON_INSTANCE.getLstAIDecks());
|
||||
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 FLabel btn = (player0.equals(PlayerType.HUMAN)
|
||||
? VSubmenuConstructed.SINGLETON_INSTANCE.getBtnHumanRandom()
|
||||
: VSubmenuConstructed.SINGLETON_INSTANCE.getBtnAIRandom());
|
||||
|
||||
btn.setCommand(new Command() { @Override
|
||||
public void execute() { randomSelectRegular(lst); } });
|
||||
|
||||
// Init with a random select.
|
||||
randomSelectRegular(lst);
|
||||
}
|
||||
|
||||
/** 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.getLstHumanDecks()
|
||||
: VSubmenuConstructed.SINGLETON_INSTANCE.getLstAIDecks());
|
||||
lst.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
|
||||
|
||||
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());
|
||||
}
|
||||
|
||||
lst.setListData(eventNames.toArray(ArrayUtils.EMPTY_STRING_ARRAY));
|
||||
lst.setName(ESubmenuConstructedTypes.QUESTEVENTS.toString());
|
||||
lst.removeMouseListener(madDecklist);
|
||||
lst.addMouseListener(madDecklist);
|
||||
|
||||
final FLabel btn = (player0.equals(PlayerType.HUMAN)
|
||||
? VSubmenuConstructed.SINGLETON_INSTANCE.getBtnHumanRandom()
|
||||
: VSubmenuConstructed.SINGLETON_INSTANCE.getBtnAIRandom());
|
||||
|
||||
btn.setCommand(new Command() { @Override
|
||||
public void execute() { randomSelectRegular(lst); } });
|
||||
|
||||
// Init with a random select.
|
||||
randomSelectRegular(lst);
|
||||
}
|
||||
/**
|
||||
* 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}> */
|
||||
private void startGame() {
|
||||
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(
|
||||
generateDeck(VSubmenuConstructed.SINGLETON_INSTANCE.getLstHumanDecks(), PlayerType.HUMAN),
|
||||
generateDeck(VSubmenuConstructed.SINGLETON_INSTANCE.getLstAIDecks(), PlayerType.COMPUTER));
|
||||
overlay.hideOverlay();
|
||||
}
|
||||
|
||||
/** Generates deck from current list selection(s). */
|
||||
private static Deck generateDeck(final JList lst0, final PlayerType player0) {
|
||||
CardList cards = null;
|
||||
final String[] selection = Arrays.copyOf(lst0.getSelectedValues(),
|
||||
lst0.getSelectedValues().length, String[].class);
|
||||
|
||||
final Deck deck;
|
||||
|
||||
// Color deck
|
||||
if (lst0.getName().equals(ESubmenuConstructedTypes.COLORS.toString()) && colorCheck(selection)) {
|
||||
// Replace "random" with "AI" for deck generation code
|
||||
for (int i = 0; i < selection.length; i++) {
|
||||
selection[i] = COLOR_VALS.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);
|
||||
}
|
||||
|
||||
// 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 if (lst0.getName().equals(ESubmenuConstructedTypes.CUSTOM.toString())) {
|
||||
deck = Singletons.getModel().getDecks().getConstructed().get(selection[0]);
|
||||
}
|
||||
// Failure, for some reason
|
||||
else {
|
||||
deck = null;
|
||||
}
|
||||
|
||||
return deck;
|
||||
}
|
||||
|
||||
/** Shows decklist dialog for a given deck.
|
||||
* @param d0   {@link forge.deck.Deck} */
|
||||
private void showDecklist(final JList lst0) {
|
||||
final String deckName = lst0.getSelectedValue().toString();
|
||||
final Deck deck;
|
||||
|
||||
// Retrieve from custom or quest deck maps
|
||||
if (lst0.getName().equals(ESubmenuConstructedTypes.CUSTOM.toString())) {
|
||||
deck = Singletons.getModel().getDecks().getConstructed().get(deckName);
|
||||
}
|
||||
else {
|
||||
deck = Singletons.getModel().getQuestEventManager().getEvent(deckName).getEventDeck();
|
||||
}
|
||||
|
||||
// Dump into map and display.
|
||||
final HashMap<String, Integer> deckMap = new HashMap<String, Integer>();
|
||||
|
||||
for (final Entry<CardPrinted, Integer> s : deck.getMain()) {
|
||||
deckMap.put(s.getKey().getName(), s.getValue());
|
||||
}
|
||||
|
||||
final String nl = System.getProperty("line.separator");
|
||||
final StringBuilder deckList = new StringBuilder();
|
||||
final String dName = deck.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
|
||||
|
||||
/** @param lst0   {@link javax.swing.JList} */
|
||||
private void randomSelectColors(final JList lst0) {
|
||||
// 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;
|
||||
}
|
||||
|
||||
/** @param lst0   {@link javax.swing.JList} */
|
||||
private void randomSelectRegular(final JList lst0) {
|
||||
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());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -21,12 +21,14 @@ import forge.game.limited.CardPoolLimitation;
|
||||
import forge.gui.GuiUtils;
|
||||
import forge.gui.deckeditor.DraftingProcess;
|
||||
import forge.gui.home.ICSubmenu;
|
||||
import forge.view.toolbox.FOverlay;
|
||||
import forge.view.toolbox.FSkin;
|
||||
|
||||
/**
|
||||
* TODO: Write javadoc for this type.
|
||||
*
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public enum CSubmenuDraft implements ICSubmenu {
|
||||
/** */
|
||||
SINGLETON_INSTANCE;
|
||||
@@ -72,6 +74,21 @@ public enum CSubmenuDraft implements ICSubmenu {
|
||||
"Walter", "Wilfred", "William", "Winston"
|
||||
};
|
||||
|
||||
private final Command cmdDeckExit = new Command() {
|
||||
@Override
|
||||
public void execute() {
|
||||
update();
|
||||
GuiUtils.closeOverlay();
|
||||
}
|
||||
};
|
||||
|
||||
private final Command cmdDeckSelect = new Command() {
|
||||
@Override
|
||||
public void execute() {
|
||||
VSubmenuDraft.SINGLETON_INSTANCE.getBtnStart().setEnabled(true);
|
||||
}
|
||||
};
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.control.home.IControlSubmenu#update()
|
||||
*/
|
||||
@@ -82,11 +99,14 @@ public enum CSubmenuDraft implements ICSubmenu {
|
||||
view.populate();
|
||||
CSubmenuDraft.SINGLETON_INSTANCE.update();
|
||||
|
||||
VSubmenuDraft.SINGLETON_INSTANCE.getBtnBuildDeck().addMouseListener(
|
||||
view.getLstHumanDecks().setExitCommand(cmdDeckExit);
|
||||
view.getLstHumanDecks().setSelectCommand(cmdDeckSelect);
|
||||
|
||||
view.getBtnBuildDeck().addMouseListener(
|
||||
new MouseAdapter() { @Override
|
||||
public void mousePressed(MouseEvent e) { setupDraft(); } });
|
||||
|
||||
VSubmenuDraft.SINGLETON_INSTANCE.getBtnStart().addMouseListener(
|
||||
view.getBtnStart().addMouseListener(
|
||||
new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseReleased(final MouseEvent e) {
|
||||
@@ -99,7 +119,7 @@ public enum CSubmenuDraft implements ICSubmenu {
|
||||
}
|
||||
});
|
||||
|
||||
VSubmenuDraft.SINGLETON_INSTANCE.getBtnDirections().addMouseListener(new MouseAdapter() {
|
||||
view.getBtnDirections().addMouseListener(new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseClicked(MouseEvent e) {
|
||||
view.showDirections();
|
||||
@@ -136,6 +156,7 @@ public enum CSubmenuDraft implements ICSubmenu {
|
||||
for (DeckGroup d : Singletons.getModel().getDecks().getDraft()) {
|
||||
human.add(d.getHumanDeck());
|
||||
}
|
||||
|
||||
VSubmenuDraft.SINGLETON_INSTANCE.getLstHumanDecks().setDecks(human);
|
||||
|
||||
if (human.size() > 1) {
|
||||
@@ -178,6 +199,9 @@ public enum CSubmenuDraft implements ICSubmenu {
|
||||
|
||||
/** */
|
||||
private void setupDraft() {
|
||||
final FOverlay overlay = Singletons.getView().getOverlay();
|
||||
overlay.showOverlay();
|
||||
|
||||
final DraftingProcess draft = new DraftingProcess();
|
||||
|
||||
// Determine what kind of booster draft to run
|
||||
@@ -200,7 +224,6 @@ public enum CSubmenuDraft implements ICSubmenu {
|
||||
else if (o.toString().equals(draftTypes.get(2))) {
|
||||
draft.showGui(new BoosterDraft(CardPoolLimitation.Custom));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private String[] generateNames() {
|
||||
|
||||
@@ -24,6 +24,7 @@ import forge.game.GameType;
|
||||
import forge.game.limited.SealedDeck;
|
||||
import forge.gui.GuiUtils;
|
||||
import forge.gui.home.ICSubmenu;
|
||||
import forge.gui.home.utilities.CSubmenuDeckEditor;
|
||||
import forge.item.CardPrinted;
|
||||
import forge.item.ItemPool;
|
||||
import forge.properties.ForgeProps;
|
||||
@@ -34,12 +35,28 @@ import forge.view.toolbox.FSkin;
|
||||
* TODO: Write javadoc for this type.
|
||||
*
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public enum CSubmenuSealed implements ICSubmenu {
|
||||
/** */
|
||||
SINGLETON_INSTANCE;
|
||||
|
||||
private Map<String, Deck> aiDecks;
|
||||
|
||||
private final Command cmdDeckExit = new Command() {
|
||||
@Override
|
||||
public void execute() {
|
||||
update();
|
||||
GuiUtils.closeOverlay();
|
||||
}
|
||||
};
|
||||
|
||||
private final Command cmdDeckSelect = new Command() {
|
||||
@Override
|
||||
public void execute() {
|
||||
VSubmenuSealed.SINGLETON_INSTANCE.getBtnStart().setEnabled(true);
|
||||
}
|
||||
};
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.control.home.IControlSubmenu#update()
|
||||
*/
|
||||
@@ -50,6 +67,9 @@ public enum CSubmenuSealed implements ICSubmenu {
|
||||
view.populate();
|
||||
CSubmenuSealed.SINGLETON_INSTANCE.update();
|
||||
|
||||
VSubmenuSealed.SINGLETON_INSTANCE.getLstDecks().setExitCommand(cmdDeckExit);
|
||||
VSubmenuSealed.SINGLETON_INSTANCE.getLstDecks().setSelectCommand(cmdDeckSelect);
|
||||
|
||||
VSubmenuSealed.SINGLETON_INSTANCE.getBtnBuildDeck().addMouseListener(
|
||||
new MouseAdapter() { @Override
|
||||
public void mousePressed(MouseEvent e) { setupSealed(); } });
|
||||
@@ -184,6 +204,6 @@ public enum CSubmenuSealed implements ICSubmenu {
|
||||
sealed.addAiDeck(sd.buildAIDeck(sDeck.toForgeCardList()));
|
||||
Singletons.getModel().getDecks().getSealed().add(sealed);
|
||||
|
||||
Singletons.getControl().getControlHome().getControlUtilities().showDeckEditor(GameType.Sealed, sealed);
|
||||
CSubmenuDeckEditor.SINGLETON_INSTANCE.showDeckEditor(GameType.Sealed, sealed);
|
||||
}
|
||||
}
|
||||
|
||||
267
src/main/java/forge/gui/home/limited/VSubmenuConstructed.java
Normal file
267
src/main/java/forge/gui/home/limited/VSubmenuConstructed.java
Normal file
@@ -0,0 +1,267 @@
|
||||
package forge.gui.home.limited;
|
||||
|
||||
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.gui.home.EMenuGroup;
|
||||
import forge.gui.home.EMenuItem;
|
||||
import forge.gui.home.ICSubmenu;
|
||||
import forge.gui.home.IVSubmenu;
|
||||
import forge.gui.home.StartButton;
|
||||
import forge.view.toolbox.FCheckBox;
|
||||
import forge.view.toolbox.FLabel;
|
||||
import forge.view.toolbox.FList;
|
||||
import forge.view.toolbox.FRadioButton;
|
||||
import forge.view.toolbox.FScrollPane;
|
||||
|
||||
/**
|
||||
* TODO: Write javadoc for this type.
|
||||
*
|
||||
*/
|
||||
public enum VSubmenuConstructed implements IVSubmenu {
|
||||
/** */
|
||||
SINGLETON_INSTANCE;
|
||||
|
||||
/** */
|
||||
private final JPanel pnl = new JPanel();
|
||||
private final StartButton btnStart = new StartButton();
|
||||
private final JList lstHumanDecks = new FList();
|
||||
private final JList lstAIDecks = 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 event 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 event 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 scrHumanDecks = new FScrollPane(lstHumanDecks,
|
||||
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
|
||||
|
||||
private final JScrollPane scrAIDecks = new FScrollPane(lstAIDecks,
|
||||
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
|
||||
|
||||
private final FLabel btnHumanRandom = new FLabel.Builder().text("Random").fontSize(14).opaque(true)
|
||||
.hoverable(true).fontScaleAuto(false).build();
|
||||
|
||||
private final FLabel btnAIRandom = new FLabel.Builder().text("Random").fontSize(14).opaque(true)
|
||||
.hoverable(true).fontScaleAuto(false).build();
|
||||
|
||||
private VSubmenuConstructed() {
|
||||
// Radio button group: Human
|
||||
final ButtonGroup grpRadiosHuman = new ButtonGroup();
|
||||
grpRadiosHuman.add(radColorsHuman);
|
||||
grpRadiosHuman.add(radThemesHuman);
|
||||
grpRadiosHuman.add(radCustomHuman);
|
||||
grpRadiosHuman.add(radQuestsHuman);
|
||||
|
||||
// Radio button group: AI
|
||||
final ButtonGroup grpRadiosAI = new ButtonGroup();
|
||||
grpRadiosAI.add(radColorsAI);
|
||||
grpRadiosAI.add(radThemesAI);
|
||||
grpRadiosAI.add(radCustomAI);
|
||||
grpRadiosAI.add(radQuestsAI);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getPanel()
|
||||
*/
|
||||
@Override
|
||||
public JPanel getPanel() {
|
||||
return pnl;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getControl()
|
||||
*/
|
||||
@Override
|
||||
public ICSubmenu getControl() {
|
||||
return CSubmenuConstructed.SINGLETON_INSTANCE;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getGroupEnum()
|
||||
*/
|
||||
@Override
|
||||
public EMenuGroup getGroupEnum() {
|
||||
return EMenuGroup.SANCTIONED;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getMenuTitle()
|
||||
*/
|
||||
@Override
|
||||
public String getMenuTitle() {
|
||||
return "Constructed";
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getItemEnum()
|
||||
*/
|
||||
@Override
|
||||
public String getItemEnum() {
|
||||
return EMenuItem.CONSTRUCTED.toString();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#populate()
|
||||
*/
|
||||
@Override
|
||||
public void populate() {
|
||||
// Deck panels: Human and AI
|
||||
final JPanel pnlDecksHuman = new JPanel(new MigLayout("insets 0, gap 0, wrap"));
|
||||
final JPanel pnlDecksAI = new JPanel(new MigLayout("insets 0, gap 0, wrap"));
|
||||
|
||||
// Add deck scrollers and random buttons: Human and AI
|
||||
pnlDecksHuman.setOpaque(false);
|
||||
pnlDecksHuman.add(scrHumanDecks, "w 100%!, pushy, growy");
|
||||
pnlDecksHuman.add(btnHumanRandom, "w 100%!, h 30px!, gap 0 0 10px 10px");
|
||||
|
||||
pnlDecksAI.setOpaque(false);
|
||||
pnlDecksAI.add(scrAIDecks, "w 100%!, pushy, growy");
|
||||
pnlDecksAI.add(btnAIRandom, "w 100%!, h 30px!, gap 0 0 10px 0");
|
||||
|
||||
// Radio button panels: Human and AI
|
||||
final JPanel pnlRadiosHuman = new JPanel(new MigLayout("insets 0, gap 0, wrap"));
|
||||
final JPanel pnlRadiosAI = new JPanel(new MigLayout("insets 0, gap 0, wrap"));
|
||||
final String strRadioConstraints = "w 100%!, h 30px!";
|
||||
|
||||
// Add radio buttons: Human
|
||||
pnlRadiosHuman.setOpaque(false);
|
||||
pnlRadiosHuman.add(new FLabel.Builder().text("Select your deck:")
|
||||
.fontStyle(Font.BOLD).fontScaleAuto(false).fontSize(16)
|
||||
.fontAlign(SwingConstants.LEFT).build(), strRadioConstraints);
|
||||
pnlRadiosHuman.add(radColorsHuman, strRadioConstraints);
|
||||
pnlRadiosHuman.add(radThemesHuman, strRadioConstraints);
|
||||
pnlRadiosHuman.add(radCustomHuman, strRadioConstraints);
|
||||
pnlRadiosHuman.add(radQuestsHuman, strRadioConstraints);
|
||||
|
||||
// Add radio buttons: AI
|
||||
pnlRadiosAI.setOpaque(false);
|
||||
pnlRadiosAI.add(new FLabel.Builder().text("Select an AI deck:")
|
||||
.fontStyle(Font.BOLD).fontScaleAuto(false).fontSize(16)
|
||||
.fontAlign(SwingConstants.LEFT).build(), strRadioConstraints);
|
||||
pnlRadiosAI.add(radColorsAI, strRadioConstraints);
|
||||
pnlRadiosAI.add(radThemesAI, strRadioConstraints);
|
||||
pnlRadiosAI.add(radCustomAI, strRadioConstraints);
|
||||
pnlRadiosAI.add(radQuestsAI, strRadioConstraints);
|
||||
|
||||
final JPanel pnlStart = new JPanel(new MigLayout("insets 0, gap 0, wrap 2"));
|
||||
final String strCheckboxConstraints = "w 200px!, h 30px!, gap 0 20px 0 0";
|
||||
pnlStart.setOpaque(false);
|
||||
pnlStart.add(cbSingletons, strCheckboxConstraints);
|
||||
pnlStart.add(btnStart, "span 1 3, growx, pushx, align center");
|
||||
pnlStart.add(cbArtifacts, strCheckboxConstraints);
|
||||
pnlStart.add(cbRemoveSmall, strCheckboxConstraints);
|
||||
|
||||
pnl.removeAll();
|
||||
pnl.setOpaque(false);
|
||||
pnl.setLayout(new MigLayout("insets 0, gap 0, wrap 2, align center"));
|
||||
|
||||
final String strLeftConstraints = "w 200px, pushy, growy, gap 0 20px 25px 25px";
|
||||
final String strRightConstraints = "w 30%!, pushy, growy, gap 0 20px 25px 25px";
|
||||
|
||||
pnl.add(pnlRadiosAI, strLeftConstraints);
|
||||
pnl.add(pnlDecksAI, strRightConstraints);
|
||||
pnl.add(pnlRadiosHuman, strLeftConstraints);
|
||||
pnl.add(pnlDecksHuman, strRightConstraints);
|
||||
|
||||
pnl.add(pnlStart, "w 220px + 30%, span 2 1, gap 0 0 0 50px");
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JList} */
|
||||
public JList getLstHumanDecks() {
|
||||
return this.lstHumanDecks;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JList} */
|
||||
public JList getLstAIDecks() {
|
||||
return this.lstAIDecks;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JButton} */
|
||||
public JButton getBtnStart() {
|
||||
return this.btnStart;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.toolbox.FLabel} */
|
||||
public FLabel getBtnHumanRandom() {
|
||||
return this.btnHumanRandom;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.toolbox.FLabel} */
|
||||
public FLabel 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() {
|
||||
return cbSingletons;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JCheckBox} */
|
||||
public JCheckBox getCbArtifacts() {
|
||||
return cbArtifacts;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JCheckBox} */
|
||||
public JCheckBox getCbRemoveSmall() {
|
||||
return cbRemoveSmall;
|
||||
}
|
||||
}
|
||||
@@ -16,12 +16,13 @@ import javax.swing.text.StyleConstants;
|
||||
import javax.swing.text.StyledDocument;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import forge.Command;
|
||||
import forge.game.GameType;
|
||||
import forge.gui.GuiUtils;
|
||||
import forge.gui.home.EMenuGroup;
|
||||
import forge.gui.home.EMenuItem;
|
||||
import forge.gui.home.ICSubmenu;
|
||||
import forge.gui.home.IVSubmenu;
|
||||
import forge.view.home.StartButton;
|
||||
import forge.gui.home.StartButton;
|
||||
import forge.view.toolbox.DeckLister;
|
||||
import forge.view.toolbox.FButton;
|
||||
import forge.view.toolbox.FLabel;
|
||||
@@ -38,14 +39,10 @@ public enum VSubmenuDraft implements IVSubmenu {
|
||||
/** */
|
||||
SINGLETON_INSTANCE;
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
private final Command cmdExit = new Command() { @Override
|
||||
public void execute() { CSubmenuDraft.SINGLETON_INSTANCE.update(); } };
|
||||
|
||||
/** */
|
||||
private final JPanel pnl = new JPanel();
|
||||
private final StartButton btnStart = new StartButton();
|
||||
private final DeckLister lstHumanDecks = new DeckLister(GameType.Draft, cmdExit);
|
||||
private final DeckLister lstHumanDecks = new DeckLister(GameType.Draft);
|
||||
private final JList lstAI = new FList();
|
||||
private final JLabel btnBuildDeck = new FLabel.Builder()
|
||||
.fontScaleAuto(false).fontSize(16)
|
||||
@@ -94,8 +91,8 @@ public enum VSubmenuDraft implements IVSubmenu {
|
||||
* @see forge.view.home.IViewSubmenu#getGroup()
|
||||
*/
|
||||
@Override
|
||||
public EMenuGroup getGroup() {
|
||||
return EMenuGroup.LIMITED;
|
||||
public EMenuGroup getGroupEnum() {
|
||||
return EMenuGroup.SANCTIONED;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@@ -106,6 +103,30 @@ public enum VSubmenuDraft implements IVSubmenu {
|
||||
return pnl;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getMenuTitle()
|
||||
*/
|
||||
@Override
|
||||
public String getMenuTitle() {
|
||||
return "Draft Mode";
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getMenuName()
|
||||
*/
|
||||
@Override
|
||||
public String getItemEnum() {
|
||||
return EMenuItem.LIMITED_DRAFT.toString();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getControl()
|
||||
*/
|
||||
@Override
|
||||
public ICSubmenu getControl() {
|
||||
return CSubmenuDraft.SINGLETON_INSTANCE;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JLabel} */
|
||||
public JLabel getBtnDirections() {
|
||||
return this.btnDirections;
|
||||
|
||||
@@ -14,12 +14,13 @@ import javax.swing.text.StyleConstants;
|
||||
import javax.swing.text.StyledDocument;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import forge.Command;
|
||||
import forge.game.GameType;
|
||||
import forge.gui.GuiUtils;
|
||||
import forge.gui.home.EMenuGroup;
|
||||
import forge.gui.home.EMenuItem;
|
||||
import forge.gui.home.ICSubmenu;
|
||||
import forge.gui.home.IVSubmenu;
|
||||
import forge.view.home.StartButton;
|
||||
import forge.gui.home.StartButton;
|
||||
import forge.view.toolbox.DeckLister;
|
||||
import forge.view.toolbox.FButton;
|
||||
import forge.view.toolbox.FLabel;
|
||||
@@ -35,14 +36,10 @@ public enum VSubmenuSealed implements IVSubmenu {
|
||||
/** */
|
||||
SINGLETON_INSTANCE;
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
private final Command cmdExit = new Command() { @Override
|
||||
public void execute() { CSubmenuDraft.SINGLETON_INSTANCE.update(); } };
|
||||
|
||||
/** */
|
||||
private final JPanel pnl = new JPanel();
|
||||
private final StartButton btnStart = new StartButton();
|
||||
private final DeckLister lstDecks = new DeckLister(GameType.Draft, cmdExit);
|
||||
private final DeckLister lstDecks = new DeckLister(GameType.Sealed);
|
||||
private final JLabel btnBuildDeck = new FLabel.Builder()
|
||||
.fontScaleAuto(false).fontSize(16)
|
||||
.opaque(true).hoverable(true).text("Build a Sealed Deck").build();
|
||||
@@ -78,8 +75,32 @@ public enum VSubmenuSealed implements IVSubmenu {
|
||||
* @see forge.view.home.IViewSubmenu#getGroup()
|
||||
*/
|
||||
@Override
|
||||
public EMenuGroup getGroup() {
|
||||
return EMenuGroup.LIMITED;
|
||||
public EMenuGroup getGroupEnum() {
|
||||
return EMenuGroup.SANCTIONED;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getMenuTitle()
|
||||
*/
|
||||
@Override
|
||||
public String getMenuTitle() {
|
||||
return "Sealed Mode";
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getMenuName()
|
||||
*/
|
||||
@Override
|
||||
public String getItemEnum() {
|
||||
return EMenuItem.LIMITED_SEALED.toString();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getControl()
|
||||
*/
|
||||
@Override
|
||||
public ICSubmenu getControl() {
|
||||
return CSubmenuSealed.SINGLETON_INSTANCE;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
package forge.gui.home.quest;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.SwingConstants;
|
||||
@@ -9,9 +11,11 @@ import javax.swing.border.EmptyBorder;
|
||||
import forge.AllZone;
|
||||
import forge.Command;
|
||||
import forge.Singletons;
|
||||
import forge.gui.home.EMenuItem;
|
||||
import forge.gui.home.ICSubmenu;
|
||||
import forge.gui.home.quest.SubmenuQuestUtil.SelectablePanel;
|
||||
import forge.quest.data.QuestChallenge;
|
||||
import forge.view.ViewHomeUI;
|
||||
import forge.view.toolbox.FLabel;
|
||||
|
||||
/**
|
||||
@@ -23,25 +27,47 @@ public enum CSubmenuChallenges implements ICSubmenu {
|
||||
SINGLETON_INSTANCE;
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.control.home.IControlSubmenu#getMenuCommand()
|
||||
* @see forge.control.home.IControlSubmenu#getCommand()
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
@Override
|
||||
public Command getMenuCommand() {
|
||||
return null;
|
||||
return new Command() {
|
||||
public void execute() {
|
||||
if (AllZone.getQuestData() == null) {
|
||||
ViewHomeUI.SINGLETON_INSTANCE.itemClick(EMenuItem.QUEST_DATA);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.control.home.IControlSubmenu#initialize()
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
@Override
|
||||
public void initialize() {
|
||||
/// TEMPORARY
|
||||
VSubmenuDuels.SINGLETON_INSTANCE.populate();
|
||||
CSubmenuDuels.SINGLETON_INSTANCE.update();
|
||||
/////////////
|
||||
|
||||
VSubmenuChallenges.SINGLETON_INSTANCE.populate();
|
||||
CSubmenuChallenges.SINGLETON_INSTANCE.update();
|
||||
|
||||
VSubmenuChallenges.SINGLETON_INSTANCE.getBtnSpellShop().setCommand(
|
||||
new Command() { @Override
|
||||
public void execute() { SubmenuQuestUtil.showSpellShop(); } });
|
||||
|
||||
VSubmenuChallenges.SINGLETON_INSTANCE.getBtnBazaar().setCommand(
|
||||
new Command() { @Override
|
||||
public void execute() { SubmenuQuestUtil.showBazaar(); } });
|
||||
|
||||
VSubmenuChallenges.SINGLETON_INSTANCE.getBtnStart().addActionListener(
|
||||
new ActionListener() { @Override
|
||||
public void actionPerformed(final ActionEvent e) { SubmenuQuestUtil.startGame(); } });
|
||||
|
||||
VSubmenuChallenges.SINGLETON_INSTANCE.getBtnCurrentDeck().setCommand(
|
||||
new Command() { @Override
|
||||
public void execute() {
|
||||
ViewHomeUI.SINGLETON_INSTANCE.itemClick(EMenuItem.QUEST_DECKS);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@@ -52,10 +78,9 @@ public enum CSubmenuChallenges implements ICSubmenu {
|
||||
SubmenuQuestUtil.updateStatsAndPet();
|
||||
|
||||
final VSubmenuChallenges view = VSubmenuChallenges.SINGLETON_INSTANCE;
|
||||
VSubmenuDuels.SINGLETON_INSTANCE.getBtnStart().setEnabled(false);
|
||||
|
||||
if (AllZone.getQuestData() != null) {
|
||||
VSubmenuDuels.SINGLETON_INSTANCE.getLblTitle().setText("Challenges: " + AllZone.getQuestData().getRank());
|
||||
view.getLblTitle().setText("Challenges: " + AllZone.getQuestData().getRank());
|
||||
|
||||
view.getPnlChallenges().removeAll();
|
||||
final List<QuestChallenge> challenges =
|
||||
@@ -68,7 +93,7 @@ public enum CSubmenuChallenges implements ICSubmenu {
|
||||
|
||||
if (challenges.size() == 0) {
|
||||
final FLabel lbl = new FLabel.Builder()
|
||||
.text(VSubmenuDuels.SINGLETON_INSTANCE.getLblNextChallengeInWins().getText())
|
||||
.text(VSubmenuChallenges.SINGLETON_INSTANCE.getLblNextChallengeInWins().getText())
|
||||
.fontAlign(SwingConstants.CENTER).build();
|
||||
lbl.setForeground(Color.red);
|
||||
lbl.setBackground(Color.white);
|
||||
@@ -78,4 +103,39 @@ public enum CSubmenuChallenges implements ICSubmenu {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.control.home.IControlSubmenu#update()
|
||||
*/
|
||||
/* @Override
|
||||
public void update() {
|
||||
SubmenuQuestUtil.updateStatsAndPet();
|
||||
|
||||
final VSubmenuChallenges view = VSubmenuChallenges.SINGLETON_INSTANCE;
|
||||
VSubmenuChallenges.SINGLETON_INSTANCE.getBtnStart().setEnabled(false);
|
||||
|
||||
if (AllZone.getQuestData() != null) {
|
||||
VSubmenuChallenges.SINGLETON_INSTANCE.getLblTitle().setText("Challenges: " + AllZone.getQuestData().getRank());
|
||||
|
||||
view.getPnlChallenges().removeAll();
|
||||
final List<QuestChallenge> challenges =
|
||||
Singletons.getModel().getQuestEventManager().generateChallenges(AllZone.getQuestData());
|
||||
|
||||
for (final QuestChallenge c : challenges) {
|
||||
final SelectablePanel temp = new SelectablePanel(c);
|
||||
view.getPnlChallenges().add(temp, "w 96%!, h 86px!, gap 2% 0 5px 5px");
|
||||
}
|
||||
|
||||
if (challenges.size() == 0) {
|
||||
final FLabel lbl = new FLabel.Builder()
|
||||
.text(VSubmenuChallenges.SINGLETON_INSTANCE.getLblNextChallengeInWins().getText())
|
||||
.fontAlign(SwingConstants.CENTER).build();
|
||||
lbl.setForeground(Color.red);
|
||||
lbl.setBackground(Color.white);
|
||||
lbl.setBorder(new EmptyBorder(10, 10, 10, 10));
|
||||
lbl.setOpaque(true);
|
||||
view.getPnlChallenges().add(lbl, "w 50%!, h 30px!, gap 25% 0 50px 0");
|
||||
}
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
@@ -7,9 +7,11 @@ import java.util.List;
|
||||
import forge.AllZone;
|
||||
import forge.Command;
|
||||
import forge.Singletons;
|
||||
import forge.gui.home.EMenuItem;
|
||||
import forge.gui.home.ICSubmenu;
|
||||
import forge.gui.home.quest.SubmenuQuestUtil.SelectablePanel;
|
||||
import forge.quest.data.QuestDuel;
|
||||
import forge.view.ViewHomeUI;
|
||||
|
||||
/**
|
||||
* TODO: Write javadoc for this type.
|
||||
@@ -20,11 +22,18 @@ public enum CSubmenuDuels implements ICSubmenu {
|
||||
SINGLETON_INSTANCE;
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.control.home.IControlSubmenu#getMenuCommand()
|
||||
* @see forge.control.home.IControlSubmenu#getCommand()
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
@Override
|
||||
public Command getMenuCommand() {
|
||||
return null;
|
||||
return new Command() {
|
||||
public void execute() {
|
||||
if (AllZone.getQuestData() == null) {
|
||||
ViewHomeUI.SINGLETON_INSTANCE.itemClick(EMenuItem.QUEST_DATA);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@@ -40,13 +49,20 @@ public enum CSubmenuDuels implements ICSubmenu {
|
||||
new Command() { @Override
|
||||
public void execute() { SubmenuQuestUtil.showSpellShop(); } });
|
||||
|
||||
VSubmenuDuels.SINGLETON_INSTANCE.getBtnSpellShop().setCommand(
|
||||
VSubmenuDuels.SINGLETON_INSTANCE.getBtnBazaar().setCommand(
|
||||
new Command() { @Override
|
||||
public void execute() { SubmenuQuestUtil.showBazaar(); } });
|
||||
|
||||
VSubmenuDuels.SINGLETON_INSTANCE.getBtnStart().addActionListener(
|
||||
new ActionListener() { @Override
|
||||
public void actionPerformed(final ActionEvent e) { SubmenuQuestUtil.startGame(); } });
|
||||
|
||||
VSubmenuDuels.SINGLETON_INSTANCE.getBtnCurrentDeck().setCommand(
|
||||
new Command() { @Override
|
||||
public void execute() {
|
||||
ViewHomeUI.SINGLETON_INSTANCE.itemClick(EMenuItem.QUEST_DECKS);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
|
||||
@@ -22,16 +22,22 @@ import forge.quest.data.QuestPreferences.QPref;
|
||||
* TODO: Write javadoc for this type.
|
||||
*
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public enum CSubmenuQuestData implements ICSubmenu {
|
||||
/** */
|
||||
SINGLETON_INSTANCE;
|
||||
|
||||
private final Map<String, QuestData> arrQuests = new HashMap<String, QuestData>();
|
||||
|
||||
private final Command cmdQuestSelect = new Command() { @Override
|
||||
public void execute() { changeQuest(); } };
|
||||
|
||||
private final Command cmdQuestDelete = new Command() { @Override
|
||||
public void execute() { update(); } };
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.control.home.IControlSubmenu#update()
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
@Override
|
||||
public void initialize() {
|
||||
VSubmenuQuestData.SINGLETON_INSTANCE.populate();
|
||||
@@ -54,75 +60,8 @@ public enum CSubmenuQuestData implements ICSubmenu {
|
||||
*/
|
||||
@Override
|
||||
public void update() {
|
||||
refreshQuests();
|
||||
}
|
||||
|
||||
/**
|
||||
* The actuator for new quests.
|
||||
*/
|
||||
private void newQuest() {
|
||||
final VSubmenuQuestData view = VSubmenuQuestData.SINGLETON_INSTANCE;
|
||||
int difficulty = 0;
|
||||
QuestData newdata = new QuestData();
|
||||
|
||||
final String mode = view.getRadFantasy().isSelected()
|
||||
? forge.quest.data.QuestData.FANTASY
|
||||
: forge.quest.data.QuestData.CLASSIC;
|
||||
|
||||
if (view.getRadEasy().isSelected()) {
|
||||
difficulty = 0;
|
||||
} else if (view.getRadMedium().isSelected()) {
|
||||
difficulty = 1;
|
||||
} else if (view.getRadHard().isSelected()) {
|
||||
difficulty = 2;
|
||||
} else if (view.getRadExpert().isSelected()) {
|
||||
difficulty = 3;
|
||||
} else {
|
||||
throw new IllegalStateException(
|
||||
"ControlQuest() > newQuest(): Error starting new quest!");
|
||||
}
|
||||
|
||||
final Object o = JOptionPane.showInputDialog(null, "Poets will remember your quest as:", "Quest Name", JOptionPane.OK_CANCEL_OPTION);
|
||||
|
||||
if (o == null) { return; }
|
||||
|
||||
final String questName = GuiUtils.cleanString(o.toString());
|
||||
|
||||
if (getAllQuests().get(questName) != null || questName.equals("")) {
|
||||
JOptionPane.showMessageDialog(null, "Please pick another quest name, a quest already has that name.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Give the user a few cards to build a deck
|
||||
newdata.newGame(difficulty, mode, view.getCbStandardStart().isSelected());
|
||||
newdata.setName(questName);
|
||||
newdata.saveData();
|
||||
|
||||
// Save in preferences.
|
||||
Singletons.getModel().getQuestPreferences().setPreference(QPref.CURRENT_QUEST, questName + ".dat");
|
||||
Singletons.getModel().getQuestPreferences().save();
|
||||
|
||||
Singletons.getView().getViewHome().resetQuest();
|
||||
} // New Quest
|
||||
|
||||
/** Changes between quest data files. */
|
||||
private void changeQuest() {
|
||||
AllZone.setQuestData(VSubmenuQuestData.SINGLETON_INSTANCE
|
||||
.getLstQuests().getSelectedQuest());
|
||||
|
||||
// Save in preferences.
|
||||
Singletons.getModel().getQuestPreferences().setPreference(QPref.CURRENT_QUEST,
|
||||
AllZone.getQuestData().getName() + ".dat");
|
||||
Singletons.getModel().getQuestPreferences().save();
|
||||
|
||||
//refreshDecks();
|
||||
//refreshStats();
|
||||
}
|
||||
|
||||
/** Resets quests, then retrieves and sets current quest. */
|
||||
public void refreshQuests() {
|
||||
final VSubmenuQuestData view = VSubmenuQuestData.SINGLETON_INSTANCE;
|
||||
File dirQuests = ForgeProps.getFile(NewConstants.Quest.DATA_DIR);
|
||||
final File dirQuests = ForgeProps.getFile(NewConstants.Quest.DATA_DIR);
|
||||
|
||||
// Temporary transition code between v1.2.2 and v1.2.3.
|
||||
// Can be safely deleted after release of 1.2.3.
|
||||
@@ -170,6 +109,74 @@ public enum CSubmenuQuestData implements ICSubmenu {
|
||||
else {
|
||||
AllZone.setQuestData(null);
|
||||
}
|
||||
|
||||
view.getLstQuests().setSelectCommand(cmdQuestSelect);
|
||||
view.getLstQuests().setDeleteCommand(cmdQuestDelete);
|
||||
}
|
||||
|
||||
/**
|
||||
* The actuator for new quests.
|
||||
*/
|
||||
private void newQuest() {
|
||||
final VSubmenuQuestData view = VSubmenuQuestData.SINGLETON_INSTANCE;
|
||||
int difficulty = 0;
|
||||
QuestData newdata = new QuestData();
|
||||
|
||||
final String mode = view.getRadFantasy().isSelected()
|
||||
? forge.quest.data.QuestData.FANTASY
|
||||
: forge.quest.data.QuestData.CLASSIC;
|
||||
|
||||
if (view.getRadEasy().isSelected()) {
|
||||
difficulty = 0;
|
||||
} else if (view.getRadMedium().isSelected()) {
|
||||
difficulty = 1;
|
||||
} else if (view.getRadHard().isSelected()) {
|
||||
difficulty = 2;
|
||||
} else if (view.getRadExpert().isSelected()) {
|
||||
difficulty = 3;
|
||||
} else {
|
||||
throw new IllegalStateException(
|
||||
"ControlQuest() > newQuest(): Error starting new quest!");
|
||||
}
|
||||
|
||||
final Object o = JOptionPane.showInputDialog(null, "Poets will remember your quest as:", "Quest Name", JOptionPane.OK_CANCEL_OPTION);
|
||||
|
||||
if (o == null) { return; }
|
||||
|
||||
final String questName = GuiUtils.cleanString(o.toString());
|
||||
|
||||
if (getAllQuests().get(questName) != null || questName.equals("")) {
|
||||
JOptionPane.showMessageDialog(null, "Please pick another quest name, a quest already has that name.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Give the user a few cards to build a deck
|
||||
newdata.newGame(difficulty, mode, view.getCbStandardStart().isSelected());
|
||||
newdata.setName(questName);
|
||||
newdata.saveData();
|
||||
|
||||
// Save in preferences.
|
||||
Singletons.getModel().getQuestPreferences().setPreference(QPref.CURRENT_QUEST, questName + ".dat");
|
||||
Singletons.getModel().getQuestPreferences().save();
|
||||
|
||||
update();
|
||||
} // New Quest
|
||||
|
||||
/** Changes between quest data files. */
|
||||
private void changeQuest() {
|
||||
AllZone.setQuestData(VSubmenuQuestData.SINGLETON_INSTANCE
|
||||
.getLstQuests().getSelectedQuest());
|
||||
|
||||
// Save in preferences.
|
||||
Singletons.getModel().getQuestPreferences().setPreference(QPref.CURRENT_QUEST,
|
||||
AllZone.getQuestData().getName() + ".dat");
|
||||
Singletons.getModel().getQuestPreferences().save();
|
||||
|
||||
SubmenuQuestUtil.updateStatsAndPet();
|
||||
|
||||
CSubmenuDuels.SINGLETON_INSTANCE.update();
|
||||
CSubmenuChallenges.SINGLETON_INSTANCE.update();
|
||||
CSubmenuQuestDecks.SINGLETON_INSTANCE.update();
|
||||
}
|
||||
|
||||
/** @return */
|
||||
|
||||
@@ -7,9 +7,11 @@ import forge.Command;
|
||||
import forge.Singletons;
|
||||
import forge.deck.Deck;
|
||||
import forge.gui.deckeditor.DeckEditorQuest;
|
||||
import forge.gui.home.EMenuItem;
|
||||
import forge.gui.home.ICSubmenu;
|
||||
import forge.quest.data.QuestData;
|
||||
import forge.quest.data.QuestPreferences.QPref;
|
||||
import forge.view.ViewHomeUI;
|
||||
|
||||
/**
|
||||
* TODO: Write javadoc for this type.
|
||||
@@ -26,7 +28,6 @@ public enum CSubmenuQuestDecks implements ICSubmenu {
|
||||
public void execute() {
|
||||
AllZone.getQuestData().saveData();
|
||||
update();
|
||||
Singletons.getView().getViewHome().getBtnQuest().grabFocus();
|
||||
}
|
||||
};
|
||||
|
||||
@@ -35,13 +36,29 @@ public enum CSubmenuQuestDecks implements ICSubmenu {
|
||||
public void execute() {
|
||||
currentDeck = VSubmenuQuestDecks.SINGLETON_INSTANCE.getLstDecks().getSelectedDeck();
|
||||
Singletons.getModel().getQuestPreferences().setPreference(QPref.CURRENT_DECK, currentDeck.toString());
|
||||
VSubmenuDuels.SINGLETON_INSTANCE.setCurrentDeckStatus();
|
||||
Singletons.getModel().getQuestPreferences().save();
|
||||
VSubmenuDuels.SINGLETON_INSTANCE.updateCurrentDeckStatus();
|
||||
VSubmenuChallenges.SINGLETON_INSTANCE.updateCurrentDeckStatus();
|
||||
}
|
||||
};
|
||||
|
||||
private final Command cmdDeckDelete = new Command() { @Override
|
||||
public void execute() { update(); } };
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.control.home.IControlSubmenu#getCommand()
|
||||
*/
|
||||
@Override
|
||||
public Command getMenuCommand() {
|
||||
return new Command() {
|
||||
public void execute() {
|
||||
if (AllZone.getQuestData() == null) {
|
||||
ViewHomeUI.SINGLETON_INSTANCE.itemClick(EMenuItem.QUEST_DATA);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.control.home.IControlSubmenu#update()
|
||||
*/
|
||||
@@ -60,14 +77,6 @@ public enum CSubmenuQuestDecks implements ICSubmenu {
|
||||
});
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.control.home.IControlSubmenu#getCommand()
|
||||
*/
|
||||
@Override
|
||||
public Command getMenuCommand() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.control.home.IControlSubmenu#update()
|
||||
*/
|
||||
@@ -83,8 +92,9 @@ public enum CSubmenuQuestDecks implements ICSubmenu {
|
||||
|
||||
if (qData != null) {
|
||||
final String cd = Singletons.getModel().getQuestPreferences().getPreference(QPref.CURRENT_DECK);
|
||||
|
||||
for (Deck d : qData.getMyDecks()) {
|
||||
if (d.getName().equals(cd)) {
|
||||
if (d.getName() != null && d.getName().equals(cd)) {
|
||||
currentDeck = d;
|
||||
view.getLstDecks().setSelectedDeck(d);
|
||||
break;
|
||||
@@ -99,7 +109,15 @@ public enum CSubmenuQuestDecks implements ICSubmenu {
|
||||
view.getLstDecks().setDeleteCommand(cmdDeckDelete);
|
||||
view.getLstDecks().setExitCommand(cmdDeckExit);
|
||||
|
||||
VSubmenuDuels.SINGLETON_INSTANCE.setCurrentDeckStatus();
|
||||
if (view.getLstDecks().getSelectedDeck() != null) {
|
||||
Singletons.getModel().getQuestPreferences().setPreference(QPref.CURRENT_DECK, view.getLstDecks().getSelectedDeck().getName());
|
||||
}
|
||||
else {
|
||||
Singletons.getModel().getQuestPreferences().setPreference(QPref.CURRENT_DECK, QPref.CURRENT_DECK.getDefault());
|
||||
}
|
||||
|
||||
VSubmenuDuels.SINGLETON_INSTANCE.updateCurrentDeckStatus();
|
||||
VSubmenuChallenges.SINGLETON_INSTANCE.updateCurrentDeckStatus();
|
||||
}
|
||||
|
||||
/** @return forge.deck.Deck */
|
||||
|
||||
@@ -24,14 +24,6 @@ public enum CSubmenuQuestPrefs implements ICSubmenu {
|
||||
CSubmenuQuestPrefs.SINGLETON_INSTANCE.update();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.control.home.IControlSubmenu#getCommand()
|
||||
*/
|
||||
@Override
|
||||
public Command getMenuCommand() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.control.home.IControlSubmenu#update()
|
||||
*/
|
||||
@@ -40,6 +32,14 @@ public enum CSubmenuQuestPrefs implements ICSubmenu {
|
||||
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.control.home.IControlSubmenu#getCommand()
|
||||
*/
|
||||
@Override
|
||||
public Command getMenuCommand() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks validity of values entered into prefInputs.
|
||||
* @param i0   a PrefInput object
|
||||
|
||||
47
src/main/java/forge/gui/home/quest/IStatsAndPet.java
Normal file
47
src/main/java/forge/gui/home/quest/IStatsAndPet.java
Normal file
@@ -0,0 +1,47 @@
|
||||
package forge.gui.home.quest;
|
||||
|
||||
import javax.swing.JCheckBox;
|
||||
import javax.swing.JComboBox;
|
||||
import javax.swing.JLabel;
|
||||
|
||||
import forge.view.toolbox.FLabel;
|
||||
|
||||
/** Dictates methods required for a panel with stats/pet display. */
|
||||
|
||||
public interface IStatsAndPet {
|
||||
/** @return {@link forge.view.toolbox.FLabel} */
|
||||
FLabel getBtnBazaar();
|
||||
|
||||
/** @return {@link forge.view.toolbox.FLabel} */
|
||||
FLabel getBtnSpellShop();
|
||||
|
||||
/** @return {@link javax.swing.JLabel} */
|
||||
JLabel getLblCredits();
|
||||
|
||||
/** @return {@link javax.swing.JLabel} */
|
||||
JLabel getLblLife();
|
||||
|
||||
/** @return {@link javax.swing.JLabel} */
|
||||
JLabel getLblWins();
|
||||
|
||||
/** @return {@link javax.swing.JLabel} */
|
||||
JLabel getLblLosses();
|
||||
|
||||
/** @return {@link javax.swing.JLabel} */
|
||||
JLabel getLblNextChallengeInWins();
|
||||
|
||||
/** @return {@link javax.swing.JLabel} */
|
||||
JLabel getLblWinStreak();
|
||||
|
||||
/** @return {@link javax.swing.JComboBox} */
|
||||
JComboBox getCbxPet();
|
||||
|
||||
/** @return {@link javax.swing.JCheckBox} */
|
||||
JCheckBox getCbPlant();
|
||||
|
||||
/** @return {@link javax.swing.JCheckBox} */
|
||||
JCheckBox getCbZep();
|
||||
|
||||
/** */
|
||||
void updateCurrentDeckStatus();
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package forge.view.home;
|
||||
package forge.gui.home.quest;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.event.MouseAdapter;
|
||||
@@ -1,4 +1,4 @@
|
||||
package forge.view.home;
|
||||
package forge.gui.home.quest;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Font;
|
||||
@@ -19,7 +19,6 @@ import forge.properties.ForgeProps;
|
||||
import forge.properties.NewConstants;
|
||||
import forge.quest.data.QuestChallenge;
|
||||
import forge.quest.data.QuestData;
|
||||
import forge.quest.data.QuestDataIO;
|
||||
import forge.quest.data.QuestEvent;
|
||||
import forge.quest.data.QuestPreferences.QPref;
|
||||
import forge.quest.data.QuestUtil;
|
||||
@@ -37,7 +36,6 @@ import forge.view.toolbox.FTextArea;
|
||||
*/
|
||||
public class SubmenuQuestUtil {
|
||||
private static SelectablePanel selectedOpponent;
|
||||
private static Deck currentDeck;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
@@ -66,29 +64,28 @@ public class SubmenuQuestUtil {
|
||||
|
||||
/** Updates stats, pets panels for both duels and challenges. */
|
||||
public static void updateStatsAndPet() {
|
||||
final QuestData qData;
|
||||
final VSubmenuDuels view = VSubmenuDuels.SINGLETON_INSTANCE;
|
||||
final QuestData qData = AllZone.getQuestData();
|
||||
|
||||
////////// TODO - THIS SHOULD NOT BE HERE AND WILL BE MOVED EVENTUALLY.
|
||||
if (AllZone.getQuestData() == null) {
|
||||
final String questname = Singletons.getModel()
|
||||
.getQuestPreferences().getPreference(QPref.CURRENT_QUEST);
|
||||
if (qData == null) { return; }
|
||||
|
||||
qData = QuestDataIO.loadData(new File(
|
||||
ForgeProps.getFile(NewConstants.Quest.DATA_DIR) + questname + ".dat"));
|
||||
AllZone.setQuestData(qData);
|
||||
}
|
||||
else {
|
||||
qData = AllZone.getQuestData();
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
final IStatsAndPet[] viewsToUpdate = new IStatsAndPet[] {
|
||||
VSubmenuDuels.SINGLETON_INSTANCE,
|
||||
VSubmenuChallenges.SINGLETON_INSTANCE
|
||||
};
|
||||
|
||||
|
||||
for (final IStatsAndPet view : viewsToUpdate) {
|
||||
// Fantasy UI display
|
||||
view.getLblNextChallengeInWins().setVisible(true);
|
||||
view.getBtnBazaar().setVisible(true);
|
||||
view.getLblLife().setVisible(true);
|
||||
|
||||
// Stats panel
|
||||
view.getLblCredits().setText("Credits: " + qData.getCredits());
|
||||
view.getLblLife().setText("Life: " + qData.getLife());
|
||||
view.getLblWins().setText("Wins: " + qData.getWin());
|
||||
view.getLblLosses().setText("Losses: " + qData.getLost());
|
||||
view.setCurrentDeckStatus();
|
||||
view.updateCurrentDeckStatus();
|
||||
|
||||
final int num = SubmenuQuestUtil.nextChallengeInWins();
|
||||
if (num == 0) {
|
||||
@@ -135,11 +132,117 @@ public class SubmenuQuestUtil {
|
||||
view.getCbZep().setVisible(zeppelin.hasBeenUsed());
|
||||
}
|
||||
else {
|
||||
// Classic mode display changes
|
||||
view.getCbxPet().setVisible(false);
|
||||
view.getCbPlant().setVisible(false);
|
||||
view.getCbZep().setVisible(false);
|
||||
view.getLblNextChallengeInWins().setVisible(false);
|
||||
view.getBtnBazaar().setVisible(false);
|
||||
view.getLblLife().setVisible(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.home.ViewQuest.SelectablePanel} */
|
||||
public static SelectablePanel getSelectedOpponent() {
|
||||
return selectedOpponent;
|
||||
}
|
||||
|
||||
/** @return {@link forge.deck.Deck} */
|
||||
public static Deck getCurrentDeck() {
|
||||
Deck d = null;
|
||||
|
||||
if (AllZone.getQuestData() != null) {
|
||||
d = AllZone.getQuestData().getMyDecks().get(
|
||||
Singletons.getModel().getQuestPreferences().getPreference(QPref.CURRENT_DECK));
|
||||
}
|
||||
|
||||
return d;
|
||||
}
|
||||
|
||||
/** */
|
||||
@SuppressWarnings("serial")
|
||||
public static void showSpellShop() {
|
||||
final Command exit = new Command() {
|
||||
@Override
|
||||
public void execute() {
|
||||
AllZone.getQuestData().saveData();
|
||||
updateStatsAndPet();
|
||||
}
|
||||
};
|
||||
|
||||
final QuestCardShop g = new QuestCardShop(AllZone.getQuestData());
|
||||
g.show(exit);
|
||||
g.setAlwaysOnTop(true);
|
||||
g.setVisible(true);
|
||||
}
|
||||
|
||||
/** */
|
||||
public static void showBazaar() {
|
||||
Singletons.getControl().changeState(FControl.QUEST_BAZAAR);
|
||||
Singletons.getView().getFrame().validate();
|
||||
}
|
||||
|
||||
/** */
|
||||
public static void startGame() {
|
||||
final QuestData qData = AllZone.getQuestData();
|
||||
final QuestEvent event = selectedOpponent.getEvent();
|
||||
final FOverlay overlay = Singletons.getView().getOverlay();
|
||||
final FPanel pnl = new FPanel();
|
||||
|
||||
// Overlay layout
|
||||
overlay.setLayout(new MigLayout("insets 0, gap 0, align center"));
|
||||
|
||||
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();
|
||||
|
||||
// Logic
|
||||
final QuestItemZeppelin zeppelin = (QuestItemZeppelin) qData.getInventory().getItem("Zeppelin");
|
||||
zeppelin.setZeppelinUsed(false);
|
||||
qData.randomizeOpponents();
|
||||
|
||||
Constant.Runtime.HUMAN_DECK[0] = SubmenuQuestUtil.getCurrentDeck();
|
||||
Constant.Runtime.COMPUTER_DECK[0] = event.getEventDeck();
|
||||
Constant.Quest.OPP_ICON_NAME[0] = event.getIconFilename();
|
||||
Constant.Runtime.setGameType(GameType.Quest);
|
||||
qData.setCurrentEvent(event);
|
||||
qData.saveData();
|
||||
|
||||
if (qData.isFantasy()) {
|
||||
Constant.Quest.FANTASY_QUEST[0] = true;
|
||||
int lifeAI = 20;
|
||||
int lifeHuman = 20;
|
||||
|
||||
if (selectedOpponent.getEvent().getEventType().equals("challenge")) {
|
||||
int extraLife = 0;
|
||||
|
||||
if (qData.getInventory().getItemLevel("Gear") == 2) {
|
||||
extraLife = 3;
|
||||
}
|
||||
lifeAI = ((QuestChallenge) event).getAILife();
|
||||
lifeHuman = qData.getLife() + extraLife;
|
||||
}
|
||||
|
||||
GameNew.newGame(
|
||||
Constant.Runtime.HUMAN_DECK[0], Constant.Runtime.COMPUTER_DECK[0],
|
||||
QuestUtil.getHumanStartingCards(qData),
|
||||
QuestUtil.getComputerStartingCards(qData),
|
||||
lifeHuman, lifeAI);
|
||||
} // End isFantasy
|
||||
else {
|
||||
GameNew.newGame(SubmenuQuestUtil.getCurrentDeck(), event.getEventDeck());
|
||||
}
|
||||
|
||||
// Start transisiton to match UI.
|
||||
overlay.hideOverlay();
|
||||
}
|
||||
|
||||
/** Selectable panels for duels and challenges. */
|
||||
@SuppressWarnings("serial")
|
||||
@@ -158,7 +261,12 @@ public class SubmenuQuestUtil {
|
||||
@Override
|
||||
public void execute() {
|
||||
if (selectedOpponent != null) { selectedOpponent.setSelected(false); }
|
||||
else { VSubmenuDuels.SINGLETON_INSTANCE.getBtnStart().setEnabled(true); }
|
||||
else if (VSubmenuDuels.SINGLETON_INSTANCE.getPanel().isShowing() && getCurrentDeck() != null) {
|
||||
VSubmenuDuels.SINGLETON_INSTANCE.getBtnStart().setEnabled(true);
|
||||
}
|
||||
else if (getCurrentDeck() != null) {
|
||||
VSubmenuChallenges.SINGLETON_INSTANCE.getBtnStart().setEnabled(true);
|
||||
}
|
||||
|
||||
selectedOpponent = SubmenuQuestUtil.SelectablePanel.this;
|
||||
}
|
||||
@@ -194,102 +302,4 @@ public class SubmenuQuestUtil {
|
||||
return event;
|
||||
}
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.home.ViewQuest.SelectablePanel} */
|
||||
public static SelectablePanel getSelectedOpponent() {
|
||||
return selectedOpponent;
|
||||
}
|
||||
|
||||
/** @param deck0   {@link forge.deck.Deck} */
|
||||
public static void setCurrentDeck(final Deck deck0) {
|
||||
currentDeck = deck0;
|
||||
}
|
||||
|
||||
/** @return {@link forge.deck.Deck} */
|
||||
public static Deck getCurrentDeck() {
|
||||
return currentDeck;
|
||||
}
|
||||
|
||||
/** */
|
||||
@SuppressWarnings("serial")
|
||||
public static void showSpellShop() {
|
||||
final Command exit = new Command() {
|
||||
@Override
|
||||
public void execute() {
|
||||
AllZone.getQuestData().saveData();
|
||||
updateStatsAndPet();
|
||||
}
|
||||
};
|
||||
|
||||
QuestCardShop g = new QuestCardShop(AllZone.getQuestData());
|
||||
g.show(exit);
|
||||
g.setVisible(true);
|
||||
}
|
||||
|
||||
/** */
|
||||
public static void showBazaar() {
|
||||
Singletons.getControl().changeState(FControl.QUEST_BAZAAR);
|
||||
Singletons.getView().getFrame().validate();
|
||||
}
|
||||
|
||||
/** */
|
||||
public static void startGame() {
|
||||
final QuestData qData = AllZone.getQuestData();
|
||||
final QuestEvent event = selectedOpponent.getEvent();
|
||||
final FOverlay overlay = Singletons.getView().getOverlay();
|
||||
final FPanel pnl = new FPanel();
|
||||
|
||||
// Overlay layout
|
||||
overlay.setLayout(new MigLayout("insets 0, gap 0, align center"));
|
||||
|
||||
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();
|
||||
|
||||
// Logic
|
||||
final QuestItemZeppelin zeppelin = (QuestItemZeppelin) qData.getInventory().getItem("Zeppelin");
|
||||
zeppelin.setZeppelinUsed(false);
|
||||
qData.randomizeOpponents();
|
||||
|
||||
Constant.Runtime.HUMAN_DECK[0] = currentDeck;
|
||||
Constant.Runtime.COMPUTER_DECK[0] = event.getEventDeck();
|
||||
Constant.Quest.OPP_ICON_NAME[0] = event.getIconFilename();
|
||||
Constant.Runtime.setGameType(GameType.Quest);
|
||||
qData.setCurrentEvent(event);
|
||||
qData.saveData();
|
||||
|
||||
if (qData.isFantasy()) {
|
||||
Constant.Quest.FANTASY_QUEST[0] = true;
|
||||
int lifeAI = 20;
|
||||
int lifeHuman = 20;
|
||||
|
||||
if (selectedOpponent.getEvent().getEventType().equals("challenge")) {
|
||||
int extraLife = 0;
|
||||
|
||||
if (qData.getInventory().getItemLevel("Gear") == 2) {
|
||||
extraLife = 3;
|
||||
}
|
||||
lifeAI = ((QuestChallenge) event).getAILife();
|
||||
lifeHuman = qData.getLife() + extraLife;
|
||||
}
|
||||
|
||||
GameNew.newGame(
|
||||
Constant.Runtime.HUMAN_DECK[0], Constant.Runtime.COMPUTER_DECK[0],
|
||||
QuestUtil.getHumanStartingCards(qData),
|
||||
QuestUtil.getComputerStartingCards(qData),
|
||||
lifeHuman, lifeAI);
|
||||
} // End isFantasy
|
||||
else {
|
||||
GameNew.newGame(currentDeck, event.getEventDeck());
|
||||
}
|
||||
|
||||
// Start transisiton to match UI.
|
||||
overlay.hideOverlay();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,22 +1,72 @@
|
||||
package forge.gui.home.quest;
|
||||
|
||||
import java.awt.Color;
|
||||
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JCheckBox;
|
||||
import javax.swing.JComboBox;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.SwingConstants;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import forge.gui.home.EMenuGroup;
|
||||
import forge.gui.home.EMenuItem;
|
||||
import forge.gui.home.ICSubmenu;
|
||||
import forge.gui.home.IVSubmenu;
|
||||
import forge.gui.home.StartButton;
|
||||
import forge.view.toolbox.FCheckBox;
|
||||
import forge.view.toolbox.FLabel;
|
||||
import forge.view.toolbox.FPanel;
|
||||
import forge.view.toolbox.FScrollPane;
|
||||
import forge.view.toolbox.FSkin;
|
||||
|
||||
/** */
|
||||
public enum VSubmenuChallenges implements IVSubmenu {
|
||||
public enum VSubmenuChallenges implements IVSubmenu, IStatsAndPet {
|
||||
/** */
|
||||
SINGLETON_INSTANCE;
|
||||
|
||||
//========== INSTANTIATION
|
||||
private final JPanel pnl = new JPanel();
|
||||
private final JPanel pnlChallenges = new JPanel();
|
||||
private final FPanel pnlTitle = new FPanel();
|
||||
private final JPanel pnlStats = new JPanel();
|
||||
private final JPanel pnlStart = new JPanel();
|
||||
|
||||
private final JButton btnStart = new StartButton();
|
||||
private final JComboBox cbxPet = new JComboBox();
|
||||
private final JCheckBox cbPlant = new FCheckBox("Summon Plant");
|
||||
private final JCheckBox cbZep = new FCheckBox("Launch Zeppelin");
|
||||
|
||||
private final FLabel lblLife = new FLabel.Builder()
|
||||
.icon(FSkin.getIcon(FSkin.QuestIcons.ICO_LIFE))
|
||||
.fontScaleAuto(false).fontSize(15).build();
|
||||
private final FLabel lblCredits = new FLabel.Builder()
|
||||
.icon(FSkin.getIcon(FSkin.QuestIcons.ICO_COINSTACK))
|
||||
.fontScaleAuto(false).fontSize(15).build();
|
||||
private final FLabel lblWins = new FLabel.Builder()
|
||||
.icon(FSkin.getIcon(FSkin.QuestIcons.ICO_PLUS))
|
||||
.fontScaleAuto(false).fontSize(15).build();
|
||||
private final FLabel lblLosses = new FLabel.Builder()
|
||||
.icon(FSkin.getIcon(FSkin.QuestIcons.ICO_MINUS))
|
||||
.fontScaleAuto(false).fontSize(15).build();
|
||||
private final FLabel lblWinStreak = new FLabel.Builder()
|
||||
.icon(FSkin.getIcon(FSkin.QuestIcons.ICO_PLUSPLUS))
|
||||
.fontScaleAuto(false).fontSize(15).build();
|
||||
private final FLabel lblTitle = new FLabel.Builder()
|
||||
.text("Title Hasn't Been Set Yet").fontAlign(SwingConstants.CENTER)
|
||||
.fontScaleAuto(false).fontSize(16).build();
|
||||
private final FLabel lblNextChallengeInWins = new FLabel.Builder()
|
||||
.fontScaleAuto(false).fontSize(15).build();
|
||||
private final FLabel btnCurrentDeck = new FLabel.Builder()
|
||||
.fontScaleAuto(false).fontSize(15).opaque(true).hoverable(true).build();
|
||||
private final FLabel btnBazaar = new FLabel.Builder()
|
||||
.opaque(true).hoverable(true).text("Bazaar")
|
||||
.fontScaleAuto(false).fontSize(14).tooltip("Peruse the Bazaar").build();
|
||||
private final FLabel btnSpellShop = new FLabel.Builder()
|
||||
.opaque(true).hoverable(true).text("Spell Shop")
|
||||
.fontScaleAuto(false).fontSize(14).tooltip("Travel to the Spell Shop").build();
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.view.home.IViewSubmenu#getPanel()
|
||||
@@ -30,22 +80,46 @@ public enum VSubmenuChallenges implements IVSubmenu {
|
||||
* @see forge.view.home.IViewSubmenu#getGroup()
|
||||
*/
|
||||
@Override
|
||||
public EMenuGroup getGroup() {
|
||||
public EMenuGroup getGroupEnum() {
|
||||
return EMenuGroup.QUEST;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getMenuTitle()
|
||||
*/
|
||||
@Override
|
||||
public String getMenuTitle() {
|
||||
return "Challenges";
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getMenuName()
|
||||
*/
|
||||
@Override
|
||||
public String getItemEnum() {
|
||||
return EMenuItem.QUEST_CHALLENGES.toString();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getControl()
|
||||
*/
|
||||
@Override
|
||||
public ICSubmenu getControl() {
|
||||
return CSubmenuChallenges.SINGLETON_INSTANCE;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.view.home.IViewSubmenu#populate()
|
||||
*/
|
||||
@Override
|
||||
public void populate() {
|
||||
// Note: "Challenges" submenu uses the instances of
|
||||
// title, stats, and start panels from "Duels" submenu.
|
||||
final FPanel pnlTitle = VSubmenuDuels.SINGLETON_INSTANCE.getPnlTitle();
|
||||
final JPanel pnlStats = VSubmenuDuels.SINGLETON_INSTANCE.getPnlStats();
|
||||
final JPanel pnlStart = VSubmenuDuels.SINGLETON_INSTANCE.getPnlStart();
|
||||
VSubmenuDuels.SINGLETON_INSTANCE.getBtnStart().setEnabled(false);
|
||||
////
|
||||
pnlTitle.setLayout(new MigLayout("insets 0, gap 0"));
|
||||
pnlTitle.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2));
|
||||
pnlTitle.add(lblTitle, "w 100%, h 100%, gap 0 0 0 0");
|
||||
|
||||
populateStats();
|
||||
populateStart();
|
||||
btnStart.setEnabled(false);
|
||||
|
||||
final FScrollPane scrChallenges = new FScrollPane(pnlChallenges,
|
||||
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
|
||||
@@ -61,8 +135,137 @@ public enum VSubmenuChallenges implements IVSubmenu {
|
||||
pnl.add(pnlStart, "w 94%, gap 3% 0 15px 5%");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateCurrentDeckStatus() {
|
||||
final JLabel btnCurrentDeck = VSubmenuChallenges.SINGLETON_INSTANCE.getBtnCurrentDeck();
|
||||
if (SubmenuQuestUtil.getCurrentDeck() == null) {
|
||||
btnCurrentDeck.setBackground(Color.red.darker());
|
||||
btnCurrentDeck.setText(" Build, then select a deck in the \"Decks\" submenu. ");
|
||||
}
|
||||
else {
|
||||
btnCurrentDeck.setBackground(FSkin.getColor(FSkin.Colors.CLR_INACTIVE));
|
||||
btnCurrentDeck.setText("Current deck: "
|
||||
+ SubmenuQuestUtil.getCurrentDeck().getName());
|
||||
}
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JPanel} */
|
||||
public JPanel getPnlChallenges() {
|
||||
return pnlChallenges;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JPanel} */
|
||||
public FPanel getPnlTitle() {
|
||||
return pnlTitle;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.toolbox.FPanel} */
|
||||
public JPanel getPnlStats() {
|
||||
return pnlStats;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.toolbox.FPanel} */
|
||||
public JPanel getPnlStart() {
|
||||
return pnlStart;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JLabel} */
|
||||
public JLabel getLblTitle() {
|
||||
return lblTitle;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FLabel getLblLife() {
|
||||
return lblLife;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FLabel getLblCredits() {
|
||||
return lblCredits;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FLabel getLblWins() {
|
||||
return lblWins;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FLabel getLblLosses() {
|
||||
return lblLosses;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FLabel getLblNextChallengeInWins() {
|
||||
return lblNextChallengeInWins;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FLabel getLblWinStreak() {
|
||||
return lblWinStreak;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.toolbox.FLabel} */
|
||||
public FLabel getBtnCurrentDeck() {
|
||||
return btnCurrentDeck;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FLabel getBtnBazaar() {
|
||||
return btnBazaar;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FLabel getBtnSpellShop() {
|
||||
return btnSpellShop;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JCheckBox getCbPlant() {
|
||||
return cbPlant;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JCheckBox getCbZep() {
|
||||
return cbZep;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JComboBox getCbxPet() {
|
||||
return cbxPet;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JButton} */
|
||||
public JButton getBtnStart() {
|
||||
return btnStart;
|
||||
}
|
||||
|
||||
private void populateStats() {
|
||||
final String constraints = "w 23%!, h 35px!, gap 1% 1% 5px 5px";
|
||||
pnlStats.removeAll();
|
||||
pnlStats.setOpaque(false);
|
||||
pnlStats.setLayout(new MigLayout("insets 0, gap 0, hidemode 0"));
|
||||
pnlStats.add(btnSpellShop, constraints);
|
||||
pnlStats.add(lblWins, constraints);
|
||||
pnlStats.add(lblLosses, constraints);
|
||||
pnlStats.add(lblCredits, constraints + ", wrap");
|
||||
|
||||
pnlStats.add(btnBazaar, constraints);
|
||||
pnlStats.add(lblWinStreak, "w 48%!, h 35px!, gap 1% 1% 5px 5px, span 2 1");
|
||||
pnlStats.add(lblLife, constraints + ", wrap");
|
||||
|
||||
pnlStats.add(lblNextChallengeInWins, "span 4 1, h 20px!, gap 0 0 5px 5px, ax center, wrap");
|
||||
pnlStats.add(btnCurrentDeck, "span 4 1, w 350px!, h 30px!, gap 0 0 0 5px, ax center");
|
||||
}
|
||||
|
||||
private void populateStart() {
|
||||
final String constraints = "w 200px!, h 20px!, gap 0 10px 5px 5px";
|
||||
pnlStart.removeAll();
|
||||
pnlStart.setOpaque(false);
|
||||
pnlStart.setLayout(new MigLayout("insets 0, gap 0, align center, hidemode 3"));
|
||||
|
||||
pnlStart.add(cbxPet, constraints);
|
||||
pnlStart.add(btnStart, "ax center, span 1 3, wrap");
|
||||
pnlStart.add(cbPlant, constraints + ", wrap");
|
||||
pnlStart.add(cbZep, constraints);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,8 +12,10 @@ import javax.swing.SwingConstants;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import forge.gui.home.EMenuGroup;
|
||||
import forge.gui.home.EMenuItem;
|
||||
import forge.gui.home.ICSubmenu;
|
||||
import forge.gui.home.IVSubmenu;
|
||||
import forge.view.home.StartButton;
|
||||
import forge.gui.home.StartButton;
|
||||
import forge.view.toolbox.FCheckBox;
|
||||
import forge.view.toolbox.FLabel;
|
||||
import forge.view.toolbox.FPanel;
|
||||
@@ -21,7 +23,7 @@ import forge.view.toolbox.FScrollPane;
|
||||
import forge.view.toolbox.FSkin;
|
||||
|
||||
/** */
|
||||
public enum VSubmenuDuels implements IVSubmenu {
|
||||
public enum VSubmenuDuels implements IVSubmenu, IStatsAndPet {
|
||||
/** */
|
||||
SINGLETON_INSTANCE;
|
||||
|
||||
@@ -60,7 +62,7 @@ public enum VSubmenuDuels implements IVSubmenu {
|
||||
private final FLabel btnCurrentDeck = new FLabel.Builder()
|
||||
.fontScaleAuto(false).fontSize(15).opaque(true).hoverable(true).build();
|
||||
private final FLabel btnBazaar = new FLabel.Builder()
|
||||
.selectable(true).opaque(true).hoverable(true).text("Bazaar")
|
||||
.opaque(true).hoverable(true).text("Bazaar")
|
||||
.fontScaleAuto(false).fontSize(14).tooltip("Peruse the Bazaar").build();
|
||||
private final FLabel btnSpellShop = new FLabel.Builder()
|
||||
.opaque(true).hoverable(true).text("Spell Shop")
|
||||
@@ -78,10 +80,34 @@ public enum VSubmenuDuels implements IVSubmenu {
|
||||
* @see forge.view.home.IViewSubmenu#getGroup()
|
||||
*/
|
||||
@Override
|
||||
public EMenuGroup getGroup() {
|
||||
public EMenuGroup getGroupEnum() {
|
||||
return EMenuGroup.QUEST;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getMenuTitle()
|
||||
*/
|
||||
@Override
|
||||
public String getMenuTitle() {
|
||||
return "Duels";
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getMenuName()
|
||||
*/
|
||||
@Override
|
||||
public String getItemEnum() {
|
||||
return EMenuItem.QUEST_DUELS.toString();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getControl()
|
||||
*/
|
||||
@Override
|
||||
public ICSubmenu getControl() {
|
||||
return CSubmenuDuels.SINGLETON_INSTANCE;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.view.home.IViewSubmenu#populate()
|
||||
*/
|
||||
@@ -110,7 +136,7 @@ public enum VSubmenuDuels implements IVSubmenu {
|
||||
}
|
||||
|
||||
/** */
|
||||
public void setCurrentDeckStatus() {
|
||||
public void updateCurrentDeckStatus() {
|
||||
final JLabel btnCurrentDeck = VSubmenuDuels.SINGLETON_INSTANCE.getBtnCurrentDeck();
|
||||
if (SubmenuQuestUtil.getCurrentDeck() == null) {
|
||||
btnCurrentDeck.setBackground(Color.red.darker());
|
||||
@@ -133,12 +159,12 @@ public enum VSubmenuDuels implements IVSubmenu {
|
||||
return pnlTitle;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JPanel} */
|
||||
/** @return {@link forge.view.toolbox.FPanel} */
|
||||
public JPanel getPnlStats() {
|
||||
return pnlStats;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JPanel} */
|
||||
/** @return {@link forge.view.toolbox.FPanel} */
|
||||
public JPanel getPnlStart() {
|
||||
return pnlStart;
|
||||
}
|
||||
@@ -147,32 +173,33 @@ public enum VSubmenuDuels implements IVSubmenu {
|
||||
public JLabel getLblTitle() {
|
||||
return lblTitle;
|
||||
}
|
||||
/** @return {@link javax.swing.FLabel} */
|
||||
|
||||
@Override
|
||||
public FLabel getLblLife() {
|
||||
return lblLife;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.FLabel} */
|
||||
@Override
|
||||
public FLabel getLblCredits() {
|
||||
return lblCredits;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.FLabel} */
|
||||
@Override
|
||||
public FLabel getLblWins() {
|
||||
return lblWins;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.FLabel} */
|
||||
@Override
|
||||
public FLabel getLblLosses() {
|
||||
return lblLosses;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.FLabel} */
|
||||
@Override
|
||||
public FLabel getLblNextChallengeInWins() {
|
||||
return lblNextChallengeInWins;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.FLabel} */
|
||||
@Override
|
||||
public FLabel getLblWinStreak() {
|
||||
return lblWinStreak;
|
||||
}
|
||||
@@ -182,27 +209,27 @@ public enum VSubmenuDuels implements IVSubmenu {
|
||||
return btnCurrentDeck;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.toolbox.FLabel} */
|
||||
@Override
|
||||
public FLabel getBtnBazaar() {
|
||||
return btnBazaar;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.toolbox.FLabel} */
|
||||
@Override
|
||||
public FLabel getBtnSpellShop() {
|
||||
return btnSpellShop;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JCheckBox} */
|
||||
@Override
|
||||
public JCheckBox getCbPlant() {
|
||||
return cbPlant;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JCheckBox} */
|
||||
@Override
|
||||
public JCheckBox getCbZep() {
|
||||
return cbZep;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JComboBox} */
|
||||
@Override
|
||||
public JComboBox getCbxPet() {
|
||||
return cbxPet;
|
||||
}
|
||||
@@ -217,15 +244,15 @@ public enum VSubmenuDuels implements IVSubmenu {
|
||||
pnlStats.removeAll();
|
||||
pnlStats.setOpaque(false);
|
||||
pnlStats.setLayout(new MigLayout("insets 0, gap 0, hidemode 0"));
|
||||
pnlStats.add(btnBazaar, constraints);
|
||||
pnlStats.add(btnSpellShop, constraints);
|
||||
pnlStats.add(lblWins, constraints);
|
||||
pnlStats.add(lblLosses, constraints);
|
||||
pnlStats.add(lblLife, constraints + ", wrap");
|
||||
|
||||
pnlStats.add(btnSpellShop, constraints);
|
||||
pnlStats.add(lblWinStreak, "w 48%!, h 35px!, gap 1% 1% 5px 5px, span 2 1");
|
||||
pnlStats.add(lblCredits, constraints + ", wrap");
|
||||
|
||||
pnlStats.add(btnBazaar, constraints);
|
||||
pnlStats.add(lblWinStreak, "w 48%!, h 35px!, gap 1% 1% 5px 5px, span 2 1");
|
||||
pnlStats.add(lblLife, constraints + ", wrap");
|
||||
|
||||
pnlStats.add(lblNextChallengeInWins, "span 4 1, h 20px!, gap 0 0 5px 5px, ax center, wrap");
|
||||
pnlStats.add(btnCurrentDeck, "span 4 1, w 350px!, h 30px!, gap 0 0 0 5px, ax center");
|
||||
}
|
||||
|
||||
@@ -8,8 +8,9 @@ import javax.swing.SwingConstants;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import forge.gui.home.EMenuGroup;
|
||||
import forge.gui.home.EMenuItem;
|
||||
import forge.gui.home.ICSubmenu;
|
||||
import forge.gui.home.IVSubmenu;
|
||||
import forge.view.home.QuestFileLister;
|
||||
import forge.view.toolbox.FCheckBox;
|
||||
import forge.view.toolbox.FLabel;
|
||||
import forge.view.toolbox.FPanel;
|
||||
@@ -119,7 +120,7 @@ public enum VSubmenuQuestData implements IVSubmenu {
|
||||
* @see forge.view.home.IViewSubmenu#getGroup()
|
||||
*/
|
||||
@Override
|
||||
public EMenuGroup getGroup() {
|
||||
public EMenuGroup getGroupEnum() {
|
||||
return EMenuGroup.QUEST;
|
||||
}
|
||||
|
||||
@@ -131,7 +132,32 @@ public enum VSubmenuQuestData implements IVSubmenu {
|
||||
return pnl;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.home.QuestFileLister} */
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getMenuTitle()
|
||||
*/
|
||||
@Override
|
||||
public String getMenuTitle() {
|
||||
return "New / Load Quest";
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getMenuName()
|
||||
*/
|
||||
@Override
|
||||
public String getItemEnum() {
|
||||
return EMenuItem.QUEST_DATA.toString();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getControl()
|
||||
*/
|
||||
@Override
|
||||
public ICSubmenu getControl() {
|
||||
return CSubmenuQuestData.SINGLETON_INSTANCE;
|
||||
}
|
||||
|
||||
/** @return {@link forge.gui.home.quest.QuestFileLister} */
|
||||
public QuestFileLister getLstQuests() {
|
||||
return this.lstQuests;
|
||||
}
|
||||
|
||||
@@ -5,6 +5,8 @@ import javax.swing.JPanel;
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import forge.game.GameType;
|
||||
import forge.gui.home.EMenuGroup;
|
||||
import forge.gui.home.EMenuItem;
|
||||
import forge.gui.home.ICSubmenu;
|
||||
import forge.gui.home.IVSubmenu;
|
||||
import forge.view.toolbox.DeckLister;
|
||||
import forge.view.toolbox.FLabel;
|
||||
@@ -50,7 +52,7 @@ public enum VSubmenuQuestDecks implements IVSubmenu {
|
||||
* @see forge.view.home.IViewSubmenu#getGroup()
|
||||
*/
|
||||
@Override
|
||||
public EMenuGroup getGroup() {
|
||||
public EMenuGroup getGroupEnum() {
|
||||
return EMenuGroup.QUEST;
|
||||
}
|
||||
|
||||
@@ -62,6 +64,30 @@ public enum VSubmenuQuestDecks implements IVSubmenu {
|
||||
return pnl;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getMenuTitle()
|
||||
*/
|
||||
@Override
|
||||
public String getMenuTitle() {
|
||||
return "Quest Decks";
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getMenuName()
|
||||
*/
|
||||
@Override
|
||||
public String getItemEnum() {
|
||||
return EMenuItem.QUEST_DECKS.toString();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getControl()
|
||||
*/
|
||||
@Override
|
||||
public ICSubmenu getControl() {
|
||||
return CSubmenuQuestDecks.SINGLETON_INSTANCE;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.toolbox.DeckLister} */
|
||||
public DeckLister getLstDecks() {
|
||||
return this.lstDecks;
|
||||
|
||||
@@ -16,6 +16,8 @@ import javax.swing.SwingConstants;
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import forge.Singletons;
|
||||
import forge.gui.home.EMenuGroup;
|
||||
import forge.gui.home.EMenuItem;
|
||||
import forge.gui.home.ICSubmenu;
|
||||
import forge.gui.home.IVSubmenu;
|
||||
import forge.quest.data.QuestPreferences;
|
||||
import forge.quest.data.QuestPreferences.QPref;
|
||||
@@ -129,7 +131,7 @@ public enum VSubmenuQuestPrefs implements IVSubmenu {
|
||||
* @see forge.view.home.IViewSubmenu#getGroup()
|
||||
*/
|
||||
@Override
|
||||
public EMenuGroup getGroup() {
|
||||
public EMenuGroup getGroupEnum() {
|
||||
return EMenuGroup.QUEST;
|
||||
}
|
||||
|
||||
@@ -141,6 +143,30 @@ public enum VSubmenuQuestPrefs implements IVSubmenu {
|
||||
return pnl;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getMenuTitle()
|
||||
*/
|
||||
@Override
|
||||
public String getMenuTitle() {
|
||||
return "Quest Preferences";
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getMenuName()
|
||||
*/
|
||||
@Override
|
||||
public String getItemEnum() {
|
||||
return EMenuItem.QUEST_PREFS.toString();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getControl()
|
||||
*/
|
||||
@Override
|
||||
public ICSubmenu getControl() {
|
||||
return CSubmenuQuestPrefs.SINGLETON_INSTANCE;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JLabel} */
|
||||
public JLabel getLblErrRewards() {
|
||||
return lblErrRewards;
|
||||
|
||||
@@ -2,18 +2,15 @@ package forge.gui.home.settings;
|
||||
|
||||
import java.awt.event.ItemEvent;
|
||||
import java.awt.event.ItemListener;
|
||||
|
||||
import javax.swing.ImageIcon;
|
||||
import javax.swing.SwingWorker;
|
||||
import javax.swing.event.ListSelectionEvent;
|
||||
import javax.swing.event.ListSelectionListener;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
|
||||
import org.apache.commons.lang3.text.WordUtils;
|
||||
|
||||
import forge.Command;
|
||||
import forge.Constant;
|
||||
import forge.Singletons;
|
||||
import forge.control.FControl;
|
||||
import forge.control.RestartUtil;
|
||||
import forge.gui.home.ICSubmenu;
|
||||
import forge.properties.ForgePreferences;
|
||||
import forge.properties.ForgePreferences.FPref;
|
||||
@@ -39,10 +36,9 @@ public enum CSubmenuPreferences implements ICSubmenu {
|
||||
final VSubmenuPreferences view = VSubmenuPreferences.SINGLETON_INSTANCE;
|
||||
final ForgePreferences prefs = Singletons.getModel().getPreferences();
|
||||
|
||||
view.getLstChooseSkin().addListSelectionListener(new ListSelectionListener() {
|
||||
view.getLstChooseSkin().addMouseListener(new MouseAdapter() {
|
||||
@Override
|
||||
public void valueChanged(ListSelectionEvent e) {
|
||||
if (e.getValueIsAdjusting()) { return; }
|
||||
public void mouseClicked(final MouseEvent e) {
|
||||
updateSkin();
|
||||
}
|
||||
});
|
||||
@@ -145,7 +141,7 @@ public enum CSubmenuPreferences implements ICSubmenu {
|
||||
@Override
|
||||
public void execute() {
|
||||
Singletons.getModel().getPreferences().reset();
|
||||
Singletons.getView().getViewHome().resetSettings();
|
||||
update();
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -199,30 +195,16 @@ public enum CSubmenuPreferences implements ICSubmenu {
|
||||
private void updateSkin() {
|
||||
final VSubmenuPreferences view = VSubmenuPreferences.SINGLETON_INSTANCE;
|
||||
final ForgePreferences prefs = Singletons.getModel().getPreferences();
|
||||
|
||||
view.getLblTitleSkin().setText(" Loading...");
|
||||
view.getLblTitleSkin().setIcon(new ImageIcon("res/images/skins/default/loader.gif"));
|
||||
|
||||
final String name = view.getLstChooseSkin().getSelectedValue().toString();
|
||||
|
||||
final SwingWorker<Object, Object> w = new SwingWorker<Object, Object>() {
|
||||
@Override
|
||||
public String doInBackground() {
|
||||
FSkin.loadLight(name);
|
||||
FSkin.loadFull();
|
||||
if (name.equals(prefs.getPref(FPref.UI_SKIN))) { return; }
|
||||
|
||||
RestartUtil.restartApplication(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
prefs.setPref(FPref.UI_SKIN, name);
|
||||
prefs.save();
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void done() {
|
||||
Singletons.getView().instantiateCachedUIStates();
|
||||
Singletons.getControl().changeState(FControl.HOME_SCREEN);
|
||||
Singletons.getView().getViewHome().showSettingsMenu();
|
||||
}
|
||||
};
|
||||
w.execute();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,23 +1,22 @@
|
||||
package forge.gui.home.settings;
|
||||
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.Image;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.ImageIcon;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JScrollPane;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import forge.PlayerType;
|
||||
import forge.Command;
|
||||
import forge.Singletons;
|
||||
import forge.gui.home.EMenuGroup;
|
||||
import forge.gui.home.EMenuItem;
|
||||
import forge.gui.home.ICSubmenu;
|
||||
import forge.gui.home.IVSubmenu;
|
||||
import forge.properties.ForgePreferences.FPref;
|
||||
import forge.view.toolbox.FLabel;
|
||||
import forge.view.toolbox.FScrollPane;
|
||||
import forge.view.toolbox.FSkin;
|
||||
import forge.view.toolbox.WrapLayout;
|
||||
@@ -33,8 +32,10 @@ public enum VSubmenuAvatars implements IVSubmenu {
|
||||
private final JPanel pnl = new JPanel();
|
||||
private final JPanel pnlAvatars = new JPanel();
|
||||
|
||||
private AvatarLabel avatarHuman, avatarAI;
|
||||
private List<AvatarLabel> lstAvatars;
|
||||
private final FLabel lblAvatarHuman = new FLabel.Builder().hoverable(true).selectable(true)
|
||||
.iconScaleFactor(0.99f).iconInBackground(true).build();
|
||||
private final FLabel lblAvatarAI = new FLabel.Builder().hoverable(true).selectable(true)
|
||||
.iconScaleFactor(0.99f).iconInBackground(true).build();
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.view.home.IViewSubmenu#populate()
|
||||
@@ -55,7 +56,7 @@ public enum VSubmenuAvatars implements IVSubmenu {
|
||||
* @see forge.view.home.IViewSubmenu#getGroup()
|
||||
*/
|
||||
@Override
|
||||
public EMenuGroup getGroup() {
|
||||
public EMenuGroup getGroupEnum() {
|
||||
return EMenuGroup.SETTINGS;
|
||||
}
|
||||
|
||||
@@ -67,162 +68,117 @@ public enum VSubmenuAvatars implements IVSubmenu {
|
||||
return pnl;
|
||||
}
|
||||
|
||||
private void populateAvatars() {
|
||||
pnlAvatars.removeAll();
|
||||
pnlAvatars.setLayout(new WrapLayout());
|
||||
pnlAvatars.setOpaque(false);
|
||||
|
||||
lstAvatars = new ArrayList<AvatarLabel>();
|
||||
int counter = 0;
|
||||
for (final Image i : FSkin.getAvatars().values()) {
|
||||
lstAvatars.add(new AvatarLabel(i, counter++));
|
||||
pnlAvatars.add(lstAvatars.get(lstAvatars.size() - 1));
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getMenuTitle()
|
||||
*/
|
||||
@Override
|
||||
public String getMenuTitle() {
|
||||
return "Avatars";
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getMenuName()
|
||||
*/
|
||||
@Override
|
||||
public String getItemEnum() {
|
||||
return EMenuItem.SETTINGS_AVATARS.toString();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getControl()
|
||||
*/
|
||||
@Override
|
||||
public ICSubmenu getControl() {
|
||||
return CSubmenuAvatars.SINGLETON_INSTANCE;
|
||||
}
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
private void populateAvatars() {
|
||||
final Map<Integer, Image> avatarMap = FSkin.getAvatars();
|
||||
final JPanel pnlAvatarPics = new JPanel(new WrapLayout());
|
||||
final JPanel pnlAvatarUsers = new JPanel(new MigLayout("insets 0, gap 0, align center"));
|
||||
|
||||
pnlAvatars.setOpaque(false);
|
||||
pnlAvatarUsers.setOpaque(false);
|
||||
pnlAvatarPics.setOpaque(false);
|
||||
|
||||
pnlAvatarUsers.add(new FLabel.Builder().fontSize(12).text("Human").build(),
|
||||
"w 100px!, h 20px!, gap 0 20px 0 0");
|
||||
pnlAvatarUsers.add(new FLabel.Builder().fontSize(12).text("AI").build(),
|
||||
"w 100px!, h 20px!, wrap");
|
||||
|
||||
pnlAvatarUsers.add(lblAvatarHuman, "w 100px!, h 100px!, gap 0 20px 0 0");
|
||||
pnlAvatarUsers.add(lblAvatarAI, "w 100px!, h 100px!");
|
||||
|
||||
for (final Integer i : avatarMap.keySet()) {
|
||||
pnlAvatarPics.add(makeAvatarLabel(avatarMap.get(i), i));
|
||||
}
|
||||
|
||||
pnlAvatars.removeAll();
|
||||
pnlAvatars.setLayout(new MigLayout("insets 0, gap 0"));
|
||||
pnlAvatars.add(pnlAvatarUsers, "w 90%!, h 150px!, wrap");
|
||||
pnlAvatars.add(new FScrollPane(pnlAvatarPics,
|
||||
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER),
|
||||
"w 90%!, pushy, growy, gap 5% 0 0 0");
|
||||
|
||||
final Command cmdHuman = new Command() { @Override
|
||||
public void execute() { lblAvatarAI.setSelected(false); } };
|
||||
|
||||
final Command cmdAI = new Command() { @Override
|
||||
public void execute() { lblAvatarHuman.setSelected(false); } };
|
||||
|
||||
lblAvatarHuman.setCommand(cmdHuman);
|
||||
lblAvatarAI.setCommand(cmdAI);
|
||||
|
||||
lblAvatarHuman.setSelected(true);
|
||||
|
||||
final String[] indexes = Singletons.getModel().getPreferences().getPref(FPref.UI_AVATARS).split(",");
|
||||
int humanIndex = Integer.parseInt(indexes[0]);
|
||||
int aiIndex = Integer.parseInt(indexes[1]);
|
||||
|
||||
// Set human avatar from preferences
|
||||
if (humanIndex >= lstAvatars.size()) {
|
||||
humanIndex = (int) (Math.random() * (lstAvatars.size() - 1));
|
||||
}
|
||||
if (humanIndex >= FSkin.getAvatars().size()) { humanIndex = 0; }
|
||||
if (aiIndex >= FSkin.getAvatars().size()) { aiIndex = 0; }
|
||||
|
||||
avatarHuman = lstAvatars.get(humanIndex);
|
||||
avatarHuman.setOwner(PlayerType.HUMAN);
|
||||
avatarHuman.repaintOnlyThisLabel();
|
||||
lblAvatarHuman.setIcon(new ImageIcon(FSkin.getAvatars().get(humanIndex)));
|
||||
lblAvatarAI.setIcon(new ImageIcon(FSkin.getAvatars().get(aiIndex)));
|
||||
|
||||
if (humanIndex == aiIndex || aiIndex >= lstAvatars.size()) {
|
||||
aiIndex = humanIndex;
|
||||
while (aiIndex == humanIndex) {
|
||||
aiIndex = (int) (Math.random() * (lstAvatars.size() - 1));
|
||||
}
|
||||
}
|
||||
|
||||
avatarAI = lstAvatars.get(aiIndex);
|
||||
avatarAI.setOwner(PlayerType.COMPUTER);
|
||||
avatarAI.repaintOnlyThisLabel();
|
||||
Singletons.getModel().getPreferences().setPref(FPref.UI_AVATARS, aiIndex + "," + humanIndex);
|
||||
Singletons.getModel().getPreferences().save();
|
||||
}
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
private class AvatarLabel extends JLabel {
|
||||
private final Image img;
|
||||
private final int index;
|
||||
private PlayerType owner;
|
||||
private boolean hovered = false;
|
||||
private FLabel makeAvatarLabel(final Image img0, final int index0) {
|
||||
final FLabel lbl = new FLabel.Builder().icon(new ImageIcon(img0)).iconScaleFactor(1.0)
|
||||
.iconAlpha(0.7f).iconInBackground(true).hoverable(true).build();
|
||||
|
||||
public AvatarLabel(final Image img0, final int index0) {
|
||||
super();
|
||||
img = img0;
|
||||
index = index0;
|
||||
setMaximumSize(new Dimension(100, 120));
|
||||
setMinimumSize(new Dimension(100, 120));
|
||||
setPreferredSize(new Dimension(100, 120));
|
||||
final Dimension size = new Dimension(100, 100);
|
||||
lbl.setPreferredSize(size);
|
||||
lbl.setMaximumSize(size);
|
||||
lbl.setMinimumSize(size);
|
||||
|
||||
this.addMouseListener(new MouseAdapter() {
|
||||
final Command cmd = new Command() {
|
||||
@Override
|
||||
public void mouseEntered(final MouseEvent evt) { hovered = true; repaintOnlyThisLabel(); }
|
||||
public void execute() {
|
||||
String[] indices = Singletons.getModel().getPreferences()
|
||||
.getPref(FPref.UI_AVATARS).split(",");
|
||||
|
||||
@Override
|
||||
public void mouseExited(final MouseEvent evt) { hovered = false; repaintOnlyThisLabel(); }
|
||||
|
||||
@Override
|
||||
public void mouseClicked(final MouseEvent evt) { cycleOwner(AvatarLabel.this); repaintOnlyThisLabel(); }
|
||||
});
|
||||
}
|
||||
|
||||
public void setOwner(final PlayerType player0) {
|
||||
this.owner = player0;
|
||||
}
|
||||
|
||||
public PlayerType getOwner() {
|
||||
return this.owner;
|
||||
}
|
||||
|
||||
public int getIndex() {
|
||||
return this.index;
|
||||
}
|
||||
|
||||
public void repaintOnlyThisLabel() {
|
||||
final Dimension d = AvatarLabel.this.getSize();
|
||||
repaint(0, 0, d.width, d.height);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void paintComponent(final Graphics graphics0) {
|
||||
if (hovered) {
|
||||
graphics0.setColor(FSkin.getColor(FSkin.Colors.CLR_HOVER));
|
||||
graphics0.fillRect(0, 0, 100, 120);
|
||||
}
|
||||
|
||||
graphics0.drawImage(img, 0, 20, null);
|
||||
if (owner == null) { return; }
|
||||
|
||||
graphics0.setColor(FSkin.getColor(FSkin.Colors.CLR_TEXT));
|
||||
graphics0.drawRect(0, 0, 99, 119);
|
||||
graphics0.setFont(FSkin.getBoldFont(14));
|
||||
graphics0.drawString(owner.toString(), 5, 15);
|
||||
}
|
||||
}
|
||||
|
||||
/** Surprisingly complicated - be careful when modifying! */
|
||||
private void cycleOwner(final AvatarLabel lbl0) {
|
||||
if (lbl0.getOwner() == null) {
|
||||
lbl0.setOwner(PlayerType.HUMAN);
|
||||
lbl0.repaintOnlyThisLabel();
|
||||
|
||||
if (avatarHuman != null) {
|
||||
avatarHuman.setOwner(null);
|
||||
avatarHuman.repaintOnlyThisLabel();
|
||||
}
|
||||
|
||||
avatarHuman = lbl0;
|
||||
}
|
||||
else if (lbl0.getOwner() == PlayerType.HUMAN) {
|
||||
// Re-assign avatar to human
|
||||
avatarHuman.setOwner(null);
|
||||
avatarHuman.repaintOnlyThisLabel();
|
||||
|
||||
for (int i = 0; i < lstAvatars.size(); i++) {
|
||||
if (lstAvatars.get(i) != lbl0) {
|
||||
avatarHuman = lstAvatars.get(i);
|
||||
avatarHuman.setOwner(PlayerType.HUMAN);
|
||||
avatarHuman.repaintOnlyThisLabel();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Assign computer
|
||||
lbl0.setOwner(PlayerType.COMPUTER);
|
||||
lbl0.repaintOnlyThisLabel();
|
||||
|
||||
if (avatarAI != null) {
|
||||
avatarAI.setOwner(null);
|
||||
avatarAI.repaintOnlyThisLabel();
|
||||
}
|
||||
|
||||
avatarAI = lbl0;
|
||||
if (lblAvatarAI.isSelected()) {
|
||||
lblAvatarAI.setIcon(new ImageIcon(FSkin.getAvatars().get(index0)));
|
||||
lblAvatarAI.repaintOnlyThisLabel();
|
||||
indices[0] = String.valueOf(index0);
|
||||
}
|
||||
else {
|
||||
lbl0.setOwner(null);
|
||||
lbl0.repaintOnlyThisLabel();
|
||||
|
||||
// Re-assign avatar to computer
|
||||
avatarAI.setOwner(null);
|
||||
avatarAI.repaintOnlyThisLabel();
|
||||
|
||||
for (int i = 0; i < lstAvatars.size(); i++) {
|
||||
if (lstAvatars.get(i) != avatarHuman) {
|
||||
avatarAI = lstAvatars.get(i);
|
||||
avatarAI.setOwner(PlayerType.COMPUTER);
|
||||
avatarAI.repaintOnlyThisLabel();
|
||||
break;
|
||||
}
|
||||
}
|
||||
lblAvatarHuman.setIcon(new ImageIcon(FSkin.getAvatars().get(index0)));
|
||||
lblAvatarHuman.repaintOnlyThisLabel();
|
||||
indices[1] = String.valueOf(index0);
|
||||
}
|
||||
|
||||
Singletons.getModel().getPreferences().setPref(
|
||||
FPref.UI_AVATARS, avatarHuman.getIndex() + "," + avatarAI.getIndex());
|
||||
Singletons.getModel().getPreferences().setPref(FPref.UI_AVATARS, indices[0] + "," + indices[1]);
|
||||
Singletons.getModel().getPreferences().save();
|
||||
}
|
||||
};
|
||||
|
||||
lbl.setCommand(cmd);
|
||||
return lbl;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,6 +29,8 @@ import forge.Singletons;
|
||||
import forge.control.KeyboardShortcuts;
|
||||
import forge.control.KeyboardShortcuts.Shortcut;
|
||||
import forge.gui.home.EMenuGroup;
|
||||
import forge.gui.home.EMenuItem;
|
||||
import forge.gui.home.ICSubmenu;
|
||||
import forge.gui.home.IVSubmenu;
|
||||
import forge.properties.ForgeProps;
|
||||
import forge.properties.NewConstants.Lang.OldGuiNewGame.NewGameText;
|
||||
@@ -154,7 +156,7 @@ public enum VSubmenuPreferences implements IVSubmenu {
|
||||
* @see forge.view.home.IViewSubmenu#getGroup()
|
||||
*/
|
||||
@Override
|
||||
public EMenuGroup getGroup() {
|
||||
public EMenuGroup getGroupEnum() {
|
||||
return EMenuGroup.SETTINGS;
|
||||
}
|
||||
|
||||
@@ -166,6 +168,30 @@ public enum VSubmenuPreferences implements IVSubmenu {
|
||||
return pnl;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getMenuTitle()
|
||||
*/
|
||||
@Override
|
||||
public String getMenuTitle() {
|
||||
return "Preferences";
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getMenuName()
|
||||
*/
|
||||
@Override
|
||||
public String getItemEnum() {
|
||||
return EMenuItem.SETTINGS_PREFS.toString();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getControl()
|
||||
*/
|
||||
@Override
|
||||
public ICSubmenu getControl() {
|
||||
return CSubmenuPreferences.SINGLETON_INSTANCE;
|
||||
}
|
||||
|
||||
/** Consolidates checkbox styling in one place. */
|
||||
@SuppressWarnings("serial")
|
||||
private class OptionsCheckBox extends JCheckBox {
|
||||
@@ -349,11 +375,6 @@ public enum VSubmenuPreferences implements IVSubmenu {
|
||||
return cbDevMode;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.FLabel} */
|
||||
public FLabel getLblTitleSkin() {
|
||||
return lblTitleSkin;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.toolbox.FLabel} */
|
||||
public FLabel getBtnReset() {
|
||||
return btnReset;
|
||||
|
||||
@@ -59,22 +59,13 @@ public enum CSubmenuDeckEditor implements ICSubmenu {
|
||||
editor = (DeckEditorBase<?, T>) new DeckEditorLimited(Singletons.getModel().getDecks().getSealed());
|
||||
}
|
||||
|
||||
|
||||
final Command exit = new Command() {
|
||||
private static final long serialVersionUID = -9133358399503226853L;
|
||||
|
||||
@Override
|
||||
public void execute() {
|
||||
Singletons.getControl().getControlHome().getControlConstructed().updateDeckLists();
|
||||
}
|
||||
};
|
||||
|
||||
editor.show(exit);
|
||||
editor.show(null);
|
||||
|
||||
if (d0 != null) {
|
||||
editor.getController().setModel(d0);
|
||||
}
|
||||
|
||||
editor.setAlwaysOnTop(true);
|
||||
editor.setVisible(true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,8 @@ import javax.swing.JPanel;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import forge.gui.home.EMenuGroup;
|
||||
import forge.gui.home.EMenuItem;
|
||||
import forge.gui.home.ICSubmenu;
|
||||
import forge.gui.home.IVSubmenu;
|
||||
import forge.view.toolbox.FLabel;
|
||||
|
||||
@@ -35,7 +37,7 @@ public enum VSubmenuDeckEditor implements IVSubmenu {
|
||||
* @see forge.view.home.IViewSubmenu#getGroup()
|
||||
*/
|
||||
@Override
|
||||
public EMenuGroup getGroup() {
|
||||
public EMenuGroup getGroupEnum() {
|
||||
return EMenuGroup.UTILITIES;
|
||||
}
|
||||
|
||||
@@ -46,4 +48,28 @@ public enum VSubmenuDeckEditor implements IVSubmenu {
|
||||
public JPanel getPanel() {
|
||||
return pnl;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getMenuTitle()
|
||||
*/
|
||||
@Override
|
||||
public String getMenuTitle() {
|
||||
return "Deck Editor";
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getMenuName()
|
||||
*/
|
||||
@Override
|
||||
public String getItemEnum() {
|
||||
return EMenuItem.UTILITIES_EDITOR.toString();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getControl()
|
||||
*/
|
||||
@Override
|
||||
public ICSubmenu getControl() {
|
||||
return CSubmenuDeckEditor.SINGLETON_INSTANCE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,6 +20,8 @@ import javax.swing.text.StyledDocument;
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import forge.gui.GuiUtils;
|
||||
import forge.gui.home.EMenuGroup;
|
||||
import forge.gui.home.EMenuItem;
|
||||
import forge.gui.home.ICSubmenu;
|
||||
import forge.gui.home.IVSubmenu;
|
||||
import forge.properties.ForgeProps;
|
||||
import forge.properties.NewConstants.Lang;
|
||||
@@ -123,7 +125,7 @@ public enum VSubmenuUtilities implements IVSubmenu {
|
||||
* @see forge.view.home.IViewSubmenu#getGroup()
|
||||
*/
|
||||
@Override
|
||||
public EMenuGroup getGroup() {
|
||||
public EMenuGroup getGroupEnum() {
|
||||
return EMenuGroup.UTILITIES;
|
||||
}
|
||||
|
||||
@@ -265,4 +267,28 @@ public enum VSubmenuUtilities implements IVSubmenu {
|
||||
overlay.add(scr);
|
||||
overlay.showOverlay();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getMenuTitle()
|
||||
*/
|
||||
@Override
|
||||
public String getMenuTitle() {
|
||||
return "Content Downloaders";
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getMenuName()
|
||||
*/
|
||||
@Override
|
||||
public String getItemEnum() {
|
||||
return EMenuItem.UTILITIES_DOWNLOADS.toString();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.IVSubmenu#getControl()
|
||||
*/
|
||||
@Override
|
||||
public ICSubmenu getControl() {
|
||||
return CSubmenuUtilities.SINGLETON_INSTANCE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,9 +50,9 @@ import forge.properties.NewConstants;
|
||||
import forge.quest.data.QuestEventManager;
|
||||
import forge.quest.data.QuestPreferences;
|
||||
import forge.util.FileUtil;
|
||||
import forge.util.StorageView;
|
||||
import forge.util.HttpUtil;
|
||||
import forge.util.IStorageView;
|
||||
import forge.util.StorageView;
|
||||
import forge.view.match.ViewField;
|
||||
import forge.view.match.ViewTabber;
|
||||
import forge.view.toolbox.FSkin;
|
||||
@@ -108,7 +108,7 @@ public enum FModel {
|
||||
final boolean deleteSucceeded = logFile.delete();
|
||||
|
||||
if (logFile.exists() && !deleteSucceeded && (logFile.length() != 0)) {
|
||||
throw new IllegalStateException("Could not delete existing logFile:" + logFile.getAbsolutePath());
|
||||
// throw new IllegalStateException("Could not delete existing logFile:" + logFile.getAbsolutePath());
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
@@ -26,6 +26,8 @@ import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import forge.gui.home.EMenuItem;
|
||||
|
||||
/**
|
||||
* Holds default preference values in an enum.
|
||||
* Loads preferred values when instantiated.
|
||||
@@ -60,7 +62,12 @@ public class ForgePreferences {
|
||||
UI_BUGZ_PWD (""), /** */
|
||||
UI_ANTE ("false"), /** */
|
||||
UI_SKIN ("default"), /** */
|
||||
UI_HOMEMENU (HomeMenus.constructed.toString()), /** */
|
||||
|
||||
SUBMENU_CURRENTMENU (EMenuItem.CONSTRUCTED.toString()), /** */
|
||||
SUBMENU_SANCTIONED ("false"), /** */
|
||||
SUBMENU_QUEST ("false"), /** */
|
||||
SUBMENU_SETTINGS ("false"), /** */
|
||||
SUBMENU_UTILITIES ("false"), /** */
|
||||
|
||||
DEV_MODE_ENABLED ("false"), /** */
|
||||
DEV_MILLING_LOSS ("true"), /** */
|
||||
|
||||
@@ -26,8 +26,6 @@ import javax.swing.SwingUtilities;
|
||||
|
||||
import forge.Singletons;
|
||||
import forge.control.FControl;
|
||||
import forge.properties.ForgePreferences;
|
||||
import forge.properties.ForgePreferences.FPref;
|
||||
import forge.view.toolbox.FOverlay;
|
||||
import forge.view.toolbox.FSkin;
|
||||
|
||||
@@ -44,14 +42,10 @@ public enum FView {
|
||||
private final FOverlay overlay = new FOverlay();
|
||||
|
||||
private SplashFrame splash;
|
||||
private ViewHomeUI home = null;
|
||||
private ViewMatchUI match = null;
|
||||
private ViewEditorUI editor = null;
|
||||
private ViewBazaarUI bazaar = null;
|
||||
|
||||
//private static final JLayeredPane lpnContent;
|
||||
//private static final FControl control;
|
||||
|
||||
/** The splash frame is guaranteed to exist when this constructor exits. */
|
||||
private FView() {
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@@ -94,21 +88,6 @@ public enum FView {
|
||||
FView.this.splash = null;
|
||||
|
||||
frame.setVisible(true);
|
||||
|
||||
// Open previous menu on first run, or constructed.
|
||||
// Focus is reset when the frame becomes visible,
|
||||
// so the call to show the menu must happen here.
|
||||
final ForgePreferences.HomeMenus lastMenu =
|
||||
ForgePreferences.HomeMenus.valueOf(Singletons.getModel().getPreferences().getPref(FPref.UI_HOMEMENU));
|
||||
|
||||
switch(lastMenu) {
|
||||
case draft: Singletons.getView().getViewHome().showDraftMenu(); break;
|
||||
case sealed: Singletons.getView().getViewHome().showSealedMenu(); break;
|
||||
case quest: Singletons.getView().getViewHome().showQuestMenu(); break;
|
||||
case settings: Singletons.getView().getViewHome().showSettingsMenu(); break;
|
||||
case utilities: Singletons.getView().getViewHome().showUtilitiesMenu(); break;
|
||||
default: Singletons.getView().getViewHome().showConstructedMenu();
|
||||
}
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JLayeredPane} */
|
||||
@@ -126,15 +105,6 @@ public enum FView {
|
||||
return FView.this.overlay;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.ViewHomeUI} */
|
||||
public ViewHomeUI getViewHome() {
|
||||
if (Singletons.getControl().getState() != FControl.HOME_SCREEN) {
|
||||
throw new IllegalArgumentException("FView$getViewHome\n"
|
||||
+ "may only be called while the home UI is showing.");
|
||||
}
|
||||
return FView.this.home;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.ViewMatchUI} */
|
||||
public ViewMatchUI getViewMatch() {
|
||||
if (Singletons.getControl().getState() != FControl.MATCH_SCREEN) {
|
||||
@@ -164,9 +134,9 @@ public enum FView {
|
||||
|
||||
/** Like it says. */
|
||||
public void instantiateCachedUIStates() {
|
||||
FView.this.home = new ViewHomeUI();
|
||||
FView.this.match = new ViewMatchUI();
|
||||
FView.this.editor = new ViewEditorUI();
|
||||
FView.this.bazaar = new ViewBazaarUI();
|
||||
ViewHomeUI.SINGLETON_INSTANCE.initialize();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,371 +17,303 @@
|
||||
*/
|
||||
package forge.view;
|
||||
|
||||
import java.awt.CardLayout;
|
||||
import java.awt.Component;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ComponentAdapter;
|
||||
import java.awt.event.ComponentEvent;
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.SortedMap;
|
||||
import java.util.TreeMap;
|
||||
|
||||
import javax.swing.AbstractAction;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.BorderFactory;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.SwingConstants;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.border.EmptyBorder;
|
||||
import javax.swing.border.MatteBorder;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import forge.AllZone;
|
||||
import forge.Command;
|
||||
import forge.Singletons;
|
||||
import forge.control.ControlHomeUI;
|
||||
import forge.game.GameType;
|
||||
import forge.gui.home.EMenuGroup;
|
||||
import forge.gui.home.EMenuItem;
|
||||
import forge.gui.home.IVSubmenu;
|
||||
import forge.gui.home.limited.VSubmenuConstructed;
|
||||
import forge.gui.home.limited.VSubmenuDraft;
|
||||
import forge.gui.home.limited.VSubmenuSealed;
|
||||
import forge.gui.home.quest.VSubmenuChallenges;
|
||||
import forge.gui.home.quest.VSubmenuDuels;
|
||||
import forge.gui.home.quest.VSubmenuQuestData;
|
||||
import forge.gui.home.quest.VSubmenuQuestDecks;
|
||||
import forge.gui.home.quest.VSubmenuQuestPrefs;
|
||||
import forge.gui.home.settings.VSubmenuAvatars;
|
||||
import forge.gui.home.settings.VSubmenuPreferences;
|
||||
import forge.gui.home.utilities.VSubmenuDeckEditor;
|
||||
import forge.gui.home.utilities.VSubmenuUtilities;
|
||||
import forge.properties.ForgePreferences;
|
||||
import forge.properties.ForgePreferences.FPref;
|
||||
import forge.view.home.ViewConstructed;
|
||||
import forge.view.home.ViewDraft;
|
||||
import forge.view.home.ViewQuest;
|
||||
import forge.view.home.ViewSealed;
|
||||
import forge.view.home.ViewSettings;
|
||||
import forge.view.home.ViewUtilities;
|
||||
import forge.view.toolbox.FButton;
|
||||
import forge.properties.ForgeProps;
|
||||
import forge.properties.NewConstants;
|
||||
import forge.quest.data.QuestDataIO;
|
||||
import forge.quest.data.QuestPreferences.QPref;
|
||||
import forge.view.toolbox.FLabel;
|
||||
import forge.view.toolbox.FPanel;
|
||||
import forge.view.toolbox.FScrollPane;
|
||||
import forge.view.toolbox.FSkin;
|
||||
|
||||
/**
|
||||
* - Lays out containers and borders for main menu and submenus<br>
|
||||
* - Instantiates top-level controller for submenus.<br>
|
||||
* - Has access methods for all child controllers<br>
|
||||
*
|
||||
/** Singleton instance of home screen UI.
|
||||
* Use "getPanel()" to work with the main container.
|
||||
* <br><br>
|
||||
* Generates a card layout with grouped submenus automatically.<br>
|
||||
* To add a menu to the home UI:<br>
|
||||
* - Register its name in the EMenuItem enum<br>
|
||||
* - Build a view implementing IVSubmenu<br>
|
||||
* - Build a controller impelementing ICSubmenu<br>
|
||||
* - Add its singleton instance to the map storing the views for the card layout.
|
||||
*/
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
public class ViewHomeUI extends FPanel {
|
||||
private JPanel pnlMenu, pnlContent;
|
||||
private FButton btnDraft, btnConstructed, btnSealed, btnQuest, btnSettings, btnUtilities, btnExit, btnDeckEditor;
|
||||
private String constraints;
|
||||
private ControlHomeUI control;
|
||||
public enum ViewHomeUI {
|
||||
/** */
|
||||
SINGLETON_INSTANCE;
|
||||
|
||||
private ViewConstructed constructed;
|
||||
private ViewSealed sealed;
|
||||
private ViewDraft draft;
|
||||
private ViewQuest quest;
|
||||
private ViewSettings settings;
|
||||
private ViewUtilities utilities;
|
||||
private final CardLayout cards = new CardLayout();
|
||||
private final FPanel pnlParent = new FPanel();
|
||||
private final FPanel pnlLeft = new FPanel();
|
||||
private final FPanel pnlRight = new FPanel(cards);
|
||||
private final JPanel pnlMenu = new JPanel();
|
||||
|
||||
private final int insets = 10;
|
||||
private final int menuWidthPx = 350;
|
||||
private final int leftWidthPx = 250;
|
||||
private final List<IVSubmenu> allSubmenus = new ArrayList<IVSubmenu>();
|
||||
private final Map<EMenuItem, FLabel> allSubmenuLabels = new HashMap<EMenuItem, FLabel>();
|
||||
private FLabel lblPreviousSelected;
|
||||
|
||||
/**
|
||||
* Instantiates a new home top level.
|
||||
*/
|
||||
public ViewHomeUI() {
|
||||
super();
|
||||
/** Mostly, assembles child singletons for the home screen UI. */
|
||||
public void initialize() {
|
||||
// There's d a better home for this (model?)
|
||||
final File dirQuests = ForgeProps.getFile(NewConstants.Quest.DATA_DIR);
|
||||
final String questname = Singletons.getModel()
|
||||
.getQuestPreferences().getPreference(QPref.CURRENT_QUEST);
|
||||
final File data = new File(dirQuests.getPath() + File.separator + questname);
|
||||
|
||||
constructed = new ViewConstructed();
|
||||
sealed = new ViewSealed();
|
||||
draft = new ViewDraft();
|
||||
quest = new ViewQuest();
|
||||
settings = new ViewSettings();
|
||||
utilities = new ViewUtilities();
|
||||
if (data.exists()) {
|
||||
AllZone.setQuestData(QuestDataIO.loadData(data));
|
||||
}
|
||||
//////////////////////////////
|
||||
this.setCornerDiameter(0);
|
||||
this.setBorderToggle(false);
|
||||
this.setBackgroundTexture(FSkin.getIcon(FSkin.Backgrounds.BG_TEXTURE));
|
||||
this.setLayout(null);
|
||||
this.addComponentListener(new ComponentAdapter() {
|
||||
|
||||
|
||||
// Add new menu items here (order doesn't matter).
|
||||
allSubmenus.clear();
|
||||
allSubmenus.add(VSubmenuConstructed.SINGLETON_INSTANCE);
|
||||
allSubmenus.add(VSubmenuDraft.SINGLETON_INSTANCE);
|
||||
allSubmenus.add(VSubmenuSealed.SINGLETON_INSTANCE);
|
||||
|
||||
allSubmenus.add(VSubmenuDuels.SINGLETON_INSTANCE);
|
||||
allSubmenus.add(VSubmenuChallenges.SINGLETON_INSTANCE);
|
||||
allSubmenus.add(VSubmenuQuestDecks.SINGLETON_INSTANCE);
|
||||
allSubmenus.add(VSubmenuQuestData.SINGLETON_INSTANCE);
|
||||
allSubmenus.add(VSubmenuQuestPrefs.SINGLETON_INSTANCE);
|
||||
|
||||
allSubmenus.add(VSubmenuPreferences.SINGLETON_INSTANCE);
|
||||
allSubmenus.add(VSubmenuAvatars.SINGLETON_INSTANCE);
|
||||
|
||||
allSubmenus.add(VSubmenuDeckEditor.SINGLETON_INSTANCE);
|
||||
allSubmenus.add(VSubmenuUtilities.SINGLETON_INSTANCE);
|
||||
|
||||
// Parent layout
|
||||
pnlParent.setCornerDiameter(0);
|
||||
pnlParent.setBorderToggle(false);
|
||||
pnlParent.setBackgroundTexture(FSkin.getIcon(FSkin.Backgrounds.BG_TEXTURE));
|
||||
pnlParent.setLayout(null);
|
||||
|
||||
pnlParent.add(pnlLeft);
|
||||
pnlParent.add(pnlRight);
|
||||
|
||||
// Left pane holds scroller with menu panel.
|
||||
final FScrollPane scrMenu = new FScrollPane(pnlMenu,
|
||||
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
|
||||
scrMenu.setBorder(null);
|
||||
|
||||
pnlLeft.setLayout(new MigLayout("insets 0, gap 0, align center, wrap"));
|
||||
pnlLeft.add(new FLabel.Builder().icon(FSkin.getIcon(FSkin.ForgeIcons.ICO_LOGO))
|
||||
.iconScaleFactor(1.0f).build(), "w 150px!, h 150px!, align center");
|
||||
|
||||
pnlLeft.add(scrMenu, "pushy, growy, w 98%!, gap 1% 0 1% 0");
|
||||
|
||||
populateMenu();
|
||||
|
||||
// Select previous
|
||||
EMenuItem selected = null;
|
||||
try {
|
||||
selected = EMenuItem.valueOf(Singletons.getModel()
|
||||
.getPreferences().getPref(FPref.SUBMENU_CURRENTMENU));
|
||||
} catch (final Exception e) { }
|
||||
|
||||
if (selected != null && allSubmenuLabels.get(selected) != null) {
|
||||
itemClick(selected);
|
||||
}
|
||||
else {
|
||||
itemClick(EMenuItem.CONSTRUCTED);
|
||||
}
|
||||
|
||||
pnlParent.addComponentListener(new ComponentAdapter() {
|
||||
public void componentResized(ComponentEvent e) {
|
||||
int w = getWidth();
|
||||
int h = getHeight();
|
||||
pnlContent.setBounds(new Rectangle(
|
||||
2 * insets + menuWidthPx, insets,
|
||||
w - menuWidthPx - 3 * insets, h - 2 * insets));
|
||||
pnlMenu.setBounds(new Rectangle(
|
||||
@Override
|
||||
public void componentResized(final ComponentEvent e) {
|
||||
final int w = pnlParent.getWidth();
|
||||
final int h = pnlParent.getHeight();
|
||||
pnlRight.setBounds(new Rectangle(
|
||||
2 * insets + leftWidthPx, insets,
|
||||
w - leftWidthPx - 3 * insets, h - 2 * insets));
|
||||
pnlLeft.setBounds(new Rectangle(
|
||||
menuWidthPx, h - 2 * insets
|
||||
insets, insets,
|
||||
leftWidthPx, h - 2 * insets
|
||||
revalidate();
|
||||
));
|
||||
pnlParent.revalidate();
|
||||
}
|
||||
|
||||
pnlMenu = new FPanel();
|
||||
pnlMenu.setLayout(new MigLayout("insets 0, gap 0, wrap"));
|
||||
|
||||
pnlContent = new FPanel();
|
||||
pnlContent.setLayout(new MigLayout("insets 0, gap 0"));
|
||||
|
||||
btnConstructed = new FButton();
|
||||
btnConstructed.setAction(new AbstractAction() {
|
||||
public void actionPerformed(ActionEvent arg0) { showConstructedMenu(); }
|
||||
});
|
||||
btnConstructed.setText("Constructed");
|
||||
|
||||
btnSealed = new FButton();
|
||||
btnSealed.setAction(new AbstractAction() {
|
||||
public void actionPerformed(ActionEvent arg0) { showSealedMenu(); }
|
||||
});
|
||||
btnSealed.setText("Sealed");
|
||||
|
||||
btnDraft = new FButton();
|
||||
btnDraft.setAction(new AbstractAction() {
|
||||
public void actionPerformed(ActionEvent arg0) { showDraftMenu(); }
|
||||
});
|
||||
btnDraft.setText("Draft");
|
||||
|
||||
btnQuest = new FButton();
|
||||
btnQuest.setAction(new AbstractAction() {
|
||||
public void actionPerformed(ActionEvent arg0) { showQuestMenu(); }
|
||||
});
|
||||
btnQuest.setText("Quest");
|
||||
|
||||
btnDeckEditor = new FButton();
|
||||
btnDeckEditor.setAction(new AbstractAction() {
|
||||
public void actionPerformed(ActionEvent arg0) {
|
||||
Singletons.getControl().getControlHome().getControlUtilities().showDeckEditor(GameType.Constructed, null);
|
||||
}
|
||||
});
|
||||
btnDeckEditor.setText("Deck Editor");
|
||||
|
||||
btnSettings = new FButton();
|
||||
btnSettings.setAction(new AbstractAction() {
|
||||
public void actionPerformed(ActionEvent arg0) { showSettingsMenu(); }
|
||||
});
|
||||
btnSettings.setText("Settings");
|
||||
|
||||
btnUtilities = new FButton();
|
||||
btnUtilities.setAction(new AbstractAction() {
|
||||
public void actionPerformed(ActionEvent arg0) { showUtilitiesMenu(); }
|
||||
});
|
||||
btnUtilities.setText("Utilities");
|
||||
|
||||
btnExit = new FButton();
|
||||
btnExit.setAction(new AbstractAction() {
|
||||
public void actionPerformed(ActionEvent arg0) { control.exit(); }
|
||||
});
|
||||
btnExit.setText("Exit");
|
||||
|
||||
add(pnlMenu, "w 36%!, h 96%!, gap 2% 2% 2% 2%");
|
||||
add(pnlContent, "w 58%!, h 96%!, gap 0% 2% 2% 2%");
|
||||
|
||||
JLabel lblIcon = new JLabel(FSkin.getIcon(FSkin.ForgeIcons.ICO_LOGO));
|
||||
pnlMenu.add(lblIcon, "gapleft 10%, ax center");
|
||||
|
||||
constraints = "w 80%!, gapleft 10%, gaptop 1%, gapbottom 1%, h 40px!";
|
||||
pnlMenu.add(btnConstructed, constraints);
|
||||
pnlMenu.add(btnSealed, constraints);
|
||||
pnlMenu.add(btnDraft, constraints);
|
||||
pnlMenu.add(btnQuest, constraints);
|
||||
//pnlMenu.add(btnDeckEditor, constraints);
|
||||
pnlMenu.add(btnSettings, constraints);
|
||||
pnlMenu.add(btnUtilities, constraints);
|
||||
pnlMenu.add(btnExit, constraints);
|
||||
|
||||
control = new ControlHomeUI(this);
|
||||
});
|
||||
}
|
||||
/** Opens menu for constructed mode. */
|
||||
public void showConstructedMenu() {
|
||||
clearToggles();
|
||||
pnlContent.removeAll();
|
||||
pnlContent.add(constructed, "w 100%!, h 100%!");
|
||||
pnlContent.revalidate();
|
||||
pnlContent.repaint();
|
||||
|
||||
/** Generates expand/collapse menu using cards in layout, and EMenuGroup enum.
|
||||
* No further hardcoding should be required in this method. */
|
||||
private void populateMenu() {
|
||||
final SortedMap<EMenuGroup, JPanel> allGroupPanels = new TreeMap<EMenuGroup, JPanel>();
|
||||
final Map<EMenuGroup, JLabel> allGroupLabels = new HashMap<EMenuGroup, JLabel>();
|
||||
Singletons.getControl().getControlHome().getControlConstructed().updateDeckSelectionCheckboxes();
|
||||
|
||||
final ForgePreferences prefs = Singletons.getModel().getPreferences();
|
||||
final String strTitleConstraints = "w 90%!, gap 5% 0 5px 10px";
|
||||
final String strGroupConstraints = "w 85%!, gap 10% 0 0 0";
|
||||
final String strItemConstraints = "w 100%!, h 26px!, gap 0 0 1px 1px";
|
||||
SwingUtilities.invokeLater(new Runnable() { @Override
|
||||
public void run() {
|
||||
btnConstructed.setToggled(true);
|
||||
btnConstructed.grabFocus();
|
||||
|
||||
pnlMenu.removeAll();
|
||||
pnlMenu.setLayout(new MigLayout("insets 0, gap 0, wrap, hidemode 3"));
|
||||
pnlMenu.setOpaque(false);
|
||||
|
||||
// For each group: init its panel
|
||||
for (final EMenuGroup e : EMenuGroup.values()) {
|
||||
allGroupPanels.put(e, new JPanel());
|
||||
allGroupPanels.get(e).setOpaque(false);
|
||||
allGroupPanels.get(e).setVisible(false);
|
||||
allGroupPanels.get(e).setLayout(new MigLayout("insets 0, gap 0, wrap"));
|
||||
allGroupPanels.get(e).setName(e.toString());
|
||||
}
|
||||
|
||||
// For each item: Add to its group, and add to the card layout in right panel.
|
||||
allSubmenuLabels.clear();
|
||||
for (final IVSubmenu item : allSubmenus) {
|
||||
allSubmenuLabels.put(EMenuItem.valueOf(item.getItemEnum()), makeItemLabel(item));
|
||||
pnlRight.add(item.getItemEnum(), item.getPanel());
|
||||
allGroupPanels.get(item.getGroupEnum()).add(
|
||||
allSubmenuLabels.get(EMenuItem.valueOf(item.getItemEnum())), strItemConstraints);
|
||||
item.getControl().initialize();
|
||||
}
|
||||
|
||||
// For each group: add its title, then its panel, then "click" if necessary.
|
||||
for (final EMenuGroup e : allGroupPanels.keySet()) {
|
||||
allGroupLabels.put(e, makeTitleLabel(e));
|
||||
pnlMenu.add(allGroupLabels.get(e), strTitleConstraints);
|
||||
pnlMenu.add(allGroupPanels.get(e), strGroupConstraints);
|
||||
|
||||
// Expand groups expanded from previous session
|
||||
if (prefs.getPrefBoolean(FPref.valueOf("SUBMENU_" + e.toString()))) {
|
||||
groupClick(e, allGroupLabels.get(e));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void groupClick(final EMenuGroup e0, final JLabel lbl0) {
|
||||
final Component[] menuObjects = pnlMenu.getComponents();
|
||||
for (final Component c : menuObjects) {
|
||||
if (c.getName() != null && c.getName().equals(e0.toString())) {
|
||||
if (c.isVisible()) {
|
||||
lbl0.setText("+ " + e0.getTitle());
|
||||
c.setVisible(false);
|
||||
Singletons.getModel().getPreferences().setPref(
|
||||
FPref.valueOf("SUBMENU_" + e0.toString()), "false");
|
||||
}
|
||||
else {
|
||||
lbl0.setText("- " + e0.getTitle());
|
||||
c.setVisible(true);
|
||||
Singletons.getModel().getPreferences().setPref(
|
||||
FPref.valueOf("SUBMENU_" + e0.toString()), "true");
|
||||
});
|
||||
}
|
||||
Singletons.getModel().getPreferences().setPref(FPref.UI_HOMEMENU,
|
||||
ForgePreferences.HomeMenus.constructed.toString());
|
||||
|
||||
Singletons.getModel().getPreferences().save();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
/** Opens menu for draft mode. */
|
||||
public void showDraftMenu() {
|
||||
clearToggles();
|
||||
pnlContent.removeAll();
|
||||
pnlContent.add(draft, "w 100%!, h 100%!");
|
||||
pnlContent.revalidate();
|
||||
pnlContent.repaint();
|
||||
|
||||
/** Custom title label styling. */
|
||||
@SuppressWarnings("serial")
|
||||
private JLabel makeTitleLabel(final EMenuGroup e0) {
|
||||
final FLabel lbl = new FLabel.Builder().fontScaleAuto(false).fontSize(16)
|
||||
.hoverable(true).fontAlign(SwingConstants.LEFT).build();
|
||||
SwingUtilities.invokeLater(new Runnable() { @Override
|
||||
public void run() {
|
||||
btnDraft.setToggled(true);
|
||||
btnDraft.grabFocus();
|
||||
}
|
||||
});
|
||||
|
||||
lbl.setBorder(BorderFactory.createCompoundBorder(
|
||||
new MatteBorder(0, 0, 1, 0, FSkin.getColor(FSkin.Colors.CLR_BORDERS)),
|
||||
new EmptyBorder(2, 2, 2, 2)));
|
||||
Singletons.getModel().getPreferences().setPref(FPref.UI_HOMEMENU,
|
||||
ForgePreferences.HomeMenus.draft.toString());
|
||||
Singletons.getModel().getPreferences().save();
|
||||
|
||||
lbl.setCommand(new Command() { @Override
|
||||
public void execute() { groupClick(e0, lbl); } });
|
||||
|
||||
lbl.setText("+ " + e0.getTitle());
|
||||
return lbl;
|
||||
}
|
||||
/** Opens menu for sealed mode. */
|
||||
public void showSealedMenu() {
|
||||
clearToggles();
|
||||
pnlContent.removeAll();
|
||||
pnlContent.add(sealed, "w 100%!, h 100%!");
|
||||
pnlContent.revalidate();
|
||||
pnlContent.repaint();
|
||||
|
||||
/** Custom subsection label styling. */
|
||||
@SuppressWarnings("serial")
|
||||
private FLabel makeItemLabel(final IVSubmenu item) {
|
||||
final ForgePreferences prefs = Singletons.getModel().getPreferences();
|
||||
SwingUtilities.invokeLater(new Runnable() { @Override
|
||||
public void run() {
|
||||
btnSealed.setToggled(true);
|
||||
btnSealed.grabFocus();
|
||||
}
|
||||
});
|
||||
|
||||
final FLabel lbl = new FLabel.Builder().fontScaleAuto(false).fontSize(15)
|
||||
.hoverable(true).selectable(true).text(item.getMenuTitle())
|
||||
.fontAlign(SwingConstants.LEFT).build();
|
||||
Singletons.getModel().getPreferences().setPref(FPref.UI_HOMEMENU,
|
||||
ForgePreferences.HomeMenus.sealed.toString());
|
||||
Singletons.getModel().getPreferences().save();
|
||||
}
|
||||
|
||||
final Command cmdOnClick = new Command() {
|
||||
@Override
|
||||
public void execute() {
|
||||
if (lblPreviousSelected != null) { lblPreviousSelected.setSelected(false); }
|
||||
/** Opens menu for quest mode. */
|
||||
public void showQuestMenu() {
|
||||
clearToggles();
|
||||
pnlContent.removeAll();
|
||||
pnlContent.add(quest, "w 99%!, h 95%!, gaptop 2.5%, gapleft 0.5%");
|
||||
pnlContent.revalidate();
|
||||
pnlContent.repaint();
|
||||
|
||||
cards.show(pnlRight, item.getItemEnum());
|
||||
lblPreviousSelected = lbl;
|
||||
Singletons.getModel().getPreferences().setPref(FPref.UI_HOMEMENU,
|
||||
ForgePreferences.HomeMenus.quest.toString());
|
||||
|
||||
prefs.setPref(FPref.SUBMENU_CURRENTMENU, item.getItemEnum());
|
||||
Singletons.getModel().getPreferences().save();
|
||||
SwingUtilities.invokeLater(new Runnable() { @Override
|
||||
|
||||
// Make sure this is called last, so it doesn't interfere
|
||||
// with the selection display process.
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
btnQuest.setToggled(true);
|
||||
btnQuest.grabFocus();
|
||||
public void run() {
|
||||
if (item.getControl().getMenuCommand() != null) {
|
||||
item.getControl().getMenuCommand().execute();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
/** Opens menu for settings. */
|
||||
public void showSettingsMenu() {
|
||||
clearToggles();
|
||||
pnlContent.removeAll();
|
||||
pnlContent.add(settings, "w 99%!, h 95%!, gaptop 2.5%, gapleft 0.5%");
|
||||
pnlContent.revalidate();
|
||||
pnlContent.repaint();
|
||||
|
||||
lbl.setCommand(cmdOnClick);
|
||||
lbl.setBorder(new EmptyBorder(0, 10, 0, 0));
|
||||
Singletons.getModel().getPreferences().setPref(FPref.UI_HOMEMENU,
|
||||
ForgePreferences.HomeMenus.settings.toString());
|
||||
Singletons.getModel().getPreferences().save();
|
||||
|
||||
SwingUtilities.invokeLater(new Runnable() { @Override
|
||||
public void run() {
|
||||
btnSettings.setToggled(true);
|
||||
btnSettings.grabFocus();
|
||||
}
|
||||
});
|
||||
|
||||
return lbl;
|
||||
}
|
||||
/** Opens menu for utilities. */
|
||||
public void showUtilitiesMenu() {
|
||||
clearToggles();
|
||||
pnlContent.removeAll();
|
||||
pnlContent.add(utilities, "w 100%!, h 100%!");
|
||||
pnlContent.revalidate();
|
||||
pnlContent.repaint();
|
||||
|
||||
SwingUtilities.invokeLater(new Runnable() { @Override
|
||||
public void run() {
|
||||
btnUtilities.setToggled(true);
|
||||
btnUtilities.grabFocus();
|
||||
}
|
||||
});
|
||||
|
||||
Singletons.getModel().getPreferences().setPref(FPref.UI_HOMEMENU,
|
||||
ForgePreferences.HomeMenus.utilities.toString());
|
||||
Singletons.getModel().getPreferences().save();
|
||||
|
||||
/** Programatically selects a menu item.
|
||||
* @param e0   {@forge.gui.home.EMenuItem} */
|
||||
public void itemClick(final EMenuItem e0) {
|
||||
allSubmenuLabels.get(e0).getCommand().execute();
|
||||
allSubmenuLabels.get(e0).setSelected(true);
|
||||
}
|
||||
private void clearToggles() {
|
||||
btnConstructed.setToggled(false);
|
||||
btnSealed.setToggled(false);
|
||||
btnDraft.setToggled(false);
|
||||
btnQuest.setToggled(false);
|
||||
btnDeckEditor.setToggled(false);
|
||||
btnSettings.setToggled(false);
|
||||
btnUtilities.setToggled(false);
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.home.ViewConstructed} */
|
||||
public ViewConstructed getViewConstructed() {
|
||||
return this.constructed;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.home.ViewDraft} */
|
||||
public ViewDraft getViewDraft() {
|
||||
return this.draft;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.home.ViewSealed} */
|
||||
public ViewSealed getViewSealed() {
|
||||
return this.sealed;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.home.ViewQuest} */
|
||||
public ViewQuest getViewQuest() {
|
||||
return this.quest;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.home.ViewSettings} */
|
||||
public ViewSettings getViewSettings() {
|
||||
return this.settings;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.home.ViewUtilities} */
|
||||
public ViewUtilities getViewUtilities() {
|
||||
return this.utilities;
|
||||
}
|
||||
|
||||
/** */
|
||||
public void resetQuest() {
|
||||
quest = new ViewQuest();
|
||||
showQuestMenu();
|
||||
}
|
||||
|
||||
/** */
|
||||
public void resetSettings() {
|
||||
settings = new ViewSettings();
|
||||
showSettingsMenu();
|
||||
}
|
||||
|
||||
/** @return ControlHomeUI */
|
||||
public ControlHomeUI getControl() {
|
||||
return control;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JButton} */
|
||||
public JButton getBtnConstructed() {
|
||||
return this.btnConstructed;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JButton} */
|
||||
public JButton getBtnSealed() {
|
||||
return this.btnSealed;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JButton} */
|
||||
public JButton getBtnDraft() {
|
||||
return this.btnDraft;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JButton} */
|
||||
public JButton getBtnQuest() {
|
||||
return this.btnQuest;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JButton} */
|
||||
public JButton getBtnSettings() {
|
||||
return this.btnSettings;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JButton} */
|
||||
public JButton getBtnUtilities() {
|
||||
return this.btnUtilities;
|
||||
|
||||
/** @return {@link javax.swing.JPanel} the parent panel containing the home UI. */
|
||||
public JPanel getPanel() {
|
||||
return pnlParent;
|
||||
}
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
/** Views (as in model-view-controller) for Forge. */
|
||||
package forge.view.editor;
|
||||
|
||||
@@ -1,278 +0,0 @@
|
||||
package forge.view.home;
|
||||
|
||||
import java.awt.Dimension;
|
||||
import java.awt.FlowLayout;
|
||||
import java.awt.Toolkit;
|
||||
import java.awt.datatransfer.StringSelection;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.awt.event.MouseListener;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Random;
|
||||
|
||||
import javax.swing.JList;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.ListSelectionModel;
|
||||
import javax.swing.border.LineBorder;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import forge.Command;
|
||||
import forge.Singletons;
|
||||
import forge.deck.Deck;
|
||||
import forge.item.CardPrinted;
|
||||
import forge.view.toolbox.FLabel;
|
||||
import forge.view.toolbox.FList;
|
||||
import forge.view.toolbox.FScrollPane;
|
||||
import forge.view.toolbox.FSkin;
|
||||
import forge.view.toolbox.WrapLayout;
|
||||
|
||||
/**
|
||||
* Shows and manages list selectors for each type of deck
|
||||
* possible in constructed mode. This panel is fully self-contained,
|
||||
* there should be no need for further control.
|
||||
*
|
||||
* <br><br>The current selected deck can be retrieved using getLstCurrentSelected().
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public class ConstructedDeckSelectPanel extends JPanel {
|
||||
private final JList lstCustomDecks, lstQuestDecks, lstColorDecks, lstThemeDecks;
|
||||
private final String multi = System.getProperty("os.name").equals("Mac OS X") ? "CMD" : "CTRL";
|
||||
private final String colorsTT = "Generate deck (Multi-select: " + multi + ")";
|
||||
private final String themeTT = "Generate deck with a theme";
|
||||
private final String userTT = "Custom decks (Decklist: Double Click)";
|
||||
private final String questTT = "Quest event decks (Decklist: Double Click)";
|
||||
private final FLabel btnRandomTheme, btnRandomCustom, btnRandomQuest;
|
||||
private final MouseListener madDeckList;
|
||||
private JList lstCurrentSelected;
|
||||
|
||||
/**
|
||||
*
|
||||
* Basic container for deck choices available in constructed mode.
|
||||
* Can (should, will be) applied to multiple AIs or humans.
|
||||
* @param c0
|
||||
*/
|
||||
public ConstructedDeckSelectPanel() {
|
||||
this.setLayout(new WrapLayout(FlowLayout.CENTER, 10, 10));
|
||||
this.setOpaque(false);
|
||||
final Dimension size = new Dimension(170, 250);
|
||||
|
||||
final Command cmdRandomTheme = new Command() { @Override
|
||||
public void execute() { randomDeckPick(lstThemeDecks); } };
|
||||
final Command cmdRandomUser = new Command() { @Override
|
||||
public void execute() { randomDeckPick(lstCustomDecks); } };
|
||||
final Command cmdRandomQuest = new Command() { @Override
|
||||
public void execute() { randomDeckPick(lstQuestDecks); } };
|
||||
|
||||
btnRandomTheme = new FLabel.Builder().text("Random").fontScaleAuto(false)
|
||||
.hoverable(true).cmdClick(cmdRandomTheme).opaque(true).build();
|
||||
|
||||
btnRandomCustom = new FLabel.Builder().text("Random").fontScaleAuto(false)
|
||||
.hoverable(true).cmdClick(cmdRandomUser).opaque(true).build();
|
||||
|
||||
btnRandomQuest = new FLabel.Builder().text("Random").fontScaleAuto(false)
|
||||
.hoverable(true).cmdClick(cmdRandomQuest).opaque(true).build();
|
||||
|
||||
lstCustomDecks = new FList("lstCustom");
|
||||
lstQuestDecks = new FList("lstQuest");
|
||||
lstColorDecks = new FList("lstColor");
|
||||
lstThemeDecks = new FList("lstTheme");
|
||||
|
||||
lstCustomDecks.setToolTipText(userTT);
|
||||
lstQuestDecks.setToolTipText(questTT);
|
||||
lstColorDecks.setToolTipText(colorsTT);
|
||||
lstThemeDecks.setToolTipText(themeTT);
|
||||
|
||||
lstColorDecks.setBorder(new LineBorder(FSkin.getColor(FSkin.Colors.CLR_BORDERS)));
|
||||
lstCustomDecks.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
|
||||
lstQuestDecks.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
|
||||
lstThemeDecks.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
|
||||
|
||||
final JPanel pnlCustom = new JPanel(new MigLayout("insets 0, gap 0, wrap"));
|
||||
final FScrollPane scrCustom = new FScrollPane(lstCustomDecks);
|
||||
scrCustom.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
|
||||
scrCustom.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
|
||||
|
||||
pnlCustom.setOpaque(false);
|
||||
pnlCustom.add(scrCustom, "w 100%!, h 89%!");
|
||||
pnlCustom.add(btnRandomCustom, "w 100%!, h 9%!, gap 0 0 1% 1%, ax center");
|
||||
|
||||
final JPanel pnlQuest = new JPanel(new MigLayout("insets 0, gap 0, wrap"));
|
||||
final FScrollPane scrQuest = new FScrollPane(lstQuestDecks);
|
||||
scrQuest.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
|
||||
scrQuest.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
|
||||
|
||||
pnlQuest.setOpaque(false);
|
||||
pnlQuest.add(scrQuest, "w 100%!, h 89%!");
|
||||
pnlQuest.add(btnRandomQuest, "w 100%!, h 9%!, gap 0 0 1% 1%, ax center");
|
||||
|
||||
final JPanel pnlTheme = new JPanel(new MigLayout("insets 0, gap 0, wrap"));
|
||||
final FScrollPane scrTheme = new FScrollPane(lstThemeDecks);
|
||||
scrTheme.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
|
||||
scrTheme.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
|
||||
|
||||
pnlTheme.setOpaque(false);
|
||||
pnlTheme.add(scrTheme, "w 100%!, h 89%!");
|
||||
pnlTheme.add(btnRandomTheme, "w 100%!, h 9%!, gap 0 0 1% 1%, ax center");
|
||||
|
||||
// Sizing and adding
|
||||
pnlCustom.setMinimumSize(size);
|
||||
pnlCustom.setMaximumSize(size);
|
||||
pnlCustom.setPreferredSize(size);
|
||||
|
||||
pnlQuest.setMinimumSize(size);
|
||||
pnlQuest.setMaximumSize(size);
|
||||
pnlQuest.setPreferredSize(size);
|
||||
|
||||
lstColorDecks.setMinimumSize(size);
|
||||
lstColorDecks.setMaximumSize(size);
|
||||
lstColorDecks.setPreferredSize(size);
|
||||
|
||||
pnlTheme.setMinimumSize(size);
|
||||
pnlTheme.setMaximumSize(size);
|
||||
pnlTheme.setPreferredSize(size);
|
||||
|
||||
this.add(lstColorDecks);
|
||||
this.add(pnlCustom);
|
||||
this.add(pnlTheme);
|
||||
this.add(pnlQuest);
|
||||
|
||||
// Listener init
|
||||
madDeckList = new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseClicked(MouseEvent e) {
|
||||
listSelectManager((JList) e.getSource());
|
||||
|
||||
if (e.getClickCount() == 2 && ((JList) e.getSource()).getName().equals("lstCustom")) {
|
||||
final String deckName = ((JList) e.getSource()).getSelectedValue().toString();
|
||||
showDecklist(Singletons.getModel().getDecks().getConstructed().get(deckName));
|
||||
}
|
||||
else if (e.getClickCount() == 2 && ((JList) e.getSource()).getName().equals("lstQuest")) {
|
||||
final String deckName = ((JList) e.getSource()).getSelectedValue().toString();
|
||||
Singletons.getModel().getQuestEventManager().getEvent(deckName);
|
||||
showDecklist(Singletons.getModel().getQuestEventManager().getEvent(deckName).getEventDeck());
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
lstColorDecks.removeMouseListener(madDeckList);
|
||||
lstColorDecks.addMouseListener(madDeckList);
|
||||
|
||||
lstThemeDecks.removeMouseListener(madDeckList);
|
||||
lstThemeDecks.addMouseListener(madDeckList);
|
||||
|
||||
lstQuestDecks.removeMouseListener(madDeckList);
|
||||
lstQuestDecks.addMouseListener(madDeckList);
|
||||
|
||||
lstCustomDecks.removeMouseListener(madDeckList);
|
||||
lstCustomDecks.addMouseListener(madDeckList);
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JList} */
|
||||
public JList getLstCustomDecks() {
|
||||
return this.lstCustomDecks;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JList} */
|
||||
public JList getLstQuestDecks() {
|
||||
return this.lstQuestDecks;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JList} */
|
||||
public JList getLstColorDecks() {
|
||||
return this.lstColorDecks;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JList} */
|
||||
public JList getLstThemeDecks() {
|
||||
return this.lstThemeDecks;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JList} */
|
||||
public JList getLstCurrentSelected() {
|
||||
return this.lstCurrentSelected;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prevents decks from different lists being selected simultaneously.
|
||||
* Also, sets lstCurrentSelected, for use when the game is started.
|
||||
*
|
||||
* @param src0   {@link javax.swing.JList}
|
||||
*/
|
||||
public void listSelectManager(final JList src0) {
|
||||
if (src0.getSelectedValues().length == 0) { return; }
|
||||
|
||||
// Clear any previous selection.
|
||||
if (src0 != lstCustomDecks) { lstCustomDecks.clearSelection(); }
|
||||
if (src0 != lstQuestDecks) { lstQuestDecks.clearSelection(); }
|
||||
if (src0 != lstColorDecks) { lstColorDecks.clearSelection(); }
|
||||
if (src0 != lstThemeDecks) { lstThemeDecks.clearSelection(); }
|
||||
|
||||
lstCurrentSelected = src0;
|
||||
}
|
||||
|
||||
/** Shows decklist dialog for a given deck. */
|
||||
private void showDecklist(Deck d0) {
|
||||
HashMap<String, Integer> deckMap = new HashMap<String, Integer>();
|
||||
|
||||
for (Entry<CardPrinted, Integer> s : d0.getMain()) {
|
||||
deckMap.put(s.getKey().getName(), s.getValue());
|
||||
}
|
||||
|
||||
String nl = System.getProperty("line.separator");
|
||||
StringBuilder deckList = new StringBuilder();
|
||||
String dName = d0.getName();
|
||||
|
||||
deckList.append(dName == null ? "" : dName + nl + nl);
|
||||
|
||||
ArrayList<String> dmKeys = new ArrayList<String>();
|
||||
for (final String s : deckMap.keySet()) {
|
||||
dmKeys.add(s);
|
||||
}
|
||||
|
||||
Collections.sort(dmKeys);
|
||||
|
||||
for (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
|
||||
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
|
||||
|
||||
/**
|
||||
* Random chooser for theme decks.
|
||||
*
|
||||
* @param lst0 {@link javax.swing.JList}
|
||||
*/
|
||||
private void randomDeckPick(JList lst0) {
|
||||
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());
|
||||
}
|
||||
|
||||
listSelectManager(lst0);
|
||||
}
|
||||
}
|
||||
@@ -1,175 +0,0 @@
|
||||
package forge.view.home;
|
||||
|
||||
import java.awt.Font;
|
||||
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JCheckBox;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JScrollPane;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import forge.control.home.ControlConstructed;
|
||||
import forge.view.toolbox.FCheckBox;
|
||||
import forge.view.toolbox.FLabel;
|
||||
import forge.view.toolbox.FProgressBar;
|
||||
import forge.view.toolbox.FScrollPane;
|
||||
import forge.view.toolbox.FSkin;
|
||||
import forge.view.toolbox.SubTab;
|
||||
|
||||
/**
|
||||
* Assembles swing components for "Draft" mode menu.
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public class ViewConstructed extends JPanel {
|
||||
private final JPanel pnlTabber, tabHuman, tabAI, pnlStart;
|
||||
private final ConstructedDeckSelectPanel pnlHuman, pnlAI;
|
||||
private final JCheckBox cbSingletons, cbArtifacts, cbRemoveSmall;
|
||||
private final JScrollPane scrContent;
|
||||
private final JButton btnStart;
|
||||
private final FProgressBar barProgress;
|
||||
private ControlConstructed control;
|
||||
|
||||
/** Assembles swing components for "Constructed" mode menu. */
|
||||
public ViewConstructed() {
|
||||
// Instantiation
|
||||
pnlTabber = new JPanel();
|
||||
pnlStart = new JPanel();
|
||||
pnlHuman = new ConstructedDeckSelectPanel();
|
||||
pnlAI = new ConstructedDeckSelectPanel();
|
||||
|
||||
tabHuman = new SubTab("Human Deck Select");
|
||||
tabAI = new SubTab("AI Deck Select");
|
||||
|
||||
scrContent = new FScrollPane(null);
|
||||
scrContent.setBorder(null);
|
||||
scrContent.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
|
||||
scrContent.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
|
||||
|
||||
cbSingletons = new FCheckBox("Singleton Mode");
|
||||
cbArtifacts = new FCheckBox("Remove Artifacts");
|
||||
cbRemoveSmall = new FCheckBox("Remove Small Creatures");
|
||||
btnStart = new StartButton();
|
||||
barProgress = new FProgressBar();
|
||||
|
||||
// Population
|
||||
populateTabber();
|
||||
populateStart();
|
||||
|
||||
// Styling and layout
|
||||
this.setOpaque(false);
|
||||
this.setLayout(new MigLayout("insets 0, gap 0, wrap"));
|
||||
this.add(pnlTabber, "w 98%!, gap 1% 0 20px 10px");
|
||||
this.add(scrContent, "w 98%!, h 48%!, gap 1% 0 0 10px");
|
||||
this.add(pnlStart, "w 98%!, gap 1% 0 0 20px");
|
||||
|
||||
// After all components are instantiated, fire up control.
|
||||
this.control = new ControlConstructed(this);
|
||||
showHumanTab();
|
||||
}
|
||||
|
||||
private void populateTabber() {
|
||||
final String tabberConstraints = "w 50%!, h 20px!";
|
||||
|
||||
tabHuman.setToolTipText("Global preference options");
|
||||
tabAI.setToolTipText("Human and AI avatar select");
|
||||
|
||||
pnlTabber.setOpaque(false);
|
||||
pnlTabber.setLayout(new MigLayout("insets 0, gap 0, align center"));
|
||||
|
||||
pnlTabber.add(tabHuman, tabberConstraints);
|
||||
pnlTabber.add(tabAI, tabberConstraints + ", wrap");
|
||||
}
|
||||
|
||||
private void populateStart() {
|
||||
final String rowConstraints = "ax center, gap 0 0 0 5px";
|
||||
|
||||
final JLabel lblBlurb1 = new FLabel.Builder()
|
||||
.text("Mouse over a list above for more information.")
|
||||
.fontScaleAuto(false).build();
|
||||
JLabel lblBlurb2 = new FLabel.Builder().fontStyle(Font.PLAIN)
|
||||
.text("Deck generation options:")
|
||||
.fontScaleAuto(false).build();
|
||||
|
||||
barProgress.setVisible(false);
|
||||
pnlStart.setOpaque(false);
|
||||
lblBlurb1.setFont(FSkin.getFont(12));
|
||||
lblBlurb2.setFont(FSkin.getFont(12));
|
||||
|
||||
pnlStart.setLayout(new MigLayout("insets 0, gap 0, wrap, align center, hidemode 3"));
|
||||
|
||||
pnlStart.add(lblBlurb1, rowConstraints + ", h 12px!");
|
||||
pnlStart.add(lblBlurb2, rowConstraints + ", h 12px!");
|
||||
pnlStart.add(cbSingletons, rowConstraints);
|
||||
pnlStart.add(cbArtifacts, rowConstraints);
|
||||
pnlStart.add(cbRemoveSmall, rowConstraints);
|
||||
pnlStart.add(btnStart, rowConstraints + ", gap 0 0 0 0");
|
||||
pnlStart.add(barProgress, rowConstraints + ", w 150px!, h 30px!");
|
||||
}
|
||||
|
||||
/** */
|
||||
public final void showHumanTab() {
|
||||
this.scrContent.setViewportView(pnlHuman);
|
||||
control.updateTabber(tabHuman);
|
||||
}
|
||||
|
||||
/** */
|
||||
public final void showAITab() {
|
||||
this.scrContent.setViewportView(pnlAI);
|
||||
control.updateTabber(tabAI);
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JButton} */
|
||||
public JButton getBtnStart() {
|
||||
return this.btnStart;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JPanel} */
|
||||
public JPanel getTabHuman() {
|
||||
return this.tabHuman;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JPanel} */
|
||||
public JPanel getTabAI() {
|
||||
return this.tabAI;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.toolbox.FProgressBar} */
|
||||
public FProgressBar getBarProgress() {
|
||||
return this.barProgress;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JPanel} */
|
||||
public ConstructedDeckSelectPanel getPnlHuman() {
|
||||
return this.pnlHuman;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JPanel} */
|
||||
public ConstructedDeckSelectPanel getPnlAI() {
|
||||
return this.pnlAI;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JCheckBox} */
|
||||
public JCheckBox getCbSingletons() {
|
||||
return this.cbSingletons;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JCheckBox} */
|
||||
public JCheckBox getCbRemoveSmall() {
|
||||
return this.cbRemoveSmall;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JCheckBox} */
|
||||
public JCheckBox getCbArtifacts() {
|
||||
return this.cbArtifacts;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* TODO: Write javadoc for this method.
|
||||
* @return {@link forge.control.home.ControlConstructed}
|
||||
*/
|
||||
public ControlConstructed getControl() {
|
||||
return this.control;
|
||||
}
|
||||
}
|
||||
@@ -1,247 +0,0 @@
|
||||
package forge.view.home;
|
||||
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.util.Random;
|
||||
|
||||
import javax.swing.AbstractAction;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JList;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JTextPane;
|
||||
import javax.swing.SwingConstants;
|
||||
import javax.swing.border.LineBorder;
|
||||
import javax.swing.text.SimpleAttributeSet;
|
||||
import javax.swing.text.StyleConstants;
|
||||
import javax.swing.text.StyledDocument;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import forge.Command;
|
||||
import forge.Singletons;
|
||||
import forge.control.home.ControlDraft;
|
||||
import forge.game.GameType;
|
||||
import forge.view.toolbox.DeckLister;
|
||||
import forge.view.toolbox.FButton;
|
||||
import forge.view.toolbox.FLabel;
|
||||
import forge.view.toolbox.FList;
|
||||
import forge.view.toolbox.FPanel;
|
||||
import forge.view.toolbox.FProgressBar;
|
||||
import forge.view.toolbox.FScrollPane;
|
||||
import forge.view.toolbox.FSkin;
|
||||
|
||||
/**
|
||||
* Assembles swing components for "Draft" mode menu.
|
||||
*
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public class ViewDraft extends JPanel {
|
||||
private final ControlDraft control;
|
||||
private final JList lstAI;
|
||||
private final FProgressBar barProgress;
|
||||
private final DeckLister lstHumanDecks;
|
||||
private final JTextPane tpnDirections;
|
||||
private final JLabel lblDirections;
|
||||
private final JButton btnStart;
|
||||
private final FLabel btnBuildDeck;
|
||||
|
||||
private String[] opponentNames = new String[] {
|
||||
"Abigail", "Ada", "Adeline", "Adriana", "Agatha", "Agnes", "Aileen", "Alba", "Alcyon",
|
||||
"Alethea", "Alice", "Alicia", "Alison", "Amanda", "Amelia", "Amy", "Andrea", "Angelina",
|
||||
"Anita", "Ann", "Annabel", "Anne", "Audrey", "Barbara", "Belinda", "Bernice", "Bertha",
|
||||
"Bonnie", "Brenda", "Bridget", "Bunny", "Carmen", "Carol", "Catherine", "Cheryl",
|
||||
"Christine", "Cinderalla", "Claire", "Clarice", "Claudia", "Constance", "Cora",
|
||||
"Corinne", "Cnythia", "Daisy", "Daphne", "Dawn", "Deborah", "Diana", "Dolly", "Dora",
|
||||
"Doreen", "Doris", "Dorothy", "Eileen", "Elaine", "Elizabeth", "Emily", "Emma", "Ethel",
|
||||
"Evelyn", "Fiona", "Florence", "Frances", "Geraldine", "Gertrude", "Gladys", "Gloria",
|
||||
"Grace", "Greta", "Harriet", "Hazel", "Helen", "Hilda", "Ida", "Ingrid", "Irene",
|
||||
"Isabel", "Jacinta", "Jackie", "Jane", "Janet", "Janice", "Jennifer", "Jessie", "Joan",
|
||||
"Jocelyn", "Josephine", "Joyce", "Judith", "Julia", "Juliana", "Karina", "Kathleen",
|
||||
"Laura", "Lilian", "Lily", "Linda", "Lisa", "Lilita", "Lora", "Lorna", "Lucy", "Lydia",
|
||||
"Mabel", "Madeline", "Maggie", "Maria", "Mariam", "Marilyn", "Mary", "Matilda", "Mavis",
|
||||
"Melanie", "Melinda", "Melody", "Michelle", "Mildred", "Molly", "Mona", "Monica",
|
||||
"Nancy", "Nora", "Norma", "Olga", "Pamela", "Patricia", "Paula", "Pauline", "Pearl",
|
||||
"Peggy", "Penny", "Phoebe", "Phyllis", "Polly", "Priscilla", "Rachel", "Rebecca",
|
||||
"Rita", "Rosa", "Rosalind", "Rose", "Rosemary", "Rowena", "Ruby", "Sally", "Samantha",
|
||||
"Sarah", "Selina", "Sharon", "Sheila", "Shirley", "Sonya", "Stella", "Sue", "Susan",
|
||||
"Sylvia", "Tina", "Tracy", "Ursula", "Valentine", "Valerie", "Vanessa", "Veronica",
|
||||
"Victoria", "Violet", "Vivian", "Wendy", "Winnie", "Yvonne", "Aaron", "Abraham", "Adam",
|
||||
"Adrain", "Alain", "Alan", "Alban", "Albert", "Alec", "Alexander", "Alfonso", "Alfred",
|
||||
"Allan", "Allen", "Alonso", "Aloysius", "Alphonso", "Alvin", "Andrew", "Andy", "Amadeus",
|
||||
"Amselm", "Anthony", "Arnold", "Augusta", "Austin", "Barnaby", "Benedict", "Benjamin",
|
||||
"Bertie", "Bertram", "Bill", "Bob", "Boris", "Brady", "Brian", "Bruce", "Burt", "Byron",
|
||||
"Calvin", "Carl", "Carter", "Casey", "Cecil", "Charles", "Christian", "Christopher",
|
||||
"Clarence", "Clement", "Colin", "Conan", "Dalton", "Damian", "Daniel", "David", "Denis",
|
||||
"Derek", "Desmond", "Dick", "Dominic", "Donald", "Douglas", "Duncan", "Edmund",
|
||||
"Edward", "Ellen", "Elton", "Elvis", "Eric", "Eugene", "Felix", "Francis", "Frank",
|
||||
"Frederick", "Gary", "Geoffrey", "George", "Gerald", "Gerry", "Gordon", "Hamish",
|
||||
"Hardy", "Harold", "Harry", "Henry", "Herbert", "Ignatius", "Jack", "James", "Jeffrey",
|
||||
"Jim", "Joe", "John", "Joseph", "Karl", "Keith", "Kenneth", "Kevin", "Larry", "Lawrence",
|
||||
"Leonard", "Lionel", "Louis", "Lucas", "Malcolm", "Mark", "Martin", "Mathew", "Maurice",
|
||||
"Max", "Melvin", "Michael", "Milton", "Morgan", "Morris", "Murphy", "Neville",
|
||||
"Nicholas", "Noel", "Norman", "Oliver", "Oscar", "Patrick", "Paul", "Perkin", "Peter",
|
||||
"Philip", "Ralph", "Randy", "Raymond", "Richard", "Ricky", "Robert", "Robin", "Rodney",
|
||||
"Roger", "Roland", "Ronald", "Roy", "Sam", "Sebastian", "Simon", "Stanley", "Stephen",
|
||||
"Stuart", "Terence", "Thomas", "Tim", "Tom", "Tony", "Victor", "Vincent", "Wallace",
|
||||
"Walter", "Wilfred", "William", "Winston"
|
||||
};
|
||||
|
||||
private final String instructions = "BOOSTER DRAFT MODE INSTRUCTIONS"
|
||||
+ "\r\n\r\n"
|
||||
+ "In a booster draft, several players (usually eight) are seated "
|
||||
+ "around a table and each player is given three booster packs."
|
||||
+ "\r\n\r\n"
|
||||
+ "Each player opens a pack, selects a card from it and passes the remaining "
|
||||
+ "cards to his or her left. Each player then selects one of the 14 remaining "
|
||||
+ "cards from the pack that was just passed to him or her, and passes the "
|
||||
+ "remaining cards to the left again. This continues until all of the cards "
|
||||
+ "are depleted. The process is repeated with the second and third packs, "
|
||||
+ "except that the cards are passed to the right in the second pack."
|
||||
+ "\r\n\r\n"
|
||||
+ "Players then build decks out of any of the cards that they selected "
|
||||
+ "during the drafting and add as many basic lands as they want."
|
||||
+ "\r\n\r\n"
|
||||
+ "(Credit: Wikipedia <http://en.wikipedia.org/wiki/Magic:_The_Gathering_formats#Booster_Draft>)";
|
||||
|
||||
/** Assembles swing components for "Draft" mode menu. */
|
||||
public ViewDraft() {
|
||||
super();
|
||||
this.setOpaque(false);
|
||||
this.setLayout(new MigLayout("insets 0, gap 0, hidemode 2"));
|
||||
|
||||
// Generate random selection of names for display
|
||||
Random generator = new Random();
|
||||
int i = opponentNames.length;
|
||||
String[] ai = {
|
||||
opponentNames[generator.nextInt(i)],
|
||||
opponentNames[generator.nextInt(i)],
|
||||
opponentNames[generator.nextInt(i)],
|
||||
opponentNames[generator.nextInt(i)],
|
||||
opponentNames[generator.nextInt(i)],
|
||||
opponentNames[generator.nextInt(i)],
|
||||
opponentNames[generator.nextInt(i)]
|
||||
};
|
||||
|
||||
// Init directions text pane
|
||||
tpnDirections = new JTextPane();
|
||||
tpnDirections.setOpaque(false);
|
||||
tpnDirections.setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT));
|
||||
tpnDirections.setFont(FSkin.getFont(15));
|
||||
tpnDirections.setAlignmentX(SwingConstants.CENTER);
|
||||
tpnDirections.setFocusable(false);
|
||||
tpnDirections.setEditable(false);
|
||||
tpnDirections.setBorder(null);
|
||||
tpnDirections.setText(instructions);
|
||||
|
||||
StyledDocument doc = tpnDirections.getStyledDocument();
|
||||
SimpleAttributeSet center = new SimpleAttributeSet();
|
||||
StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER);
|
||||
doc.setParagraphAttributes(0, doc.getLength(), center, false);
|
||||
|
||||
// Define exit command for deck editor (TODO put this in controller)
|
||||
final Command exit = new Command() {
|
||||
private static final long serialVersionUID = -9133358399503226853L;
|
||||
|
||||
@Override
|
||||
public void execute() {
|
||||
control.updateHumanDecks();
|
||||
}
|
||||
};
|
||||
|
||||
// Layout
|
||||
final JLabel lblHuman = new JLabel("Select your deck: ");
|
||||
lblHuman.setFont(FSkin.getBoldFont(16));
|
||||
lblHuman.setHorizontalAlignment(SwingConstants.CENTER);
|
||||
lblHuman.setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT));
|
||||
this.add(lblHuman, "w 60%!, gap 5% 5% 2% 2%");
|
||||
|
||||
final JLabel lblAI = new JLabel("Who will you play?");
|
||||
lblAI.setFont(FSkin.getBoldFont(16));
|
||||
lblAI.setHorizontalAlignment(SwingConstants.CENTER);
|
||||
lblAI.setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT));
|
||||
this.add(lblAI, "w 25%!, gap 0 0 2% 2%, wrap");
|
||||
|
||||
lstHumanDecks = new DeckLister(GameType.Draft, exit);
|
||||
this.add(new FScrollPane(lstHumanDecks), "w 60%!, h 30%!, gap 5% 5% 2% 2%");
|
||||
|
||||
lstAI = new FList(ai);
|
||||
this.add(new FScrollPane(lstAI), "w 25%!, h 37%!, gap 0 0 2% 0, span 1 2, wrap");
|
||||
|
||||
btnBuildDeck = new FLabel.Builder().opaque(true).hoverable(true).text("Start A New Draft").build();
|
||||
this.add(btnBuildDeck, "w 60%!, h 5%!, gap 5% 5% 0 0, wrap");
|
||||
|
||||
lblDirections = new JLabel("Click For Directions");
|
||||
lblDirections.setFont(FSkin.getFont(16));
|
||||
lblDirections.setHorizontalAlignment(SwingConstants.CENTER);
|
||||
lblDirections.setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT));
|
||||
this.add(lblDirections, "alignx center, span 2 1, gap 5% 5% 5% 2%, wrap");
|
||||
|
||||
btnStart = new StartButton();
|
||||
this.add(btnStart, "gap 5% 5% 0 0, ax center, span 2 1, wrap");
|
||||
|
||||
barProgress = new FProgressBar();
|
||||
barProgress.setVisible(false);
|
||||
this.add(barProgress, "w 150px!, h 30px!, gap 5% 5% 0 0, span 2 1, align center");
|
||||
|
||||
control = new ControlDraft(this);
|
||||
}
|
||||
|
||||
/** */
|
||||
public void showDirections() {
|
||||
final FButton btnClose = new FButton();
|
||||
final FPanel pnlContainer = new FPanel();
|
||||
|
||||
btnClose.setAction(new AbstractAction() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
Singletons.getView().getOverlay().hideOverlay();
|
||||
}
|
||||
});
|
||||
btnClose.setText("Close");
|
||||
|
||||
pnlContainer.setBorder(new LineBorder(FSkin.getColor(FSkin.Colors.CLR_BORDERS), 1));
|
||||
pnlContainer.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME));
|
||||
pnlContainer.setLayout(new MigLayout("insets 0, wrap"));
|
||||
pnlContainer.add(tpnDirections, "w 90%, gap 5% 0 20px 0, wrap");
|
||||
pnlContainer.add(btnClose, "w 300px!, h 40px!, gap 0 0 20px 20px, alignx center");
|
||||
|
||||
Singletons.getView().getOverlay().removeAll();
|
||||
Singletons.getView().getOverlay().setLayout(new MigLayout("insets 0"));
|
||||
Singletons.getView().getOverlay().add(pnlContainer, "w 50%, gap 25% 0 5% 5%, wrap");
|
||||
Singletons.getView().getOverlay().showOverlay();
|
||||
}
|
||||
|
||||
/** @return JList */
|
||||
public DeckLister getLstHumanDecks() {
|
||||
return lstHumanDecks;
|
||||
}
|
||||
|
||||
/** @return JList */
|
||||
public JList getLstAIDecks() {
|
||||
return lstAI;
|
||||
}
|
||||
|
||||
/** @return ControlDraft */
|
||||
public ControlDraft getControl() {
|
||||
return control;
|
||||
}
|
||||
|
||||
/** @return JTextArea */
|
||||
public JLabel getLblDirections() {
|
||||
return lblDirections;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.toolbox.FLabel} */
|
||||
public FLabel getBtnBuildDeck() {
|
||||
return btnBuildDeck;
|
||||
}
|
||||
|
||||
/** @return JButton */
|
||||
public JButton getBtnStart() {
|
||||
return btnStart;
|
||||
}
|
||||
|
||||
/** @return FProgressBar */
|
||||
public FProgressBar getBarProgress() {
|
||||
return barProgress;
|
||||
}
|
||||
}
|
||||
@@ -1,787 +0,0 @@
|
||||
package forge.view.home;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.io.File;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.ButtonGroup;
|
||||
import javax.swing.ImageIcon;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JCheckBox;
|
||||
import javax.swing.JComboBox;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JRadioButton;
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.SwingConstants;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.border.MatteBorder;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import forge.AllZone;
|
||||
import forge.Command;
|
||||
import forge.Singletons;
|
||||
import forge.control.home.ControlQuest;
|
||||
import forge.game.GameType;
|
||||
import forge.properties.ForgeProps;
|
||||
import forge.properties.NewConstants;
|
||||
import forge.quest.data.QuestChallenge;
|
||||
import forge.quest.data.QuestDuel;
|
||||
import forge.quest.data.QuestEvent;
|
||||
import forge.view.toolbox.DeckLister;
|
||||
import forge.view.toolbox.FCheckBox;
|
||||
import forge.view.toolbox.FLabel;
|
||||
import forge.view.toolbox.FPanel;
|
||||
import forge.view.toolbox.FProgressBar;
|
||||
import forge.view.toolbox.FRadioButton;
|
||||
import forge.view.toolbox.FScrollPane;
|
||||
import forge.view.toolbox.FSkin;
|
||||
import forge.view.toolbox.FTextArea;
|
||||
import forge.view.toolbox.SubTab;
|
||||
|
||||
/**
|
||||
* Populates Swing components of Quest mode in home screen.
|
||||
*
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public class ViewQuest extends JScrollPane {
|
||||
private final ControlQuest control;
|
||||
private final String eventPanelConstraints;
|
||||
private final Color clrBorders;
|
||||
private final JPanel pnlViewport, pnlTabber, pnlStats,
|
||||
pnlDuels, pnlChallenges, pnlStart, pnlTitle, pnlNewQuest,
|
||||
pnlDecks, pnlLoadQuest, pnlPrefs,
|
||||
tabDuels, tabChallenges, tabDecks, tabQuests, tabPreferences;
|
||||
private final FLabel lblTitle, lblLife, lblCredits,
|
||||
lblWins, lblLosses, lblNextChallengeInWins, lblWinStreak, btnBazaar, btnSpellShop, btnEmbark,
|
||||
btnResetPrefs, btnNewDeck, btnCurrentDeck;
|
||||
|
||||
private final StartButton btnStart;
|
||||
|
||||
private final JCheckBox cbPlant, cbZep, cbStandardStart;
|
||||
private final JComboBox cbxPet;
|
||||
private final JRadioButton radEasy, radMedium, radHard, radExpert, radFantasy, radClassic;
|
||||
|
||||
private SelectablePanel selectedOpponent;
|
||||
private DeckLister lstDecks;
|
||||
private QuestFileLister lstQuests;
|
||||
private final FProgressBar barProgress;
|
||||
|
||||
/** Assembles swing components for "Quest" mode menu. */
|
||||
public ViewQuest() {
|
||||
// Display
|
||||
super(VERTICAL_SCROLLBAR_AS_NEEDED, HORIZONTAL_SCROLLBAR_AS_NEEDED);
|
||||
this.setBorder(null);
|
||||
this.setOpaque(false);
|
||||
this.getViewport().setOpaque(false);
|
||||
this.getVerticalScrollBar().setUnitIncrement(16);
|
||||
|
||||
// Non-final inits
|
||||
this.clrBorders = FSkin.getColor(FSkin.Colors.CLR_THEME2);
|
||||
this.eventPanelConstraints = "w 100%!, h 86px!, gap 0 0 5px 5px";
|
||||
|
||||
// Final component inits
|
||||
tabDuels = new SubTab("Duels");
|
||||
tabChallenges = new SubTab("Challenges");
|
||||
tabDecks = new SubTab("Decks");
|
||||
tabQuests = new SubTab("Quests");
|
||||
tabPreferences = new SubTab("Preferences");
|
||||
|
||||
pnlTabber = new JPanel();
|
||||
pnlTitle = new FPanel();
|
||||
pnlStats = new JPanel();
|
||||
pnlDuels = new JPanel();
|
||||
pnlChallenges = new JPanel();
|
||||
pnlStart = new JPanel();
|
||||
pnlDecks = new JPanel();
|
||||
pnlNewQuest = new JPanel();
|
||||
pnlLoadQuest = new JPanel();
|
||||
pnlPrefs = new JPanel();
|
||||
|
||||
lblTitle = new FLabel.Builder().text("New Quest").fontAlign(SwingConstants.CENTER)
|
||||
.fontScaleBy(SwingConstants.HORIZONTAL).fontScaleFactor(0.035).build();
|
||||
lblLife = new FLabel.Builder().build();
|
||||
lblCredits = new FLabel.Builder().build();
|
||||
lblWins = new FLabel.Builder().build();
|
||||
lblLosses = new FLabel.Builder().build();
|
||||
lblNextChallengeInWins = new FLabel.Builder().build();
|
||||
lblWinStreak = new FLabel.Builder().build();
|
||||
|
||||
radEasy = new FRadioButton("Easy");
|
||||
radMedium = new FRadioButton("Medium");
|
||||
radHard = new FRadioButton("Hard");
|
||||
radExpert = new FRadioButton("Expert");
|
||||
radFantasy = new FRadioButton("Fantasy");
|
||||
radClassic = new FRadioButton("Classic");
|
||||
|
||||
btnCurrentDeck = new FLabel.Builder().opaque(true).hoverable(true).build();
|
||||
btnBazaar = new FLabel.Builder().selectable(true).opaque(true).hoverable(true).text("Bazaar")
|
||||
.fontScaleAuto(false).tooltip("Peruse the Bazaar").build();
|
||||
btnBazaar.setFont(FSkin.getFont(14));
|
||||
btnSpellShop = new FLabel.Builder().opaque(true).hoverable(true).text("Spell Shop")
|
||||
.fontScaleAuto(false).tooltip("Travel to the Spell Shop").build();
|
||||
btnSpellShop.setFont(FSkin.getFont(14));
|
||||
btnStart = new StartButton();
|
||||
btnEmbark = new FLabel.Builder().opaque(true).hoverable(true).text("Embark!").build();
|
||||
btnNewDeck = new FLabel.Builder().opaque(true).hoverable(true).text("Build a New Deck").build();
|
||||
btnResetPrefs = new FLabel.Builder().opaque(true).hoverable(true).text("Reset to Defaults").build();
|
||||
cbxPet = new JComboBox();
|
||||
cbStandardStart = new FCheckBox("Standard (Type 2) Starting Pool");
|
||||
cbPlant = new FCheckBox("Summon Plant");
|
||||
cbZep = new FCheckBox("Launch Zeppelin");
|
||||
barProgress = new FProgressBar();
|
||||
|
||||
lstDecks = new DeckLister(GameType.Quest);
|
||||
lstQuests = new QuestFileLister();
|
||||
|
||||
// Final layout of parent panel
|
||||
pnlViewport = new JPanel();
|
||||
pnlViewport.setOpaque(false);
|
||||
pnlViewport.setLayout(new MigLayout("insets 0, gap 0, wrap, alignx center, hidemode 3"));
|
||||
|
||||
final String constraints = "w 90%!, gap 0 0 0 20px, alignx center";
|
||||
pnlViewport.add(pnlTabber, constraints + ", h 20px!");
|
||||
pnlViewport.add(pnlTitle, constraints + ", h 7%:7%:60px");
|
||||
pnlViewport.add(pnlStats, constraints);
|
||||
pnlViewport.add(pnlDuels, constraints);
|
||||
pnlViewport.add(pnlChallenges, constraints);
|
||||
pnlViewport.add(pnlStart, constraints);
|
||||
pnlViewport.add(pnlLoadQuest, constraints + ", h 40%!");
|
||||
pnlViewport.add(pnlNewQuest, constraints + ", h 40%!");
|
||||
pnlViewport.add(pnlDecks, constraints);
|
||||
pnlViewport.add(pnlPrefs, constraints);
|
||||
|
||||
// Drop into scroll pane, init values from controller.
|
||||
this.setViewportView(pnlViewport);
|
||||
|
||||
// Lay out each child panel, starting with previous quests.
|
||||
populateLoadQuest();
|
||||
populateTabber();
|
||||
populateTitle();
|
||||
populateStats();
|
||||
populateDuels();
|
||||
populateChallenges();
|
||||
populateStart();
|
||||
populateDecks();
|
||||
populateNewQuest();
|
||||
populatePrefs();
|
||||
|
||||
// If start when quest submenu is shown,
|
||||
// it will need a few cycles to read the quest datas.
|
||||
hideAllPanels();
|
||||
|
||||
// Init controller, select quest and deck.
|
||||
this.control = new ControlQuest(this);
|
||||
control.refreshQuests();
|
||||
control.refreshDecks();
|
||||
this.showDuelsTab();
|
||||
}
|
||||
|
||||
//========= POPULATION METHODS
|
||||
/** Layout and details for Swing components in title panel. */
|
||||
private void populateTabber() {
|
||||
tabDuels.setToolTipText("Available Duels");
|
||||
tabChallenges.setToolTipText("Available Challenges");
|
||||
tabDecks.setToolTipText("Edit or create decks");
|
||||
tabQuests.setToolTipText("Load a Quest, or start a new Quest");
|
||||
tabPreferences.setToolTipText("Change Preference Settings");
|
||||
|
||||
final String constraints = "w 20%!, h 20px!";
|
||||
pnlTabber.setOpaque(false);
|
||||
pnlTabber.setLayout(new MigLayout("insets 0, gap 0, align center"));
|
||||
|
||||
pnlTabber.add(tabDuels, constraints);
|
||||
pnlTabber.add(tabChallenges, constraints);
|
||||
pnlTabber.add(tabDecks, constraints);
|
||||
pnlTabber.add(tabQuests, constraints);
|
||||
pnlTabber.add(tabPreferences, constraints);
|
||||
}
|
||||
|
||||
/** Layout and details for Swing components in title panel. */
|
||||
private void populateTitle() {
|
||||
pnlTitle.setLayout(new MigLayout("insets 0, gap 0, align center"));
|
||||
pnlTitle.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2));
|
||||
|
||||
pnlTitle.add(lblTitle, "w 78%!, h 80%!, gap 0 0 15%! 15%!");
|
||||
}
|
||||
|
||||
/** Layout permanent parts of stats panel. */
|
||||
private void populateStats() {
|
||||
pnlStats.setOpaque(false);
|
||||
pnlStats.setBorder(new MatteBorder(1, 0, 1, 0, clrBorders));
|
||||
|
||||
lblLife.setIcon(FSkin.getIcon(FSkin.QuestIcons.ICO_LIFE));
|
||||
lblCredits.setIcon(FSkin.getIcon(FSkin.QuestIcons.ICO_COINSTACK));
|
||||
lblWins.setIcon(FSkin.getIcon(FSkin.QuestIcons.ICO_PLUS));
|
||||
lblLosses.setIcon(FSkin.getIcon(FSkin.QuestIcons.ICO_MINUS));
|
||||
lblNextChallengeInWins.setText("No challenges available.");
|
||||
}
|
||||
|
||||
/** Layout permanent parts of duels panel. */
|
||||
private void populateDuels() {
|
||||
pnlDuels.setOpaque(false);
|
||||
pnlDuels.setLayout(new MigLayout("insets 0, wrap"));
|
||||
}
|
||||
|
||||
/** Layout permanent parts of challenges panel. */
|
||||
private void populateChallenges() {
|
||||
pnlChallenges.setOpaque(false);
|
||||
pnlChallenges.setLayout(new MigLayout("insets 0, wrap"));
|
||||
}
|
||||
|
||||
/** Layout permanent parts of start panel. */
|
||||
private void populateStart() {
|
||||
pnlStart.setOpaque(false);
|
||||
pnlStart.setLayout(new MigLayout("insets 0, wrap, align center, hidemode 3"));
|
||||
pnlStart.add(cbxPet, "gap 0 0 0 5px, align center");
|
||||
pnlStart.add(cbPlant, "gap 0 0 5px 5px, align center");
|
||||
pnlStart.add(cbZep, "gap 0 0 5px 5px, align center");
|
||||
pnlStart.add(btnStart, "");
|
||||
}
|
||||
|
||||
/** Layout permanent parts of decks panel. */
|
||||
private void populateDecks() {
|
||||
final FScrollPane scr = new FScrollPane(lstDecks);
|
||||
scr.setBorder(null);
|
||||
scr.getViewport().setBorder(null);
|
||||
|
||||
pnlDecks.setOpaque(false);
|
||||
pnlDecks.setLayout(new MigLayout("insets 0, wrap, alignx center, wrap"));
|
||||
|
||||
pnlDecks.add(btnNewDeck, "w 40%!, h 35px!, gap 25%! 0 0 20px");
|
||||
pnlDecks.add(scr, "w 90%!, h 350px!");
|
||||
}
|
||||
|
||||
/** Layout permanent parts of quest load panel. */
|
||||
private void populateLoadQuest() {
|
||||
// New quest notes
|
||||
final FPanel pnl = new FPanel();
|
||||
pnl.setLayout(new MigLayout("insets 0, align center"));
|
||||
pnl.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2));
|
||||
pnl.add(new FLabel.Builder().text("Load a previous Quest").build(), "h 95%!, gap 0 0 2.5% 0");
|
||||
|
||||
final FLabel lbl = new FLabel.Builder().text("To use quest files "
|
||||
+ "from previous versions, put them into "
|
||||
+ "the res/quest/data directory, and restart Forge.")
|
||||
.fontAlign(SwingConstants.CENTER).fontScaleFactor(0.8).build();
|
||||
|
||||
final FScrollPane scr = new FScrollPane(lstQuests);
|
||||
scr.setBorder(null);
|
||||
scr.getViewport().setBorder(null);
|
||||
|
||||
pnlLoadQuest.setOpaque(false);
|
||||
pnlLoadQuest.setLayout(new MigLayout("insets 0, gap 0, alignx center, wrap"));
|
||||
pnlLoadQuest.add(pnl, "w 99%, h 8%!, gap 0 0 0 10px");
|
||||
pnlLoadQuest.add(lbl, "w 99%!, h 5%!, gap 2px 2px 0 4px");
|
||||
pnlLoadQuest.add(scr, "w 99%!, h 85%!, gap 0 0 0 30px");
|
||||
}
|
||||
|
||||
/** Layout permanent parts of new quests panel. */
|
||||
private void populateNewQuest() {
|
||||
// New quest notes
|
||||
final FPanel pnl1 = new FPanel();
|
||||
pnl1.setLayout(new MigLayout("insets 0, align center"));
|
||||
pnl1.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2));
|
||||
pnl1.add(new FLabel.Builder().text("Start a new quest").build(), "h 95%!, gap 0 0 2.5% 0");
|
||||
|
||||
final ButtonGroup group1 = new ButtonGroup();
|
||||
group1.add(radEasy);
|
||||
group1.add(radMedium);
|
||||
group1.add(radHard);
|
||||
group1.add(radExpert);
|
||||
|
||||
radEasy.setSelected(true);
|
||||
radClassic.setSelected(true);
|
||||
|
||||
final ButtonGroup group2 = new ButtonGroup();
|
||||
group2.add(radFantasy);
|
||||
group2.add(radClassic);
|
||||
|
||||
final JPanel pnl2 = new JPanel();
|
||||
pnl2.setOpaque(false);
|
||||
pnl2.setLayout(new MigLayout("insets 0, gap 0"));
|
||||
|
||||
final String constraints = "w 30%!, h 40px!";
|
||||
pnl2.add(radEasy, constraints + ", gap 15% 5% 0 0");
|
||||
pnl2.add(radFantasy, constraints + ", wrap");
|
||||
pnl2.add(radMedium, constraints + ", gap 15% 5% 0 0");
|
||||
pnl2.add(radClassic, constraints + ", wrap");
|
||||
pnl2.add(radHard, constraints + ", gap 15% 5% 0 0");
|
||||
pnl2.add(cbStandardStart, constraints + ", wrap");
|
||||
pnl2.add(radExpert, constraints + ", gap 15% 5% 0 0, wrap");
|
||||
|
||||
pnl2.add(btnEmbark, "w 40%!, h 30px!, gapleft 30%, gaptop 3%, span 3 1");
|
||||
|
||||
pnlNewQuest.setLayout(new MigLayout("insets 0, gap 0, align center, wrap"));
|
||||
pnlNewQuest.setOpaque(false);
|
||||
pnlNewQuest.add(pnl1, "w 99%, h 8%!, gap 0 0 0 2%");
|
||||
pnlNewQuest.add(pnl2, "w 99%!, h 89%!");
|
||||
}
|
||||
|
||||
/** Layout permanent parts of prefs panel. */
|
||||
private void populatePrefs() {
|
||||
pnlPrefs.setOpaque(false);
|
||||
pnlPrefs.setLayout(new MigLayout("insets 0, gap 0, wrap"));
|
||||
|
||||
pnlPrefs.add(new QuestPreferencesHandler(), "w 100%!");
|
||||
pnlPrefs.add(btnResetPrefs, " w 60%!, h 30px!, gap 20% 0 20px 20px");
|
||||
}
|
||||
|
||||
private void hideAllPanels() {
|
||||
pnlTitle.setVisible(false);
|
||||
pnlStats.setVisible(false);
|
||||
pnlDuels.setVisible(false);
|
||||
pnlChallenges.setVisible(false);
|
||||
pnlStart.setVisible(false);
|
||||
pnlDecks.setVisible(false);
|
||||
pnlNewQuest.setVisible(false);
|
||||
pnlLoadQuest.setVisible(false);
|
||||
pnlPrefs.setVisible(false);
|
||||
}
|
||||
|
||||
//========= UPDATE METHODS
|
||||
/** Update transitory parts of duels panel. */
|
||||
public void updateDuels() {
|
||||
if (AllZone.getQuestData() == null) { return; }
|
||||
|
||||
pnlDuels.removeAll();
|
||||
final List<QuestDuel> duels = control.getQEM().generateDuels();
|
||||
|
||||
for (QuestDuel d : duels) {
|
||||
SelectablePanel temp = new SelectablePanel(d);
|
||||
pnlDuels.add(temp, this.eventPanelConstraints);
|
||||
}
|
||||
}
|
||||
|
||||
/** Update transitory parts of challenges panel. */
|
||||
public void updateChallenges() {
|
||||
if (AllZone.getQuestData() == null) { return; }
|
||||
|
||||
pnlChallenges.removeAll();
|
||||
final List<QuestChallenge> challenges = control.getQEM().generateChallenges(AllZone.getQuestData());
|
||||
|
||||
for (QuestChallenge c : challenges) {
|
||||
SelectablePanel temp = new SelectablePanel(c);
|
||||
pnlChallenges.add(temp, this.eventPanelConstraints);
|
||||
}
|
||||
}
|
||||
|
||||
/** Update transitory parts of stats panel. */
|
||||
public void updateStats() {
|
||||
pnlStats.removeAll();
|
||||
|
||||
if (AllZone.getQuestData().isFantasy()) {
|
||||
pnlStats.setLayout(new MigLayout("insets 0, gap 0"));
|
||||
|
||||
pnlStats.add(btnBazaar, "w 15%!, h 70px!, gap 0 4% 10px 10px, span 1 2");
|
||||
pnlStats.add(lblWins, "w 30%!, h 25px!, gap 0 2% 12px 0");
|
||||
pnlStats.add(lblLosses, "w 30%!, h 25px!, gap 0 4% 12px 0");
|
||||
pnlStats.add(btnSpellShop, "w 14.5%!, h 70px!, gap 0 0 10px 10px, span 1 2, wrap");
|
||||
pnlStats.add(lblCredits, "w 30%!, h 25px!, gap 0 2% 0 0");
|
||||
pnlStats.add(lblLife, "w 30%!, h 25px!, gap 0 4% 0 0 0, wrap");
|
||||
pnlStats.add(lblWinStreak, "h 20px!, align center, span 4 1, wrap");
|
||||
pnlStats.add(lblNextChallengeInWins, "h 20px!, align center, span 4 1, wrap");
|
||||
pnlStats.add(btnCurrentDeck, "w 40%!, h 26px!, align center, span 4 1, gap 0 0 0 5px");
|
||||
}
|
||||
else {
|
||||
pnlStats.setLayout(new MigLayout("insets 0, gap 0, align center"));
|
||||
lblCredits.setHorizontalAlignment(SwingConstants.CENTER);
|
||||
|
||||
pnlStats.add(lblWins, "w 150px!, h 25px!, gap 0 50px 5px 5px, align center");
|
||||
pnlStats.add(lblCredits, "w 150px!, h 25px!, gap 0 0 5px 5px, align center, wrap");
|
||||
pnlStats.add(lblLosses, "w 150px!, h 25px!, gap 0 50px 0 5px, align center");
|
||||
pnlStats.add(btnSpellShop, "w 150px!, h 25px!, gap 0 0 0 5px, align center, wrap");
|
||||
pnlStats.add(lblWinStreak, "h 20px!, align center, span 4 1, wrap");
|
||||
pnlStats.add(lblNextChallengeInWins, "h 20px!, align center, span 4 1, gap 0 0 10px 5px, wrap");
|
||||
pnlStats.add(btnCurrentDeck, "w 40%!, h 26px!, align center, span 4 1, gap 0 0 0 5px");
|
||||
}
|
||||
}
|
||||
|
||||
/** */
|
||||
public void resetPrefs() {
|
||||
pnlPrefs.removeAll();
|
||||
populatePrefs();
|
||||
pnlPrefs.revalidate();
|
||||
Singletons.getView().getViewHome().getBtnQuest().grabFocus();
|
||||
}
|
||||
|
||||
//========= TAB SHOW METHODS
|
||||
/** Display handler for duel tab click. */
|
||||
public void showDuelsTab() {
|
||||
if (AllZone.getQuestData() == null) {
|
||||
showQuestsTab();
|
||||
return;
|
||||
}
|
||||
|
||||
control.updateTabber(tabDuels);
|
||||
hideAllPanels();
|
||||
pnlTitle.setVisible(true);
|
||||
|
||||
setCurrentDeckStatus();
|
||||
updateDuels();
|
||||
updateStats();
|
||||
control.refreshStats();
|
||||
lblTitle.setText("Duels: " + control.getRankString());
|
||||
|
||||
// Select first event.
|
||||
if (control.getCurrentDeck() != null) {
|
||||
pnlStart.setVisible(true);
|
||||
selectedOpponent = (SelectablePanel) pnlDuels.getComponent(0);
|
||||
selectedOpponent.setSelected(true);
|
||||
}
|
||||
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
pnlStats.setVisible(true);
|
||||
pnlDuels.setVisible(true);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/** Display handler for duel tab click. */
|
||||
public void showChallengesTab() {
|
||||
if (AllZone.getQuestData() == null) {
|
||||
showQuestsTab();
|
||||
return;
|
||||
}
|
||||
|
||||
control.updateTabber(tabChallenges);
|
||||
hideAllPanels();
|
||||
pnlTitle.setVisible(true);
|
||||
|
||||
setCurrentDeckStatus();
|
||||
updateChallenges();
|
||||
updateStats();
|
||||
control.refreshStats();
|
||||
lblTitle.setText("Challenges: " + control.getRankString());
|
||||
|
||||
// Select first event.
|
||||
if (pnlChallenges.getComponentCount() > 0) {
|
||||
pnlStart.setVisible(true);
|
||||
selectedOpponent = (SelectablePanel) pnlChallenges.getComponent(0);
|
||||
selectedOpponent.setSelected(true);
|
||||
}
|
||||
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
pnlStats.setVisible(true);
|
||||
pnlChallenges.setVisible(true);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/** Display handler for decks tab click. */
|
||||
public void showDecksTab() {
|
||||
if (AllZone.getQuestData() == null) {
|
||||
showQuestsTab();
|
||||
return;
|
||||
}
|
||||
|
||||
control.updateTabber(tabDecks);
|
||||
this.hideAllPanels();
|
||||
pnlTitle.setVisible(true);
|
||||
lblTitle.setText("Quest Deck Manager");
|
||||
pnlDecks.setVisible(true);
|
||||
}
|
||||
|
||||
/** Display handler for quests tab click. */
|
||||
public void showQuestsTab() {
|
||||
control.updateTabber(tabQuests);
|
||||
this.hideAllPanels();
|
||||
|
||||
pnlNewQuest.setVisible(true);
|
||||
pnlLoadQuest.setVisible(true);
|
||||
}
|
||||
|
||||
/** Display handler for quests tab click. */
|
||||
public void showPrefsTab() {
|
||||
control.updateTabber(tabPreferences);
|
||||
|
||||
this.hideAllPanels();
|
||||
|
||||
lblTitle.setText("Quest Preferences");
|
||||
pnlTitle.setVisible(true);
|
||||
pnlPrefs.setVisible(true);
|
||||
}
|
||||
|
||||
/** Toggles red, bold font if no current deck. */
|
||||
public void setCurrentDeckStatus() {
|
||||
if (control.getCurrentDeck() == null) {
|
||||
btnCurrentDeck.setBackground(Color.red.darker());
|
||||
btnCurrentDeck.setText(" Build, then select a deck in the \"Decks\" tab. ");
|
||||
}
|
||||
else {
|
||||
btnCurrentDeck.setBackground(FSkin.getColor(FSkin.Colors.CLR_INACTIVE));
|
||||
btnCurrentDeck.setText("Current deck: " + control.getCurrentDeck().getName());
|
||||
}
|
||||
}
|
||||
|
||||
/** Selectable panels for duels and challenges. */
|
||||
public class SelectablePanel extends FPanel {
|
||||
private QuestEvent event;
|
||||
|
||||
/** @param e0   QuestEvent */
|
||||
public SelectablePanel(QuestEvent e0) {
|
||||
super();
|
||||
this.event = e0;
|
||||
this.setSelectable(true);
|
||||
this.setHoverable(true);
|
||||
this.setLayout(new MigLayout("insets 0, gap 0"));
|
||||
|
||||
this.setCommand(new Command() {
|
||||
@Override
|
||||
public void execute() {
|
||||
if (selectedOpponent != null) { selectedOpponent.setSelected(false); }
|
||||
selectedOpponent = ViewQuest.SelectablePanel.this;
|
||||
}
|
||||
});
|
||||
|
||||
// Icon
|
||||
final File base = ForgeProps.getFile(NewConstants.IMAGE_ICON);
|
||||
File file = new File(base, event.getIconFilename());
|
||||
|
||||
final FLabel lblIcon = new FLabel.Builder().iconScaleFactor(1).build();
|
||||
if (!file.exists()) {
|
||||
lblIcon.setIcon(FSkin.getIcon(FSkin.ForgeIcons.ICO_UNKNOWN));
|
||||
}
|
||||
else {
|
||||
lblIcon.setIcon(new ImageIcon(file.toString()));
|
||||
}
|
||||
this.add(lblIcon, "h 60px!, w 60px!, gap 10px 10px 10px 0, span 1 2");
|
||||
|
||||
// Name
|
||||
final FLabel lblName = new FLabel.Builder()
|
||||
.text(event.getTitle() + ": " + event.getDifficulty()).hoverable(false).build();
|
||||
this.add(lblName, "h 31px!, gap 0 0 10px 5px, wrap");
|
||||
|
||||
// Description
|
||||
final FTextArea tarDesc = new FTextArea();
|
||||
tarDesc.addMouseListener(new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseEntered(MouseEvent e) {
|
||||
SelectablePanel.this.setHovered(true);
|
||||
SelectablePanel.this.repaint();
|
||||
}
|
||||
});
|
||||
tarDesc.setText(event.getDescription());
|
||||
tarDesc.setFont(FSkin.getItalicFont(12));
|
||||
this.add(tarDesc, "w 80%!, h 30px!");
|
||||
}
|
||||
|
||||
/** @return QuestEvent */
|
||||
public QuestEvent getEvent() {
|
||||
return event;
|
||||
}
|
||||
}
|
||||
|
||||
//========= RETRIEVAL FUNCTIONS
|
||||
/** @return {@link javax.swing.JRadioButton} */
|
||||
public JRadioButton getRadEasy() {
|
||||
return radEasy;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JRadioButton} */
|
||||
public JRadioButton getRadMedium() {
|
||||
return radMedium;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JRadioButton} */
|
||||
public JRadioButton getRadHard() {
|
||||
return radHard;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JRadioButton} */
|
||||
public JRadioButton getRadExpert() {
|
||||
return radExpert;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JRadioButton} */
|
||||
public JRadioButton getRadFantasy() {
|
||||
return radFantasy;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JRadioButton} */
|
||||
public JRadioButton getRadClassic() {
|
||||
return radClassic;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JCheckBox} */
|
||||
public JCheckBox getCbStandardStart() {
|
||||
return cbStandardStart;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JCheckBox} */
|
||||
public JCheckBox getCbPlant() {
|
||||
return cbPlant;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JCheckBox} */
|
||||
public JCheckBox getCbZep() {
|
||||
return cbZep;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JComboBox} */
|
||||
public JComboBox getCbxPet() {
|
||||
return cbxPet;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.home.ViewQuest.SelectablePanel} */
|
||||
public SelectablePanel getSelectedOpponent() {
|
||||
return selectedOpponent;
|
||||
}
|
||||
|
||||
/** @return {@link forge.control.home.ControlQuest} */
|
||||
public ControlQuest getControl() {
|
||||
return control;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.FLabel} */
|
||||
public FLabel getLblTitle() {
|
||||
return lblTitle;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.FLabel} */
|
||||
public FLabel getLblLife() {
|
||||
return lblLife;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.FLabel} */
|
||||
public FLabel getLblCredits() {
|
||||
return lblCredits;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.FLabel} */
|
||||
public FLabel getLblWins() {
|
||||
return lblWins;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.FLabel} */
|
||||
public FLabel getLblLosses() {
|
||||
return lblLosses;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.FLabel} */
|
||||
public FLabel getLblNextChallengeInWins() {
|
||||
return lblNextChallengeInWins;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.FLabel} */
|
||||
public FLabel getLblWinStreak() {
|
||||
return lblWinStreak;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.toolbox.FLabel} */
|
||||
public FLabel getBtnCurrentDeck() {
|
||||
return btnCurrentDeck;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JButton} */
|
||||
public JButton getBtnStart() {
|
||||
return btnStart;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.toolbox.FLabel} */
|
||||
public FLabel getBtnBazaar() {
|
||||
return btnBazaar;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.toolbox.FLabel} */
|
||||
public FLabel getBtnSpellShop() {
|
||||
return btnSpellShop;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.toolbox.FLabel} */
|
||||
public FLabel getBtnEmbark() {
|
||||
return btnEmbark;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.toolbox.FLabel} */
|
||||
public FLabel getBtnResetPrefs() {
|
||||
return btnResetPrefs;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.toolbox.FLabel} */
|
||||
public FLabel getBtnNewDeck() {
|
||||
return btnNewDeck;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.toolbox.FProgressBar} */
|
||||
public FProgressBar getBarProgress() {
|
||||
return barProgress;
|
||||
}
|
||||
|
||||
//========== CONTAINER RETRIEVAL
|
||||
/** @return {@link javax.swing.JPanel} */
|
||||
public JPanel getPnlStats() {
|
||||
return this.pnlStats;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JPanel} */
|
||||
public JPanel getPnlTitle() {
|
||||
return this.pnlTitle;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JPanel} */
|
||||
public JPanel getPnlDuels() {
|
||||
return this.pnlDuels;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JPanel} */
|
||||
public JPanel getPnlChallenges() {
|
||||
return this.pnlChallenges;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JPanel} */
|
||||
public JPanel getPnlStart() {
|
||||
return this.pnlStart;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JPanel} */
|
||||
public JPanel getPnlLoadQuest() {
|
||||
return pnlLoadQuest;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JPanel} */
|
||||
public JPanel getpnlPrefs() {
|
||||
return pnlPrefs;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.toolbox.DeckLister} */
|
||||
public DeckLister getLstDecks() {
|
||||
return this.lstDecks;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.home.QuestFileLister} */
|
||||
public QuestFileLister getLstQuests() {
|
||||
return this.lstQuests;
|
||||
}
|
||||
|
||||
//========== TAB RETRIEVAL
|
||||
/** @return {@link javax.swing.JPanel} */
|
||||
public JPanel getTabDuels() {
|
||||
return tabDuels;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JPanel} */
|
||||
public JPanel getTabChallenges() {
|
||||
return tabChallenges;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JPanel} */
|
||||
public JPanel getTabDecks() {
|
||||
return tabDecks;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JPanel} */
|
||||
public JPanel getTabQuests() {
|
||||
return tabQuests;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JPanel} */
|
||||
public JPanel getTabPreferences() {
|
||||
return tabPreferences;
|
||||
}
|
||||
}
|
||||
@@ -1,88 +0,0 @@
|
||||
package forge.view.home;
|
||||
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.SwingConstants;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import forge.control.home.ControlSealed;
|
||||
import forge.game.GameType;
|
||||
import forge.view.toolbox.DeckLister;
|
||||
import forge.view.toolbox.FLabel;
|
||||
import forge.view.toolbox.FProgressBar;
|
||||
import forge.view.toolbox.FScrollPane;
|
||||
import forge.view.toolbox.FSkin;
|
||||
|
||||
/**
|
||||
* Assembles swing components for "Sealed" mode menu.
|
||||
*
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public class ViewSealed extends JPanel {
|
||||
private final ControlSealed control;
|
||||
private DeckLister lstHumanDecks;
|
||||
private final JButton btnStart;
|
||||
private final FLabel btnBuild;
|
||||
private final FProgressBar barProgress;
|
||||
|
||||
/** Assembles swing components for "Sealed" mode menu. */
|
||||
public ViewSealed() {
|
||||
super();
|
||||
this.setOpaque(false);
|
||||
this.setLayout(new MigLayout("insets 0, gap 0, hidemode 2, wrap"));
|
||||
control = new ControlSealed(this);
|
||||
|
||||
// Title
|
||||
JLabel lblTitle = new JLabel("Select a deck for yourself, or build a new one: ");
|
||||
lblTitle.setFont(FSkin.getBoldFont(14));
|
||||
lblTitle.setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT));
|
||||
lblTitle.setHorizontalAlignment(SwingConstants.CENTER);
|
||||
|
||||
// Deck lister
|
||||
lstHumanDecks = new DeckLister(GameType.Sealed, control.getExitCommand());
|
||||
|
||||
// Build button
|
||||
btnBuild = new FLabel.Builder().opaque(true).hoverable(true).text("Build A New Deck").build();
|
||||
|
||||
// Start button
|
||||
btnStart = new StartButton();
|
||||
barProgress = new FProgressBar();
|
||||
barProgress.setVisible(false);
|
||||
|
||||
// Add components
|
||||
this.add(lblTitle, "w 100%!, gap 0 0 2% 2%");
|
||||
this.add(new FScrollPane(lstHumanDecks), "w 90%!, h 35%!, gap 5% 0 2% 2%");
|
||||
this.add(btnBuild, "w 50%!, h 5%!, gap 25% 0 0 0, wrap");
|
||||
this.add(btnStart, "ax center, gaptop 5%");
|
||||
this.add(barProgress, "w 150px!, h 30px!, align center");
|
||||
|
||||
control.updateDeckLists();
|
||||
control.addListeners();
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JList} */
|
||||
public DeckLister getLstHumanDecks() {
|
||||
return lstHumanDecks;
|
||||
}
|
||||
|
||||
/** @return {@link forge.control.home.ControlSealed} */
|
||||
public ControlSealed getControl() {
|
||||
return control;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.toolbox.FLabel} */
|
||||
public FLabel getBtnBuild() {
|
||||
return btnBuild;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JButton} */
|
||||
public JButton getBtnStart() {
|
||||
return btnStart;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.toolbox.FProgressBar} */
|
||||
public FProgressBar getBarProgress() {
|
||||
return barProgress;
|
||||
}
|
||||
}
|
||||
@@ -1,545 +0,0 @@
|
||||
package forge.view.home;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Font;
|
||||
import java.awt.Image;
|
||||
import java.awt.event.FocusAdapter;
|
||||
import java.awt.event.FocusEvent;
|
||||
import java.awt.event.KeyAdapter;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.swing.ImageIcon;
|
||||
import javax.swing.JCheckBox;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JList;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.JTextField;
|
||||
import javax.swing.SwingConstants;
|
||||
import javax.swing.border.MatteBorder;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.commons.lang3.text.WordUtils;
|
||||
|
||||
import forge.Command;
|
||||
import forge.Singletons;
|
||||
import forge.control.KeyboardShortcuts;
|
||||
import forge.control.KeyboardShortcuts.Shortcut;
|
||||
import forge.control.home.ControlSettings;
|
||||
import forge.properties.ForgePreferences.FPref;
|
||||
import forge.properties.ForgeProps;
|
||||
import forge.properties.NewConstants.Lang.OldGuiNewGame.NewGameText;
|
||||
import forge.view.toolbox.FLabel;
|
||||
import forge.view.toolbox.FList;
|
||||
import forge.view.toolbox.FScrollPane;
|
||||
import forge.view.toolbox.FSkin;
|
||||
import forge.view.toolbox.SubTab;
|
||||
import forge.view.toolbox.WrapLayout;
|
||||
|
||||
/**
|
||||
* Assembles swing components for "Settings" mode menu.
|
||||
*
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public class ViewSettings extends JPanel {
|
||||
private final ControlSettings control;
|
||||
private final FLabel btnReset, lblTitleSkin;
|
||||
|
||||
private final JList lstChooseSkin;
|
||||
|
||||
private final JCheckBox cbAnte, cbScaleLarger, cbDevMode, cbRemoveSmall, cbRemoveArtifacts,
|
||||
cbUploadDraft, cbStackLand, cbRandomFoil, cbTextMana, cbSingletons;
|
||||
|
||||
private final JPanel pnlTabber, pnlPrefs, pnlAvatars, tabPrefs, tabAvatars;
|
||||
private final JScrollPane scrContent;
|
||||
|
||||
private String sectionConstraints, regularConstraints, tabberConstraints;
|
||||
|
||||
private final FLabel lblAvatarHuman, lblAvatarAI;
|
||||
|
||||
/** Assembles swing components for "Settings" mode menu. */
|
||||
public ViewSettings() {
|
||||
// Display
|
||||
super();
|
||||
this.setOpaque(false);
|
||||
|
||||
// Final component inits: JPanels
|
||||
pnlTabber = new JPanel();
|
||||
pnlTabber.setOpaque(false);
|
||||
|
||||
pnlPrefs = new JPanel();
|
||||
pnlPrefs.setOpaque(false);
|
||||
|
||||
pnlAvatars = new JPanel();
|
||||
pnlAvatars.setOpaque(false);
|
||||
|
||||
tabPrefs = new SubTab("Preferences");
|
||||
tabAvatars = new SubTab("Avatars");
|
||||
|
||||
cbRemoveSmall = new OptionsCheckBox("Remove Small Creatures");
|
||||
cbSingletons = new OptionsCheckBox("Singleton Mode");
|
||||
cbRemoveArtifacts = new OptionsCheckBox("Remove Artifacts");
|
||||
cbAnte = new OptionsCheckBox("Play for Ante");
|
||||
cbUploadDraft = new OptionsCheckBox("Upload Draft Pics");
|
||||
cbStackLand = new OptionsCheckBox("Stack AI Land");
|
||||
cbDevMode = new OptionsCheckBox(ForgeProps.getLocalized(NewGameText.DEV_MODE));
|
||||
cbTextMana = new OptionsCheckBox("Text / Mana Overlay");
|
||||
cbScaleLarger = new OptionsCheckBox("Scale Image Larger");
|
||||
cbRandomFoil = new OptionsCheckBox("Random Foil");
|
||||
|
||||
// Final component inits: Various
|
||||
scrContent = new JScrollPane(
|
||||
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
|
||||
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
|
||||
scrContent.getViewport().setOpaque(false);
|
||||
scrContent.setBorder(null);
|
||||
scrContent.setOpaque(false);
|
||||
scrContent.getVerticalScrollBar().setUnitIncrement(16);
|
||||
|
||||
lstChooseSkin = new FList();
|
||||
|
||||
btnReset = new FLabel.Builder().opaque(true)
|
||||
.hoverable(true).text("Reset to defaults").build();
|
||||
|
||||
lblTitleSkin = new FLabel.Builder().text("Choose Skin").fontScaleAuto(false).build();
|
||||
lblTitleSkin.setFont(FSkin.getBoldFont(14));
|
||||
|
||||
lblAvatarHuman = new FLabel.Builder().hoverable(true).selectable(true)
|
||||
.iconScaleFactor(0.99f).iconInBackground(true).build();
|
||||
lblAvatarAI = new FLabel.Builder().hoverable(true).selectable(true)
|
||||
.iconScaleFactor(0.99f).iconInBackground(true).build();
|
||||
|
||||
populateTabber();
|
||||
populatePrefs();
|
||||
populateAvatars();
|
||||
|
||||
this.setLayout(new MigLayout("insets 0, gap 0, wrap, hidemode 3"));
|
||||
this.add(pnlTabber, "w 95%!, h 20px!, gap 2.5% 0 0 0");
|
||||
this.add(scrContent, "w 95%!, h 92%!, gap 2.5% 0 20px 0");
|
||||
|
||||
// After all components are instantiated, fire up control.
|
||||
this.control = new ControlSettings(this);
|
||||
showPrefsTab();
|
||||
}
|
||||
|
||||
/** */
|
||||
public void updateSkinNames() {
|
||||
final String[] uglyNames = FSkin.getSkins().toArray(new String[0]);
|
||||
final String[] prettyNames = new String[uglyNames.length];
|
||||
|
||||
for (int i = 0; i < uglyNames.length; i++) {
|
||||
prettyNames[i] = WordUtils.capitalize(uglyNames[i].replace('_', ' '));
|
||||
}
|
||||
|
||||
lstChooseSkin.setListData(prettyNames);
|
||||
lstChooseSkin.setSelectedValue(Singletons.getModel().getPreferences().getPref(FPref.UI_SKIN), true);
|
||||
lstChooseSkin.ensureIndexIsVisible(lstChooseSkin.getSelectedIndex());
|
||||
}
|
||||
|
||||
private void populateTabber() {
|
||||
tabPrefs.setToolTipText("Global preference options");
|
||||
tabAvatars.setToolTipText("Human and AI avatar select");
|
||||
|
||||
tabberConstraints = "w 50%!, h 20px!";
|
||||
pnlTabber.setOpaque(false);
|
||||
pnlTabber.setLayout(new MigLayout("insets 0, gap 0, align center"));
|
||||
|
||||
pnlTabber.add(tabPrefs, tabberConstraints);
|
||||
pnlTabber.add(tabAvatars, tabberConstraints);
|
||||
}
|
||||
|
||||
private void populatePrefs() {
|
||||
pnlPrefs.setLayout(new MigLayout("insets 0, gap 0, wrap 2"));
|
||||
|
||||
// Spacing between components is defined here.
|
||||
sectionConstraints = "w 80%!, h 42px!, gap 10% 0 10px 10px, span 2 1";
|
||||
regularConstraints = "w 80%!, h 22px!, gap 10% 0 0 10px, span 2 1";
|
||||
|
||||
// Deck building options
|
||||
pnlPrefs.add(new SectionLabel("Deck Building Options"), sectionConstraints + ", gaptop 2%");
|
||||
|
||||
pnlPrefs.add(cbRemoveSmall, regularConstraints);
|
||||
pnlPrefs.add(new NoteLabel("Disables 1/1 and 0/X creatures in generated decks."), regularConstraints);
|
||||
|
||||
pnlPrefs.add(cbSingletons, regularConstraints);
|
||||
pnlPrefs.add(new NoteLabel("Disables non-land duplicates in generated decks."), regularConstraints);
|
||||
|
||||
pnlPrefs.add(cbRemoveArtifacts, regularConstraints);
|
||||
pnlPrefs.add(new NoteLabel("Disables artifact cards in generated decks."), regularConstraints);
|
||||
|
||||
// Gameplay Options
|
||||
pnlPrefs.add(new SectionLabel("Gameplay Options"), sectionConstraints);
|
||||
|
||||
pnlPrefs.add(cbAnte, regularConstraints);
|
||||
pnlPrefs.add(new NoteLabel("Determines whether or not the game is played for ante."), regularConstraints);
|
||||
|
||||
pnlPrefs.add(cbUploadDraft, regularConstraints);
|
||||
pnlPrefs.add(new NoteLabel("Sends draft picks to Forge servers for analysis, to improve draft AI."), regularConstraints);
|
||||
|
||||
pnlPrefs.add(cbStackLand, regularConstraints);
|
||||
pnlPrefs.add(new NoteLabel("Minimizes mana lock in AI hands, giving a slight advantage to computer."), regularConstraints);
|
||||
|
||||
pnlPrefs.add(cbDevMode, regularConstraints);
|
||||
pnlPrefs.add(new NoteLabel("Enables menu with functions for testing during development."), regularConstraints);
|
||||
|
||||
// Graphic Options
|
||||
pnlPrefs.add(new SectionLabel("Graphic Options"), sectionConstraints);
|
||||
|
||||
pnlPrefs.add(lblTitleSkin, regularConstraints);
|
||||
pnlPrefs.add(new NoteLabel("Various user-created themes for Forge backgrounds, fonts, and colors."), regularConstraints);
|
||||
pnlPrefs.add(new FScrollPane(lstChooseSkin), "h 120px!, w 150px!, gap 10% 0 0 2%, wrap");
|
||||
|
||||
pnlPrefs.add(new FLabel.Builder().text("Card Size").fontStyle(Font.BOLD).build(), regularConstraints);
|
||||
pnlPrefs.add(new NoteLabel("Size of cards in hand and playing field, when possible"), regularConstraints);
|
||||
|
||||
pnlPrefs.add(cbRandomFoil, regularConstraints);
|
||||
pnlPrefs.add(new NoteLabel("Adds foiled effects to random cards."), regularConstraints);
|
||||
|
||||
pnlPrefs.add(cbScaleLarger, regularConstraints);
|
||||
pnlPrefs.add(new NoteLabel("Allows card pictures to be expanded larger than their original size."), regularConstraints);
|
||||
|
||||
pnlPrefs.add(cbTextMana, regularConstraints);
|
||||
pnlPrefs.add(new NoteLabel("Overlays each card with basic card-specific information."), regularConstraints);
|
||||
|
||||
// Keyboard shortcuts
|
||||
final JLabel lblShortcuts = new SectionLabel("Keyboard Shortcuts");
|
||||
pnlPrefs.add(lblShortcuts, sectionConstraints);
|
||||
|
||||
final List<Shortcut> shortcuts = Singletons.getControl().getShortcuts();
|
||||
|
||||
FLabel lblTemp;
|
||||
KeyboardShortcutField ksf;
|
||||
for (final Shortcut s : shortcuts) {
|
||||
lblTemp = new FLabel.Builder().text(s.getDescription()).build();
|
||||
ksf = new KeyboardShortcutField(s);
|
||||
pnlPrefs.add(lblTemp, "w 40%!, h 22px!, gap 10%! 0 0 1%");
|
||||
pnlPrefs.add(ksf, "w 25%!");
|
||||
}
|
||||
|
||||
// Reset button
|
||||
pnlPrefs.add(new SectionLabel(" "), sectionConstraints);
|
||||
pnlPrefs.add(btnReset, sectionConstraints);
|
||||
} // End populatePrefs()
|
||||
|
||||
private void populateAvatars() {
|
||||
final Map<Integer, Image> avatarMap = FSkin.getAvatars();
|
||||
final JPanel pnlAvatarPics = new JPanel(new WrapLayout());
|
||||
final JPanel pnlAvatarUsers = new JPanel(new MigLayout("insets 0, gap 0, align center"));
|
||||
|
||||
pnlAvatarUsers.setOpaque(false);
|
||||
pnlAvatarPics.setOpaque(false);
|
||||
|
||||
pnlAvatarUsers.add(new FLabel.Builder().fontSize(12).text("Human").build(),
|
||||
"w 100px!, h 20px!, gap 0 20px 0 0");
|
||||
pnlAvatarUsers.add(new FLabel.Builder().fontSize(12).text("AI").build(),
|
||||
"w 100px!, h 20px!, wrap");
|
||||
|
||||
pnlAvatarUsers.add(lblAvatarHuman, "w 100px!, h 100px!, gap 0 20px 0 0");
|
||||
pnlAvatarUsers.add(lblAvatarAI, "w 100px!, h 100px!");
|
||||
|
||||
for (final Integer i : avatarMap.keySet()) {
|
||||
pnlAvatarPics.add(makeAvatarLabel(avatarMap.get(i), i));
|
||||
}
|
||||
|
||||
pnlAvatars.removeAll();
|
||||
pnlAvatars.setLayout(new MigLayout("insets 0, gap 0"));
|
||||
pnlAvatars.add(pnlAvatarUsers, "w 90%!, h 150px!, wrap");
|
||||
pnlAvatars.add(new FScrollPane(pnlAvatarPics,
|
||||
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER),
|
||||
"w 90%!, pushy, growy, gap 5% 0 0 0");
|
||||
|
||||
final Command cmdHuman = new Command() { @Override
|
||||
public void execute() { lblAvatarAI.setSelected(false); } };
|
||||
|
||||
final Command cmdAI = new Command() { @Override
|
||||
public void execute() { lblAvatarHuman.setSelected(false); } };
|
||||
|
||||
lblAvatarHuman.setCommand(cmdHuman);
|
||||
lblAvatarAI.setCommand(cmdAI);
|
||||
|
||||
lblAvatarHuman.setSelected(true);
|
||||
|
||||
final String[] indexes = Singletons.getModel().getPreferences().getPref(FPref.UI_AVATARS).split(",");
|
||||
int humanIndex = Integer.parseInt(indexes[0]);
|
||||
int aiIndex = Integer.parseInt(indexes[1]);
|
||||
|
||||
if (humanIndex >= FSkin.getAvatars().size()) { humanIndex = 0; }
|
||||
if (aiIndex >= FSkin.getAvatars().size()) { aiIndex = 0; }
|
||||
|
||||
lblAvatarHuman.setIcon(new ImageIcon(FSkin.getAvatars().get(humanIndex)));
|
||||
lblAvatarAI.setIcon(new ImageIcon(FSkin.getAvatars().get(aiIndex)));
|
||||
|
||||
Singletons.getModel().getPreferences().setPref(FPref.UI_AVATARS, aiIndex + "," + humanIndex);
|
||||
Singletons.getModel().getPreferences().save();
|
||||
}
|
||||
|
||||
private FLabel makeAvatarLabel(final Image img0, final int index0) {
|
||||
final FLabel lbl = new FLabel.Builder().icon(new ImageIcon(img0)).iconScaleFactor(1.0)
|
||||
.iconAlpha(0.7f).iconInBackground(true).hoverable(true).build();
|
||||
|
||||
final Dimension size = new Dimension(100, 100);
|
||||
lbl.setPreferredSize(size);
|
||||
lbl.setMaximumSize(size);
|
||||
lbl.setMinimumSize(size);
|
||||
|
||||
final Command cmd = new Command() {
|
||||
@Override
|
||||
public void execute() {
|
||||
String[] indices = Singletons.getModel().getPreferences()
|
||||
.getPref(FPref.UI_AVATARS).split(",");
|
||||
|
||||
if (lblAvatarAI.isSelected()) {
|
||||
lblAvatarAI.setIcon(new ImageIcon(FSkin.getAvatars().get(index0)));
|
||||
lblAvatarAI.repaintOnlyThisLabel();
|
||||
indices[0] = String.valueOf(index0);
|
||||
}
|
||||
else {
|
||||
lblAvatarHuman.setIcon(new ImageIcon(FSkin.getAvatars().get(index0)));
|
||||
lblAvatarHuman.repaintOnlyThisLabel();
|
||||
indices[1] = String.valueOf(index0);
|
||||
}
|
||||
|
||||
Singletons.getModel().getPreferences().setPref(FPref.UI_AVATARS, indices[0] + "," + indices[1]);
|
||||
Singletons.getModel().getPreferences().save();
|
||||
}
|
||||
};
|
||||
|
||||
lbl.setCommand(cmd);
|
||||
return lbl;
|
||||
}
|
||||
|
||||
/** Consolidates checkbox styling in one place. */
|
||||
private class OptionsCheckBox extends JCheckBox {
|
||||
public OptionsCheckBox(final String txt0) {
|
||||
super();
|
||||
setText(txt0);
|
||||
setFont(FSkin.getBoldFont(12));
|
||||
setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT));
|
||||
setBackground(FSkin.getColor(FSkin.Colors.CLR_HOVER));
|
||||
setOpaque(false);
|
||||
|
||||
this.addMouseListener(new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseEntered(final MouseEvent evt) {
|
||||
setOpaque(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseExited(final MouseEvent evt) {
|
||||
setOpaque(false);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/** Consolidates section title label styling in one place. */
|
||||
private class SectionLabel extends JLabel {
|
||||
public SectionLabel(final String txt0) {
|
||||
super(txt0);
|
||||
setBorder(new MatteBorder(0, 0, 1, 0, FSkin.getColor(FSkin.Colors.CLR_BORDERS)));
|
||||
setHorizontalAlignment(SwingConstants.CENTER);
|
||||
setFont(FSkin.getBoldFont(16));
|
||||
setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT));
|
||||
}
|
||||
}
|
||||
|
||||
/** Consolidates notation label styling in one place. */
|
||||
private class NoteLabel extends JLabel {
|
||||
public NoteLabel(final String txt0) {
|
||||
super(txt0);
|
||||
setFont(FSkin.getItalicFont(12));
|
||||
setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A JTextField plus a "codeString" property, that stores keycodes for the
|
||||
* shortcut. Also, an action listener that handles translation of keycodes
|
||||
* into characters and (dis)assembly of keycode stack.
|
||||
*/
|
||||
public class KeyboardShortcutField extends JTextField {
|
||||
private String codeString;
|
||||
|
||||
/**
|
||||
* A JTextField plus a "codeString" property, that stores keycodes for
|
||||
* the shortcut. Also, an action listener that handles translation of
|
||||
* keycodes into characters and (dis)assembly of keycode stack.
|
||||
*
|
||||
* @param shortcut0   Shortcut object
|
||||
*/
|
||||
public KeyboardShortcutField(final Shortcut shortcut0) {
|
||||
super();
|
||||
this.setEditable(false);
|
||||
this.setFont(FSkin.getFont(14));
|
||||
this.setCodeString(Singletons.getModel().getPreferences().getPref(shortcut0.getPrefKey()));
|
||||
|
||||
this.addKeyListener(new KeyAdapter() {
|
||||
@Override
|
||||
public void keyPressed(final KeyEvent evt) {
|
||||
KeyboardShortcuts.addKeyCode(evt);
|
||||
}
|
||||
});
|
||||
|
||||
this.addFocusListener(new FocusAdapter() {
|
||||
@Override
|
||||
public void focusGained(final FocusEvent evt) {
|
||||
KeyboardShortcutField.this.setBackground(FSkin.getColor(FSkin.Colors.CLR_ACTIVE));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void focusLost(final FocusEvent evt) {
|
||||
Singletons.getModel().getPreferences().setPref(
|
||||
shortcut0.getPrefKey(), getCodeString());
|
||||
Singletons.getModel().getPreferences().save();
|
||||
shortcut0.attach();
|
||||
KeyboardShortcutField.this.setBackground(Color.white);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the code string.
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
public final String getCodeString() {
|
||||
return this.codeString;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the code string.
|
||||
*
|
||||
* @param str0
|
||||
*   The new code string (space delimited)
|
||||
*/
|
||||
public final void setCodeString(final String str0) {
|
||||
if ("null".equals(str0)) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.codeString = str0.trim();
|
||||
|
||||
final List<String> codes = new ArrayList<String>(Arrays.asList(this.codeString.split(" ")));
|
||||
final List<String> displayText = new ArrayList<String>();
|
||||
|
||||
for (final String s : codes) {
|
||||
if (!s.isEmpty()) {
|
||||
displayText.add(KeyEvent.getKeyText(Integer.valueOf(s)));
|
||||
}
|
||||
}
|
||||
|
||||
this.setText(StringUtils.join(displayText, ' '));
|
||||
}
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JPanel} */
|
||||
public final JPanel getPnlPrefs() {
|
||||
return this.pnlPrefs;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JPanel} */
|
||||
public final JPanel getPnlAvatars() {
|
||||
return this.pnlAvatars;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JList} */
|
||||
public final JList getLstChooseSkin() {
|
||||
return lstChooseSkin;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JCheckBox} */
|
||||
public final JCheckBox getCbRemoveSmall() {
|
||||
return cbRemoveSmall;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JCheckBox} */
|
||||
public final JCheckBox getCbSingletons() {
|
||||
return cbSingletons;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JCheckBox} */
|
||||
public JCheckBox getCbRemoveArtifacts() {
|
||||
return cbRemoveArtifacts;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JCheckBox} */
|
||||
public JCheckBox getCbUploadDraft() {
|
||||
return cbUploadDraft;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JCheckBox} */
|
||||
public JCheckBox getCbStackLand() {
|
||||
return cbStackLand;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JCheckBox} */
|
||||
public JCheckBox getCbTextMana() {
|
||||
return cbTextMana;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JCheckBox} */
|
||||
public JCheckBox getCbRandomFoil() {
|
||||
return cbRandomFoil;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JCheckBox} */
|
||||
public JCheckBox getCbAnte() {
|
||||
return cbAnte;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JCheckBox} */
|
||||
public JCheckBox getCbScaleLarger() {
|
||||
return cbScaleLarger;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JCheckBox} */
|
||||
public JCheckBox getCbDevMode() {
|
||||
return cbDevMode;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.FLabel} */
|
||||
public FLabel getLblTitleSkin() {
|
||||
return lblTitleSkin;
|
||||
}
|
||||
|
||||
/** @return ControlSettings */
|
||||
public ControlSettings getControl() {
|
||||
return ViewSettings.this.control;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.toolbox.FLabel} */
|
||||
public FLabel getBtnReset() {
|
||||
return btnReset;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JPanel} */
|
||||
public JPanel getTabPrefs() {
|
||||
return this.tabPrefs;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JPanel} */
|
||||
public JPanel getTabAvatars() {
|
||||
return this.tabAvatars;
|
||||
}
|
||||
|
||||
/** */
|
||||
public final void showPrefsTab() {
|
||||
this.scrContent.setViewportView(pnlPrefs);
|
||||
control.updateTabber(tabPrefs);
|
||||
}
|
||||
|
||||
/** */
|
||||
public final void showAvatarsTab() {
|
||||
this.scrContent.setViewportView(pnlAvatars);
|
||||
control.updateTabber(tabAvatars);
|
||||
}
|
||||
}
|
||||
@@ -1,216 +0,0 @@
|
||||
package forge.view.home;
|
||||
|
||||
import java.awt.Font;
|
||||
import java.awt.event.ActionEvent;
|
||||
|
||||
import javax.swing.AbstractAction;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JTextPane;
|
||||
import javax.swing.SwingConstants;
|
||||
import javax.swing.border.LineBorder;
|
||||
import javax.swing.text.SimpleAttributeSet;
|
||||
import javax.swing.text.StyleConstants;
|
||||
import javax.swing.text.StyledDocument;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import forge.Singletons;
|
||||
import forge.control.home.ControlUtilities;
|
||||
import forge.view.toolbox.FButton;
|
||||
import forge.view.toolbox.FLabel;
|
||||
import forge.view.toolbox.FPanel;
|
||||
import forge.view.toolbox.FSkin;
|
||||
|
||||
/**
|
||||
* Assembles swing components for "Utilities" mode menu.
|
||||
*
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public class ViewUtilities extends JPanel {
|
||||
private final ControlUtilities control;
|
||||
private final JTextPane tpnLicensing;
|
||||
private final JLabel lblLicensing;
|
||||
|
||||
private FLabel btnDownloadSetPics, btnDownloadPics, btnDownloadQuestImages, btnReportBug, btnImportPictures,
|
||||
btnHowToPlay, btnDownloadPrices, btnDeckEditor;
|
||||
|
||||
private final String license = "Forge License Information" + "\r\n\r\n"
|
||||
+ "This program is free software : you can redistribute it and/or modify "
|
||||
+ "it under the terms of the GNU General Public License as published by "
|
||||
+ "the Free Software Foundation, either version 3 of the License, or "
|
||||
+ "(at your option) any later version." + "\r\n\r\n"
|
||||
+ "This program is distributed in the hope that it will be useful, "
|
||||
+ "but WITHOUT ANY WARRANTY; without even the implied warranty of "
|
||||
+ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the "
|
||||
+ "GNU General Public License for more details." + "\r\n\r\n"
|
||||
+ "You should have received a copy of the GNU General Public License "
|
||||
+ "along with this program. If not, see <http://www.gnu.org/licenses/>.";
|
||||
|
||||
/** Assembles swing components for "Utilities" mode menu. */
|
||||
public ViewUtilities() {
|
||||
super();
|
||||
this.setOpaque(false);
|
||||
this.setLayout(new MigLayout("insets 0, gap 0, wrap, ay center"));
|
||||
final String constraintsLBL = "w 90%!, h 20px!, gap 5% 0 3px 8px";
|
||||
final String constraintsBTN = "h 30px!, w 50%!, gap 25% 0 0 0";
|
||||
|
||||
btnDownloadPics = new FLabel.Builder().opaque(true).hoverable(true)
|
||||
.text("Download LQ Card Pictures").fontScaleFactor(0.5).build();
|
||||
final FLabel lblPics = new FLabel.Builder().fontAlign(SwingConstants.CENTER)
|
||||
.text("Download default card picture for each card.").fontStyle(Font.ITALIC).build();
|
||||
|
||||
this.add(btnDownloadPics, constraintsBTN);
|
||||
this.add(lblPics, constraintsLBL);
|
||||
|
||||
btnDownloadSetPics = new FLabel.Builder().opaque(true).hoverable(true)
|
||||
.text("Download LQ Set Pictures").fontScaleFactor(0.5).build();
|
||||
final FLabel lblSets = new FLabel.Builder().fontAlign(SwingConstants.CENTER)
|
||||
.text("Download full card picture sets for all cards from legacy releases of MTG.")
|
||||
.fontStyle(Font.ITALIC).build();
|
||||
|
||||
this.add(btnDownloadSetPics, constraintsBTN);
|
||||
this.add(lblSets, constraintsLBL);
|
||||
|
||||
btnDownloadQuestImages = new FLabel.Builder().opaque(true).hoverable(true)
|
||||
.text("Download Quest Images").fontScaleFactor(0.5).build();
|
||||
final FLabel lblQuest = new FLabel.Builder().fontAlign(SwingConstants.CENTER)
|
||||
.text("Download tokens and icons used in Quest mode.").fontStyle(Font.ITALIC).build();
|
||||
|
||||
this.add(btnDownloadQuestImages, constraintsBTN);
|
||||
this.add(lblQuest, constraintsLBL);
|
||||
|
||||
btnDownloadPrices = new FLabel.Builder().opaque(true).hoverable(true)
|
||||
.text("Download Card Prices").fontScaleFactor(0.5).build();
|
||||
final FLabel lblPrices = new FLabel.Builder().fontAlign(SwingConstants.CENTER)
|
||||
.text("Download up-to-date price list for in-game card shops.")
|
||||
.fontStyle(Font.ITALIC).build();
|
||||
|
||||
this.add(btnDownloadPrices, constraintsBTN);
|
||||
this.add(lblPrices, constraintsLBL);
|
||||
|
||||
btnImportPictures = new FLabel.Builder().opaque(true).hoverable(true)
|
||||
.text("Import Pictures").fontScaleFactor(0.5).build();
|
||||
final FLabel lblImport = new FLabel.Builder().fontAlign(SwingConstants.CENTER)
|
||||
.text("Import card pictures from a local version of Forge.")
|
||||
.fontStyle(Font.ITALIC).build();
|
||||
this.add(btnImportPictures, constraintsBTN);
|
||||
this.add(lblImport, constraintsLBL);
|
||||
|
||||
btnReportBug = new FLabel.Builder().opaque(true).hoverable(true)
|
||||
.text("Report a Bug").fontScaleFactor(0.5).build();
|
||||
final FLabel lblReport = new FLabel.Builder().fontAlign(SwingConstants.CENTER)
|
||||
.text("Something broken?").fontStyle(Font.ITALIC).build();
|
||||
|
||||
this.add(btnReportBug, constraintsBTN);
|
||||
this.add(lblReport, constraintsLBL);
|
||||
|
||||
btnDeckEditor = new FLabel.Builder().opaque(true).hoverable(true)
|
||||
.text("Deck Editor").fontScaleFactor(0.5).build();
|
||||
final FLabel lblEditor = new FLabel.Builder().fontAlign(SwingConstants.CENTER)
|
||||
.text("Build or edit a deck using all cards available in Forge.")
|
||||
.fontStyle(Font.ITALIC).build();
|
||||
this.add(btnDeckEditor, constraintsBTN);
|
||||
this.add(lblEditor, constraintsLBL);
|
||||
|
||||
btnHowToPlay = new FLabel.Builder().opaque(true).hoverable(true).text("How To Play");
|
||||
this.add(btnHowToPlay, constraintsBTN);
|
||||
|
||||
tpnLicensing = new JTextPane();
|
||||
tpnLicensing.setOpaque(false);
|
||||
tpnLicensing.setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT));
|
||||
tpnLicensing.setFont(FSkin.getFont(15));
|
||||
tpnLicensing.setAlignmentX(SwingConstants.CENTER);
|
||||
tpnLicensing.setFocusable(false);
|
||||
tpnLicensing.setEditable(false);
|
||||
tpnLicensing.setBorder(null);
|
||||
tpnLicensing.setText(license);
|
||||
|
||||
StyledDocument doc = tpnLicensing.getStyledDocument();
|
||||
SimpleAttributeSet center = new SimpleAttributeSet();
|
||||
StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER);
|
||||
doc.setParagraphAttributes(0, doc.getLength(), center, false);
|
||||
|
||||
lblLicensing = new JLabel("Click For License Information");
|
||||
lblLicensing.setFont(FSkin.getFont(16));
|
||||
lblLicensing.setHorizontalAlignment(SwingConstants.CENTER);
|
||||
lblLicensing.setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT));
|
||||
this.add(lblLicensing, "alignx center, gap 5% 0 5% 0");
|
||||
|
||||
control = new ControlUtilities(this);
|
||||
}
|
||||
|
||||
/** */
|
||||
public void showLicensing() {
|
||||
final FButton btnClose = new FButton();
|
||||
final FPanel pnlContainer = new FPanel();
|
||||
|
||||
btnClose.setAction(new AbstractAction() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
Singletons.getView().getOverlay().hideOverlay();
|
||||
}
|
||||
});
|
||||
btnClose.setText("Close");
|
||||
|
||||
pnlContainer.setBorder(new LineBorder(FSkin.getColor(FSkin.Colors.CLR_BORDERS), 1));
|
||||
pnlContainer.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME));
|
||||
pnlContainer.setLayout(new MigLayout("insets 0, wrap"));
|
||||
pnlContainer.add(tpnLicensing, "w 90%, gap 5% 0 20px 0, wrap");
|
||||
pnlContainer.add(btnClose, "w 300px!, h 40px!, gap 0 0 20px 20px, alignx center");
|
||||
|
||||
Singletons.getView().getOverlay().removeAll();
|
||||
Singletons.getView().getOverlay().setLayout(new MigLayout("insets 0"));
|
||||
Singletons.getView().getOverlay().add(pnlContainer, "w 50%, gap 25% 0 5% 5%, wrap");
|
||||
Singletons.getView().getOverlay().showOverlay();
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.toolbox.FLabel} */
|
||||
public FLabel getBtnDownloadPics() {
|
||||
return btnDownloadPics;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.toolbox.FLabel} */
|
||||
public FLabel getBtnDownloadSetPics() {
|
||||
return btnDownloadSetPics;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.toolbox.FLabel} */
|
||||
public FLabel getBtnDownloadQuestImages() {
|
||||
return btnDownloadQuestImages;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.toolbox.FLabel} */
|
||||
public FLabel getBtnReportBug() {
|
||||
return btnReportBug;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.toolbox.FLabel} */
|
||||
public FLabel getBtnImportPictures() {
|
||||
return btnImportPictures;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.toolbox.FLabel} */
|
||||
public FLabel getBtnHowToPlay() {
|
||||
return btnHowToPlay;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.toolbox.FLabel} */
|
||||
public FLabel getBtnDownloadPrices() {
|
||||
return btnDownloadPrices;
|
||||
}
|
||||
|
||||
/** @return {@link forge.view.toolbox.FLabel} */
|
||||
public FLabel getBtnDeckEditor() {
|
||||
return btnDeckEditor;
|
||||
}
|
||||
|
||||
/** @return JLabel */
|
||||
public JLabel getLblLicensing() {
|
||||
return lblLicensing;
|
||||
}
|
||||
|
||||
/** @return ControlUtilities */
|
||||
public ControlUtilities getControl() {
|
||||
return ViewUtilities.this.control;
|
||||
}
|
||||
} // end class ViewUtilities
|
||||
@@ -1,3 +0,0 @@
|
||||
/** Views (as in model-view-controller) for Forge. */
|
||||
package forge.view.home;
|
||||
|
||||
@@ -296,15 +296,16 @@ public class QuestWinLoseHandler extends ControlWinLose {
|
||||
Singletons.getControl().changeState(FControl.HOME_SCREEN);
|
||||
|
||||
// Update as necessary.
|
||||
if ((Singletons.getView().getViewHome().getViewQuest().getPnlDuels().isVisible())) {
|
||||
/* if ((Singletons.getView().getViewHome().getViewQuest().getPnlDuels().isVisible())) {
|
||||
Singletons.getView().getViewHome().getViewQuest().showDuelsTab();
|
||||
}
|
||||
else if (Singletons.getView().getViewHome().getViewQuest().getPnlChallenges().isVisible()) {
|
||||
Singletons.getView().getViewHome().getViewQuest().showChallengesTab();
|
||||
}
|
||||
|
||||
Singletons.getView().getViewHome().showQuestMenu();
|
||||
Singletons.getView().getViewHome().showQuestMenu();*/
|
||||
GuiUtils.closeOverlay();
|
||||
throw new NullPointerException("Fix me");
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -421,30 +421,36 @@ public class DeckLister extends JPanel {
|
||||
}
|
||||
|
||||
private void editDeck(final Deck d0) {
|
||||
Singletons.getView().getOverlay().showOverlay();
|
||||
|
||||
switch (this.gametype) {
|
||||
case Quest:
|
||||
Constant.Runtime.HUMAN_DECK[0] = d0;
|
||||
final DeckEditorQuest editor = new DeckEditorQuest(AllZone.getQuestData());
|
||||
editor.show(this.cmdEditorExit);
|
||||
editor.setVisible(true);
|
||||
editor.setAlwaysOnTop(true);
|
||||
break;
|
||||
case Constructed:
|
||||
final DeckEditorConstructed cEditor = new DeckEditorConstructed();
|
||||
cEditor.show(this.cmdEditorExit);
|
||||
cEditor.getController().load(d0.getName());
|
||||
cEditor.setVisible(true);
|
||||
cEditor.setAlwaysOnTop(true);
|
||||
break;
|
||||
case Sealed:
|
||||
final DeckEditorLimited sEditor = new DeckEditorLimited(Singletons.getModel().getDecks().getSealed());
|
||||
sEditor.show(this.cmdEditorExit);
|
||||
sEditor.getController().load(d0.getName());
|
||||
sEditor.setVisible(true);
|
||||
sEditor.setAlwaysOnTop(true);
|
||||
break;
|
||||
case Draft:
|
||||
final DeckEditorLimited dEditor = new DeckEditorLimited(Singletons.getModel().getDecks().getDraft());
|
||||
dEditor.show(this.cmdEditorExit);
|
||||
dEditor.getController().load(d0.getName());
|
||||
dEditor.setVisible(true);
|
||||
dEditor.setAlwaysOnTop(true);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -470,7 +476,6 @@ public class DeckLister extends JPanel {
|
||||
} else if (this.gametype.equals(GameType.Quest)) {
|
||||
AllZone.getQuestData().getMyDecks().delete(d0.getName());
|
||||
AllZone.getQuestData().saveData();
|
||||
Singletons.getView().getViewHome().getBtnQuest().grabFocus();
|
||||
} else {
|
||||
deckManager.getConstructed().delete(d0.getName());
|
||||
}
|
||||
|
||||
@@ -316,6 +316,11 @@ public class FLabel extends JLabel {
|
||||
return this.resizeTimer;
|
||||
}
|
||||
|
||||
/** @return {@link forge.Command} */
|
||||
public Command getCommand() {
|
||||
return this.cmdClick;
|
||||
}
|
||||
|
||||
/** @return boolean */
|
||||
public boolean isSelected() {
|
||||
return selected;
|
||||
|
||||
@@ -18,9 +18,11 @@
|
||||
package forge.view.toolbox;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.FlowLayout;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.Image;
|
||||
import java.awt.LayoutManager;
|
||||
import java.awt.RenderingHints;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
@@ -67,9 +69,16 @@ public class FPanel extends JPanel {
|
||||
// Image aspect ratio (width / height)
|
||||
private double iar;
|
||||
|
||||
/** Core panel used in UI. See class javadoc for more details. */
|
||||
/** */
|
||||
public FPanel() {
|
||||
super();
|
||||
this(new FlowLayout());
|
||||
}
|
||||
|
||||
/** Core panel used in UI. See class javadoc for more details.
|
||||
* @param lm0   {@link java.awt.LayoutManager}
|
||||
*/
|
||||
public FPanel(final LayoutManager lm0) {
|
||||
super(lm0);
|
||||
|
||||
// Opacity must be removed for proper rounded corner drawing
|
||||
this.setOpaque(false);
|
||||
|
||||
@@ -720,8 +720,8 @@ public enum FSkin {
|
||||
final int aw = bimAvatars.getWidth();
|
||||
final int ah = bimAvatars.getHeight();
|
||||
|
||||
for (int j = 0; j < aw; j += 100) {
|
||||
for (int i = 0; i < ah; i += 100) {
|
||||
for (int j = 0; j < ah; j += 100) {
|
||||
for (int i = 0; i < aw; i += 100) {
|
||||
if (i == 0 && j == 0) { continue; }
|
||||
pxTest = FSkin.getColorFromPixel(bimAvatars.getRGB(i + 50, j + 50));
|
||||
if (pxTest.getAlpha() == 0) { continue; }
|
||||
|
||||
Reference in New Issue
Block a user