From 09634a145e6e968b222dcacc052cbad91d30351c Mon Sep 17 00:00:00 2001 From: myk Date: Thu, 24 Jan 2013 18:41:24 +0000 Subject: [PATCH] myk patch 5: save/restore state of quest plant/pet widgets - saved quest data when pet settings are modified - moved the selectedPets map from QuestController to QuestData (since it now gets persisted); also renamed it petSlots for clarity - incremented the quest file format version - added code to bring older file formats up to date - finally, while researching how the data is saved, I noticed that saveData() can be called from multiple threads. I made the method synchronized to prevent file corruption --- .../java/forge/gui/home/quest/CSubmenuChallenges.java | 2 ++ src/main/java/forge/gui/home/quest/CSubmenuDuels.java | 2 ++ src/main/java/forge/quest/QuestController.java | 10 ++++------ src/main/java/forge/quest/data/QuestData.java | 10 ++++++++-- src/main/java/forge/quest/io/QuestDataIO.java | 8 ++++++-- 5 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/main/java/forge/gui/home/quest/CSubmenuChallenges.java b/src/main/java/forge/gui/home/quest/CSubmenuChallenges.java index dabba2418fc..4a54b86c25f 100644 --- a/src/main/java/forge/gui/home/quest/CSubmenuChallenges.java +++ b/src/main/java/forge/gui/home/quest/CSubmenuChallenges.java @@ -76,6 +76,7 @@ public enum CSubmenuChallenges implements ICDoc { @Override public void actionPerformed(ActionEvent arg0) { quest.selectPet(0, view.getCbPlant().isSelected() ? "Plant" : null); + quest.save(); } }); @@ -87,6 +88,7 @@ public enum CSubmenuChallenges implements ICDoc { List pets = quest.getPetsStorage().getAvaliablePets(slot, quest.getAssets()); String petName = index <= 0 || index > pets.size() ? null : pets.get(index - 1).getName(); quest.selectPet(slot, petName); + quest.save(); } }); } diff --git a/src/main/java/forge/gui/home/quest/CSubmenuDuels.java b/src/main/java/forge/gui/home/quest/CSubmenuDuels.java index 7de26693b2d..15fe420f114 100644 --- a/src/main/java/forge/gui/home/quest/CSubmenuDuels.java +++ b/src/main/java/forge/gui/home/quest/CSubmenuDuels.java @@ -58,6 +58,7 @@ public enum CSubmenuDuels implements ICDoc { @Override public void actionPerformed(ActionEvent arg0) { quest.selectPet(0, view.getCbPlant().isSelected() ? "Plant" : null); + quest.save(); } }); @@ -69,6 +70,7 @@ public enum CSubmenuDuels implements ICDoc { List pets = quest.getPetsStorage().getAvaliablePets(slot, quest.getAssets()); String petName = index <= 0 || index > pets.size() ? null : pets.get(index - 1).getName(); quest.selectPet(slot, petName); + quest.save(); } }); } diff --git a/src/main/java/forge/quest/QuestController.java b/src/main/java/forge/quest/QuestController.java index 4dd4c3b1059..6dc5c1c58c1 100644 --- a/src/main/java/forge/quest/QuestController.java +++ b/src/main/java/forge/quest/QuestController.java @@ -18,8 +18,6 @@ package forge.quest; import java.io.File; -import java.util.HashMap; -import java.util.Map; import com.google.common.base.Predicate; import com.google.common.base.Predicates; @@ -89,8 +87,6 @@ public class QuestController { /** */ public static final int MAX_PET_SLOTS = 2; - private Map selectedPets = new HashMap(); - /** * * TODO: Write javadoc for this method. @@ -98,7 +94,9 @@ public class QuestController { * @param name   String */ public void selectPet(Integer slot, String name) { - selectedPets.put(slot, name); + if (this.model != null) { + this.model.getPetSlots().put(slot, name); + } } /** @@ -107,7 +105,7 @@ public class QuestController { * @return String */ public String getSelectedPet(Integer slot) { - return selectedPets.get(slot); + return this.model == null ? null : this.model.getPetSlots().get(slot); } // Cards - class uses data from here diff --git a/src/main/java/forge/quest/data/QuestData.java b/src/main/java/forge/quest/data/QuestData.java index 0465a54f951..26c02c96ea4 100644 --- a/src/main/java/forge/quest/data/QuestData.java +++ b/src/main/java/forge/quest/data/QuestData.java @@ -17,6 +17,9 @@ */ package forge.quest.data; +import java.util.HashMap; +import java.util.Map; + import forge.Singletons; import forge.game.GameFormat; import forge.quest.QuestMode; @@ -37,7 +40,7 @@ import forge.quest.io.QuestDataIO; public final class QuestData { /** Holds the latest version of the Quest Data. */ - public static final int CURRENT_VERSION_NUMBER = 5; + public static final int CURRENT_VERSION_NUMBER = 6; // This field places the version number into QD instance, // but only when the object is created through the constructor @@ -58,7 +61,7 @@ public final class QuestData { private final QuestAssets assets; private final QuestAchievements achievements; - + private final Map petSlots = new HashMap(); /** @@ -160,6 +163,9 @@ public final class QuestData { return assets; } + public Map getPetSlots() { + return petSlots; + } public QuestAchievements getAchievements() { return achievements; diff --git a/src/main/java/forge/quest/io/QuestDataIO.java b/src/main/java/forge/quest/io/QuestDataIO.java index c3facf0fffc..0b6fc05a5c2 100644 --- a/src/main/java/forge/quest/io/QuestDataIO.java +++ b/src/main/java/forge/quest/io/QuestDataIO.java @@ -197,7 +197,11 @@ public class QuestDataIO { if (saveVersion < 5) { QuestDataIO.setFinalField(QuestAssets.class, "combatPets", newData.getAssets(), new HashMap()); } - + + if (saveVersion < 6) { + QuestDataIO.setFinalField(QuestData.class, "petSlots", newData, new HashMap()); + } + final QuestAssets qS = newData.getAssets(); switch (saveVersion) { @@ -346,7 +350,7 @@ public class QuestDataIO { * @param qd * a {@link forge.quest.data.QuestData} object. */ - public static void saveData(final QuestData qd) { + public static synchronized void saveData(final QuestData qd) { try { final XStream xStream = QuestDataIO.getSerializer(false);