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
This commit is contained in:
myk
2013-01-24 18:41:24 +00:00
parent 928a1bb596
commit 09634a145e
5 changed files with 22 additions and 10 deletions

View File

@@ -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<QuestPetController> 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();
}
});
}

View File

@@ -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<QuestPetController> 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();
}
});
}

View File

@@ -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<Integer, String> selectedPets = new HashMap<Integer, String>();
/**
*
* TODO: Write javadoc for this method.
@@ -98,7 +94,9 @@ public class QuestController {
* @param name &emsp; 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

View File

@@ -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<Integer, String> petSlots = new HashMap<Integer, String>();
/**
@@ -160,6 +163,9 @@ public final class QuestData {
return assets;
}
public Map<Integer, String> getPetSlots() {
return petSlots;
}
public QuestAchievements getAchievements() {
return achievements;

View File

@@ -198,6 +198,10 @@ public class QuestDataIO {
QuestDataIO.setFinalField(QuestAssets.class, "combatPets", newData.getAssets(), new HashMap<String, QuestItemCondition>());
}
if (saveVersion < 6) {
QuestDataIO.setFinalField(QuestData.class, "petSlots", newData, new HashMap<Integer, String>());
}
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);