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/ControlMatchUI.java -text
|
||||||
src/main/java/forge/control/FControl.java -text
|
src/main/java/forge/control/FControl.java -text
|
||||||
src/main/java/forge/control/KeyboardShortcuts.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/ControlStall.java -text
|
||||||
src/main/java/forge/control/bazaar/package-info.java -text svneol=native#text/plain
|
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/Input.java svneol=native#text/plain
|
||||||
src/main/java/forge/control/input/InputAttack.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
|
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/CardPicturePanel.java svneol=native#text/plain
|
||||||
src/main/java/forge/gui/game/package-info.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/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/ICSubmenu.java -text
|
||||||
src/main/java/forge/gui/home/IVSubmenu.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/StartButton.java -text
|
||||||
src/main/java/forge/gui/home/constructed/CSubmenuCustom.java -text
|
src/main/java/forge/gui/home/limited/CSubmenuConstructed.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/limited/CSubmenuDraft.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/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/VSubmenuDraft.java -text
|
||||||
src/main/java/forge/gui/home/limited/VSubmenuSealed.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
|
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/CSubmenuQuestData.java -text
|
||||||
src/main/java/forge/gui/home/quest/CSubmenuQuestDecks.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/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/SubmenuQuestUtil.java -text
|
||||||
src/main/java/forge/gui/home/quest/VSubmenuChallenges.java -text
|
src/main/java/forge/gui/home/quest/VSubmenuChallenges.java -text
|
||||||
src/main/java/forge/gui/home/quest/VSubmenuDuels.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/ViewItem.java -text
|
||||||
src/main/java/forge/view/bazaar/ViewStall.java svneol=native#text/plain
|
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/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/QuestWinLoseCardViewer.java -text
|
||||||
src/main/java/forge/view/match/QuestWinLoseHandler.java -text
|
src/main/java/forge/view/match/QuestWinLoseHandler.java -text
|
||||||
src/main/java/forge/view/match/ViewBattlefield.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/Zack[!!-~]Shaffner's[!!-~]Creatureless[!!-~]Control.dck
|
||||||
res/decks/Zemox's[!!-~]Mono-Green[!!-~]Infect.dck
|
res/decks/Zemox's[!!-~]Mono-Green[!!-~]Infect.dck
|
||||||
res/decks/Zvi[!!-~]Mowshowitz's[!!-~]Mono-Black[!!-~]Control.dck
|
res/decks/Zvi[!!-~]Mowshowitz's[!!-~]Mono-Black[!!-~]Control.dck
|
||||||
|
res/decks/constructed/*.dck
|
||||||
res/decks/o1.bdk
|
res/decks/o1.bdk
|
||||||
res/images/themes
|
res/images/themes
|
||||||
res/oracleScript.log
|
res/oracleScript.log
|
||||||
|
|||||||
@@ -1,10 +1,5 @@
|
|||||||
package forge.control;
|
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;
|
import forge.view.ViewHomeUI;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -28,29 +23,4 @@ public class ControlHomeUI {
|
|||||||
public ViewHomeUI getView() {
|
public ViewHomeUI getView() {
|
||||||
return view;
|
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.AllZone;
|
||||||
import forge.Singletons;
|
import forge.Singletons;
|
||||||
import forge.control.KeyboardShortcuts.Shortcut;
|
import forge.control.KeyboardShortcuts.Shortcut;
|
||||||
|
import forge.gui.home.quest.SubmenuQuestUtil;
|
||||||
|
import forge.view.ViewHomeUI;
|
||||||
import forge.view.toolbox.CardFaceSymbols;
|
import forge.view.toolbox.CardFaceSymbols;
|
||||||
import forge.view.toolbox.FSkin;
|
import forge.view.toolbox.FSkin;
|
||||||
|
|
||||||
@@ -85,8 +87,7 @@ public enum FControl {
|
|||||||
public void windowClosing(final WindowEvent e) {
|
public void windowClosing(final WindowEvent e) {
|
||||||
Singletons.getView().getFrame().setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
|
Singletons.getView().getFrame().setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
|
||||||
changeState(0);
|
changeState(0);
|
||||||
Singletons.getControl().getControlHome().getControlQuest().refreshStats();
|
SubmenuQuestUtil.updateStatsAndPet();
|
||||||
Singletons.getView().getViewHome().showQuestMenu();
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -146,7 +147,7 @@ public enum FControl {
|
|||||||
// Fire up new state
|
// Fire up new state
|
||||||
switch (i0) {
|
switch (i0) {
|
||||||
case HOME_SCREEN:
|
case HOME_SCREEN:
|
||||||
display.add(Singletons.getView().getViewHome(), JLayeredPane.DEFAULT_LAYER);
|
display.add(ViewHomeUI.SINGLETON_INSTANCE.getPanel(), JLayeredPane.DEFAULT_LAYER);
|
||||||
sizeChildren();
|
sizeChildren();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -189,7 +190,7 @@ public enum FControl {
|
|||||||
+ "may only be called while the home UI is showing.");
|
+ "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 org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
import forge.Singletons;
|
import forge.Singletons;
|
||||||
|
import forge.gui.home.settings.VSubmenuPreferences.KeyboardShortcutField;
|
||||||
import forge.properties.ForgePreferences.FPref;
|
import forge.properties.ForgePreferences.FPref;
|
||||||
import forge.view.home.ViewSettings.KeyboardShortcutField;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Consolidates keyboard shortcut assembly into one location
|
* 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")
|
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("Swamp") || deck.get(i).getName().equals("Mountain")
|
||||||
|| deck.get(i).getName().equals("Forest")) {
|
|| deck.get(i).getName().equals("Forest")) {
|
||||||
System.out.println("Heyo!");
|
//System.out.println("Heyo!");
|
||||||
}
|
}
|
||||||
aiDeck.getMain().add(deck.get(i));
|
aiDeck.getMain().add(deck.get(i));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,9 +36,11 @@ import java.util.List;
|
|||||||
import javax.swing.Box;
|
import javax.swing.Box;
|
||||||
import javax.swing.ImageIcon;
|
import javax.swing.ImageIcon;
|
||||||
import javax.swing.JButton;
|
import javax.swing.JButton;
|
||||||
|
import javax.swing.JLabel;
|
||||||
import javax.swing.JList;
|
import javax.swing.JList;
|
||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
import javax.swing.SwingUtilities;
|
import javax.swing.SwingUtilities;
|
||||||
|
import javax.swing.Timer;
|
||||||
import javax.swing.border.LineBorder;
|
import javax.swing.border.LineBorder;
|
||||||
import javax.swing.event.ListSelectionEvent;
|
import javax.swing.event.ListSelectionEvent;
|
||||||
import javax.swing.event.ListSelectionListener;
|
import javax.swing.event.ListSelectionListener;
|
||||||
@@ -62,6 +64,7 @@ import forge.view.toolbox.FSkin;
|
|||||||
* @version $Id$
|
* @version $Id$
|
||||||
*/
|
*/
|
||||||
public final class GuiUtils {
|
public final class GuiUtils {
|
||||||
|
private static int counter = 0;
|
||||||
|
|
||||||
private GuiUtils() {
|
private GuiUtils() {
|
||||||
throw new AssertionError();
|
throw new AssertionError();
|
||||||
@@ -427,6 +430,43 @@ public final class GuiUtils {
|
|||||||
return overlay;
|
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} */
|
/** @return {@forge.view.toolbox.FOverlay} */
|
||||||
public static FOverlay genericOverlay() {
|
public static FOverlay genericOverlay() {
|
||||||
final FOverlay overlay = Singletons.getView().getOverlay();
|
final FOverlay overlay = Singletons.getView().getOverlay();
|
||||||
|
|||||||
@@ -91,7 +91,9 @@ public final class DeckEditorConstructed extends DeckEditorBase<CardPrinted, Dec
|
|||||||
@Override
|
@Override
|
||||||
public void execute() {
|
public void execute() {
|
||||||
DeckEditorConstructed.this.dispose();
|
DeckEditorConstructed.this.dispose();
|
||||||
exitCommand.execute();
|
if (exitCommand != null) {
|
||||||
|
exitCommand.execute();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,6 @@ import javax.swing.JOptionPane;
|
|||||||
import javax.swing.JTable;
|
import javax.swing.JTable;
|
||||||
import javax.swing.WindowConstants;
|
import javax.swing.WindowConstants;
|
||||||
|
|
||||||
|
|
||||||
import forge.Command;
|
import forge.Command;
|
||||||
import forge.Constant;
|
import forge.Constant;
|
||||||
import forge.Singletons;
|
import forge.Singletons;
|
||||||
@@ -49,6 +48,7 @@ import forge.gui.deckeditor.elements.CardPanelLite;
|
|||||||
import forge.gui.deckeditor.elements.ManaCostRenderer;
|
import forge.gui.deckeditor.elements.ManaCostRenderer;
|
||||||
import forge.gui.deckeditor.elements.TableColumnInfo;
|
import forge.gui.deckeditor.elements.TableColumnInfo;
|
||||||
import forge.gui.deckeditor.elements.TableView;
|
import forge.gui.deckeditor.elements.TableView;
|
||||||
|
import forge.gui.home.limited.CSubmenuDraft;
|
||||||
import forge.item.CardDb;
|
import forge.item.CardDb;
|
||||||
import forge.item.CardPrinted;
|
import forge.item.CardPrinted;
|
||||||
import forge.item.InventoryItem;
|
import forge.item.InventoryItem;
|
||||||
@@ -128,7 +128,8 @@ public class DraftingProcess extends DeckEditorBase<CardPrinted, DeckGroup> {
|
|||||||
ForgeProps.getLocalized(GuiBoosterDraft.CLOSE_MESSAGE), "", JOptionPane.YES_NO_OPTION);
|
ForgeProps.getLocalized(GuiBoosterDraft.CLOSE_MESSAGE), "", JOptionPane.YES_NO_OPTION);
|
||||||
if (n == JOptionPane.YES_OPTION) {
|
if (n == JOptionPane.YES_OPTION) {
|
||||||
DraftingProcess.this.dispose();
|
DraftingProcess.this.dispose();
|
||||||
Singletons.getControl().getControlHome().getControlDraft().updateHumanDecks();
|
CSubmenuDraft.SINGLETON_INSTANCE.update();
|
||||||
|
GuiUtils.closeOverlay();
|
||||||
}
|
}
|
||||||
} // windowClosing()
|
} // windowClosing()
|
||||||
});
|
});
|
||||||
@@ -336,10 +337,9 @@ public class DraftingProcess extends DeckEditorBase<CardPrinted, DeckGroup> {
|
|||||||
// here
|
// here
|
||||||
|
|
||||||
// close and open next screen
|
// close and open next screen
|
||||||
this.dispose();
|
DraftingProcess.this.dispose();
|
||||||
|
CSubmenuDraft.SINGLETON_INSTANCE.update();
|
||||||
Singletons.getControl().getControlHome().getControlDraft().updateHumanDecks();
|
GuiUtils.closeOverlay();
|
||||||
|
|
||||||
} /* saveDraft() */
|
} /* saveDraft() */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -386,5 +386,6 @@ public class DraftingProcess extends DeckEditorBase<CardPrinted, DeckGroup> {
|
|||||||
this.getBottomTableWithCards().sort(1, true);
|
this.getBottomTableWithCards().sort(1, true);
|
||||||
|
|
||||||
this.setVisible(true);
|
this.setVisible(true);
|
||||||
|
this.setAlwaysOnTop(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,9 +6,16 @@ package forge.gui.home;
|
|||||||
* and collapsing in the menu.
|
* and collapsing in the menu.
|
||||||
*/
|
*/
|
||||||
public enum EMenuGroup { /** */
|
public enum EMenuGroup { /** */
|
||||||
CONSTRUCTED, /** */
|
SANCTIONED ("Sanctioned Game Formats"), /** */
|
||||||
LIMITED, /** */
|
QUEST ("Quest Mode"), /** */
|
||||||
QUEST, /** */
|
SETTINGS ("Game Settings"), /** */
|
||||||
SETTINGS, /** */
|
UTILITIES ("Tools");
|
||||||
UTILITIES;
|
|
||||||
|
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;
|
import forge.Command;
|
||||||
|
|
||||||
|
|
||||||
/** Dictates methods required for a submenu controller. */
|
/** Dictates methods required for a submenu controller. */
|
||||||
public interface ICSubmenu {
|
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();
|
Command getMenuCommand();
|
||||||
|
|
||||||
/** Call this method after the view singleton has been fully realized
|
/** Call this method after the view singleton has been fully realized
|
||||||
|
|||||||
@@ -8,11 +8,24 @@ public interface IVSubmenu {
|
|||||||
* @return {@link javax.swing.JPanel} */
|
* @return {@link javax.swing.JPanel} */
|
||||||
JPanel getPanel();
|
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
|
/** Returns parent menu grouping of this submenu, useful for
|
||||||
* functions such as expanding and collapsing in the menu area.
|
* functions such as expanding and collapsing in the menu area.
|
||||||
*
|
*
|
||||||
* @return {@link javax.swing.JPanel} */
|
* @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.*/
|
/** Removes all children and (re)populates panel components, independent of constructor.*/
|
||||||
void populate();
|
void populate();
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package forge.view.home;
|
package forge.gui.home;
|
||||||
|
|
||||||
import javax.swing.JButton;
|
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.GuiUtils;
|
||||||
import forge.gui.deckeditor.DraftingProcess;
|
import forge.gui.deckeditor.DraftingProcess;
|
||||||
import forge.gui.home.ICSubmenu;
|
import forge.gui.home.ICSubmenu;
|
||||||
|
import forge.view.toolbox.FOverlay;
|
||||||
import forge.view.toolbox.FSkin;
|
import forge.view.toolbox.FSkin;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO: Write javadoc for this type.
|
* TODO: Write javadoc for this type.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("serial")
|
||||||
public enum CSubmenuDraft implements ICSubmenu {
|
public enum CSubmenuDraft implements ICSubmenu {
|
||||||
/** */
|
/** */
|
||||||
SINGLETON_INSTANCE;
|
SINGLETON_INSTANCE;
|
||||||
@@ -72,6 +74,21 @@ public enum CSubmenuDraft implements ICSubmenu {
|
|||||||
"Walter", "Wilfred", "William", "Winston"
|
"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)
|
/* (non-Javadoc)
|
||||||
* @see forge.control.home.IControlSubmenu#update()
|
* @see forge.control.home.IControlSubmenu#update()
|
||||||
*/
|
*/
|
||||||
@@ -82,11 +99,14 @@ public enum CSubmenuDraft implements ICSubmenu {
|
|||||||
view.populate();
|
view.populate();
|
||||||
CSubmenuDraft.SINGLETON_INSTANCE.update();
|
CSubmenuDraft.SINGLETON_INSTANCE.update();
|
||||||
|
|
||||||
VSubmenuDraft.SINGLETON_INSTANCE.getBtnBuildDeck().addMouseListener(
|
view.getLstHumanDecks().setExitCommand(cmdDeckExit);
|
||||||
|
view.getLstHumanDecks().setSelectCommand(cmdDeckSelect);
|
||||||
|
|
||||||
|
view.getBtnBuildDeck().addMouseListener(
|
||||||
new MouseAdapter() { @Override
|
new MouseAdapter() { @Override
|
||||||
public void mousePressed(MouseEvent e) { setupDraft(); } });
|
public void mousePressed(MouseEvent e) { setupDraft(); } });
|
||||||
|
|
||||||
VSubmenuDraft.SINGLETON_INSTANCE.getBtnStart().addMouseListener(
|
view.getBtnStart().addMouseListener(
|
||||||
new MouseAdapter() {
|
new MouseAdapter() {
|
||||||
@Override
|
@Override
|
||||||
public void mouseReleased(final MouseEvent e) {
|
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
|
@Override
|
||||||
public void mouseClicked(MouseEvent e) {
|
public void mouseClicked(MouseEvent e) {
|
||||||
view.showDirections();
|
view.showDirections();
|
||||||
@@ -136,6 +156,7 @@ public enum CSubmenuDraft implements ICSubmenu {
|
|||||||
for (DeckGroup d : Singletons.getModel().getDecks().getDraft()) {
|
for (DeckGroup d : Singletons.getModel().getDecks().getDraft()) {
|
||||||
human.add(d.getHumanDeck());
|
human.add(d.getHumanDeck());
|
||||||
}
|
}
|
||||||
|
|
||||||
VSubmenuDraft.SINGLETON_INSTANCE.getLstHumanDecks().setDecks(human);
|
VSubmenuDraft.SINGLETON_INSTANCE.getLstHumanDecks().setDecks(human);
|
||||||
|
|
||||||
if (human.size() > 1) {
|
if (human.size() > 1) {
|
||||||
@@ -178,6 +199,9 @@ public enum CSubmenuDraft implements ICSubmenu {
|
|||||||
|
|
||||||
/** */
|
/** */
|
||||||
private void setupDraft() {
|
private void setupDraft() {
|
||||||
|
final FOverlay overlay = Singletons.getView().getOverlay();
|
||||||
|
overlay.showOverlay();
|
||||||
|
|
||||||
final DraftingProcess draft = new DraftingProcess();
|
final DraftingProcess draft = new DraftingProcess();
|
||||||
|
|
||||||
// Determine what kind of booster draft to run
|
// 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))) {
|
else if (o.toString().equals(draftTypes.get(2))) {
|
||||||
draft.showGui(new BoosterDraft(CardPoolLimitation.Custom));
|
draft.showGui(new BoosterDraft(CardPoolLimitation.Custom));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private String[] generateNames() {
|
private String[] generateNames() {
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import forge.game.GameType;
|
|||||||
import forge.game.limited.SealedDeck;
|
import forge.game.limited.SealedDeck;
|
||||||
import forge.gui.GuiUtils;
|
import forge.gui.GuiUtils;
|
||||||
import forge.gui.home.ICSubmenu;
|
import forge.gui.home.ICSubmenu;
|
||||||
|
import forge.gui.home.utilities.CSubmenuDeckEditor;
|
||||||
import forge.item.CardPrinted;
|
import forge.item.CardPrinted;
|
||||||
import forge.item.ItemPool;
|
import forge.item.ItemPool;
|
||||||
import forge.properties.ForgeProps;
|
import forge.properties.ForgeProps;
|
||||||
@@ -34,12 +35,28 @@ import forge.view.toolbox.FSkin;
|
|||||||
* TODO: Write javadoc for this type.
|
* TODO: Write javadoc for this type.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("serial")
|
||||||
public enum CSubmenuSealed implements ICSubmenu {
|
public enum CSubmenuSealed implements ICSubmenu {
|
||||||
/** */
|
/** */
|
||||||
SINGLETON_INSTANCE;
|
SINGLETON_INSTANCE;
|
||||||
|
|
||||||
private Map<String, Deck> aiDecks;
|
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)
|
/* (non-Javadoc)
|
||||||
* @see forge.control.home.IControlSubmenu#update()
|
* @see forge.control.home.IControlSubmenu#update()
|
||||||
*/
|
*/
|
||||||
@@ -50,6 +67,9 @@ public enum CSubmenuSealed implements ICSubmenu {
|
|||||||
view.populate();
|
view.populate();
|
||||||
CSubmenuSealed.SINGLETON_INSTANCE.update();
|
CSubmenuSealed.SINGLETON_INSTANCE.update();
|
||||||
|
|
||||||
|
VSubmenuSealed.SINGLETON_INSTANCE.getLstDecks().setExitCommand(cmdDeckExit);
|
||||||
|
VSubmenuSealed.SINGLETON_INSTANCE.getLstDecks().setSelectCommand(cmdDeckSelect);
|
||||||
|
|
||||||
VSubmenuSealed.SINGLETON_INSTANCE.getBtnBuildDeck().addMouseListener(
|
VSubmenuSealed.SINGLETON_INSTANCE.getBtnBuildDeck().addMouseListener(
|
||||||
new MouseAdapter() { @Override
|
new MouseAdapter() { @Override
|
||||||
public void mousePressed(MouseEvent e) { setupSealed(); } });
|
public void mousePressed(MouseEvent e) { setupSealed(); } });
|
||||||
@@ -184,6 +204,6 @@ public enum CSubmenuSealed implements ICSubmenu {
|
|||||||
sealed.addAiDeck(sd.buildAIDeck(sDeck.toForgeCardList()));
|
sealed.addAiDeck(sd.buildAIDeck(sDeck.toForgeCardList()));
|
||||||
Singletons.getModel().getDecks().getSealed().add(sealed);
|
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 javax.swing.text.StyledDocument;
|
||||||
|
|
||||||
import net.miginfocom.swing.MigLayout;
|
import net.miginfocom.swing.MigLayout;
|
||||||
import forge.Command;
|
|
||||||
import forge.game.GameType;
|
import forge.game.GameType;
|
||||||
import forge.gui.GuiUtils;
|
import forge.gui.GuiUtils;
|
||||||
import forge.gui.home.EMenuGroup;
|
import forge.gui.home.EMenuGroup;
|
||||||
|
import forge.gui.home.EMenuItem;
|
||||||
|
import forge.gui.home.ICSubmenu;
|
||||||
import forge.gui.home.IVSubmenu;
|
import forge.gui.home.IVSubmenu;
|
||||||
import forge.view.home.StartButton;
|
import forge.gui.home.StartButton;
|
||||||
import forge.view.toolbox.DeckLister;
|
import forge.view.toolbox.DeckLister;
|
||||||
import forge.view.toolbox.FButton;
|
import forge.view.toolbox.FButton;
|
||||||
import forge.view.toolbox.FLabel;
|
import forge.view.toolbox.FLabel;
|
||||||
@@ -38,14 +39,10 @@ public enum VSubmenuDraft implements IVSubmenu {
|
|||||||
/** */
|
/** */
|
||||||
SINGLETON_INSTANCE;
|
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 JPanel pnl = new JPanel();
|
||||||
private final StartButton btnStart = new StartButton();
|
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 JList lstAI = new FList();
|
||||||
private final JLabel btnBuildDeck = new FLabel.Builder()
|
private final JLabel btnBuildDeck = new FLabel.Builder()
|
||||||
.fontScaleAuto(false).fontSize(16)
|
.fontScaleAuto(false).fontSize(16)
|
||||||
@@ -94,8 +91,8 @@ public enum VSubmenuDraft implements IVSubmenu {
|
|||||||
* @see forge.view.home.IViewSubmenu#getGroup()
|
* @see forge.view.home.IViewSubmenu#getGroup()
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public EMenuGroup getGroup() {
|
public EMenuGroup getGroupEnum() {
|
||||||
return EMenuGroup.LIMITED;
|
return EMenuGroup.SANCTIONED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
@@ -106,6 +103,30 @@ public enum VSubmenuDraft implements IVSubmenu {
|
|||||||
return pnl;
|
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} */
|
/** @return {@link javax.swing.JLabel} */
|
||||||
public JLabel getBtnDirections() {
|
public JLabel getBtnDirections() {
|
||||||
return this.btnDirections;
|
return this.btnDirections;
|
||||||
|
|||||||
@@ -14,12 +14,13 @@ import javax.swing.text.StyleConstants;
|
|||||||
import javax.swing.text.StyledDocument;
|
import javax.swing.text.StyledDocument;
|
||||||
|
|
||||||
import net.miginfocom.swing.MigLayout;
|
import net.miginfocom.swing.MigLayout;
|
||||||
import forge.Command;
|
|
||||||
import forge.game.GameType;
|
import forge.game.GameType;
|
||||||
import forge.gui.GuiUtils;
|
import forge.gui.GuiUtils;
|
||||||
import forge.gui.home.EMenuGroup;
|
import forge.gui.home.EMenuGroup;
|
||||||
|
import forge.gui.home.EMenuItem;
|
||||||
|
import forge.gui.home.ICSubmenu;
|
||||||
import forge.gui.home.IVSubmenu;
|
import forge.gui.home.IVSubmenu;
|
||||||
import forge.view.home.StartButton;
|
import forge.gui.home.StartButton;
|
||||||
import forge.view.toolbox.DeckLister;
|
import forge.view.toolbox.DeckLister;
|
||||||
import forge.view.toolbox.FButton;
|
import forge.view.toolbox.FButton;
|
||||||
import forge.view.toolbox.FLabel;
|
import forge.view.toolbox.FLabel;
|
||||||
@@ -35,14 +36,10 @@ public enum VSubmenuSealed implements IVSubmenu {
|
|||||||
/** */
|
/** */
|
||||||
SINGLETON_INSTANCE;
|
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 JPanel pnl = new JPanel();
|
||||||
private final StartButton btnStart = new StartButton();
|
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()
|
private final JLabel btnBuildDeck = new FLabel.Builder()
|
||||||
.fontScaleAuto(false).fontSize(16)
|
.fontScaleAuto(false).fontSize(16)
|
||||||
.opaque(true).hoverable(true).text("Build a Sealed Deck").build();
|
.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()
|
* @see forge.view.home.IViewSubmenu#getGroup()
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public EMenuGroup getGroup() {
|
public EMenuGroup getGroupEnum() {
|
||||||
return EMenuGroup.LIMITED;
|
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)
|
/* (non-Javadoc)
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
package forge.gui.home.quest;
|
package forge.gui.home.quest;
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import javax.swing.SwingConstants;
|
import javax.swing.SwingConstants;
|
||||||
@@ -9,9 +11,11 @@ import javax.swing.border.EmptyBorder;
|
|||||||
import forge.AllZone;
|
import forge.AllZone;
|
||||||
import forge.Command;
|
import forge.Command;
|
||||||
import forge.Singletons;
|
import forge.Singletons;
|
||||||
|
import forge.gui.home.EMenuItem;
|
||||||
import forge.gui.home.ICSubmenu;
|
import forge.gui.home.ICSubmenu;
|
||||||
import forge.gui.home.quest.SubmenuQuestUtil.SelectablePanel;
|
import forge.gui.home.quest.SubmenuQuestUtil.SelectablePanel;
|
||||||
import forge.quest.data.QuestChallenge;
|
import forge.quest.data.QuestChallenge;
|
||||||
|
import forge.view.ViewHomeUI;
|
||||||
import forge.view.toolbox.FLabel;
|
import forge.view.toolbox.FLabel;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -23,25 +27,47 @@ public enum CSubmenuChallenges implements ICSubmenu {
|
|||||||
SINGLETON_INSTANCE;
|
SINGLETON_INSTANCE;
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see forge.control.home.IControlSubmenu#getMenuCommand()
|
* @see forge.control.home.IControlSubmenu#getCommand()
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("serial")
|
||||||
@Override
|
@Override
|
||||||
public Command getMenuCommand() {
|
public Command getMenuCommand() {
|
||||||
return null;
|
return new Command() {
|
||||||
|
public void execute() {
|
||||||
|
if (AllZone.getQuestData() == null) {
|
||||||
|
ViewHomeUI.SINGLETON_INSTANCE.itemClick(EMenuItem.QUEST_DATA);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see forge.control.home.IControlSubmenu#initialize()
|
* @see forge.control.home.IControlSubmenu#initialize()
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("serial")
|
||||||
@Override
|
@Override
|
||||||
public void initialize() {
|
public void initialize() {
|
||||||
/// TEMPORARY
|
|
||||||
VSubmenuDuels.SINGLETON_INSTANCE.populate();
|
|
||||||
CSubmenuDuels.SINGLETON_INSTANCE.update();
|
|
||||||
/////////////
|
|
||||||
|
|
||||||
VSubmenuChallenges.SINGLETON_INSTANCE.populate();
|
VSubmenuChallenges.SINGLETON_INSTANCE.populate();
|
||||||
CSubmenuChallenges.SINGLETON_INSTANCE.update();
|
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)
|
/* (non-Javadoc)
|
||||||
@@ -52,10 +78,9 @@ public enum CSubmenuChallenges implements ICSubmenu {
|
|||||||
SubmenuQuestUtil.updateStatsAndPet();
|
SubmenuQuestUtil.updateStatsAndPet();
|
||||||
|
|
||||||
final VSubmenuChallenges view = VSubmenuChallenges.SINGLETON_INSTANCE;
|
final VSubmenuChallenges view = VSubmenuChallenges.SINGLETON_INSTANCE;
|
||||||
VSubmenuDuels.SINGLETON_INSTANCE.getBtnStart().setEnabled(false);
|
|
||||||
|
|
||||||
if (AllZone.getQuestData() != null) {
|
if (AllZone.getQuestData() != null) {
|
||||||
VSubmenuDuels.SINGLETON_INSTANCE.getLblTitle().setText("Challenges: " + AllZone.getQuestData().getRank());
|
view.getLblTitle().setText("Challenges: " + AllZone.getQuestData().getRank());
|
||||||
|
|
||||||
view.getPnlChallenges().removeAll();
|
view.getPnlChallenges().removeAll();
|
||||||
final List<QuestChallenge> challenges =
|
final List<QuestChallenge> challenges =
|
||||||
@@ -68,7 +93,7 @@ public enum CSubmenuChallenges implements ICSubmenu {
|
|||||||
|
|
||||||
if (challenges.size() == 0) {
|
if (challenges.size() == 0) {
|
||||||
final FLabel lbl = new FLabel.Builder()
|
final FLabel lbl = new FLabel.Builder()
|
||||||
.text(VSubmenuDuels.SINGLETON_INSTANCE.getLblNextChallengeInWins().getText())
|
.text(VSubmenuChallenges.SINGLETON_INSTANCE.getLblNextChallengeInWins().getText())
|
||||||
.fontAlign(SwingConstants.CENTER).build();
|
.fontAlign(SwingConstants.CENTER).build();
|
||||||
lbl.setForeground(Color.red);
|
lbl.setForeground(Color.red);
|
||||||
lbl.setBackground(Color.white);
|
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.AllZone;
|
||||||
import forge.Command;
|
import forge.Command;
|
||||||
import forge.Singletons;
|
import forge.Singletons;
|
||||||
|
import forge.gui.home.EMenuItem;
|
||||||
import forge.gui.home.ICSubmenu;
|
import forge.gui.home.ICSubmenu;
|
||||||
import forge.gui.home.quest.SubmenuQuestUtil.SelectablePanel;
|
import forge.gui.home.quest.SubmenuQuestUtil.SelectablePanel;
|
||||||
import forge.quest.data.QuestDuel;
|
import forge.quest.data.QuestDuel;
|
||||||
|
import forge.view.ViewHomeUI;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO: Write javadoc for this type.
|
* TODO: Write javadoc for this type.
|
||||||
@@ -20,11 +22,18 @@ public enum CSubmenuDuels implements ICSubmenu {
|
|||||||
SINGLETON_INSTANCE;
|
SINGLETON_INSTANCE;
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see forge.control.home.IControlSubmenu#getMenuCommand()
|
* @see forge.control.home.IControlSubmenu#getCommand()
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("serial")
|
||||||
@Override
|
@Override
|
||||||
public Command getMenuCommand() {
|
public Command getMenuCommand() {
|
||||||
return null;
|
return new Command() {
|
||||||
|
public void execute() {
|
||||||
|
if (AllZone.getQuestData() == null) {
|
||||||
|
ViewHomeUI.SINGLETON_INSTANCE.itemClick(EMenuItem.QUEST_DATA);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
@@ -40,13 +49,20 @@ public enum CSubmenuDuels implements ICSubmenu {
|
|||||||
new Command() { @Override
|
new Command() { @Override
|
||||||
public void execute() { SubmenuQuestUtil.showSpellShop(); } });
|
public void execute() { SubmenuQuestUtil.showSpellShop(); } });
|
||||||
|
|
||||||
VSubmenuDuels.SINGLETON_INSTANCE.getBtnSpellShop().setCommand(
|
VSubmenuDuels.SINGLETON_INSTANCE.getBtnBazaar().setCommand(
|
||||||
new Command() { @Override
|
new Command() { @Override
|
||||||
public void execute() { SubmenuQuestUtil.showBazaar(); } });
|
public void execute() { SubmenuQuestUtil.showBazaar(); } });
|
||||||
|
|
||||||
VSubmenuDuels.SINGLETON_INSTANCE.getBtnStart().addActionListener(
|
VSubmenuDuels.SINGLETON_INSTANCE.getBtnStart().addActionListener(
|
||||||
new ActionListener() { @Override
|
new ActionListener() { @Override
|
||||||
public void actionPerformed(final ActionEvent e) { SubmenuQuestUtil.startGame(); } });
|
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)
|
/* (non-Javadoc)
|
||||||
|
|||||||
@@ -22,16 +22,22 @@ import forge.quest.data.QuestPreferences.QPref;
|
|||||||
* TODO: Write javadoc for this type.
|
* TODO: Write javadoc for this type.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("serial")
|
||||||
public enum CSubmenuQuestData implements ICSubmenu {
|
public enum CSubmenuQuestData implements ICSubmenu {
|
||||||
/** */
|
/** */
|
||||||
SINGLETON_INSTANCE;
|
SINGLETON_INSTANCE;
|
||||||
|
|
||||||
private final Map<String, QuestData> arrQuests = new HashMap<String, QuestData>();
|
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)
|
/* (non-Javadoc)
|
||||||
* @see forge.control.home.IControlSubmenu#update()
|
* @see forge.control.home.IControlSubmenu#update()
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("serial")
|
|
||||||
@Override
|
@Override
|
||||||
public void initialize() {
|
public void initialize() {
|
||||||
VSubmenuQuestData.SINGLETON_INSTANCE.populate();
|
VSubmenuQuestData.SINGLETON_INSTANCE.populate();
|
||||||
@@ -54,75 +60,8 @@ public enum CSubmenuQuestData implements ICSubmenu {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void update() {
|
public void update() {
|
||||||
refreshQuests();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The actuator for new quests.
|
|
||||||
*/
|
|
||||||
private void newQuest() {
|
|
||||||
final VSubmenuQuestData view = VSubmenuQuestData.SINGLETON_INSTANCE;
|
final VSubmenuQuestData view = VSubmenuQuestData.SINGLETON_INSTANCE;
|
||||||
int difficulty = 0;
|
final File dirQuests = ForgeProps.getFile(NewConstants.Quest.DATA_DIR);
|
||||||
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);
|
|
||||||
|
|
||||||
// Temporary transition code between v1.2.2 and v1.2.3.
|
// Temporary transition code between v1.2.2 and v1.2.3.
|
||||||
// Can be safely deleted after release of 1.2.3.
|
// Can be safely deleted after release of 1.2.3.
|
||||||
@@ -170,6 +109,74 @@ public enum CSubmenuQuestData implements ICSubmenu {
|
|||||||
else {
|
else {
|
||||||
AllZone.setQuestData(null);
|
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 */
|
/** @return */
|
||||||
|
|||||||
@@ -7,9 +7,11 @@ import forge.Command;
|
|||||||
import forge.Singletons;
|
import forge.Singletons;
|
||||||
import forge.deck.Deck;
|
import forge.deck.Deck;
|
||||||
import forge.gui.deckeditor.DeckEditorQuest;
|
import forge.gui.deckeditor.DeckEditorQuest;
|
||||||
|
import forge.gui.home.EMenuItem;
|
||||||
import forge.gui.home.ICSubmenu;
|
import forge.gui.home.ICSubmenu;
|
||||||
import forge.quest.data.QuestData;
|
import forge.quest.data.QuestData;
|
||||||
import forge.quest.data.QuestPreferences.QPref;
|
import forge.quest.data.QuestPreferences.QPref;
|
||||||
|
import forge.view.ViewHomeUI;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO: Write javadoc for this type.
|
* TODO: Write javadoc for this type.
|
||||||
@@ -26,7 +28,6 @@ public enum CSubmenuQuestDecks implements ICSubmenu {
|
|||||||
public void execute() {
|
public void execute() {
|
||||||
AllZone.getQuestData().saveData();
|
AllZone.getQuestData().saveData();
|
||||||
update();
|
update();
|
||||||
Singletons.getView().getViewHome().getBtnQuest().grabFocus();
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -35,13 +36,29 @@ public enum CSubmenuQuestDecks implements ICSubmenu {
|
|||||||
public void execute() {
|
public void execute() {
|
||||||
currentDeck = VSubmenuQuestDecks.SINGLETON_INSTANCE.getLstDecks().getSelectedDeck();
|
currentDeck = VSubmenuQuestDecks.SINGLETON_INSTANCE.getLstDecks().getSelectedDeck();
|
||||||
Singletons.getModel().getQuestPreferences().setPreference(QPref.CURRENT_DECK, currentDeck.toString());
|
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
|
private final Command cmdDeckDelete = new Command() { @Override
|
||||||
public void execute() { update(); } };
|
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)
|
/* (non-Javadoc)
|
||||||
* @see forge.control.home.IControlSubmenu#update()
|
* @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)
|
/* (non-Javadoc)
|
||||||
* @see forge.control.home.IControlSubmenu#update()
|
* @see forge.control.home.IControlSubmenu#update()
|
||||||
*/
|
*/
|
||||||
@@ -83,8 +92,9 @@ public enum CSubmenuQuestDecks implements ICSubmenu {
|
|||||||
|
|
||||||
if (qData != null) {
|
if (qData != null) {
|
||||||
final String cd = Singletons.getModel().getQuestPreferences().getPreference(QPref.CURRENT_DECK);
|
final String cd = Singletons.getModel().getQuestPreferences().getPreference(QPref.CURRENT_DECK);
|
||||||
|
|
||||||
for (Deck d : qData.getMyDecks()) {
|
for (Deck d : qData.getMyDecks()) {
|
||||||
if (d.getName().equals(cd)) {
|
if (d.getName() != null && d.getName().equals(cd)) {
|
||||||
currentDeck = d;
|
currentDeck = d;
|
||||||
view.getLstDecks().setSelectedDeck(d);
|
view.getLstDecks().setSelectedDeck(d);
|
||||||
break;
|
break;
|
||||||
@@ -99,7 +109,15 @@ public enum CSubmenuQuestDecks implements ICSubmenu {
|
|||||||
view.getLstDecks().setDeleteCommand(cmdDeckDelete);
|
view.getLstDecks().setDeleteCommand(cmdDeckDelete);
|
||||||
view.getLstDecks().setExitCommand(cmdDeckExit);
|
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 */
|
/** @return forge.deck.Deck */
|
||||||
|
|||||||
@@ -24,14 +24,6 @@ public enum CSubmenuQuestPrefs implements ICSubmenu {
|
|||||||
CSubmenuQuestPrefs.SINGLETON_INSTANCE.update();
|
CSubmenuQuestPrefs.SINGLETON_INSTANCE.update();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see forge.control.home.IControlSubmenu#getCommand()
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public Command getMenuCommand() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see forge.control.home.IControlSubmenu#update()
|
* @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.
|
* Checks validity of values entered into prefInputs.
|
||||||
* @param i0   a PrefInput object
|
* @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.Color;
|
||||||
import java.awt.event.MouseAdapter;
|
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.Color;
|
||||||
import java.awt.Font;
|
import java.awt.Font;
|
||||||
@@ -19,7 +19,6 @@ import forge.properties.ForgeProps;
|
|||||||
import forge.properties.NewConstants;
|
import forge.properties.NewConstants;
|
||||||
import forge.quest.data.QuestChallenge;
|
import forge.quest.data.QuestChallenge;
|
||||||
import forge.quest.data.QuestData;
|
import forge.quest.data.QuestData;
|
||||||
import forge.quest.data.QuestDataIO;
|
|
||||||
import forge.quest.data.QuestEvent;
|
import forge.quest.data.QuestEvent;
|
||||||
import forge.quest.data.QuestPreferences.QPref;
|
import forge.quest.data.QuestPreferences.QPref;
|
||||||
import forge.quest.data.QuestUtil;
|
import forge.quest.data.QuestUtil;
|
||||||
@@ -37,7 +36,6 @@ import forge.view.toolbox.FTextArea;
|
|||||||
*/
|
*/
|
||||||
public class SubmenuQuestUtil {
|
public class SubmenuQuestUtil {
|
||||||
private static SelectablePanel selectedOpponent;
|
private static SelectablePanel selectedOpponent;
|
||||||
private static Deck currentDeck;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
@@ -66,79 +64,184 @@ public class SubmenuQuestUtil {
|
|||||||
|
|
||||||
/** Updates stats, pets panels for both duels and challenges. */
|
/** Updates stats, pets panels for both duels and challenges. */
|
||||||
public static void updateStatsAndPet() {
|
public static void updateStatsAndPet() {
|
||||||
final QuestData qData;
|
final QuestData qData = AllZone.getQuestData();
|
||||||
final VSubmenuDuels view = VSubmenuDuels.SINGLETON_INSTANCE;
|
|
||||||
|
|
||||||
////////// TODO - THIS SHOULD NOT BE HERE AND WILL BE MOVED EVENTUALLY.
|
if (qData == null) { return; }
|
||||||
if (AllZone.getQuestData() == null) {
|
|
||||||
final String questname = Singletons.getModel()
|
|
||||||
.getQuestPreferences().getPreference(QPref.CURRENT_QUEST);
|
|
||||||
|
|
||||||
qData = QuestDataIO.loadData(new File(
|
final IStatsAndPet[] viewsToUpdate = new IStatsAndPet[] {
|
||||||
ForgeProps.getFile(NewConstants.Quest.DATA_DIR) + questname + ".dat"));
|
VSubmenuDuels.SINGLETON_INSTANCE,
|
||||||
AllZone.setQuestData(qData);
|
VSubmenuChallenges.SINGLETON_INSTANCE
|
||||||
}
|
};
|
||||||
else {
|
|
||||||
qData = AllZone.getQuestData();
|
|
||||||
}
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
// 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();
|
|
||||||
|
|
||||||
final int num = SubmenuQuestUtil.nextChallengeInWins();
|
for (final IStatsAndPet view : viewsToUpdate) {
|
||||||
if (num == 0) {
|
// Fantasy UI display
|
||||||
view.getLblNextChallengeInWins().setText("Next challenge available now.");
|
view.getLblNextChallengeInWins().setVisible(true);
|
||||||
}
|
view.getBtnBazaar().setVisible(true);
|
||||||
else {
|
view.getLblLife().setVisible(true);
|
||||||
view.getLblNextChallengeInWins().setText("Next challenge available in " + num + " wins.");
|
|
||||||
}
|
|
||||||
|
|
||||||
view.getLblWinStreak().setText(
|
// Stats panel
|
||||||
"Win streak: " + qData.getWinStreakCurrent()
|
view.getLblCredits().setText("Credits: " + qData.getCredits());
|
||||||
+ " (Best:" + qData.getWinStreakBest() + ")");
|
view.getLblLife().setText("Life: " + qData.getLife());
|
||||||
|
view.getLblWins().setText("Wins: " + qData.getWin());
|
||||||
|
view.getLblLosses().setText("Losses: " + qData.getLost());
|
||||||
|
view.updateCurrentDeckStatus();
|
||||||
|
|
||||||
// Start panel: pet, plant, zep.
|
final int num = SubmenuQuestUtil.nextChallengeInWins();
|
||||||
if (qData.getMode().equals(QuestData.FANTASY)) {
|
if (num == 0) {
|
||||||
final Set<String> petList = qData.getPetManager().getAvailablePetNames();
|
view.getLblNextChallengeInWins().setText("Next challenge available now.");
|
||||||
final QuestPetAbstract currentPet = 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 (qData.getPetManager().getPlant().getLevel() == 0) {
|
|
||||||
view.getCbPlant().setVisible(false);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
view.getCbPlant().setVisible(true);
|
view.getLblNextChallengeInWins().setText("Next challenge available in " + num + " wins.");
|
||||||
view.getCbPlant().setSelected(qData.getPetManager().shouldPlantBeUsed());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Zeppelin visibility
|
view.getLblWinStreak().setText(
|
||||||
final QuestItemZeppelin zeppelin = (QuestItemZeppelin) qData.getInventory().getItem("Zeppelin");
|
"Win streak: " + qData.getWinStreakCurrent()
|
||||||
view.getCbZep().setVisible(zeppelin.hasBeenUsed());
|
+ " (Best:" + qData.getWinStreakBest() + ")");
|
||||||
|
|
||||||
|
// Start panel: pet, plant, zep.
|
||||||
|
if (qData.getMode().equals(QuestData.FANTASY)) {
|
||||||
|
final Set<String> petList = qData.getPetManager().getAvailablePetNames();
|
||||||
|
final QuestPetAbstract currentPet = 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 (qData.getPetManager().getPlant().getLevel() == 0) {
|
||||||
|
view.getCbPlant().setVisible(false);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
view.getCbPlant().setVisible(true);
|
||||||
|
view.getCbPlant().setSelected(qData.getPetManager().shouldPlantBeUsed());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Zeppelin visibility
|
||||||
|
final QuestItemZeppelin zeppelin = (QuestItemZeppelin) qData.getInventory().getItem("Zeppelin");
|
||||||
|
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 {
|
else {
|
||||||
view.getCbxPet().setVisible(false);
|
GameNew.newGame(SubmenuQuestUtil.getCurrentDeck(), event.getEventDeck());
|
||||||
view.getCbPlant().setVisible(false);
|
|
||||||
view.getCbZep().setVisible(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Start transisiton to match UI.
|
||||||
|
overlay.hideOverlay();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Selectable panels for duels and challenges. */
|
/** Selectable panels for duels and challenges. */
|
||||||
@@ -158,7 +261,12 @@ public class SubmenuQuestUtil {
|
|||||||
@Override
|
@Override
|
||||||
public void execute() {
|
public void execute() {
|
||||||
if (selectedOpponent != null) { selectedOpponent.setSelected(false); }
|
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;
|
selectedOpponent = SubmenuQuestUtil.SelectablePanel.this;
|
||||||
}
|
}
|
||||||
@@ -194,102 +302,4 @@ public class SubmenuQuestUtil {
|
|||||||
return event;
|
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;
|
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.JPanel;
|
||||||
import javax.swing.JScrollPane;
|
import javax.swing.JScrollPane;
|
||||||
|
import javax.swing.SwingConstants;
|
||||||
|
|
||||||
import net.miginfocom.swing.MigLayout;
|
import net.miginfocom.swing.MigLayout;
|
||||||
import forge.gui.home.EMenuGroup;
|
import forge.gui.home.EMenuGroup;
|
||||||
|
import forge.gui.home.EMenuItem;
|
||||||
|
import forge.gui.home.ICSubmenu;
|
||||||
import forge.gui.home.IVSubmenu;
|
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.FPanel;
|
||||||
import forge.view.toolbox.FScrollPane;
|
import forge.view.toolbox.FScrollPane;
|
||||||
|
import forge.view.toolbox.FSkin;
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
public enum VSubmenuChallenges implements IVSubmenu {
|
public enum VSubmenuChallenges implements IVSubmenu, IStatsAndPet {
|
||||||
/** */
|
/** */
|
||||||
SINGLETON_INSTANCE;
|
SINGLETON_INSTANCE;
|
||||||
|
|
||||||
//========== INSTANTIATION
|
//========== INSTANTIATION
|
||||||
private final JPanel pnl = new JPanel();
|
private final JPanel pnl = new JPanel();
|
||||||
private final JPanel pnlChallenges = 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)
|
/* (non-Javadoc)
|
||||||
* @see forge.view.home.IViewSubmenu#getPanel()
|
* @see forge.view.home.IViewSubmenu#getPanel()
|
||||||
@@ -30,22 +80,46 @@ public enum VSubmenuChallenges implements IVSubmenu {
|
|||||||
* @see forge.view.home.IViewSubmenu#getGroup()
|
* @see forge.view.home.IViewSubmenu#getGroup()
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public EMenuGroup getGroup() {
|
public EMenuGroup getGroupEnum() {
|
||||||
return EMenuGroup.QUEST;
|
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)
|
/* (non-Javadoc)
|
||||||
* @see forge.view.home.IViewSubmenu#populate()
|
* @see forge.view.home.IViewSubmenu#populate()
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void populate() {
|
public void populate() {
|
||||||
// Note: "Challenges" submenu uses the instances of
|
pnlTitle.setLayout(new MigLayout("insets 0, gap 0"));
|
||||||
// title, stats, and start panels from "Duels" submenu.
|
pnlTitle.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2));
|
||||||
final FPanel pnlTitle = VSubmenuDuels.SINGLETON_INSTANCE.getPnlTitle();
|
pnlTitle.add(lblTitle, "w 100%, h 100%, gap 0 0 0 0");
|
||||||
final JPanel pnlStats = VSubmenuDuels.SINGLETON_INSTANCE.getPnlStats();
|
|
||||||
final JPanel pnlStart = VSubmenuDuels.SINGLETON_INSTANCE.getPnlStart();
|
populateStats();
|
||||||
VSubmenuDuels.SINGLETON_INSTANCE.getBtnStart().setEnabled(false);
|
populateStart();
|
||||||
////
|
btnStart.setEnabled(false);
|
||||||
|
|
||||||
final FScrollPane scrChallenges = new FScrollPane(pnlChallenges,
|
final FScrollPane scrChallenges = new FScrollPane(pnlChallenges,
|
||||||
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
|
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%");
|
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} */
|
/** @return {@link javax.swing.JPanel} */
|
||||||
public JPanel getPnlChallenges() {
|
public JPanel getPnlChallenges() {
|
||||||
return pnlChallenges;
|
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 net.miginfocom.swing.MigLayout;
|
||||||
import forge.gui.home.EMenuGroup;
|
import forge.gui.home.EMenuGroup;
|
||||||
|
import forge.gui.home.EMenuItem;
|
||||||
|
import forge.gui.home.ICSubmenu;
|
||||||
import forge.gui.home.IVSubmenu;
|
import forge.gui.home.IVSubmenu;
|
||||||
import forge.view.home.StartButton;
|
import forge.gui.home.StartButton;
|
||||||
import forge.view.toolbox.FCheckBox;
|
import forge.view.toolbox.FCheckBox;
|
||||||
import forge.view.toolbox.FLabel;
|
import forge.view.toolbox.FLabel;
|
||||||
import forge.view.toolbox.FPanel;
|
import forge.view.toolbox.FPanel;
|
||||||
@@ -21,7 +23,7 @@ import forge.view.toolbox.FScrollPane;
|
|||||||
import forge.view.toolbox.FSkin;
|
import forge.view.toolbox.FSkin;
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
public enum VSubmenuDuels implements IVSubmenu {
|
public enum VSubmenuDuels implements IVSubmenu, IStatsAndPet {
|
||||||
/** */
|
/** */
|
||||||
SINGLETON_INSTANCE;
|
SINGLETON_INSTANCE;
|
||||||
|
|
||||||
@@ -60,7 +62,7 @@ public enum VSubmenuDuels implements IVSubmenu {
|
|||||||
private final FLabel btnCurrentDeck = new FLabel.Builder()
|
private final FLabel btnCurrentDeck = new FLabel.Builder()
|
||||||
.fontScaleAuto(false).fontSize(15).opaque(true).hoverable(true).build();
|
.fontScaleAuto(false).fontSize(15).opaque(true).hoverable(true).build();
|
||||||
private final FLabel btnBazaar = new FLabel.Builder()
|
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();
|
.fontScaleAuto(false).fontSize(14).tooltip("Peruse the Bazaar").build();
|
||||||
private final FLabel btnSpellShop = new FLabel.Builder()
|
private final FLabel btnSpellShop = new FLabel.Builder()
|
||||||
.opaque(true).hoverable(true).text("Spell Shop")
|
.opaque(true).hoverable(true).text("Spell Shop")
|
||||||
@@ -78,10 +80,34 @@ public enum VSubmenuDuels implements IVSubmenu {
|
|||||||
* @see forge.view.home.IViewSubmenu#getGroup()
|
* @see forge.view.home.IViewSubmenu#getGroup()
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public EMenuGroup getGroup() {
|
public EMenuGroup getGroupEnum() {
|
||||||
return EMenuGroup.QUEST;
|
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)
|
/* (non-Javadoc)
|
||||||
* @see forge.view.home.IViewSubmenu#populate()
|
* @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();
|
final JLabel btnCurrentDeck = VSubmenuDuels.SINGLETON_INSTANCE.getBtnCurrentDeck();
|
||||||
if (SubmenuQuestUtil.getCurrentDeck() == null) {
|
if (SubmenuQuestUtil.getCurrentDeck() == null) {
|
||||||
btnCurrentDeck.setBackground(Color.red.darker());
|
btnCurrentDeck.setBackground(Color.red.darker());
|
||||||
@@ -133,12 +159,12 @@ public enum VSubmenuDuels implements IVSubmenu {
|
|||||||
return pnlTitle;
|
return pnlTitle;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return {@link javax.swing.JPanel} */
|
/** @return {@link forge.view.toolbox.FPanel} */
|
||||||
public JPanel getPnlStats() {
|
public JPanel getPnlStats() {
|
||||||
return pnlStats;
|
return pnlStats;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return {@link javax.swing.JPanel} */
|
/** @return {@link forge.view.toolbox.FPanel} */
|
||||||
public JPanel getPnlStart() {
|
public JPanel getPnlStart() {
|
||||||
return pnlStart;
|
return pnlStart;
|
||||||
}
|
}
|
||||||
@@ -147,32 +173,33 @@ public enum VSubmenuDuels implements IVSubmenu {
|
|||||||
public JLabel getLblTitle() {
|
public JLabel getLblTitle() {
|
||||||
return lblTitle;
|
return lblTitle;
|
||||||
}
|
}
|
||||||
/** @return {@link javax.swing.FLabel} */
|
|
||||||
|
@Override
|
||||||
public FLabel getLblLife() {
|
public FLabel getLblLife() {
|
||||||
return lblLife;
|
return lblLife;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return {@link javax.swing.FLabel} */
|
@Override
|
||||||
public FLabel getLblCredits() {
|
public FLabel getLblCredits() {
|
||||||
return lblCredits;
|
return lblCredits;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return {@link javax.swing.FLabel} */
|
@Override
|
||||||
public FLabel getLblWins() {
|
public FLabel getLblWins() {
|
||||||
return lblWins;
|
return lblWins;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return {@link javax.swing.FLabel} */
|
@Override
|
||||||
public FLabel getLblLosses() {
|
public FLabel getLblLosses() {
|
||||||
return lblLosses;
|
return lblLosses;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return {@link javax.swing.FLabel} */
|
@Override
|
||||||
public FLabel getLblNextChallengeInWins() {
|
public FLabel getLblNextChallengeInWins() {
|
||||||
return lblNextChallengeInWins;
|
return lblNextChallengeInWins;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return {@link javax.swing.FLabel} */
|
@Override
|
||||||
public FLabel getLblWinStreak() {
|
public FLabel getLblWinStreak() {
|
||||||
return lblWinStreak;
|
return lblWinStreak;
|
||||||
}
|
}
|
||||||
@@ -182,27 +209,27 @@ public enum VSubmenuDuels implements IVSubmenu {
|
|||||||
return btnCurrentDeck;
|
return btnCurrentDeck;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return {@link forge.view.toolbox.FLabel} */
|
@Override
|
||||||
public FLabel getBtnBazaar() {
|
public FLabel getBtnBazaar() {
|
||||||
return btnBazaar;
|
return btnBazaar;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return {@link forge.view.toolbox.FLabel} */
|
@Override
|
||||||
public FLabel getBtnSpellShop() {
|
public FLabel getBtnSpellShop() {
|
||||||
return btnSpellShop;
|
return btnSpellShop;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return {@link javax.swing.JCheckBox} */
|
@Override
|
||||||
public JCheckBox getCbPlant() {
|
public JCheckBox getCbPlant() {
|
||||||
return cbPlant;
|
return cbPlant;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return {@link javax.swing.JCheckBox} */
|
@Override
|
||||||
public JCheckBox getCbZep() {
|
public JCheckBox getCbZep() {
|
||||||
return cbZep;
|
return cbZep;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return {@link javax.swing.JComboBox} */
|
@Override
|
||||||
public JComboBox getCbxPet() {
|
public JComboBox getCbxPet() {
|
||||||
return cbxPet;
|
return cbxPet;
|
||||||
}
|
}
|
||||||
@@ -217,15 +244,15 @@ public enum VSubmenuDuels implements IVSubmenu {
|
|||||||
pnlStats.removeAll();
|
pnlStats.removeAll();
|
||||||
pnlStats.setOpaque(false);
|
pnlStats.setOpaque(false);
|
||||||
pnlStats.setLayout(new MigLayout("insets 0, gap 0, hidemode 0"));
|
pnlStats.setLayout(new MigLayout("insets 0, gap 0, hidemode 0"));
|
||||||
pnlStats.add(btnBazaar, constraints);
|
pnlStats.add(btnSpellShop, constraints);
|
||||||
pnlStats.add(lblWins, constraints);
|
pnlStats.add(lblWins, constraints);
|
||||||
pnlStats.add(lblLosses, 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(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(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");
|
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 net.miginfocom.swing.MigLayout;
|
||||||
import forge.gui.home.EMenuGroup;
|
import forge.gui.home.EMenuGroup;
|
||||||
|
import forge.gui.home.EMenuItem;
|
||||||
|
import forge.gui.home.ICSubmenu;
|
||||||
import forge.gui.home.IVSubmenu;
|
import forge.gui.home.IVSubmenu;
|
||||||
import forge.view.home.QuestFileLister;
|
|
||||||
import forge.view.toolbox.FCheckBox;
|
import forge.view.toolbox.FCheckBox;
|
||||||
import forge.view.toolbox.FLabel;
|
import forge.view.toolbox.FLabel;
|
||||||
import forge.view.toolbox.FPanel;
|
import forge.view.toolbox.FPanel;
|
||||||
@@ -119,7 +120,7 @@ public enum VSubmenuQuestData implements IVSubmenu {
|
|||||||
* @see forge.view.home.IViewSubmenu#getGroup()
|
* @see forge.view.home.IViewSubmenu#getGroup()
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public EMenuGroup getGroup() {
|
public EMenuGroup getGroupEnum() {
|
||||||
return EMenuGroup.QUEST;
|
return EMenuGroup.QUEST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -131,7 +132,32 @@ public enum VSubmenuQuestData implements IVSubmenu {
|
|||||||
return pnl;
|
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() {
|
public QuestFileLister getLstQuests() {
|
||||||
return this.lstQuests;
|
return this.lstQuests;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ import javax.swing.JPanel;
|
|||||||
import net.miginfocom.swing.MigLayout;
|
import net.miginfocom.swing.MigLayout;
|
||||||
import forge.game.GameType;
|
import forge.game.GameType;
|
||||||
import forge.gui.home.EMenuGroup;
|
import forge.gui.home.EMenuGroup;
|
||||||
|
import forge.gui.home.EMenuItem;
|
||||||
|
import forge.gui.home.ICSubmenu;
|
||||||
import forge.gui.home.IVSubmenu;
|
import forge.gui.home.IVSubmenu;
|
||||||
import forge.view.toolbox.DeckLister;
|
import forge.view.toolbox.DeckLister;
|
||||||
import forge.view.toolbox.FLabel;
|
import forge.view.toolbox.FLabel;
|
||||||
@@ -50,7 +52,7 @@ public enum VSubmenuQuestDecks implements IVSubmenu {
|
|||||||
* @see forge.view.home.IViewSubmenu#getGroup()
|
* @see forge.view.home.IViewSubmenu#getGroup()
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public EMenuGroup getGroup() {
|
public EMenuGroup getGroupEnum() {
|
||||||
return EMenuGroup.QUEST;
|
return EMenuGroup.QUEST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62,6 +64,30 @@ public enum VSubmenuQuestDecks implements IVSubmenu {
|
|||||||
return pnl;
|
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} */
|
/** @return {@link forge.view.toolbox.DeckLister} */
|
||||||
public DeckLister getLstDecks() {
|
public DeckLister getLstDecks() {
|
||||||
return this.lstDecks;
|
return this.lstDecks;
|
||||||
|
|||||||
@@ -16,6 +16,8 @@ import javax.swing.SwingConstants;
|
|||||||
import net.miginfocom.swing.MigLayout;
|
import net.miginfocom.swing.MigLayout;
|
||||||
import forge.Singletons;
|
import forge.Singletons;
|
||||||
import forge.gui.home.EMenuGroup;
|
import forge.gui.home.EMenuGroup;
|
||||||
|
import forge.gui.home.EMenuItem;
|
||||||
|
import forge.gui.home.ICSubmenu;
|
||||||
import forge.gui.home.IVSubmenu;
|
import forge.gui.home.IVSubmenu;
|
||||||
import forge.quest.data.QuestPreferences;
|
import forge.quest.data.QuestPreferences;
|
||||||
import forge.quest.data.QuestPreferences.QPref;
|
import forge.quest.data.QuestPreferences.QPref;
|
||||||
@@ -129,7 +131,7 @@ public enum VSubmenuQuestPrefs implements IVSubmenu {
|
|||||||
* @see forge.view.home.IViewSubmenu#getGroup()
|
* @see forge.view.home.IViewSubmenu#getGroup()
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public EMenuGroup getGroup() {
|
public EMenuGroup getGroupEnum() {
|
||||||
return EMenuGroup.QUEST;
|
return EMenuGroup.QUEST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -141,6 +143,30 @@ public enum VSubmenuQuestPrefs implements IVSubmenu {
|
|||||||
return pnl;
|
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} */
|
/** @return {@link javax.swing.JLabel} */
|
||||||
public JLabel getLblErrRewards() {
|
public JLabel getLblErrRewards() {
|
||||||
return lblErrRewards;
|
return lblErrRewards;
|
||||||
|
|||||||
@@ -2,18 +2,15 @@ package forge.gui.home.settings;
|
|||||||
|
|
||||||
import java.awt.event.ItemEvent;
|
import java.awt.event.ItemEvent;
|
||||||
import java.awt.event.ItemListener;
|
import java.awt.event.ItemListener;
|
||||||
|
import java.awt.event.MouseAdapter;
|
||||||
import javax.swing.ImageIcon;
|
import java.awt.event.MouseEvent;
|
||||||
import javax.swing.SwingWorker;
|
|
||||||
import javax.swing.event.ListSelectionEvent;
|
|
||||||
import javax.swing.event.ListSelectionListener;
|
|
||||||
|
|
||||||
import org.apache.commons.lang3.text.WordUtils;
|
import org.apache.commons.lang3.text.WordUtils;
|
||||||
|
|
||||||
import forge.Command;
|
import forge.Command;
|
||||||
import forge.Constant;
|
import forge.Constant;
|
||||||
import forge.Singletons;
|
import forge.Singletons;
|
||||||
import forge.control.FControl;
|
import forge.control.RestartUtil;
|
||||||
import forge.gui.home.ICSubmenu;
|
import forge.gui.home.ICSubmenu;
|
||||||
import forge.properties.ForgePreferences;
|
import forge.properties.ForgePreferences;
|
||||||
import forge.properties.ForgePreferences.FPref;
|
import forge.properties.ForgePreferences.FPref;
|
||||||
@@ -39,10 +36,9 @@ public enum CSubmenuPreferences implements ICSubmenu {
|
|||||||
final VSubmenuPreferences view = VSubmenuPreferences.SINGLETON_INSTANCE;
|
final VSubmenuPreferences view = VSubmenuPreferences.SINGLETON_INSTANCE;
|
||||||
final ForgePreferences prefs = Singletons.getModel().getPreferences();
|
final ForgePreferences prefs = Singletons.getModel().getPreferences();
|
||||||
|
|
||||||
view.getLstChooseSkin().addListSelectionListener(new ListSelectionListener() {
|
view.getLstChooseSkin().addMouseListener(new MouseAdapter() {
|
||||||
@Override
|
@Override
|
||||||
public void valueChanged(ListSelectionEvent e) {
|
public void mouseClicked(final MouseEvent e) {
|
||||||
if (e.getValueIsAdjusting()) { return; }
|
|
||||||
updateSkin();
|
updateSkin();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -145,7 +141,7 @@ public enum CSubmenuPreferences implements ICSubmenu {
|
|||||||
@Override
|
@Override
|
||||||
public void execute() {
|
public void execute() {
|
||||||
Singletons.getModel().getPreferences().reset();
|
Singletons.getModel().getPreferences().reset();
|
||||||
Singletons.getView().getViewHome().resetSettings();
|
update();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -199,30 +195,16 @@ public enum CSubmenuPreferences implements ICSubmenu {
|
|||||||
private void updateSkin() {
|
private void updateSkin() {
|
||||||
final VSubmenuPreferences view = VSubmenuPreferences.SINGLETON_INSTANCE;
|
final VSubmenuPreferences view = VSubmenuPreferences.SINGLETON_INSTANCE;
|
||||||
final ForgePreferences prefs = Singletons.getModel().getPreferences();
|
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 String name = view.getLstChooseSkin().getSelectedValue().toString();
|
||||||
|
|
||||||
final SwingWorker<Object, Object> w = new SwingWorker<Object, Object>() {
|
if (name.equals(prefs.getPref(FPref.UI_SKIN))) { return; }
|
||||||
@Override
|
|
||||||
public String doInBackground() {
|
|
||||||
FSkin.loadLight(name);
|
|
||||||
FSkin.loadFull();
|
|
||||||
|
|
||||||
|
RestartUtil.restartApplication(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
prefs.setPref(FPref.UI_SKIN, name);
|
prefs.setPref(FPref.UI_SKIN, name);
|
||||||
prefs.save();
|
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;
|
package forge.gui.home.settings;
|
||||||
|
|
||||||
import java.awt.Dimension;
|
import java.awt.Dimension;
|
||||||
import java.awt.Graphics;
|
|
||||||
import java.awt.Image;
|
import java.awt.Image;
|
||||||
import java.awt.event.MouseAdapter;
|
import java.util.Map;
|
||||||
import java.awt.event.MouseEvent;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import javax.swing.JLabel;
|
import javax.swing.ImageIcon;
|
||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
import javax.swing.JScrollPane;
|
import javax.swing.JScrollPane;
|
||||||
|
|
||||||
import net.miginfocom.swing.MigLayout;
|
import net.miginfocom.swing.MigLayout;
|
||||||
import forge.PlayerType;
|
import forge.Command;
|
||||||
import forge.Singletons;
|
import forge.Singletons;
|
||||||
import forge.gui.home.EMenuGroup;
|
import forge.gui.home.EMenuGroup;
|
||||||
|
import forge.gui.home.EMenuItem;
|
||||||
|
import forge.gui.home.ICSubmenu;
|
||||||
import forge.gui.home.IVSubmenu;
|
import forge.gui.home.IVSubmenu;
|
||||||
import forge.properties.ForgePreferences.FPref;
|
import forge.properties.ForgePreferences.FPref;
|
||||||
|
import forge.view.toolbox.FLabel;
|
||||||
import forge.view.toolbox.FScrollPane;
|
import forge.view.toolbox.FScrollPane;
|
||||||
import forge.view.toolbox.FSkin;
|
import forge.view.toolbox.FSkin;
|
||||||
import forge.view.toolbox.WrapLayout;
|
import forge.view.toolbox.WrapLayout;
|
||||||
@@ -33,8 +32,10 @@ public enum VSubmenuAvatars implements IVSubmenu {
|
|||||||
private final JPanel pnl = new JPanel();
|
private final JPanel pnl = new JPanel();
|
||||||
private final JPanel pnlAvatars = new JPanel();
|
private final JPanel pnlAvatars = new JPanel();
|
||||||
|
|
||||||
private AvatarLabel avatarHuman, avatarAI;
|
private final FLabel lblAvatarHuman = new FLabel.Builder().hoverable(true).selectable(true)
|
||||||
private List<AvatarLabel> lstAvatars;
|
.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)
|
/* (non-Javadoc)
|
||||||
* @see forge.view.home.IViewSubmenu#populate()
|
* @see forge.view.home.IViewSubmenu#populate()
|
||||||
@@ -55,7 +56,7 @@ public enum VSubmenuAvatars implements IVSubmenu {
|
|||||||
* @see forge.view.home.IViewSubmenu#getGroup()
|
* @see forge.view.home.IViewSubmenu#getGroup()
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public EMenuGroup getGroup() {
|
public EMenuGroup getGroupEnum() {
|
||||||
return EMenuGroup.SETTINGS;
|
return EMenuGroup.SETTINGS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -67,162 +68,117 @@ public enum VSubmenuAvatars implements IVSubmenu {
|
|||||||
return pnl;
|
return pnl;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void populateAvatars() {
|
/* (non-Javadoc)
|
||||||
pnlAvatars.removeAll();
|
* @see forge.gui.home.IVSubmenu#getMenuTitle()
|
||||||
pnlAvatars.setLayout(new WrapLayout());
|
*/
|
||||||
pnlAvatars.setOpaque(false);
|
@Override
|
||||||
|
public String getMenuTitle() {
|
||||||
|
return "Avatars";
|
||||||
|
}
|
||||||
|
|
||||||
lstAvatars = new ArrayList<AvatarLabel>();
|
/* (non-Javadoc)
|
||||||
int counter = 0;
|
* @see forge.gui.home.IVSubmenu#getMenuName()
|
||||||
for (final Image i : FSkin.getAvatars().values()) {
|
*/
|
||||||
lstAvatars.add(new AvatarLabel(i, counter++));
|
@Override
|
||||||
pnlAvatars.add(lstAvatars.get(lstAvatars.size() - 1));
|
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(",");
|
final String[] indexes = Singletons.getModel().getPreferences().getPref(FPref.UI_AVATARS).split(",");
|
||||||
int humanIndex = Integer.parseInt(indexes[0]);
|
int humanIndex = Integer.parseInt(indexes[0]);
|
||||||
int aiIndex = Integer.parseInt(indexes[1]);
|
int aiIndex = Integer.parseInt(indexes[1]);
|
||||||
|
|
||||||
// Set human avatar from preferences
|
if (humanIndex >= FSkin.getAvatars().size()) { humanIndex = 0; }
|
||||||
if (humanIndex >= lstAvatars.size()) {
|
if (aiIndex >= FSkin.getAvatars().size()) { aiIndex = 0; }
|
||||||
humanIndex = (int) (Math.random() * (lstAvatars.size() - 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
avatarHuman = lstAvatars.get(humanIndex);
|
lblAvatarHuman.setIcon(new ImageIcon(FSkin.getAvatars().get(humanIndex)));
|
||||||
avatarHuman.setOwner(PlayerType.HUMAN);
|
lblAvatarAI.setIcon(new ImageIcon(FSkin.getAvatars().get(aiIndex)));
|
||||||
avatarHuman.repaintOnlyThisLabel();
|
|
||||||
|
|
||||||
if (humanIndex == aiIndex || aiIndex >= lstAvatars.size()) {
|
Singletons.getModel().getPreferences().setPref(FPref.UI_AVATARS, aiIndex + "," + humanIndex);
|
||||||
aiIndex = humanIndex;
|
Singletons.getModel().getPreferences().save();
|
||||||
while (aiIndex == humanIndex) {
|
|
||||||
aiIndex = (int) (Math.random() * (lstAvatars.size() - 1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
avatarAI = lstAvatars.get(aiIndex);
|
|
||||||
avatarAI.setOwner(PlayerType.COMPUTER);
|
|
||||||
avatarAI.repaintOnlyThisLabel();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("serial")
|
@SuppressWarnings("serial")
|
||||||
private class AvatarLabel extends JLabel {
|
private FLabel makeAvatarLabel(final Image img0, final int index0) {
|
||||||
private final Image img;
|
final FLabel lbl = new FLabel.Builder().icon(new ImageIcon(img0)).iconScaleFactor(1.0)
|
||||||
private final int index;
|
.iconAlpha(0.7f).iconInBackground(true).hoverable(true).build();
|
||||||
private PlayerType owner;
|
|
||||||
private boolean hovered = false;
|
|
||||||
|
|
||||||
public AvatarLabel(final Image img0, final int index0) {
|
final Dimension size = new Dimension(100, 100);
|
||||||
super();
|
lbl.setPreferredSize(size);
|
||||||
img = img0;
|
lbl.setMaximumSize(size);
|
||||||
index = index0;
|
lbl.setMinimumSize(size);
|
||||||
setMaximumSize(new Dimension(100, 120));
|
|
||||||
setMinimumSize(new Dimension(100, 120));
|
|
||||||
setPreferredSize(new Dimension(100, 120));
|
|
||||||
|
|
||||||
this.addMouseListener(new MouseAdapter() {
|
final Command cmd = new Command() {
|
||||||
@Override
|
@Override
|
||||||
public void mouseEntered(final MouseEvent evt) { hovered = true; repaintOnlyThisLabel(); }
|
public void execute() {
|
||||||
|
String[] indices = Singletons.getModel().getPreferences()
|
||||||
|
.getPref(FPref.UI_AVATARS).split(",");
|
||||||
|
|
||||||
@Override
|
if (lblAvatarAI.isSelected()) {
|
||||||
public void mouseExited(final MouseEvent evt) { hovered = false; repaintOnlyThisLabel(); }
|
lblAvatarAI.setIcon(new ImageIcon(FSkin.getAvatars().get(index0)));
|
||||||
|
lblAvatarAI.repaintOnlyThisLabel();
|
||||||
@Override
|
indices[0] = String.valueOf(index0);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
}
|
else {
|
||||||
|
lblAvatarHuman.setIcon(new ImageIcon(FSkin.getAvatars().get(index0)));
|
||||||
// Assign computer
|
lblAvatarHuman.repaintOnlyThisLabel();
|
||||||
lbl0.setOwner(PlayerType.COMPUTER);
|
indices[1] = String.valueOf(index0);
|
||||||
lbl0.repaintOnlyThisLabel();
|
|
||||||
|
|
||||||
if (avatarAI != null) {
|
|
||||||
avatarAI.setOwner(null);
|
|
||||||
avatarAI.repaintOnlyThisLabel();
|
|
||||||
}
|
|
||||||
|
|
||||||
avatarAI = lbl0;
|
|
||||||
}
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Singletons.getModel().getPreferences().setPref(
|
Singletons.getModel().getPreferences().setPref(FPref.UI_AVATARS, indices[0] + "," + indices[1]);
|
||||||
FPref.UI_AVATARS, avatarHuman.getIndex() + "," + avatarAI.getIndex());
|
Singletons.getModel().getPreferences().save();
|
||||||
Singletons.getModel().getPreferences().save();
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
lbl.setCommand(cmd);
|
||||||
|
return lbl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,6 +29,8 @@ import forge.Singletons;
|
|||||||
import forge.control.KeyboardShortcuts;
|
import forge.control.KeyboardShortcuts;
|
||||||
import forge.control.KeyboardShortcuts.Shortcut;
|
import forge.control.KeyboardShortcuts.Shortcut;
|
||||||
import forge.gui.home.EMenuGroup;
|
import forge.gui.home.EMenuGroup;
|
||||||
|
import forge.gui.home.EMenuItem;
|
||||||
|
import forge.gui.home.ICSubmenu;
|
||||||
import forge.gui.home.IVSubmenu;
|
import forge.gui.home.IVSubmenu;
|
||||||
import forge.properties.ForgeProps;
|
import forge.properties.ForgeProps;
|
||||||
import forge.properties.NewConstants.Lang.OldGuiNewGame.NewGameText;
|
import forge.properties.NewConstants.Lang.OldGuiNewGame.NewGameText;
|
||||||
@@ -154,7 +156,7 @@ public enum VSubmenuPreferences implements IVSubmenu {
|
|||||||
* @see forge.view.home.IViewSubmenu#getGroup()
|
* @see forge.view.home.IViewSubmenu#getGroup()
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public EMenuGroup getGroup() {
|
public EMenuGroup getGroupEnum() {
|
||||||
return EMenuGroup.SETTINGS;
|
return EMenuGroup.SETTINGS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -166,6 +168,30 @@ public enum VSubmenuPreferences implements IVSubmenu {
|
|||||||
return pnl;
|
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. */
|
/** Consolidates checkbox styling in one place. */
|
||||||
@SuppressWarnings("serial")
|
@SuppressWarnings("serial")
|
||||||
private class OptionsCheckBox extends JCheckBox {
|
private class OptionsCheckBox extends JCheckBox {
|
||||||
@@ -349,11 +375,6 @@ public enum VSubmenuPreferences implements IVSubmenu {
|
|||||||
return cbDevMode;
|
return cbDevMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return {@link javax.swing.FLabel} */
|
|
||||||
public FLabel getLblTitleSkin() {
|
|
||||||
return lblTitleSkin;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @return {@link forge.view.toolbox.FLabel} */
|
/** @return {@link forge.view.toolbox.FLabel} */
|
||||||
public FLabel getBtnReset() {
|
public FLabel getBtnReset() {
|
||||||
return btnReset;
|
return btnReset;
|
||||||
|
|||||||
@@ -59,22 +59,13 @@ public enum CSubmenuDeckEditor implements ICSubmenu {
|
|||||||
editor = (DeckEditorBase<?, T>) new DeckEditorLimited(Singletons.getModel().getDecks().getSealed());
|
editor = (DeckEditorBase<?, T>) new DeckEditorLimited(Singletons.getModel().getDecks().getSealed());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
editor.show(null);
|
||||||
final Command exit = new Command() {
|
|
||||||
private static final long serialVersionUID = -9133358399503226853L;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void execute() {
|
|
||||||
Singletons.getControl().getControlHome().getControlConstructed().updateDeckLists();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
editor.show(exit);
|
|
||||||
|
|
||||||
if (d0 != null) {
|
if (d0 != null) {
|
||||||
editor.getController().setModel(d0);
|
editor.getController().setModel(d0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
editor.setAlwaysOnTop(true);
|
||||||
editor.setVisible(true);
|
editor.setVisible(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ import javax.swing.JPanel;
|
|||||||
|
|
||||||
import net.miginfocom.swing.MigLayout;
|
import net.miginfocom.swing.MigLayout;
|
||||||
import forge.gui.home.EMenuGroup;
|
import forge.gui.home.EMenuGroup;
|
||||||
|
import forge.gui.home.EMenuItem;
|
||||||
|
import forge.gui.home.ICSubmenu;
|
||||||
import forge.gui.home.IVSubmenu;
|
import forge.gui.home.IVSubmenu;
|
||||||
import forge.view.toolbox.FLabel;
|
import forge.view.toolbox.FLabel;
|
||||||
|
|
||||||
@@ -35,7 +37,7 @@ public enum VSubmenuDeckEditor implements IVSubmenu {
|
|||||||
* @see forge.view.home.IViewSubmenu#getGroup()
|
* @see forge.view.home.IViewSubmenu#getGroup()
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public EMenuGroup getGroup() {
|
public EMenuGroup getGroupEnum() {
|
||||||
return EMenuGroup.UTILITIES;
|
return EMenuGroup.UTILITIES;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -46,4 +48,28 @@ public enum VSubmenuDeckEditor implements IVSubmenu {
|
|||||||
public JPanel getPanel() {
|
public JPanel getPanel() {
|
||||||
return pnl;
|
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 net.miginfocom.swing.MigLayout;
|
||||||
import forge.gui.GuiUtils;
|
import forge.gui.GuiUtils;
|
||||||
import forge.gui.home.EMenuGroup;
|
import forge.gui.home.EMenuGroup;
|
||||||
|
import forge.gui.home.EMenuItem;
|
||||||
|
import forge.gui.home.ICSubmenu;
|
||||||
import forge.gui.home.IVSubmenu;
|
import forge.gui.home.IVSubmenu;
|
||||||
import forge.properties.ForgeProps;
|
import forge.properties.ForgeProps;
|
||||||
import forge.properties.NewConstants.Lang;
|
import forge.properties.NewConstants.Lang;
|
||||||
@@ -123,7 +125,7 @@ public enum VSubmenuUtilities implements IVSubmenu {
|
|||||||
* @see forge.view.home.IViewSubmenu#getGroup()
|
* @see forge.view.home.IViewSubmenu#getGroup()
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public EMenuGroup getGroup() {
|
public EMenuGroup getGroupEnum() {
|
||||||
return EMenuGroup.UTILITIES;
|
return EMenuGroup.UTILITIES;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -265,4 +267,28 @@ public enum VSubmenuUtilities implements IVSubmenu {
|
|||||||
overlay.add(scr);
|
overlay.add(scr);
|
||||||
overlay.showOverlay();
|
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.QuestEventManager;
|
||||||
import forge.quest.data.QuestPreferences;
|
import forge.quest.data.QuestPreferences;
|
||||||
import forge.util.FileUtil;
|
import forge.util.FileUtil;
|
||||||
import forge.util.StorageView;
|
|
||||||
import forge.util.HttpUtil;
|
import forge.util.HttpUtil;
|
||||||
import forge.util.IStorageView;
|
import forge.util.IStorageView;
|
||||||
|
import forge.util.StorageView;
|
||||||
import forge.view.match.ViewField;
|
import forge.view.match.ViewField;
|
||||||
import forge.view.match.ViewTabber;
|
import forge.view.match.ViewTabber;
|
||||||
import forge.view.toolbox.FSkin;
|
import forge.view.toolbox.FSkin;
|
||||||
@@ -108,7 +108,7 @@ public enum FModel {
|
|||||||
final boolean deleteSucceeded = logFile.delete();
|
final boolean deleteSucceeded = logFile.delete();
|
||||||
|
|
||||||
if (logFile.exists() && !deleteSucceeded && (logFile.length() != 0)) {
|
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 {
|
try {
|
||||||
|
|||||||
@@ -26,6 +26,8 @@ import java.io.IOException;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import forge.gui.home.EMenuItem;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Holds default preference values in an enum.
|
* Holds default preference values in an enum.
|
||||||
* Loads preferred values when instantiated.
|
* Loads preferred values when instantiated.
|
||||||
@@ -60,7 +62,12 @@ public class ForgePreferences {
|
|||||||
UI_BUGZ_PWD (""), /** */
|
UI_BUGZ_PWD (""), /** */
|
||||||
UI_ANTE ("false"), /** */
|
UI_ANTE ("false"), /** */
|
||||||
UI_SKIN ("default"), /** */
|
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_MODE_ENABLED ("false"), /** */
|
||||||
DEV_MILLING_LOSS ("true"), /** */
|
DEV_MILLING_LOSS ("true"), /** */
|
||||||
|
|||||||
@@ -26,8 +26,6 @@ import javax.swing.SwingUtilities;
|
|||||||
|
|
||||||
import forge.Singletons;
|
import forge.Singletons;
|
||||||
import forge.control.FControl;
|
import forge.control.FControl;
|
||||||
import forge.properties.ForgePreferences;
|
|
||||||
import forge.properties.ForgePreferences.FPref;
|
|
||||||
import forge.view.toolbox.FOverlay;
|
import forge.view.toolbox.FOverlay;
|
||||||
import forge.view.toolbox.FSkin;
|
import forge.view.toolbox.FSkin;
|
||||||
|
|
||||||
@@ -44,14 +42,10 @@ public enum FView {
|
|||||||
private final FOverlay overlay = new FOverlay();
|
private final FOverlay overlay = new FOverlay();
|
||||||
|
|
||||||
private SplashFrame splash;
|
private SplashFrame splash;
|
||||||
private ViewHomeUI home = null;
|
|
||||||
private ViewMatchUI match = null;
|
private ViewMatchUI match = null;
|
||||||
private ViewEditorUI editor = null;
|
private ViewEditorUI editor = null;
|
||||||
private ViewBazaarUI bazaar = 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. */
|
/** The splash frame is guaranteed to exist when this constructor exits. */
|
||||||
private FView() {
|
private FView() {
|
||||||
SwingUtilities.invokeLater(new Runnable() {
|
SwingUtilities.invokeLater(new Runnable() {
|
||||||
@@ -94,21 +88,6 @@ public enum FView {
|
|||||||
FView.this.splash = null;
|
FView.this.splash = null;
|
||||||
|
|
||||||
frame.setVisible(true);
|
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} */
|
/** @return {@link javax.swing.JLayeredPane} */
|
||||||
@@ -126,15 +105,6 @@ public enum FView {
|
|||||||
return FView.this.overlay;
|
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} */
|
/** @return {@link forge.view.ViewMatchUI} */
|
||||||
public ViewMatchUI getViewMatch() {
|
public ViewMatchUI getViewMatch() {
|
||||||
if (Singletons.getControl().getState() != FControl.MATCH_SCREEN) {
|
if (Singletons.getControl().getState() != FControl.MATCH_SCREEN) {
|
||||||
@@ -164,9 +134,9 @@ public enum FView {
|
|||||||
|
|
||||||
/** Like it says. */
|
/** Like it says. */
|
||||||
public void instantiateCachedUIStates() {
|
public void instantiateCachedUIStates() {
|
||||||
FView.this.home = new ViewHomeUI();
|
|
||||||
FView.this.match = new ViewMatchUI();
|
FView.this.match = new ViewMatchUI();
|
||||||
FView.this.editor = new ViewEditorUI();
|
FView.this.editor = new ViewEditorUI();
|
||||||
FView.this.bazaar = new ViewBazaarUI();
|
FView.this.bazaar = new ViewBazaarUI();
|
||||||
|
ViewHomeUI.SINGLETON_INSTANCE.initialize();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,371 +17,303 @@
|
|||||||
*/
|
*/
|
||||||
package forge.view;
|
package forge.view;
|
||||||
|
|
||||||
|
import java.awt.CardLayout;
|
||||||
|
import java.awt.Component;
|
||||||
import java.awt.Rectangle;
|
import java.awt.Rectangle;
|
||||||
import java.awt.event.ActionEvent;
|
|
||||||
import java.awt.event.ComponentAdapter;
|
import java.awt.event.ComponentAdapter;
|
||||||
import java.awt.event.ComponentEvent;
|
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.BorderFactory;
|
||||||
import javax.swing.JButton;
|
|
||||||
import javax.swing.JLabel;
|
import javax.swing.JLabel;
|
||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
|
import javax.swing.JScrollPane;
|
||||||
|
import javax.swing.SwingConstants;
|
||||||
import javax.swing.SwingUtilities;
|
import javax.swing.SwingUtilities;
|
||||||
|
import javax.swing.border.EmptyBorder;
|
||||||
|
import javax.swing.border.MatteBorder;
|
||||||
|
|
||||||
import net.miginfocom.swing.MigLayout;
|
import net.miginfocom.swing.MigLayout;
|
||||||
|
import forge.AllZone;
|
||||||
|
import forge.Command;
|
||||||
import forge.Singletons;
|
import forge.Singletons;
|
||||||
import forge.control.ControlHomeUI;
|
import forge.gui.home.EMenuGroup;
|
||||||
import forge.game.GameType;
|
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;
|
||||||
import forge.properties.ForgePreferences.FPref;
|
import forge.properties.ForgePreferences.FPref;
|
||||||
import forge.view.home.ViewConstructed;
|
import forge.properties.ForgeProps;
|
||||||
import forge.view.home.ViewDraft;
|
import forge.properties.NewConstants;
|
||||||
import forge.view.home.ViewQuest;
|
import forge.quest.data.QuestDataIO;
|
||||||
import forge.view.home.ViewSealed;
|
import forge.quest.data.QuestPreferences.QPref;
|
||||||
import forge.view.home.ViewSettings;
|
import forge.view.toolbox.FLabel;
|
||||||
import forge.view.home.ViewUtilities;
|
|
||||||
import forge.view.toolbox.FButton;
|
|
||||||
import forge.view.toolbox.FPanel;
|
import forge.view.toolbox.FPanel;
|
||||||
|
import forge.view.toolbox.FScrollPane;
|
||||||
import forge.view.toolbox.FSkin;
|
import forge.view.toolbox.FSkin;
|
||||||
|
|
||||||
/**
|
/** Singleton instance of home screen UI.
|
||||||
* - Lays out containers and borders for main menu and submenus<br>
|
* Use "getPanel()" to work with the main container.
|
||||||
* - Instantiates top-level controller for submenus.<br>
|
* <br><br>
|
||||||
* - Has access methods for all child controllers<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 enum ViewHomeUI {
|
||||||
public class ViewHomeUI extends FPanel {
|
/** */
|
||||||
private JPanel pnlMenu, pnlContent;
|
SINGLETON_INSTANCE;
|
||||||
private FButton btnDraft, btnConstructed, btnSealed, btnQuest, btnSettings, btnUtilities, btnExit, btnDeckEditor;
|
|
||||||
private String constraints;
|
|
||||||
private ControlHomeUI control;
|
|
||||||
|
|
||||||
private ViewConstructed constructed;
|
private final CardLayout cards = new CardLayout();
|
||||||
private ViewSealed sealed;
|
private final FPanel pnlParent = new FPanel();
|
||||||
private ViewDraft draft;
|
private final FPanel pnlLeft = new FPanel();
|
||||||
private ViewQuest quest;
|
private final FPanel pnlRight = new FPanel(cards);
|
||||||
private ViewSettings settings;
|
private final JPanel pnlMenu = new JPanel();
|
||||||
private ViewUtilities utilities;
|
|
||||||
|
|
||||||
private final int insets = 10;
|
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;
|
||||||
|
|
||||||
/**
|
/** Mostly, assembles child singletons for the home screen UI. */
|
||||||
* Instantiates a new home top level.
|
public void initialize() {
|
||||||
*/
|
// There's d a better home for this (model?)
|
||||||
public ViewHomeUI() {
|
final File dirQuests = ForgeProps.getFile(NewConstants.Quest.DATA_DIR);
|
||||||
super();
|
final String questname = Singletons.getModel()
|
||||||
|
.getQuestPreferences().getPreference(QPref.CURRENT_QUEST);
|
||||||
|
final File data = new File(dirQuests.getPath() + File.separator + questname);
|
||||||
|
|
||||||
constructed = new ViewConstructed();
|
if (data.exists()) {
|
||||||
sealed = new ViewSealed();
|
AllZone.setQuestData(QuestDataIO.loadData(data));
|
||||||
draft = new ViewDraft();
|
}
|
||||||
quest = new ViewQuest();
|
|
||||||
settings = new ViewSettings();
|
|
||||||
utilities = new ViewUtilities();
|
|
||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
this.setCornerDiameter(0);
|
|
||||||
this.setBorderToggle(false);
|
|
||||||
this.setBackgroundTexture(FSkin.getIcon(FSkin.Backgrounds.BG_TEXTURE));
|
// Add new menu items here (order doesn't matter).
|
||||||
this.setLayout(null);
|
allSubmenus.clear();
|
||||||
this.addComponentListener(new ComponentAdapter() {
|
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() {
|
pnlParent.addComponentListener(new ComponentAdapter() {
|
||||||
public void componentResized(ComponentEvent e) {
|
@Override
|
||||||
int w = getWidth();
|
public void componentResized(final ComponentEvent e) {
|
||||||
int h = getHeight();
|
final int w = pnlParent.getWidth();
|
||||||
pnlContent.setBounds(new Rectangle(
|
final int h = pnlParent.getHeight();
|
||||||
2 * insets + menuWidthPx, insets,
|
pnlRight.setBounds(new Rectangle(
|
||||||
w - menuWidthPx - 3 * insets, h - 2 * insets));
|
2 * insets + leftWidthPx, insets,
|
||||||
pnlMenu.setBounds(new Rectangle(
|
w - leftWidthPx - 3 * insets, h - 2 * insets));
|
||||||
pnlLeft.setBounds(new Rectangle(
|
pnlLeft.setBounds(new Rectangle(
|
||||||
menuWidthPx, h - 2 * insets
|
insets, insets,
|
||||||
leftWidthPx, h - 2 * insets
|
leftWidthPx, h - 2 * insets
|
||||||
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();
|
|
||||||
|
|
||||||
Singletons.getControl().getControlHome().getControlConstructed().updateDeckSelectionCheckboxes();
|
|
||||||
|
|
||||||
SwingUtilities.invokeLater(new Runnable() { @Override
|
|
||||||
public void run() {
|
|
||||||
btnConstructed.setToggled(true);
|
|
||||||
btnConstructed.grabFocus();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Singletons.getModel().getPreferences().setPref(FPref.UI_HOMEMENU,
|
|
||||||
ForgePreferences.HomeMenus.constructed.toString());
|
|
||||||
Singletons.getModel().getPreferences().save();
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Opens menu for draft mode. */
|
|
||||||
public void showDraftMenu() {
|
|
||||||
clearToggles();
|
|
||||||
pnlContent.removeAll();
|
|
||||||
pnlContent.add(draft, "w 100%!, h 100%!");
|
|
||||||
pnlContent.revalidate();
|
|
||||||
pnlContent.repaint();
|
|
||||||
|
|
||||||
SwingUtilities.invokeLater(new Runnable() { @Override
|
|
||||||
public void run() {
|
|
||||||
btnDraft.setToggled(true);
|
|
||||||
btnDraft.grabFocus();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Singletons.getModel().getPreferences().setPref(FPref.UI_HOMEMENU,
|
|
||||||
ForgePreferences.HomeMenus.draft.toString());
|
|
||||||
Singletons.getModel().getPreferences().save();
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Opens menu for sealed mode. */
|
|
||||||
public void showSealedMenu() {
|
|
||||||
clearToggles();
|
|
||||||
pnlContent.removeAll();
|
|
||||||
pnlContent.add(sealed, "w 100%!, h 100%!");
|
|
||||||
pnlContent.revalidate();
|
|
||||||
pnlContent.repaint();
|
|
||||||
|
|
||||||
SwingUtilities.invokeLater(new Runnable() { @Override
|
|
||||||
public void run() {
|
|
||||||
btnSealed.setToggled(true);
|
|
||||||
btnSealed.grabFocus();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Singletons.getModel().getPreferences().setPref(FPref.UI_HOMEMENU,
|
|
||||||
ForgePreferences.HomeMenus.sealed.toString());
|
|
||||||
Singletons.getModel().getPreferences().save();
|
|
||||||
}
|
|
||||||
|
|
||||||
/** 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();
|
|
||||||
|
|
||||||
Singletons.getModel().getPreferences().setPref(FPref.UI_HOMEMENU,
|
|
||||||
ForgePreferences.HomeMenus.quest.toString());
|
|
||||||
Singletons.getModel().getPreferences().save();
|
|
||||||
|
|
||||||
SwingUtilities.invokeLater(new Runnable() { @Override
|
|
||||||
public void run() {
|
|
||||||
btnQuest.setToggled(true);
|
|
||||||
btnQuest.grabFocus();
|
|
||||||
pnlParent.revalidate();
|
pnlParent.revalidate();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
/** Opens menu for settings. */
|
|
||||||
public void showSettingsMenu() {
|
/** Generates expand/collapse menu using cards in layout, and EMenuGroup enum.
|
||||||
clearToggles();
|
* No further hardcoding should be required in this method. */
|
||||||
pnlContent.removeAll();
|
private void populateMenu() {
|
||||||
pnlContent.add(settings, "w 99%!, h 95%!, gaptop 2.5%, gapleft 0.5%");
|
final SortedMap<EMenuGroup, JPanel> allGroupPanels = new TreeMap<EMenuGroup, JPanel>();
|
||||||
pnlContent.revalidate();
|
|
||||||
pnlContent.repaint();
|
|
||||||
final Map<EMenuGroup, JLabel> allGroupLabels = new HashMap<EMenuGroup, JLabel>();
|
final Map<EMenuGroup, JLabel> allGroupLabels = new HashMap<EMenuGroup, JLabel>();
|
||||||
Singletons.getModel().getPreferences().setPref(FPref.UI_HOMEMENU,
|
|
||||||
ForgePreferences.HomeMenus.settings.toString());
|
final ForgePreferences prefs = Singletons.getModel().getPreferences();
|
||||||
Singletons.getModel().getPreferences().save();
|
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";
|
final String strItemConstraints = "w 100%!, h 26px!, gap 0 0 1px 1px";
|
||||||
SwingUtilities.invokeLater(new Runnable() { @Override
|
|
||||||
public void run() {
|
pnlMenu.removeAll();
|
||||||
btnSettings.setToggled(true);
|
pnlMenu.setLayout(new MigLayout("insets 0, gap 0, wrap, hidemode 3"));
|
||||||
btnSettings.grabFocus();
|
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));
|
groupClick(e, allGroupLabels.get(e));
|
||||||
});
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/** Opens menu for utilities. */
|
|
||||||
public void showUtilitiesMenu() {
|
private void groupClick(final EMenuGroup e0, final JLabel lbl0) {
|
||||||
clearToggles();
|
final Component[] menuObjects = pnlMenu.getComponents();
|
||||||
pnlContent.removeAll();
|
for (final Component c : menuObjects) {
|
||||||
pnlContent.add(utilities, "w 100%!, h 100%!");
|
if (c.getName() != null && c.getName().equals(e0.toString())) {
|
||||||
pnlContent.revalidate();
|
if (c.isVisible()) {
|
||||||
pnlContent.repaint();
|
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");
|
||||||
}
|
}
|
||||||
SwingUtilities.invokeLater(new Runnable() { @Override
|
|
||||||
public void run() {
|
Singletons.getModel().getPreferences().save();
|
||||||
btnUtilities.setToggled(true);
|
|
||||||
btnUtilities.grabFocus();
|
|
||||||
break;
|
break;
|
||||||
});
|
}
|
||||||
|
|
||||||
Singletons.getModel().getPreferences().setPref(FPref.UI_HOMEMENU,
|
|
||||||
ForgePreferences.HomeMenus.utilities.toString());
|
|
||||||
Singletons.getModel().getPreferences().save();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private void clearToggles() {
|
|
||||||
btnConstructed.setToggled(false);
|
/** Custom title label styling. */
|
||||||
btnSealed.setToggled(false);
|
@SuppressWarnings("serial")
|
||||||
btnDraft.setToggled(false);
|
private JLabel makeTitleLabel(final EMenuGroup e0) {
|
||||||
btnQuest.setToggled(false);
|
final FLabel lbl = new FLabel.Builder().fontScaleAuto(false).fontSize(16)
|
||||||
btnDeckEditor.setToggled(false);
|
.hoverable(true).fontAlign(SwingConstants.LEFT).build();
|
||||||
btnSettings.setToggled(false);
|
|
||||||
btnUtilities.setToggled(false);
|
lbl.setBorder(BorderFactory.createCompoundBorder(
|
||||||
|
new MatteBorder(0, 0, 1, 0, FSkin.getColor(FSkin.Colors.CLR_BORDERS)),
|
||||||
|
new EmptyBorder(2, 2, 2, 2)));
|
||||||
|
|
||||||
|
lbl.setCommand(new Command() { @Override
|
||||||
|
public void execute() { groupClick(e0, lbl); } });
|
||||||
|
|
||||||
|
lbl.setText("+ " + e0.getTitle());
|
||||||
return lbl;
|
return lbl;
|
||||||
}
|
}
|
||||||
/** @return {@link forge.view.home.ViewConstructed} */
|
|
||||||
public ViewConstructed getViewConstructed() {
|
/** Custom subsection label styling. */
|
||||||
return this.constructed;
|
@SuppressWarnings("serial")
|
||||||
|
private FLabel makeItemLabel(final IVSubmenu item) {
|
||||||
|
final ForgePreferences prefs = Singletons.getModel().getPreferences();
|
||||||
|
|
||||||
|
final FLabel lbl = new FLabel.Builder().fontScaleAuto(false).fontSize(15)
|
||||||
|
.hoverable(true).selectable(true).text(item.getMenuTitle())
|
||||||
|
.fontAlign(SwingConstants.LEFT).build();
|
||||||
|
|
||||||
|
final Command cmdOnClick = new Command() {
|
||||||
|
@Override
|
||||||
|
public void execute() {
|
||||||
|
if (lblPreviousSelected != null) { lblPreviousSelected.setSelected(false); }
|
||||||
|
|
||||||
|
cards.show(pnlRight, item.getItemEnum());
|
||||||
|
lblPreviousSelected = lbl;
|
||||||
|
|
||||||
|
prefs.setPref(FPref.SUBMENU_CURRENTMENU, item.getItemEnum());
|
||||||
|
Singletons.getModel().getPreferences().save();
|
||||||
|
|
||||||
|
// Make sure this is called last, so it doesn't interfere
|
||||||
|
// with the selection display process.
|
||||||
|
SwingUtilities.invokeLater(new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
if (item.getControl().getMenuCommand() != null) {
|
||||||
|
item.getControl().getMenuCommand().execute();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
lbl.setCommand(cmdOnClick);
|
||||||
|
lbl.setBorder(new EmptyBorder(0, 10, 0, 0));
|
||||||
|
|
||||||
return lbl;
|
return lbl;
|
||||||
}
|
}
|
||||||
/** @return {@link forge.view.home.ViewDraft} */
|
|
||||||
public ViewDraft getViewDraft() {
|
/** Programatically selects a menu item.
|
||||||
return this.draft;
|
* @param e0   {@forge.gui.home.EMenuItem} */
|
||||||
|
public void itemClick(final EMenuItem e0) {
|
||||||
|
allSubmenuLabels.get(e0).getCommand().execute();
|
||||||
allSubmenuLabels.get(e0).setSelected(true);
|
allSubmenuLabels.get(e0).setSelected(true);
|
||||||
}
|
}
|
||||||
/** @return {@link forge.view.home.ViewSealed} */
|
|
||||||
public ViewSealed getViewSealed() {
|
/** @return {@link javax.swing.JPanel} the parent panel containing the home UI. */
|
||||||
return this.sealed;
|
public JPanel getPanel() {
|
||||||
}
|
|
||||||
|
|
||||||
/** @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 pnlParent;
|
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);
|
Singletons.getControl().changeState(FControl.HOME_SCREEN);
|
||||||
|
|
||||||
// Update as necessary.
|
// Update as necessary.
|
||||||
if ((Singletons.getView().getViewHome().getViewQuest().getPnlDuels().isVisible())) {
|
/* if ((Singletons.getView().getViewHome().getViewQuest().getPnlDuels().isVisible())) {
|
||||||
Singletons.getView().getViewHome().getViewQuest().showDuelsTab();
|
Singletons.getView().getViewHome().getViewQuest().showDuelsTab();
|
||||||
}
|
}
|
||||||
else if (Singletons.getView().getViewHome().getViewQuest().getPnlChallenges().isVisible()) {
|
else if (Singletons.getView().getViewHome().getViewQuest().getPnlChallenges().isVisible()) {
|
||||||
Singletons.getView().getViewHome().getViewQuest().showChallengesTab();
|
Singletons.getView().getViewHome().getViewQuest().showChallengesTab();
|
||||||
}
|
}
|
||||||
|
|
||||||
Singletons.getView().getViewHome().showQuestMenu();
|
Singletons.getView().getViewHome().showQuestMenu();*/
|
||||||
GuiUtils.closeOverlay();
|
GuiUtils.closeOverlay();
|
||||||
|
throw new NullPointerException("Fix me");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -421,30 +421,36 @@ public class DeckLister extends JPanel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void editDeck(final Deck d0) {
|
private void editDeck(final Deck d0) {
|
||||||
|
Singletons.getView().getOverlay().showOverlay();
|
||||||
|
|
||||||
switch (this.gametype) {
|
switch (this.gametype) {
|
||||||
case Quest:
|
case Quest:
|
||||||
Constant.Runtime.HUMAN_DECK[0] = d0;
|
Constant.Runtime.HUMAN_DECK[0] = d0;
|
||||||
final DeckEditorQuest editor = new DeckEditorQuest(AllZone.getQuestData());
|
final DeckEditorQuest editor = new DeckEditorQuest(AllZone.getQuestData());
|
||||||
editor.show(this.cmdEditorExit);
|
editor.show(this.cmdEditorExit);
|
||||||
editor.setVisible(true);
|
editor.setVisible(true);
|
||||||
|
editor.setAlwaysOnTop(true);
|
||||||
break;
|
break;
|
||||||
case Constructed:
|
case Constructed:
|
||||||
final DeckEditorConstructed cEditor = new DeckEditorConstructed();
|
final DeckEditorConstructed cEditor = new DeckEditorConstructed();
|
||||||
cEditor.show(this.cmdEditorExit);
|
cEditor.show(this.cmdEditorExit);
|
||||||
cEditor.getController().load(d0.getName());
|
cEditor.getController().load(d0.getName());
|
||||||
cEditor.setVisible(true);
|
cEditor.setVisible(true);
|
||||||
|
cEditor.setAlwaysOnTop(true);
|
||||||
break;
|
break;
|
||||||
case Sealed:
|
case Sealed:
|
||||||
final DeckEditorLimited sEditor = new DeckEditorLimited(Singletons.getModel().getDecks().getSealed());
|
final DeckEditorLimited sEditor = new DeckEditorLimited(Singletons.getModel().getDecks().getSealed());
|
||||||
sEditor.show(this.cmdEditorExit);
|
sEditor.show(this.cmdEditorExit);
|
||||||
sEditor.getController().load(d0.getName());
|
sEditor.getController().load(d0.getName());
|
||||||
sEditor.setVisible(true);
|
sEditor.setVisible(true);
|
||||||
|
sEditor.setAlwaysOnTop(true);
|
||||||
break;
|
break;
|
||||||
case Draft:
|
case Draft:
|
||||||
final DeckEditorLimited dEditor = new DeckEditorLimited(Singletons.getModel().getDecks().getDraft());
|
final DeckEditorLimited dEditor = new DeckEditorLimited(Singletons.getModel().getDecks().getDraft());
|
||||||
dEditor.show(this.cmdEditorExit);
|
dEditor.show(this.cmdEditorExit);
|
||||||
dEditor.getController().load(d0.getName());
|
dEditor.getController().load(d0.getName());
|
||||||
dEditor.setVisible(true);
|
dEditor.setVisible(true);
|
||||||
|
dEditor.setAlwaysOnTop(true);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@@ -470,7 +476,6 @@ public class DeckLister extends JPanel {
|
|||||||
} else if (this.gametype.equals(GameType.Quest)) {
|
} else if (this.gametype.equals(GameType.Quest)) {
|
||||||
AllZone.getQuestData().getMyDecks().delete(d0.getName());
|
AllZone.getQuestData().getMyDecks().delete(d0.getName());
|
||||||
AllZone.getQuestData().saveData();
|
AllZone.getQuestData().saveData();
|
||||||
Singletons.getView().getViewHome().getBtnQuest().grabFocus();
|
|
||||||
} else {
|
} else {
|
||||||
deckManager.getConstructed().delete(d0.getName());
|
deckManager.getConstructed().delete(d0.getName());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -316,6 +316,11 @@ public class FLabel extends JLabel {
|
|||||||
return this.resizeTimer;
|
return this.resizeTimer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @return {@link forge.Command} */
|
||||||
|
public Command getCommand() {
|
||||||
|
return this.cmdClick;
|
||||||
|
}
|
||||||
|
|
||||||
/** @return boolean */
|
/** @return boolean */
|
||||||
public boolean isSelected() {
|
public boolean isSelected() {
|
||||||
return selected;
|
return selected;
|
||||||
|
|||||||
@@ -18,9 +18,11 @@
|
|||||||
package forge.view.toolbox;
|
package forge.view.toolbox;
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
|
import java.awt.FlowLayout;
|
||||||
import java.awt.Graphics;
|
import java.awt.Graphics;
|
||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
import java.awt.Image;
|
import java.awt.Image;
|
||||||
|
import java.awt.LayoutManager;
|
||||||
import java.awt.RenderingHints;
|
import java.awt.RenderingHints;
|
||||||
import java.awt.event.MouseAdapter;
|
import java.awt.event.MouseAdapter;
|
||||||
import java.awt.event.MouseEvent;
|
import java.awt.event.MouseEvent;
|
||||||
@@ -67,9 +69,16 @@ public class FPanel extends JPanel {
|
|||||||
// Image aspect ratio (width / height)
|
// Image aspect ratio (width / height)
|
||||||
private double iar;
|
private double iar;
|
||||||
|
|
||||||
/** Core panel used in UI. See class javadoc for more details. */
|
/** */
|
||||||
public FPanel() {
|
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
|
// Opacity must be removed for proper rounded corner drawing
|
||||||
this.setOpaque(false);
|
this.setOpaque(false);
|
||||||
|
|||||||
@@ -720,8 +720,8 @@ public enum FSkin {
|
|||||||
final int aw = bimAvatars.getWidth();
|
final int aw = bimAvatars.getWidth();
|
||||||
final int ah = bimAvatars.getHeight();
|
final int ah = bimAvatars.getHeight();
|
||||||
|
|
||||||
for (int j = 0; j < aw; j += 100) {
|
for (int j = 0; j < ah; j += 100) {
|
||||||
for (int i = 0; i < ah; i += 100) {
|
for (int i = 0; i < aw; i += 100) {
|
||||||
if (i == 0 && j == 0) { continue; }
|
if (i == 0 && j == 0) { continue; }
|
||||||
pxTest = FSkin.getColorFromPixel(bimAvatars.getRGB(i + 50, j + 50));
|
pxTest = FSkin.getColorFromPixel(bimAvatars.getRGB(i + 50, j + 50));
|
||||||
if (pxTest.getAlpha() == 0) { continue; }
|
if (pxTest.getAlpha() == 0) { continue; }
|
||||||
|
|||||||
Reference in New Issue
Block a user