v0.5.4 released! Keyword is data-protection. Many small bugfixes, but

main changes are:
- Modified marker (* character before name) goes up the project tree by
marking all parents of a modified object as modified.
- Impact management when changing an object's ID. Allows for some
refactoring to occur, while marking the impacted elements as modified,
or aven creating "altered" versions if imapcted element was only in game
source.
This commit is contained in:
Zukero
2017-04-07 10:01:31 +02:00
parent 49f19abb91
commit bd8576df0c
43 changed files with 462 additions and 91 deletions

View File

@@ -116,4 +116,9 @@ public class ClosedProject implements ProjectTreeNode {
return true;
}
@Override
public boolean needsSaving() {
return false;
}
}

View File

@@ -176,6 +176,10 @@ public abstract class GameDataElement implements ProjectTreeNode, Serializable {
return false;
}
public boolean needsSaving() {
return this.state == State.modified || this.state == State.created;
}
public abstract String getProjectFilename();
public abstract void save();

View File

@@ -213,11 +213,11 @@ public class GameSource implements ProjectTreeNode, Serializable {
@Override
public String getDesc() {
switch(type) {
case altered: return "Altered data";
case created: return "Created data";
case referenced: return "Referenced data";
case source: return "AT Source"; //The fact that it is from "source" is already mentionned by its parent.
default: return "Game data";
case altered: return (needsSaving() ? "*" : "")+"Altered data";
case created: return (needsSaving() ? "*" : "")+"Created data";
case referenced: return (needsSaving() ? "*" : "")+"Referenced data";
case source: return (needsSaving() ? "*" : "")+"AT Source"; //The fact that it is from "source" is already mentionned by its parent.
default: return (needsSaving() ? "*" : "")+"Game data";
}
}
@@ -283,4 +283,12 @@ public class GameSource implements ProjectTreeNode, Serializable {
public WorldmapSegment getWorldmapSegment(String id) {
return worldmap.getWorldmapSegment(id);
}
@Override
public boolean needsSaving() {
for (ProjectTreeNode node : v.getNonEmptyIterable()) {
if (node.needsSaving()) return true;
}
return false;
}
}

View File

@@ -191,7 +191,7 @@ public class Project implements ProjectTreeNode, Serializable {
}
@Override
public String getDesc() {
return name;
return (needsSaving() ? "*" : "")+name;
}
@@ -265,7 +265,7 @@ public class Project implements ProjectTreeNode, Serializable {
}
}
for (ProjectTreeNode node : baseContent.gameMaps.tmxMaps) {
((TMXMap)node).parse();
((TMXMap)node).link();
}
for (ProjectTreeNode node : alteredContent.gameData.v.getNonEmptyIterable()) {
if (node instanceof GameDataCategory<?>) {
@@ -275,7 +275,7 @@ public class Project implements ProjectTreeNode, Serializable {
}
}
for (ProjectTreeNode node : alteredContent.gameMaps.tmxMaps) {
((TMXMap)node).parse();
((TMXMap)node).link();
}
for (ProjectTreeNode node : createdContent.gameData.v.getNonEmptyIterable()) {
if (node instanceof GameDataCategory<?>) {
@@ -285,9 +285,6 @@ public class Project implements ProjectTreeNode, Serializable {
}
}
for (ProjectTreeNode node : createdContent.gameMaps.tmxMaps) {
((TMXMap)node).parse();
}
for (ProjectTreeNode node : baseContent.gameMaps.tmxMaps) {
((TMXMap)node).link();
}
@@ -1131,6 +1128,13 @@ public class Project implements ProjectTreeNode, Serializable {
}
@Override
public boolean needsSaving() {
for (ProjectTreeNode node : v.getNonEmptyIterable()) {
if (node.needsSaving()) return true;
}
return false;
}

View File

@@ -53,5 +53,7 @@ public interface ProjectTreeNode extends TreeNode {
public GameSource.Type getDataType();
public boolean isEmpty();
public boolean needsSaving();
}

View File

@@ -140,8 +140,15 @@ public class Workspace implements ProjectTreeNode, Serializable {
@Override
public void childrenChanged(List<ProjectTreeNode> path) {
path.add(0, this);
if (projectsTreeModel != null) projectsTreeModel.changeNode(new TreePath(path.toArray()));
ATContentStudio.frame.editorChanged(path.get(path.size() - 1));
ProjectTreeNode last = path.get(path.size() - 1);
if (projectsTreeModel != null) {
while (path.size() > 1) {
projectsTreeModel.changeNode(new TreePath(path.toArray()));
path.remove(path.size()-1);
}
}
ATContentStudio.frame.editorChanged(last);
}
@Override
@@ -346,5 +353,14 @@ public class Workspace implements ProjectTreeNode, Serializable {
public boolean isEmpty() {
return projects.isEmpty();
}
@Override
public boolean needsSaving() {
for (ProjectTreeNode node : projects) {
if (node.needsSaving()) return true;
}
return false;
}
}

View File

@@ -63,20 +63,14 @@ public class WorkspaceSettings {
reader = new FileReader(f);
@SuppressWarnings("rawtypes")
Map jsonSettings = (Map) parser.parse(reader);
Integer version = (Integer) jsonSettings.get(VERSION_KEY);
Integer version = ((Number) jsonSettings.get(VERSION_KEY)).intValue();
if (version != null) {
if (version >= 1) {
loadv1(jsonSettings);
}
}
} catch (FileNotFoundException e) {
Notification.addError("Error while parsing workspace settings: "+e.getMessage());
e.printStackTrace();
} catch (IOException e) {
Notification.addError("Error while parsing workspace settings: "+e.getMessage());
e.printStackTrace();
} catch (ParseException e) {
} catch (Exception e) {
Notification.addError("Error while parsing workspace settings: "+e.getMessage());
e.printStackTrace();
} finally {

View File

@@ -88,7 +88,7 @@ public class ActorCondition extends JSONElement {
@Override
public String getDesc() {
return ((this.state == State.modified || this.state == State.created) ? "*" : "")+display_name+" ("+id+")";
return (needsSaving() ? "*" : "")+display_name+" ("+id+")";
}
@SuppressWarnings("rawtypes")

View File

@@ -92,7 +92,7 @@ public class Dialogue extends JSONElement {
@Override
public String getDesc() {
return ((this.state == State.modified || this.state == State.created) ? "*" : "")+id;
return (needsSaving() ? "*" : "")+id;
}
public static String getStaticDesc() {

View File

@@ -47,7 +47,7 @@ public class Droplist extends JSONElement {
@Override
public String getDesc() {
return ((this.state == State.modified || this.state == State.created) ? "*" : "")+id;
return (needsSaving() ? "*" : "")+id;
}
public static String getStaticDesc() {

View File

@@ -102,7 +102,7 @@ public class GameDataCategory<E extends JSONElement> extends ArrayList<E> implem
}
@Override
public String getDesc() {
return this.name;
return (needsSaving() ? "*" : "")+this.name;
}
@Override
@@ -208,7 +208,7 @@ public class GameDataCategory<E extends JSONElement> extends ArrayList<E> implem
impactedCategory = getProject().createdContent.gameData.getCategory(node.getClass());
impactedFileName = node.getProjectFilename();
}
} else if (node.state == GameDataElement.State.modified) {
} else if (node.needsSaving()) {
events.add(new SaveEvent(SaveEvent.Type.alsoSave, node));
}
if (containedIds.containsKey(node.id)) {
@@ -242,5 +242,12 @@ public class GameDataCategory<E extends JSONElement> extends ArrayList<E> implem
return result;
}
@Override
public boolean needsSaving() {
for (E node : this) {
if (node.needsSaving()) return true;
}
return false;
}
}

View File

@@ -236,7 +236,7 @@ public class GameDataSet implements ProjectTreeNode, Serializable {
}
@Override
public String getDesc() {
return "JSON data";
return (needsSaving() ? "*" : "")+"JSON data";
}
@@ -463,4 +463,11 @@ public class GameDataSet implements ProjectTreeNode, Serializable {
return null;
}
@Override
public boolean needsSaving() {
for (ProjectTreeNode node : v.getNonEmptyIterable()) {
if (node.needsSaving()) return true;
}
return false;
}
}

View File

@@ -102,7 +102,7 @@ public class Item extends JSONElement {
@Override
public String getDesc() {
return ((this.state == State.modified || this.state == State.created) ? "*" : "")+name+" ("+id+")";
return (needsSaving() ? "*" : "")+name+" ("+id+")";
}
public static String getStaticDesc() {

View File

@@ -100,7 +100,7 @@ public class ItemCategory extends JSONElement {
@Override
public String getDesc() {
return ((this.state == State.modified || this.state == State.created) ? "*" : "")+name+" ("+id+")";
return (needsSaving() ? "*" : "")+name+" ("+id+")";
}
public static String getStaticDesc() {

View File

@@ -96,7 +96,7 @@ public class NPC extends JSONElement {
@Override
public String getDesc() {
return ((this.state == State.modified || this.state == State.created) ? "*" : "")+name+" ("+id+")";
return (needsSaving() ? "*" : "")+name+" ("+id+")";
}
public static String getStaticDesc() {

View File

@@ -49,7 +49,7 @@ public class Quest extends JSONElement {
@Override
public String getDesc() {
return ((this.state == State.modified || this.state == State.created) ? "*" : "")+name+" ("+id+")";
return (needsSaving() ? "*" : "")+name+" ("+id+")";
}
public static String getStaticDesc() {

View File

@@ -120,6 +120,7 @@ public class Requirement extends JSONElement {
break;
}
if (this.required_obj != null) this.required_obj.addBacklink((GameDataElement) this.parent);
this.state = State.linked;
}
@Override

View File

@@ -62,7 +62,6 @@ public class TMXMap extends GameDataElement {
public Integer outside = null;
public ColorFilter colorFilter = null;
public boolean writable = false;
public boolean changedOnDisk = false;
public int dismissNextChangeNotif = 0;
@@ -129,6 +128,7 @@ public class TMXMap extends GameDataElement {
clone.groups = new ArrayList<MapObjectGroup>();
}
MapObjectGroup group = new MapObjectGroup((tiled.core.ObjectGroup) layer, this);
group.link();
clone.groups.add(group);
}
}
@@ -201,7 +201,7 @@ public class TMXMap extends GameDataElement {
}
@Override
public String getDesc() {
return ((this.state == State.modified || this.state == State.created) ? "*" : "")+id;
return (needsSaving() ? "*" : "")+id;
}
@Override
@@ -315,7 +315,7 @@ public class TMXMap extends GameDataElement {
if (this.state == GameDataElement.State.init) {
parse();
}
if (this.state == GameDataElement.State.parsed || this.state == GameDataElement.State.created) {
if (this.state == GameDataElement.State.parsed) {
if (groups != null) {
for (MapObjectGroup group : groups) {
group.link();

View File

@@ -187,7 +187,7 @@ public class TMXMapSet implements ProjectTreeNode {
}
@Override
public String getDesc() {
return "TMX Maps";
return (needsSaving() ? "*" : "")+"TMX Maps";
}
@Override
@@ -262,4 +262,12 @@ public class TMXMapSet implements ProjectTreeNode {
return tmxMaps.get(index);
}
@Override
public boolean needsSaving() {
for (ProjectTreeNode node : tmxMaps) {
if (node.needsSaving()) return true;
}
return false;
}
}

View File

@@ -173,7 +173,7 @@ public class Worldmap extends ArrayList<WorldmapSegment> implements ProjectTreeN
@Override
public String getDesc() {
return "Worldmap";
return (needsSaving() ? "*" : "")+"Worldmap";
}
@Override
public void notifyCreated() {
@@ -277,6 +277,13 @@ public class Worldmap extends ArrayList<WorldmapSegment> implements ProjectTreeN
e.printStackTrace();
}
}
@Override
public boolean needsSaving() {
for (ProjectTreeNode node : this) {
if (node.needsSaving()) return true;
}
return false;
}
}

View File

@@ -52,7 +52,7 @@ public class WorldmapSegment extends GameDataElement {
@Override
public String getDesc() {
return id;
return (needsSaving() ? "*" : "")+id;
}
@Override

View File

@@ -97,7 +97,7 @@ public class SavedGame extends GameDataElement {
}
@Override
public String getDesc() {
return loadedSave.displayInfo;
return (needsSaving() ? "*" : "")+loadedSave.displayInfo;
}
@Override

View File

@@ -128,7 +128,7 @@ public class SavedGamesSet implements ProjectTreeNode, Serializable {
}
@Override
public String getDesc() {
return "Saved games";
return (needsSaving() ? "*" : "")+"Saved games";
}
@Override
@@ -168,4 +168,13 @@ public class SavedGamesSet implements ProjectTreeNode, Serializable {
public boolean isEmpty() {
return saves.isEmpty();
}
@Override
public boolean needsSaving() {
for (ProjectTreeNode node : saves) {
if (node.needsSaving()) return true;
}
return false;
}
}

View File

@@ -102,7 +102,7 @@ public class SpriteSheetSet implements ProjectTreeNode {
}
@Override
public String getDesc() {
return "Spritesheets";
return (needsSaving() ? "*" : "")+"Spritesheets";
}
@Override
@@ -151,4 +151,12 @@ public class SpriteSheetSet implements ProjectTreeNode {
}
return null;
}
@Override
public boolean needsSaving() {
for (ProjectTreeNode node : spritesheets) {
if (node.needsSaving()) return true;
}
return false;
}
}

View File

@@ -118,7 +118,7 @@ public class Spritesheet extends GameDataElement {
}
@Override
public String getDesc() {
return spritesheetFile.getName();
return (needsSaving() ? "*" : "")+spritesheetFile.getName();
}
@Override

View File

@@ -413,7 +413,7 @@ public class WriterModeData extends GameDataElement {
@Override
public String getDesc() {
return (this.state == State.modified ? "*" : "")+id;
return (needsSaving() ? "*" : "")+id;
}
@Override
public Project getProject() {

View File

@@ -110,7 +110,7 @@ public class WriterModeDataSet implements ProjectTreeNode, Serializable {
@Override
public String getDesc() {
return "Dialogue sketchs";
return (needsSaving() ? "*" : "")+"Dialogue sketchs";
}
@Override
@@ -195,7 +195,7 @@ public class WriterModeDataSet implements ProjectTreeNode, Serializable {
public List<SaveEvent> attemptSave() {
List<SaveEvent> events = new ArrayList<SaveEvent>();
for (WriterModeData data : writerModeDataList) {
if (data.state == State.created || data.state == State.modified) {
if (data.needsSaving()) {
events.add(new SaveEvent(SaveEvent.Type.alsoSave, data));
}
}
@@ -262,5 +262,14 @@ public class WriterModeDataSet implements ProjectTreeNode, Serializable {
if (higherEmptyParent != null) higherEmptyParent.notifyCreated();
else node.notifyCreated();
}
@Override
public boolean needsSaving() {
for (ProjectTreeNode node : writerModeDataList) {
if (node.needsSaving()) return true;
}
return false;
}
}