From 2597fe350b452cf46bfa0ecdfecb995e3a9f3313 Mon Sep 17 00:00:00 2001 From: Doublestrike Date: Sat, 25 Feb 2012 06:18:59 +0000 Subject: [PATCH] Continued work on home screen rebuild. --- .gitattributes | 7 + res/skins/default/sprite_icons.png | Bin 562647 -> 568669 bytes .../constructed/SubmenuConstructedUtil.java | 9 +- .../gui/home/quest/CSubmenuChallenges.java | 81 ++++ .../forge/gui/home/quest/CSubmenuDuels.java | 47 +- .../gui/home/quest/CSubmenuQuestData.java | 179 ++++++++ .../gui/home/quest/CSubmenuQuestPrefs.java | 165 +++++++ .../gui/home/quest/SubmenuQuestUtil.java | 295 ++++++++++++ .../gui/home/quest/VSubmenuChallenges.java | 68 +++ .../forge/gui/home/quest/VSubmenuDuels.java | 135 ++++-- .../gui/home/quest/VSubmenuQuestData.java | 178 ++++++++ .../gui/home/quest/VSubmenuQuestPrefs.java | 420 ++++++++++++++++++ src/main/java/forge/view/toolbox/FSkin.java | 3 +- 13 files changed, 1519 insertions(+), 68 deletions(-) create mode 100644 src/main/java/forge/gui/home/quest/CSubmenuChallenges.java create mode 100644 src/main/java/forge/gui/home/quest/CSubmenuQuestData.java create mode 100644 src/main/java/forge/gui/home/quest/CSubmenuQuestPrefs.java create mode 100644 src/main/java/forge/gui/home/quest/SubmenuQuestUtil.java create mode 100644 src/main/java/forge/gui/home/quest/VSubmenuChallenges.java create mode 100644 src/main/java/forge/gui/home/quest/VSubmenuQuestData.java create mode 100644 src/main/java/forge/gui/home/quest/VSubmenuQuestPrefs.java diff --git a/.gitattributes b/.gitattributes index 88d48815517..1651b5886cc 100644 --- a/.gitattributes +++ b/.gitattributes @@ -11351,8 +11351,15 @@ src/main/java/forge/gui/home/draft/VSubmenuDraft.java -text src/main/java/forge/gui/home/draft/VSubmenuSealed.java -text src/main/java/forge/gui/home/draft/package-info.java svneol=native#text/plain src/main/java/forge/gui/home/package-info.java svneol=native#text/plain +src/main/java/forge/gui/home/quest/CSubmenuChallenges.java -text 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/CSubmenuQuestPrefs.java -text +src/main/java/forge/gui/home/quest/SubmenuQuestUtil.java -text +src/main/java/forge/gui/home/quest/VSubmenuChallenges.java -text src/main/java/forge/gui/home/quest/VSubmenuDuels.java -text +src/main/java/forge/gui/home/quest/VSubmenuQuestData.java -text +src/main/java/forge/gui/home/quest/VSubmenuQuestPrefs.java -text src/main/java/forge/gui/home/quest/package-info.java svneol=native#text/plain src/main/java/forge/gui/home/settings/CSubmenuAvatars.java -text src/main/java/forge/gui/home/settings/CSubmenuPreferences.java -text diff --git a/res/skins/default/sprite_icons.png b/res/skins/default/sprite_icons.png index 609d1f0078acc688ae3bd15f2c6f151081581f99..27c68b0f6a0caa69bb65e468cecc1c2b9951cba4 100644 GIT binary patch delta 42820 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%0Ddp$kU6cPpK`j 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 */ public static void startGame(final List lists0) { - final Deck deckHuman = generateDeck(lists0.get(0), PlayerType.HUMAN); - final Deck deckAI = generateDeck(lists0.get(1), PlayerType.COMPUTER); - final FOverlay overlay = Singletons.getView().getOverlay(); overlay.setLayout(new MigLayout("insets 0, gap 0, align center")); @@ -355,7 +352,9 @@ public class SubmenuConstructedUtil { overlay.add(pnl, "h 300px!, w 400px!"); overlay.showOverlay(); - GameNew.newGame(deckHuman, deckAI); + GameNew.newGame( + generateDeck(lists0.get(0), PlayerType.HUMAN), + generateDeck(lists0.get(1), PlayerType.COMPUTER)); overlay.hideOverlay(); } diff --git a/src/main/java/forge/gui/home/quest/CSubmenuChallenges.java b/src/main/java/forge/gui/home/quest/CSubmenuChallenges.java new file mode 100644 index 00000000000..50a02be9e0e --- /dev/null +++ b/src/main/java/forge/gui/home/quest/CSubmenuChallenges.java @@ -0,0 +1,81 @@ +package forge.gui.home.quest; + +import java.awt.Color; +import java.util.List; + +import javax.swing.SwingConstants; +import javax.swing.border.EmptyBorder; + +import forge.AllZone; +import forge.Command; +import forge.Singletons; +import forge.gui.home.ICSubmenu; +import forge.gui.home.quest.SubmenuQuestUtil.SelectablePanel; +import forge.quest.data.QuestChallenge; +import forge.view.toolbox.FLabel; + +/** + * TODO: Write javadoc for this type. + * + */ +public enum CSubmenuChallenges 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() { + /// TEMPORARY + VSubmenuDuels.SINGLETON_INSTANCE.populate(); + CSubmenuDuels.SINGLETON_INSTANCE.update(); + ///////////// + + VSubmenuChallenges.SINGLETON_INSTANCE.populate(); + CSubmenuChallenges.SINGLETON_INSTANCE.update(); + } + + /* (non-Javadoc) + * @see forge.control.home.IControlSubmenu#update() + */ + @Override + public void update() { + SubmenuQuestUtil.updateStatsAndPet(); + + final VSubmenuChallenges view = VSubmenuChallenges.SINGLETON_INSTANCE; + VSubmenuDuels.SINGLETON_INSTANCE.getBtnStart().setEnabled(false); + + if (AllZone.getQuestData() != null) { + VSubmenuDuels.SINGLETON_INSTANCE.getLblTitle().setText("Challenges: " + AllZone.getQuestData().getRank()); + + view.getPnlChallenges().removeAll(); + final List 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(VSubmenuDuels.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"); + } + } + } +} diff --git a/src/main/java/forge/gui/home/quest/CSubmenuDuels.java b/src/main/java/forge/gui/home/quest/CSubmenuDuels.java index bdc3e16ee72..34da4fc6870 100644 --- a/src/main/java/forge/gui/home/quest/CSubmenuDuels.java +++ b/src/main/java/forge/gui/home/quest/CSubmenuDuels.java @@ -1,16 +1,15 @@ package forge.gui.home.quest; -import java.io.File; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.List; import forge.AllZone; import forge.Command; import forge.Singletons; import forge.gui.home.ICSubmenu; -import forge.properties.ForgeProps; -import forge.properties.NewConstants; -import forge.quest.data.QuestData; -import forge.quest.data.QuestDataIO; -import forge.quest.data.QuestPreferences.QPref; +import forge.gui.home.quest.SubmenuQuestUtil.SelectablePanel; +import forge.quest.data.QuestDuel; /** * TODO: Write javadoc for this type. @@ -31,10 +30,23 @@ public enum CSubmenuDuels implements ICSubmenu { /* (non-Javadoc) * @see forge.control.home.IControlSubmenu#initialize() */ + @SuppressWarnings("serial") @Override public void initialize() { VSubmenuDuels.SINGLETON_INSTANCE.populate(); CSubmenuDuels.SINGLETON_INSTANCE.update(); + + VSubmenuDuels.SINGLETON_INSTANCE.getBtnSpellShop().setCommand( + new Command() { @Override + public void execute() { SubmenuQuestUtil.showSpellShop(); } }); + + VSubmenuDuels.SINGLETON_INSTANCE.getBtnSpellShop().setCommand( + new Command() { @Override + public void execute() { SubmenuQuestUtil.showBazaar(); } }); + + VSubmenuDuels.SINGLETON_INSTANCE.getBtnStart().addActionListener( + new ActionListener() { @Override + public void actionPerformed(final ActionEvent e) { SubmenuQuestUtil.startGame(); } }); } /* (non-Javadoc) @@ -42,16 +54,21 @@ public enum CSubmenuDuels implements ICSubmenu { */ @Override public void update() { - QuestData qData = AllZone.getQuestData(); - if (qData == null) { - final String questname = Singletons.getModel() - .getQuestPreferences().getPreference(QPref.CURRENT_QUEST); + SubmenuQuestUtil.updateStatsAndPet(); - qData = QuestDataIO.loadData(new File( - ForgeProps.getFile(NewConstants.Quest.DATA_DIR) + questname + ".dat")); - System.out.println("asdf current quest data and credits: " + questname + " " + qData.getCredits()); + final VSubmenuDuels view = VSubmenuDuels.SINGLETON_INSTANCE; + + if (AllZone.getQuestData() != null) { + view.getLblTitle().setText("Duels: " + AllZone.getQuestData().getRank()); + + view.getPnlDuels().removeAll(); + final List duels = + Singletons.getModel().getQuestEventManager().generateDuels(); + + for (final QuestDuel d : duels) { + final SelectablePanel temp = new SelectablePanel(d); + view.getPnlDuels().add(temp, "w 96%!, h 86px!, gap 2% 0 5px 5px"); + } } - - //lblTitle.setText("Duels: " + control.getRankString()); } } diff --git a/src/main/java/forge/gui/home/quest/CSubmenuQuestData.java b/src/main/java/forge/gui/home/quest/CSubmenuQuestData.java new file mode 100644 index 00000000000..c0ce07ff03c --- /dev/null +++ b/src/main/java/forge/gui/home/quest/CSubmenuQuestData.java @@ -0,0 +1,179 @@ +package forge.gui.home.quest; + +import java.io.File; +import java.io.FilenameFilter; +import java.util.HashMap; +import java.util.Map; + +import javax.swing.JOptionPane; + +import forge.AllZone; +import forge.Command; +import forge.Singletons; +import forge.gui.GuiUtils; +import forge.gui.home.ICSubmenu; +import forge.properties.ForgeProps; +import forge.properties.NewConstants; +import forge.quest.data.QuestData; +import forge.quest.data.QuestDataIO; +import forge.quest.data.QuestPreferences.QPref; + +/** + * TODO: Write javadoc for this type. + * + */ +public enum CSubmenuQuestData implements ICSubmenu { + /** */ + SINGLETON_INSTANCE; + + private final Map arrQuests = new HashMap(); + + /* (non-Javadoc) + * @see forge.control.home.IControlSubmenu#update() + */ + @SuppressWarnings("serial") + @Override + public void initialize() { + VSubmenuQuestData.SINGLETON_INSTANCE.populate(); + CSubmenuQuestData.SINGLETON_INSTANCE.update(); + + VSubmenuQuestData.SINGLETON_INSTANCE.getBtnEmbark().setCommand( + new Command() { @Override public void execute() { newQuest(); } }); + } + + /* (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() { + refreshQuests(); + } + + /** + * The actuator for new quests. + */ + private void newQuest() { + final VSubmenuQuestData view = VSubmenuQuestData.SINGLETON_INSTANCE; + int difficulty = 0; + QuestData newdata = new QuestData(); + + final String mode = view.getRadFantasy().isSelected() + ? forge.quest.data.QuestData.FANTASY + : forge.quest.data.QuestData.CLASSIC; + + if (view.getRadEasy().isSelected()) { + difficulty = 0; + } else if (view.getRadMedium().isSelected()) { + difficulty = 1; + } else if (view.getRadHard().isSelected()) { + difficulty = 2; + } else if (view.getRadExpert().isSelected()) { + difficulty = 3; + } else { + throw new IllegalStateException( + "ControlQuest() > newQuest(): Error starting new quest!"); + } + + final Object o = JOptionPane.showInputDialog(null, "Poets will remember your quest as:", "Quest Name", JOptionPane.OK_CANCEL_OPTION); + + if (o == null) { return; } + + final String questName = GuiUtils.cleanString(o.toString()); + + if (getAllQuests().get(questName) != null || questName.equals("")) { + JOptionPane.showMessageDialog(null, "Please pick another quest name, a quest already has that name."); + return; + } + + // Give the user a few cards to build a deck + newdata.newGame(difficulty, mode, view.getCbStandardStart().isSelected()); + newdata.setName(questName); + newdata.saveData(); + + // Save in preferences. + Singletons.getModel().getQuestPreferences().setPreference(QPref.CURRENT_QUEST, questName + ".dat"); + Singletons.getModel().getQuestPreferences().save(); + + Singletons.getView().getViewHome().resetQuest(); + } // New Quest + + /** Changes between quest data files. */ + private void changeQuest() { + AllZone.setQuestData(VSubmenuQuestData.SINGLETON_INSTANCE + .getLstQuests().getSelectedQuest()); + + // Save in preferences. + Singletons.getModel().getQuestPreferences().setPreference(QPref.CURRENT_QUEST, + AllZone.getQuestData().getName() + ".dat"); + Singletons.getModel().getQuestPreferences().save(); + + //refreshDecks(); + //refreshStats(); + } + + /** Resets quests, then retrieves and sets current quest. */ + public void refreshQuests() { + final VSubmenuQuestData view = VSubmenuQuestData.SINGLETON_INSTANCE; + File dirQuests = ForgeProps.getFile(NewConstants.Quest.DATA_DIR); + + // 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.clear(); + 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 = Singletons.getModel().getQuestPreferences() + .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); + } + } + + /** @return */ + private Map getAllQuests() { + return arrQuests; + } +} diff --git a/src/main/java/forge/gui/home/quest/CSubmenuQuestPrefs.java b/src/main/java/forge/gui/home/quest/CSubmenuQuestPrefs.java new file mode 100644 index 00000000000..74cc46413b7 --- /dev/null +++ b/src/main/java/forge/gui/home/quest/CSubmenuQuestPrefs.java @@ -0,0 +1,165 @@ +package forge.gui.home.quest; + +import forge.Command; +import forge.Singletons; +import forge.gui.home.ICSubmenu; +import forge.gui.home.quest.VSubmenuQuestPrefs.PrefInput; +import forge.quest.data.QuestPreferences; +import forge.quest.data.QuestPreferences.QPref; + +/** + * TODO: Write javadoc for this type. + * + */ +public enum CSubmenuQuestPrefs implements ICSubmenu { + /** */ + SINGLETON_INSTANCE; + + /* (non-Javadoc) + * @see forge.control.home.IControlSubmenu#update() + */ + @Override + public void initialize() { + VSubmenuQuestPrefs.SINGLETON_INSTANCE.populate(); + CSubmenuQuestPrefs.SINGLETON_INSTANCE.update(); + } + + /* (non-Javadoc) + * @see forge.control.home.IControlSubmenu#getCommand() + */ + @Override + public Command getMenuCommand() { + return null; + } + + /* (non-Javadoc) + * @see forge.control.home.IControlSubmenu#update() + */ + @Override + public void update() { + + } + + /** + * Checks validity of values entered into prefInputs. + * @param i0   a PrefInput object + */ + public static void validateAndSave(PrefInput i0) { + if (i0.getText().equals(i0.getPreviousText())) { return; } + final QuestPreferences prefs = Singletons.getModel().getQuestPreferences(); + int temp1, temp2; + + int val = Integer.parseInt(i0.getText()); + resetErrors(); + + switch (i0.getQPref()) { + case STARTING_CREDITS_EASY: case STARTING_CREDITS_MEDIUM: + case STARTING_CREDITS_HARD: case STARTING_CREDITS_EXPERT: + case REWARDS_MILLED: case REWARDS_MULLIGAN0: + case REWARDS_ALTERNATIVE: case REWARDS_TURN5: + if (val > 500) { + showError(i0, "Value too large (maximum 500)."); + return; + } + break; + case BOOSTER_COMMONS: + temp1 = prefs.getPreferenceInt(QPref.BOOSTER_UNCOMMONS); + temp2 = prefs.getPreferenceInt(QPref.BOOSTER_RARES); + + if (temp1 + temp2 + val > 15) { + showError(i0, "Booster packs must have maximum 15 cards."); + return; + } + break; + case BOOSTER_UNCOMMONS: + temp1 = prefs.getPreferenceInt(QPref.BOOSTER_COMMONS); + temp2 = prefs.getPreferenceInt(QPref.BOOSTER_RARES); + + if (temp1 + temp2 + val > 15) { + showError(i0, "Booster packs must have maximum 15 cards."); + return; + } + break; + case BOOSTER_RARES: + temp1 = prefs.getPreferenceInt(QPref.BOOSTER_COMMONS); + temp2 = prefs.getPreferenceInt(QPref.BOOSTER_UNCOMMONS); + + if (temp1 + temp2 + val > 15) { + showError(i0, "Booster packs must have maximum 15 cards."); + return; + } + break; + case REWARDS_TURN1: + if (val > 2000) { + showError(i0, "Value too large (maximum 2000)."); + return; + } + break; + case SHOP_STARTING_PACKS: + case SHOP_SINGLES_COMMON: case SHOP_SINGLES_UNCOMMON: case SHOP_SINGLES_RARE: + if (val < 0) { + showError(i0, "Value too small (minimum 0)."); + return; + } else if (val > 15) { + showError(i0, "Value too large (maximum 15)."); + return; + } + break; + case SHOP_WINS_FOR_ADDITIONAL_PACK: case SHOP_MAX_PACKS: + if (val < 1) { + showError(i0, "Value too small (minimum 1)."); + return; + } else if (val > 25) { + showError(i0, "Value too large (maximum 25)."); + return; + } + break; + default: + if (val > 100) { + showError(i0, "Value too large (maximum 100)."); + return; + } + break; + } + + prefs.setPreference(i0.getQPref(), i0.getText()); + prefs.save(); + i0.setPreviousText(i0.getText()); + } + + private static void showError(PrefInput i0, String s0) { + final VSubmenuQuestPrefs view = VSubmenuQuestPrefs.SINGLETON_INSTANCE; + String s = "Save failed: " + s0; + switch(i0.getErrType()) { + case BOOSTER: + view.getLblErrBooster().setVisible(true); + view.getLblErrBooster().setText(s); + break; + case DIFFICULTY: + view.getLblErrDifficulty().setVisible(true); + view.getLblErrDifficulty().setText(s); + break; + case REWARDS: + view.getLblErrRewards().setVisible(true); + view.getLblErrRewards().setText(s); + break; + case SHOP: + view.getLblErrShop().setVisible(true); + view.getLblErrShop().setText(s); + break; + default: + } + + i0.setText(i0.getPreviousText()); + } + + /** */ + public static void resetErrors() { + final VSubmenuQuestPrefs view = VSubmenuQuestPrefs.SINGLETON_INSTANCE; + + view.getLblErrBooster().setVisible(false); + view.getLblErrDifficulty().setVisible(false); + view.getLblErrRewards().setVisible(false); + view.getLblErrShop().setVisible(false); + } +} diff --git a/src/main/java/forge/gui/home/quest/SubmenuQuestUtil.java b/src/main/java/forge/gui/home/quest/SubmenuQuestUtil.java new file mode 100644 index 00000000000..7386c92abc2 --- /dev/null +++ b/src/main/java/forge/gui/home/quest/SubmenuQuestUtil.java @@ -0,0 +1,295 @@ +package forge.gui.home.quest; + +import java.io.File; +import java.util.Set; + +import javax.swing.ImageIcon; + +import net.miginfocom.swing.MigLayout; +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.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.QuestPreferences.QPref; +import forge.quest.data.QuestUtil; +import forge.quest.data.item.QuestItemZeppelin; +import forge.quest.data.pet.QuestPetAbstract; +import forge.view.toolbox.FLabel; +import forge.view.toolbox.FOverlay; +import forge.view.toolbox.FPanel; +import forge.view.toolbox.FSkin; +import forge.view.toolbox.FTextArea; + +/** + * Utilities for the quest submenu, all over the MVC spectrum. + * If a piece of code can be reused, it's dumped here. + */ +public class SubmenuQuestUtil { + private static SelectablePanel selectedOpponent; + private static Deck currentDeck; + + /** + *

