Caret/js/project/file.js

120 lines
No EOL
3.3 KiB
JavaScript

define([
"project/tree",
"command",
"storage/file",
"storage/settingsProvider",
"sessions",
"ui/dialog",
"util/manos"
], function(projectTree, command, File, Settings, session, dialog, M) {
var projectConfig;
var projectFile;
var generateProject = function() {
var project = projectConfig || {};
//everything but "folders" is left as-is
//run through all directories, retain them, and add to the structure
project.folders = projectTree.getDirectories().map(function(node) {
var id = chrome.fileSystem.retainEntry(node.entry);
return {
retained: id,
path: node.entry.fullPath
};
});
var json = JSON.stringify(project, null, 2);
if (projectFile) {
projectFile.write(json);
} else {
var file = new File();
var watch = watchProjectFile;
file.open("save", function() {
file.write(json);
var id = file.retain();
chrome.storage.local.set({retainedProject: id});
file.onWrite = watch;
projectFile = file;
});
}
return json;
};
var openProjectFile = function() {
var file = new File();
file.open(function() {
file.read(function(err, data) {
loadProject(data);
var retained = file.retain();
chrome.storage.local.set({retainedProject: retained});
projectFile = file;
file.onWrite = watchProjectFile;
});
});
};
var watchProjectFile = function() {
projectFile.read(function(err, data) {
loadProject(data);
});
};
var loadProject = function(project) {
//project is the JSON from a project file
if (typeof project == "string") {
project = JSON.parse(project);
}
projectConfig = project;
//assign settings
if (project.settings) {
Settings.setProject(project.settings);
}
this.loading = true;
this.element.addClass("loading");
//restore directory entries that can be restored
this.directories = [];
blacklist = blacklistRegExp();
//TODO: untangle this from tree view
M.map(
project.folders,
function(folder, index, c) {
chrome.fileSystem.restoreEntry(folder.retained, function(entry) {
//remember, you can only restore project directories you'd previously opened
if (!entry) return c();
var node = new FSNode(entry);
//if this is the first, go ahead and start the slideout
if (!self.directories.length) {
self.element.addClass("show");
}
self.directories.push(node);
node.walk(blacklist, c);
});
},
function() {
self.loading = false;
self.render();
}
);
};
var editProjectFile = function() {
if (!this.projectFile) {
return dialog(i18n.get("projectNoCurrentProject"));
}
projectFile.read(function(err, data) {
sessions.addFile(data, projectFile);
});
};
var clearProject = function(keepRetained) {
projectFile = null;
projectConfig = {};
projectTree.clear();
Settings.clearProject();
if (!keepRetained) chrome.storage.local.remove("retainedProject");
};
command.on("project:generate", generateProject);
command.on("project:open", openProjectFile);
command.on("project:edit", editProjectFile);
command.on("project:clear", clearProject);
});