+ * nextChallengeInWins. + *

+ * + * @return a int. + */ + public static int nextChallengeInWins() { + final QuestData qData = AllZone.getQuestData(); + 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 = (qData.getWin() < 20 + ? 20 - qData.getWin() + : (challengesPlayed * mul) - qData.getWin()); + + return (delta > 0) ? delta : 0; + } + + /** Updates stats, pets panels for both duels and challenges. */ + public static void updateStatsAndPet() { + final QuestData qData; + final VSubmenuDuels view = VSubmenuDuels.SINGLETON_INSTANCE; + + ////////// TODO - THIS SHOULD NOT BE HERE AND WILL BE MOVED EVENTUALLY. + if (AllZone.getQuestData() == null) { + final String questname = Singletons.getModel() + .getQuestPreferences().getPreference(QPref.CURRENT_QUEST); + + qData = QuestDataIO.loadData(new File( + ForgeProps.getFile(NewConstants.Quest.DATA_DIR) + questname + ".dat")); + AllZone.setQuestData(qData); + } + 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(); + 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 (qData.getMode().equals(QuestData.FANTASY)) { + final Set 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 { + view.getCbxPet().setVisible(false); + view.getCbPlant().setVisible(false); + view.getCbZep().setVisible(false); + } + } + + /** Selectable panels for duels and challenges. */ + @SuppressWarnings("serial") + public static class SelectablePanel extends FPanel { + private final QuestEvent event; + + /** @param e0   QuestEvent */ + public SelectablePanel(final 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); } + else { VSubmenuDuels.SINGLETON_INSTANCE.getBtnStart().setEnabled(true); } + + selectedOpponent = SubmenuQuestUtil.SelectablePanel.this; + } + }); + + // Icon + final File base = ForgeProps.getFile(NewConstants.IMAGE_ICON); + final 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.setText(event.getDescription()); + tarDesc.setFont(FSkin.getItalicFont(12)); + this.add(tarDesc, "w 80%!, h 30px!"); + } + + /** @return QuestEvent */ + public QuestEvent getEvent() { + 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); + AllZone.setQuestEvent(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(); + } +} diff --git a/src/main/java/forge/gui/home/quest/VSubmenuChallenges.java b/src/main/java/forge/gui/home/quest/VSubmenuChallenges.java new file mode 100644 index 00000000000..20d3692f150 --- /dev/null +++ b/src/main/java/forge/gui/home/quest/VSubmenuChallenges.java @@ -0,0 +1,68 @@ +package forge.gui.home.quest; + +import javax.swing.JPanel; +import javax.swing.JScrollPane; + +import net.miginfocom.swing.MigLayout; +import forge.gui.home.EMenuGroup; +import forge.gui.home.IVSubmenu; +import forge.view.toolbox.FPanel; +import forge.view.toolbox.FScrollPane; + +/** */ +public enum VSubmenuChallenges implements IVSubmenu { + /** */ + SINGLETON_INSTANCE; + + //========== INSTANTIATION + private final JPanel pnl = new JPanel(); + private final JPanel pnlChallenges = new JPanel(); + + /* (non-Javadoc) + * @see forge.view.home.IViewSubmenu#getPanel() + */ + @Override + public JPanel getPanel() { + return pnl; + } + + /* (non-Javadoc) + * @see forge.view.home.IViewSubmenu#getGroup() + */ + @Override + public EMenuGroup getGroup() { + return null; + } + + /* (non-Javadoc) + * @see forge.view.home.IViewSubmenu#populate() + */ + @Override + public void populate() { + // Note: "Challenges" submenu uses the instances of + // title, stats, and start panels from "Duels" submenu. + final FPanel pnlTitle = VSubmenuDuels.SINGLETON_INSTANCE.getPnlTitle(); + final JPanel pnlStats = VSubmenuDuels.SINGLETON_INSTANCE.getPnlStats(); + final JPanel pnlStart = VSubmenuDuels.SINGLETON_INSTANCE.getPnlStart(); + VSubmenuDuels.SINGLETON_INSTANCE.getBtnStart().setEnabled(false); + //// + + final FScrollPane scrChallenges = new FScrollPane(pnlChallenges, + JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); + scrChallenges.setBorder(null); + pnlChallenges.setOpaque(false); + pnlChallenges.setLayout(new MigLayout("insets 0, gap 0, wrap")); + + pnl.setOpaque(false); + pnl.setLayout(new MigLayout("insets 0, gap 0, wrap")); + pnl.add(pnlTitle, "w 94%!, h 30px!, gap 3% 0 15px 15px"); + pnl.add(pnlStats, "w 94%!, gap 3% 0 0 20px"); + pnl.add(scrChallenges, "w 94%!, pushy, growy, gap 3% 0 0 0"); + pnl.add(pnlStart, "w 94%, gap 3% 0 15px 5%"); + } + + /** @return {@link javax.swing.JPanel} */ + public JPanel getPnlChallenges() { + return pnlChallenges; + } +} diff --git a/src/main/java/forge/gui/home/quest/VSubmenuDuels.java b/src/main/java/forge/gui/home/quest/VSubmenuDuels.java index 2839c82fdb7..ba40c163e60 100644 --- a/src/main/java/forge/gui/home/quest/VSubmenuDuels.java +++ b/src/main/java/forge/gui/home/quest/VSubmenuDuels.java @@ -1,5 +1,7 @@ package forge.gui.home.quest; +import java.awt.Color; + import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; @@ -18,10 +20,7 @@ import forge.view.toolbox.FPanel; import forge.view.toolbox.FScrollPane; import forge.view.toolbox.FSkin; -/** - * TODO: Write javadoc for this type. - * - */ +/** */ public enum VSubmenuDuels implements IVSubmenu { /** */ SINGLETON_INSTANCE; @@ -29,28 +28,37 @@ public enum VSubmenuDuels implements IVSubmenu { //========== INSTANTIATION private final JPanel pnl = new JPanel(); private final JPanel pnlDuels = 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)).build(); + .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)).build(); + .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)).build(); + .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)).build(); - private final FLabel lblNextChallengeInWins = new FLabel.Builder() - .text("No challenges available.").build(); + .icon(FSkin.getIcon(FSkin.QuestIcons.ICO_MINUS)) + .fontScaleAuto(false).fontSize(15).build(); private final FLabel lblWinStreak = new FLabel.Builder() - .build(); + .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() - .opaque(true).hoverable(true).build(); + .fontScaleAuto(false).fontSize(15).opaque(true).hoverable(true).build(); private final FLabel btnBazaar = new FLabel.Builder() .selectable(true).opaque(true).hoverable(true).text("Bazaar") .fontScaleAuto(false).fontSize(14).tooltip("Peruse the Bazaar").build(); @@ -79,29 +87,60 @@ public enum VSubmenuDuels implements IVSubmenu { */ @Override public void populate() { - final FPanel pnlTitle = new FPanel(); pnlTitle.setLayout(new MigLayout("insets 0, gap 0")); pnlTitle.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2)); pnlTitle.add(lblTitle, "w 100%, h 100%, gap 0 0 0 0"); - final JPanel pnlStats = new JPanel(); - pnlStats.setOpaque(false); - populateStats(pnlStats); + populateStats(); + populateStart(); + btnStart.setEnabled(false); final FScrollPane scrDuels = new FScrollPane(pnlDuels, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); + scrDuels.setBorder(null); pnlDuels.setOpaque(false); pnlDuels.setLayout(new MigLayout("insets 0, gap 0, wrap")); pnl.setOpaque(false); pnl.setLayout(new MigLayout("insets 0, gap 0, wrap")); - pnl.add(pnlTitle, "w 94%!, h 30px!, gap 3% 0 20px 20px"); + pnl.add(pnlTitle, "w 94%!, h 30px!, gap 3% 0 15px 15px"); pnl.add(pnlStats, "w 94%!, gap 3% 0 0 20px"); - pnl.add(scrDuels, "w 94%!, h 50%!, gap 3% 0 0 10px"); - pnl.add(cbxPet, "ax center, gap 3% 0 5px 0"); - pnl.add(cbPlant, "ax center, gap 3% 0 5px 0"); - pnl.add(cbZep, "ax center, gap 3% 0 5px 0"); - pnl.add(btnStart, "ax center, gap 3% 0 5px 10px"); + pnl.add(scrDuels, "w 94%!, pushy, growy, gap 3% 0 0 0"); + pnl.add(pnlStart, "w 94%, gap 3% 0 15px 5%"); + } + + /** */ + public void setCurrentDeckStatus() { + final JLabel btnCurrentDeck = VSubmenuDuels.SINGLETON_INSTANCE.getBtnCurrentDeck(); + if (SubmenuQuestUtil.getCurrentDeck() == null) { + btnCurrentDeck.setBackground(Color.red.darker()); + btnCurrentDeck.setText(" Build, then select a deck in the \"Decks\" submenu. "); + } + else { + btnCurrentDeck.setBackground(FSkin.getColor(FSkin.Colors.CLR_INACTIVE)); + btnCurrentDeck.setText("Current deck: " + + SubmenuQuestUtil.getCurrentDeck().getName()); + } + } + + /** @return {@link javax.swing.JPanel} */ + public JPanel getPnlDuels() { + return pnlDuels; + } + + /** @return {@link javax.swing.JPanel} */ + public FPanel getPnlTitle() { + return pnlTitle; + } + + /** @return {@link javax.swing.JPanel} */ + public JPanel getPnlStats() { + return pnlStats; + } + + /** @return {@link javax.swing.JPanel} */ + public JPanel getPnlStart() { + return pnlStart; } /** @return {@link javax.swing.JLabel} */ @@ -173,31 +212,33 @@ public enum VSubmenuDuels implements IVSubmenu { return btnStart; } - /** Stats panel has different layout depending on classic/fantasy quest. */ - private void populateStats(final JPanel pnl0) { - pnl0.removeAll(); + 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(btnBazaar, constraints); + pnlStats.add(lblWins, constraints); + pnlStats.add(lblLosses, constraints); + pnlStats.add(lblLife, constraints + ", wrap"); - if (true) { //(AllZone.getQuestData().isFantasy()) { - pnl0.setLayout(new MigLayout("insets 0, gap 0")); - pnl0.add(btnBazaar, "w 15%!, h 70px!, gap 0 4% 10px 10px, span 1 2"); - pnl0.add(lblWins, "w 30%!, h 25px!, gap 0 2% 12px 0"); - pnl0.add(lblLosses, "w 30%!, h 25px!, gap 0 4% 12px 0"); - pnl0.add(btnSpellShop, "w 14.5%!, h 70px!, gap 0 0 10px 10px, span 1 2, wrap"); - pnl0.add(lblCredits, "w 30%!, h 25px!, gap 0 2% 0 0"); - pnl0.add(lblLife, "w 30%!, h 25px!, gap 0 4% 0 0 0, wrap"); - pnl0.add(lblWinStreak, "h 20px!, align center, span 4 1, wrap"); - pnl0.add(lblNextChallengeInWins, "h 20px!, align center, span 4 1, wrap"); - pnl0.add(btnCurrentDeck, "w 40%!, h 26px!, align center, span 4 1, gap 0 0 0 5px"); - } - else { - pnl0.setLayout(new MigLayout("insets 0, gap 0, align center")); - pnl0.add(lblWins, "w 150px!, h 25px!, gap 0 50px 5px 5px, align center"); - pnl0.add(lblCredits, "w 150px!, h 25px!, gap 0 0 5px 5px, align center, wrap"); - pnl0.add(lblLosses, "w 150px!, h 25px!, gap 0 50px 0 5px, align center"); - pnl0.add(btnSpellShop, "w 150px!, h 25px!, gap 0 0 0 5px, align center, wrap"); - pnl0.add(lblWinStreak, "h 20px!, align center, span 4 1, wrap"); - pnl0.add(lblNextChallengeInWins, "h 20px!, align center, span 4 1, gap 0 0 10px 5px, wrap"); - pnl0.add(btnCurrentDeck, "w 40%!, h 26px!, align center, span 4 1, gap 0 0 0 5px"); - } + 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(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); } } diff --git a/src/main/java/forge/gui/home/quest/VSubmenuQuestData.java b/src/main/java/forge/gui/home/quest/VSubmenuQuestData.java new file mode 100644 index 00000000000..8e61312bc6a --- /dev/null +++ b/src/main/java/forge/gui/home/quest/VSubmenuQuestData.java @@ -0,0 +1,178 @@ +package forge.gui.home.quest; + +import javax.swing.ButtonGroup; +import javax.swing.JCheckBox; +import javax.swing.JPanel; +import javax.swing.JRadioButton; +import javax.swing.SwingConstants; + +import net.miginfocom.swing.MigLayout; +import forge.gui.home.EMenuGroup; +import forge.gui.home.IVSubmenu; +import forge.view.home.QuestFileLister; +import forge.view.toolbox.FCheckBox; +import forge.view.toolbox.FLabel; +import forge.view.toolbox.FPanel; +import forge.view.toolbox.FRadioButton; +import forge.view.toolbox.FScrollPane; +import forge.view.toolbox.FSkin; + +/** + * Singleton instance of "Colors" submenu in "Constructed" group. + * + */ +public enum VSubmenuQuestData implements IVSubmenu { + /** */ + SINGLETON_INSTANCE; + + /** */ + private final JPanel pnl = new JPanel(); + private final JPanel pnlViewport = new JPanel(); + private final QuestFileLister lstQuests = new QuestFileLister(); + + private final JRadioButton radEasy = new FRadioButton("Easy"); + private final JRadioButton radMedium = new FRadioButton("Medium"); + private final JRadioButton radHard = new FRadioButton("Hard"); + private final JRadioButton radExpert = new FRadioButton("Expert"); + private final JRadioButton radFantasy = new FRadioButton("Fantasy"); + private final JRadioButton radClassic = new FRadioButton("Classic"); + + private final JCheckBox cbStandardStart = new FCheckBox("Standard (Type 2) Starting Pool"); + private final FLabel btnEmbark = new FLabel.Builder().opaque(true).hoverable(true).text("Embark!").build(); + + /* (non-Javadoc) + * @see forge.view.home.IViewSubmenu#populate() + */ + @Override + public void populate() { + pnl.removeAll(); + pnl.setOpaque(false); + pnl.setLayout(new MigLayout("insets 0, gap 0")); + + // Load quest + final FPanel pnlTitleLoad = new FPanel(); + pnlTitleLoad.setLayout(new MigLayout("insets 0, align center")); + pnlTitleLoad.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2)); + pnlTitleLoad.add(new FLabel.Builder().text("Load a previous Quest") + .fontScaleAuto(false).fontSize(16).build(), "h 95%!, gap 0 0 2.5% 0"); + + final FScrollPane scr = new FScrollPane(lstQuests); + scr.setBorder(null); + scr.getViewport().setBorder(null); + + // New quest + final FPanel pnlTitleNew = new FPanel(); + pnlTitleNew.setLayout(new MigLayout("insets 0, align center")); + pnlTitleNew.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2)); + pnlTitleNew.add(new FLabel.Builder().text("Start a new Quest") + .fontScaleAuto(false).fontSize(16).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 pnlOptions = new JPanel(); + pnlOptions.setOpaque(false); + pnlOptions.setLayout(new MigLayout("insets 0, gap 0")); + + final String constraints = "w 40%!, h 30px!"; + pnlOptions.add(radEasy, constraints + ", gap 7.5% 2.5% 0 0"); + pnlOptions.add(radFantasy, constraints + ", wrap"); + pnlOptions.add(radMedium, constraints + ", gap 7.5% 2.5% 0 0"); + pnlOptions.add(radClassic, constraints + ", wrap"); + pnlOptions.add(radHard, constraints + ", gap 7.5% 2.5% 0 0"); + pnlOptions.add(cbStandardStart, constraints + ", wrap"); + pnlOptions.add(radExpert, constraints + ", gap 7.5% 2.5% 0 0, wrap"); + + pnlOptions.add(btnEmbark, "w 40%!, h 30px!, gap 30% 0 20px 0, span 3 1"); + + // Final layout + pnlViewport.removeAll(); + pnlViewport.setOpaque(false); + pnlViewport.setLayout(new MigLayout("insets 0, gap 0, wrap")); + + pnlViewport.add(pnlTitleLoad, "w 96%, h 36px!, gap 2% 0 20px 10px"); + + pnlViewport.add(new FLabel.Builder().text("Old quest data? Put into " + + "res/quest/data, and restart Forge.") + .fontAlign(SwingConstants.CENTER).fontScaleAuto(false).fontSize(12) + .build(), "w 96%!, h 18px!, gap 2% 0 0 4px"); + + pnlViewport.add(scr, "w 96%!, pushy, growy, gap 2% 0 0 30px"); + + pnlViewport.add(pnlTitleNew, "w 96%, h 36px!, gap 2% 0 0 10px"); + pnlViewport.add(pnlOptions, "w 96%!, h 200px!, gap 2% 0 0 20px"); + + pnl.add(new FScrollPane(pnlViewport), "w 100%!, h 100%!"); + } + + /* (non-Javadoc) + * @see forge.view.home.IViewSubmenu#getGroup() + */ + @Override + public EMenuGroup getGroup() { + return null; + } + + /* (non-Javadoc) + * @see forge.view.home.IViewSubmenu#getPanel() + */ + @Override + public JPanel getPanel() { + return pnl; + } + + /** @return {@link forge.view.home.QuestFileLister} */ + public QuestFileLister getLstQuests() { + return this.lstQuests; + } + + /** @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 forge.view.toolbox.FLabel} */ + public FLabel getBtnEmbark() { + return btnEmbark; + } +} diff --git a/src/main/java/forge/gui/home/quest/VSubmenuQuestPrefs.java b/src/main/java/forge/gui/home/quest/VSubmenuQuestPrefs.java new file mode 100644 index 00000000000..dde9eca82cd --- /dev/null +++ b/src/main/java/forge/gui/home/quest/VSubmenuQuestPrefs.java @@ -0,0 +1,420 @@ +package forge.gui.home.quest; + +import java.awt.Color; +import java.awt.Font; +import java.awt.event.FocusAdapter; +import java.awt.event.FocusEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextField; +import javax.swing.SwingConstants; + +import net.miginfocom.swing.MigLayout; +import forge.Singletons; +import forge.gui.home.EMenuGroup; +import forge.gui.home.IVSubmenu; +import forge.quest.data.QuestPreferences; +import forge.quest.data.QuestPreferences.QPref; +import forge.view.toolbox.FLabel; +import forge.view.toolbox.FPanel; +import forge.view.toolbox.FScrollPane; +import forge.view.toolbox.FSkin; + +/** + * Singleton instance of "Colors" submenu in "Constructed" group. + * + */ +public enum VSubmenuQuestPrefs implements IVSubmenu { + /** */ + SINGLETON_INSTANCE; + + /** */ + private final JPanel pnl = new JPanel(); + private final JPanel pnlRewards = new JPanel(); + private final JPanel pnlDifficulty = new JPanel(); + private final JPanel pnlBooster = new JPanel(); + private final JPanel pnlShop = new JPanel(); + + private final FLabel lblErrRewards = new FLabel.Builder().text("Rewards Error").fontStyle(Font.BOLD).build(); + private final FLabel lblErrDifficulty = new FLabel.Builder().text("Difficulty Error").fontStyle(Font.BOLD).build(); + private final FLabel lblErrBooster = new FLabel.Builder().text("Booster Error").fontStyle(Font.BOLD).build(); + private final FLabel lblErrShop = new FLabel.Builder().text("Shop Error").fontStyle(Font.BOLD).build(); + + private final QuestPreferences prefs = Singletons.getModel().getQuestPreferences(); + + /** */ + public enum QuestPreferencesErrType { /** */ + REWARDS, /** */ + DIFFICULTY, /** */ + BOOSTER, /** */ + SHOP + } + + /* (non-Javadoc) + * @see forge.view.home.IViewSubmenu#populate() + */ + @Override + public void populate() { + final JPanel pnlContent = new JPanel(); + pnlContent.setOpaque(false); + pnlContent.setLayout(new MigLayout("insets 0, gap 0, wrap")); + + lblErrRewards.setForeground(Color.red); + lblErrDifficulty.setForeground(Color.red); + lblErrBooster.setForeground(Color.red); + lblErrShop.setForeground(Color.red); + + // Rewards panel + final FPanel pnlTitleRewards = new FPanel(); + pnlTitleRewards.setLayout(new MigLayout("insets 0, align center")); + pnlTitleRewards.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2)); + pnlTitleRewards.add(new FLabel.Builder().text("Rewards") + .icon(FSkin.getIcon(FSkin.QuestIcons.ICO_COIN)) + .fontScaleAuto(false).fontSize(16).build(), "h 95%!, gap 0 0 2.5% 0"); + + pnlContent.add(pnlTitleRewards, "w 96%!, h 36px!, gap 2% 0 10px 20px"); + pnlContent.add(pnlRewards, "w 96%!, gap 2% 0 10px 20px"); + populateRewards(); + + // Booster panel + final FPanel pnlTitleBooster = new FPanel(); + pnlTitleBooster.setLayout(new MigLayout("insets 0, align center")); + pnlTitleBooster.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2)); + pnlTitleBooster.add(new FLabel.Builder().text("Booster Pack Ratios") + .icon(FSkin.getIcon(FSkin.QuestIcons.ICO_BOOK)) + .fontScaleAuto(false).fontSize(16).build(), "h 95%!, gap 0 0 2.5% 0"); + pnlContent.add(pnlTitleBooster, "w 96%!, h 36px!, gap 2% 0 10px 10px"); + pnlContent.add(pnlBooster, "w 96%!, gap 2% 0 10px 20px"); + populateBooster(); + + // Difficulty table panel + final FPanel pnlTitleDifficulty = new FPanel(); + pnlTitleDifficulty.setLayout(new MigLayout("insets 0, align center")); + pnlTitleDifficulty.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2)); + pnlTitleDifficulty.add(new FLabel.Builder().text("Difficulty Adjustments") + .icon(FSkin.getIcon(FSkin.QuestIcons.ICO_NOTES)) + .fontScaleAuto(false).fontSize(16).build(), "h 95%!, gap 0 0 2.5% 0"); + pnlContent.add(pnlTitleDifficulty, "w 96%!, h 36px!, gap 2% 0 10px 10px"); + pnlContent.add(pnlDifficulty, "w 96%!, gap 2% 0 10px 20px"); + populateDifficulty(); + + // Shop panel + final FPanel pnlTitleShop = new FPanel(); + pnlTitleShop.setLayout(new MigLayout("insets 0, align center")); + pnlTitleShop.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2)); + pnlTitleShop.add(new FLabel.Builder().text("Shop Preferences") + .icon(FSkin.getIcon(FSkin.QuestIcons.ICO_COIN)) + .fontScaleAuto(false).fontSize(16).build(), "h 95%!, gap 0 0 2.5% 0"); + pnlContent.add(pnlTitleShop, "w 96%!, h 36px!, gap 2% 0 10px 10px"); + pnlContent.add(pnlShop, "w 96%!, gap 2% 0 10px 20px"); + populateShop(); + + final FScrollPane scrContent = new FScrollPane(pnlContent, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, + JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + scrContent.setBorder(null); + + pnl.removeAll(); + pnl.setOpaque(false); + pnl.setLayout(new MigLayout("insets 0, gap 0")); + pnl.add(scrContent, "w 100%!, growy, pushy, gap 0 0 10px 10px"); + + CSubmenuQuestPrefs.resetErrors(); + } + + /* (non-Javadoc) + * @see forge.view.home.IViewSubmenu#getGroup() + */ + @Override + public EMenuGroup getGroup() { + return EMenuGroup.QUEST; + } + + /* (non-Javadoc) + * @see forge.view.home.IViewSubmenu#getPanel() + */ + @Override + public JPanel getPanel() { + return pnl; + } + + /** @return {@link javax.swing.JLabel} */ + public JLabel getLblErrRewards() { + return lblErrRewards; + } + + /** @return {@link javax.swing.JLabel} */ + public JLabel getLblErrShop() { + return lblErrShop; + } + + /** @return {@link javax.swing.JLabel} */ + public JLabel getLblErrDifficulty() { + return lblErrDifficulty; + } + + /** @return {@link javax.swing.JLabel} */ + public JLabel getLblErrBooster() { + return lblErrBooster; + } + + private void populateRewards() { + pnlRewards.setOpaque(false); + pnlRewards.setLayout(new MigLayout("insets 0, gap 0, wrap 2, hidemode 3")); + pnlRewards.removeAll(); + pnlRewards.add(lblErrRewards, "w 100%!, h 30px!, span 2 1"); + + final String constraints1 = "w 60px, h 26px!"; + final String constraints2 = "w 150px!, h 26px!"; + + pnlRewards.add(new FLabel.Builder().text("Base winnings").build(), constraints2); + pnlRewards.add(new PrefInput(QPref.REWARDS_BASE, QuestPreferencesErrType.REWARDS), constraints1); + + pnlRewards.add(new FLabel.Builder().text("No losses").build(), constraints2); + pnlRewards.add(new PrefInput(QPref.REWARDS_UNDEFEATED, QuestPreferencesErrType.REWARDS), constraints1); + + pnlRewards.add(new FLabel.Builder().text("Poison win").build(), constraints2); + pnlRewards.add(new PrefInput(QPref.REWARDS_POISON, QuestPreferencesErrType.REWARDS), constraints1); + + pnlRewards.add(new FLabel.Builder().text("Milling win").build(), constraints2); + pnlRewards.add(new PrefInput(QPref.REWARDS_MILLED, QuestPreferencesErrType.REWARDS), constraints1); + + pnlRewards.add(new FLabel.Builder().text("Mulligan 0 win").build(), constraints2); + pnlRewards.add(new PrefInput(QPref.REWARDS_MULLIGAN0, QuestPreferencesErrType.REWARDS), constraints1); + + pnlRewards.add(new FLabel.Builder().text("Alternative win").build(), constraints2); + pnlRewards.add(new PrefInput(QPref.REWARDS_ALTERNATIVE, QuestPreferencesErrType.REWARDS), constraints1); + + pnlRewards.add(new FLabel.Builder().text("Win by turn 15").build(), constraints2); + pnlRewards.add(new PrefInput(QPref.REWARDS_TURN15, QuestPreferencesErrType.REWARDS), constraints1); + + pnlRewards.add(new FLabel.Builder().text("Win by turn 10").build(), constraints2); + pnlRewards.add(new PrefInput(QPref.REWARDS_TURN10, QuestPreferencesErrType.REWARDS), constraints1); + + pnlRewards.add(new FLabel.Builder().text("Win by turn 5").build(), constraints2); + pnlRewards.add(new PrefInput(QPref.REWARDS_TURN5, QuestPreferencesErrType.REWARDS), constraints1); + + pnlRewards.add(new FLabel.Builder().text("First turn win").build(), constraints2); + pnlRewards.add(new PrefInput(QPref.REWARDS_TURN1, QuestPreferencesErrType.REWARDS), constraints1); + } + + private void populateDifficulty() { + final String constraints1 = "w 60px!, h 26px!"; + final String constraints2 = "w 150px!, h 26px!"; + + pnlDifficulty.setOpaque(false); + pnlDifficulty.setLayout(new MigLayout("insets 0, gap 0, wrap 5, hidemode 3")); + pnlDifficulty.removeAll(); + pnlDifficulty.add(lblErrDifficulty, "w 100%!, h 30px!, span 5 1"); + + pnlDifficulty.add(new FLabel.Builder().text("").build(), constraints2); + pnlDifficulty.add(new FLabel.Builder().text("Easy").build(), constraints1); + pnlDifficulty.add(new FLabel.Builder().text("Medium").build(), constraints1); + pnlDifficulty.add(new FLabel.Builder().text("Hard").build(), constraints1); + pnlDifficulty.add(new FLabel.Builder().text("Expert").build(), constraints1); + + pnlDifficulty.add(new FLabel.Builder().text("Wins For Booster").build(), constraints2); + pnlDifficulty.add(new PrefInput(QPref.WINS_BOOSTER_EASY, QuestPreferencesErrType.DIFFICULTY), constraints1); + pnlDifficulty.add(new PrefInput(QPref.WINS_BOOSTER_MEDIUM, QuestPreferencesErrType.DIFFICULTY), constraints1); + pnlDifficulty.add(new PrefInput(QPref.WINS_BOOSTER_HARD, QuestPreferencesErrType.DIFFICULTY), constraints1); + pnlDifficulty.add(new PrefInput(QPref.WINS_BOOSTER_EXPERT, QuestPreferencesErrType.DIFFICULTY), constraints1); + + pnlDifficulty.add(new FLabel.Builder().text("Wins For Rank Increase").build(), constraints2); + pnlDifficulty.add(new PrefInput(QPref.WINS_RANKUP_EASY, QuestPreferencesErrType.DIFFICULTY), constraints1); + pnlDifficulty.add(new PrefInput(QPref.WINS_RANKUP_MEDIUM, QuestPreferencesErrType.DIFFICULTY), constraints1); + pnlDifficulty.add(new PrefInput(QPref.WINS_RANKUP_HARD, QuestPreferencesErrType.DIFFICULTY), constraints1); + pnlDifficulty.add(new PrefInput(QPref.WINS_RANKUP_EXPERT, QuestPreferencesErrType.DIFFICULTY), constraints1); + + pnlDifficulty.add(new FLabel.Builder().text("Wins For Medium AI").build(), constraints2); + pnlDifficulty.add(new PrefInput(QPref.WINS_MEDIUMAI_EASY, QuestPreferencesErrType.DIFFICULTY), constraints1); + pnlDifficulty.add(new PrefInput(QPref.WINS_MEDIUMAI_MEDIUM, QuestPreferencesErrType.DIFFICULTY), constraints1); + pnlDifficulty.add(new PrefInput(QPref.WINS_MEDIUMAI_HARD, QuestPreferencesErrType.DIFFICULTY), constraints1); + pnlDifficulty.add(new PrefInput(QPref.WINS_MEDIUMAI_EXPERT, QuestPreferencesErrType.DIFFICULTY), constraints1); + + pnlDifficulty.add(new FLabel.Builder().text("Wins For Hard AI").build(), constraints2); + pnlDifficulty.add(new PrefInput(QPref.WINS_HARDAI_EASY, QuestPreferencesErrType.DIFFICULTY), constraints1); + pnlDifficulty.add(new PrefInput(QPref.WINS_HARDAI_MEDIUM, QuestPreferencesErrType.DIFFICULTY), constraints1); + pnlDifficulty.add(new PrefInput(QPref.WINS_HARDAI_HARD, QuestPreferencesErrType.DIFFICULTY), constraints1); + pnlDifficulty.add(new PrefInput(QPref.WINS_HARDAI_EXPERT, QuestPreferencesErrType.DIFFICULTY), constraints1); + + pnlDifficulty.add(new FLabel.Builder().text("Wins For Expert AI").build(), constraints2); + pnlDifficulty.add(new PrefInput(QPref.WINS_EXPERTAI_EASY, QuestPreferencesErrType.DIFFICULTY), constraints1); + pnlDifficulty.add(new PrefInput(QPref.WINS_EXPERTAI_MEDIUM, QuestPreferencesErrType.DIFFICULTY), constraints1); + pnlDifficulty.add(new PrefInput(QPref.WINS_EXPERTAI_HARD, QuestPreferencesErrType.DIFFICULTY), constraints1); + pnlDifficulty.add(new PrefInput(QPref.WINS_EXPERTAI_EXPERT, QuestPreferencesErrType.DIFFICULTY), constraints1); + + pnlDifficulty.add(new FLabel.Builder().text("Starting commons").build(), constraints2); + pnlDifficulty.add(new PrefInput(QPref.STARTING_COMMONS_EASY, QuestPreferencesErrType.DIFFICULTY), constraints1); + pnlDifficulty.add(new PrefInput(QPref.STARTING_COMMONS_MEDIUM, QuestPreferencesErrType.DIFFICULTY), constraints1); + pnlDifficulty.add(new PrefInput(QPref.STARTING_COMMONS_HARD, QuestPreferencesErrType.DIFFICULTY), constraints1); + pnlDifficulty.add(new PrefInput(QPref.STARTING_COMMONS_EXPERT, QuestPreferencesErrType.DIFFICULTY), constraints1); + + pnlDifficulty.add(new FLabel.Builder().text("Starting uncommons").build(), constraints2); + pnlDifficulty.add(new PrefInput(QPref.STARTING_UNCOMMONS_EASY, QuestPreferencesErrType.DIFFICULTY), constraints1); + pnlDifficulty.add(new PrefInput(QPref.STARTING_UNCOMMONS_MEDIUM, QuestPreferencesErrType.DIFFICULTY), constraints1); + pnlDifficulty.add(new PrefInput(QPref.STARTING_UNCOMMONS_HARD, QuestPreferencesErrType.DIFFICULTY), constraints1); + pnlDifficulty.add(new PrefInput(QPref.STARTING_UNCOMMONS_EXPERT, QuestPreferencesErrType.DIFFICULTY), constraints1); + + pnlDifficulty.add(new FLabel.Builder().text("Starting rares").build(), constraints2); + pnlDifficulty.add(new PrefInput(QPref.STARTING_RARES_EASY, QuestPreferencesErrType.DIFFICULTY), constraints1); + pnlDifficulty.add(new PrefInput(QPref.STARTING_RARES_MEDIUM, QuestPreferencesErrType.DIFFICULTY), constraints1); + pnlDifficulty.add(new PrefInput(QPref.STARTING_RARES_HARD, QuestPreferencesErrType.DIFFICULTY), constraints1); + pnlDifficulty.add(new PrefInput(QPref.STARTING_RARES_EXPERT, QuestPreferencesErrType.DIFFICULTY), constraints1); + + pnlDifficulty.add(new FLabel.Builder().text("Starting credits").build(), constraints2); + pnlDifficulty.add(new PrefInput(QPref.STARTING_CREDITS_EASY, QuestPreferencesErrType.DIFFICULTY), constraints1); + pnlDifficulty.add(new PrefInput(QPref.STARTING_CREDITS_MEDIUM, QuestPreferencesErrType.DIFFICULTY), constraints1); + pnlDifficulty.add(new PrefInput(QPref.STARTING_CREDITS_HARD, QuestPreferencesErrType.DIFFICULTY), constraints1); + pnlDifficulty.add(new PrefInput(QPref.STARTING_CREDITS_EXPERT, QuestPreferencesErrType.DIFFICULTY), constraints1); + + pnlDifficulty.add(new FLabel.Builder().text("Starting basic lands").build(), constraints2); + pnlDifficulty.add(new PrefInput(QPref.STARTING_BASIC_LANDS, QuestPreferencesErrType.DIFFICULTY), constraints1 + ", wrap"); + + pnlDifficulty.add(new FLabel.Builder().text("Starting snow lands").build(), constraints2); + pnlDifficulty.add(new PrefInput(QPref.STARTING_SNOW_LANDS, QuestPreferencesErrType.DIFFICULTY), constraints1 + ", wrap"); + + pnlDifficulty.add(new FLabel.Builder().text("Penalty for loss").build(), constraints2); + pnlDifficulty.add(new PrefInput(QPref.PENALTY_LOSS, QuestPreferencesErrType.DIFFICULTY), constraints1 + ", wrap"); + } + + private void populateBooster() { + final String constraints1 = "w 60px!, h 26px!"; + final String constraints2 = "w 150px!, h 26px!"; + + pnlBooster.setOpaque(false); + pnlBooster.setLayout(new MigLayout("insets 0, gap 0, wrap 2, hidemode 3")); + pnlBooster.removeAll(); + pnlBooster.add(lblErrBooster, "w 100%!, h 30px!, span 2 1"); + + pnlBooster.add(new FLabel.Builder().text("Common").build(), constraints2); + pnlBooster.add(new PrefInput(QPref.BOOSTER_COMMONS, QuestPreferencesErrType.BOOSTER), constraints1); + + pnlBooster.add(new FLabel.Builder().text("Uncommon").build(), constraints2); + pnlBooster.add(new PrefInput(QPref.BOOSTER_UNCOMMONS, QuestPreferencesErrType.BOOSTER), constraints1); + + pnlBooster.add(new FLabel.Builder().text("Rare").build(), constraints2); + pnlBooster.add(new PrefInput(QPref.BOOSTER_RARES, QuestPreferencesErrType.BOOSTER), constraints1); + + } + + private void populateShop() { + final String constraints1 = "w 60px, h 26px!"; + final String constraints2 = "w 150px!, h 26px!"; + + pnlShop.setOpaque(false); + pnlShop.setLayout(new MigLayout("insets 0, gap 0, wrap 2, hidemode 3")); + pnlShop.removeAll(); + pnlShop.add(lblErrShop, "w 100%!, h 30px!, span 2 1"); + + pnlShop.add(new FLabel.Builder().text("Maximum Packs").build(), constraints2); + pnlShop.add(new PrefInput(QPref.SHOP_MAX_PACKS, QuestPreferencesErrType.SHOP), constraints1); + + pnlShop.add(new FLabel.Builder().text("Starting Packs").build(), constraints2); + pnlShop.add(new PrefInput(QPref.SHOP_STARTING_PACKS, QuestPreferencesErrType.SHOP), constraints1); + + pnlShop.add(new FLabel.Builder().text("Wins for Pack").build(), constraints2); + pnlShop.add(new PrefInput(QPref.SHOP_WINS_FOR_ADDITIONAL_PACK, QuestPreferencesErrType.SHOP), constraints1); + + pnlShop.add(new FLabel.Builder().text("Common Singles").build(), constraints2); + pnlShop.add(new PrefInput(QPref.SHOP_SINGLES_COMMON, QuestPreferencesErrType.SHOP), constraints1); + + pnlShop.add(new FLabel.Builder().text("Uncommon Singles").build(), constraints2); + pnlShop.add(new PrefInput(QPref.SHOP_SINGLES_UNCOMMON, QuestPreferencesErrType.SHOP), constraints1); + + pnlShop.add(new FLabel.Builder().text("Rare Singles").build(), constraints2); + pnlShop.add(new PrefInput(QPref.SHOP_SINGLES_RARE, QuestPreferencesErrType.SHOP), constraints1); + } + + /** */ + @SuppressWarnings("serial") + public class PrefInput extends JTextField { + private final QPref qpref; + private final QuestPreferencesErrType err; + private final Color clrHover, clrActive, clrText; + private boolean isFocus = false; + private String previousText = ""; + + /** + * @param qp0   {@link forge.quest.data.QuestPreferences.QPref} + * preferences ident enum + * @param e0   {@link forge.view.home.ViewQuestPreference.QuestPreferencesErrType} + * where error should display to + */ + public PrefInput(QPref qp0, QuestPreferencesErrType e0) { + super(); + + this.qpref = qp0; + this.err = e0; + this.clrHover = FSkin.getColor(FSkin.Colors.CLR_HOVER); + this.clrActive = FSkin.getColor(FSkin.Colors.CLR_ACTIVE); + this.clrText = FSkin.getColor(FSkin.Colors.CLR_TEXT); + + this.setOpaque(false); + this.setBorder(null); + this.setFont(FSkin.getFont(13)); + this.setForeground(clrText); + this.setCaretColor(clrText); + this.setBackground(clrHover); + this.setHorizontalAlignment(SwingConstants.CENTER); + this.setText(prefs.getPreference(qpref)); + this.setPreviousText(prefs.getPreference(qpref)); + + this.addMouseListener(new MouseAdapter() { + @Override + public void mouseEntered(MouseEvent e) { + if (isFocus) { return; } + setOpaque(true); + repaint(); + } + + @Override + public void mouseExited(MouseEvent e) { + if (isFocus) { return; } + setOpaque(false); + repaint(); + } + }); + + this.addFocusListener(new FocusAdapter() { + @Override + public void focusGained(FocusEvent e) { + isFocus = true; + setOpaque(true); + setBackground(clrActive); + } + + @Override + public void focusLost(FocusEvent e) { + isFocus = false; + setOpaque(false); + setBackground(clrHover); + + CSubmenuQuestPrefs.validateAndSave(PrefInput.this); + } + }); + } + + /** @return {@link forge.quest.data.QuestPreferences.QPref} */ + public QPref getQPref() { + return this.qpref; + } + + /** @return {@link forge.gui.home.quest.VSubmenuQuestPrefs.QuestPreferencesErrType} */ + public QuestPreferencesErrType getErrType() { + return this.err; + } + + /** @return {@link java.lang.String} */ + public String getPreviousText() { + return this.previousText; + } + + /** @param s0   {@link java.lang.String} */ + public void setPreviousText(String s0) { + this.previousText = s0; + } + } +} diff --git a/src/main/java/forge/view/toolbox/FSkin.java b/src/main/java/forge/view/toolbox/FSkin.java index f7783dbc3ea..e7861cddd31 100644 --- a/src/main/java/forge/view/toolbox/FSkin.java +++ b/src/main/java/forge/view/toolbox/FSkin.java @@ -243,7 +243,8 @@ public enum FSkin { ICO_BREW (new int[] {560, 560, 80, 80}), /** */ ICO_MINUS (new int[] {560, 640, 80, 80}), /** */ - ICO_PLUS (new int[] {480, 640, 80, 80}); + ICO_PLUS (new int[] {480, 640, 80, 80}), /** */ + ICO_PLUSPLUS (new int[] {480, 720, 80, 80}); private int[] coords; /** @param xy   int[] coordinates */