Issues creating script with save settings
Hi guys. I'm building a script that needs to store a file settings in the user machine. I'm using "json2" library in order to use objects and save settings as json format. The idea is that if the script runs the first time, it creates the settings file, but if the file already exists, just load its info.
My script is made from an UI panel with a "settings" button that launches another panel that feeds from the settings file and has a button to save the changes made in that window (checkboxes, dds, etc).
Right now, it creates the settings file for the first time pretty well, but when I try to save new settings in the file, this gets broken and erase everything inside.
Here is the current code. Any help will be pretty much appreciated
//@include "json2.jsx";
(function myFunction(thisObj) {
var settingsProps = {
imageSeq : true,
renderPreset : "PNG Delivery",
allowSkipFiles : true,
imageSeqVersions : false,
lastRenderPath : [""],
lastFFmpegPath : [""],
customAdditionalPath : "",
}
var settingsFolder = Folder("~/testSettings");
var settingsFileName = "settings";
setupSettings(settingsFolder, settingsFileName, settingsProps);
var myDock = (function() {
var module = {};
module.buildUI = function() {
var win = (thisObj instanceof Panel) ? thisObj : new Window("palette", "testSaveSettings", undefined, {
resizeable: true
});
// WIN
// ===
win.orientation = "column";
win.alignChildren = ["fill","top"];
win.spacing = 1;
win.margins = 5;
// GROUP1
// ======
var group1 = win.add("group", undefined, {name: "group1"});
group1.orientation = "column";
group1.alignChildren = ["fill","center"];
group1.spacing = 10;
group1.margins = 0;
var button1 = group1.add("button", undefined, undefined, {name: "button1"});
button1.text = "Settings";
// Actions
button1.onClick = function(){
settingsWindow.buildUI();
}
uiHelpers.onResize(win);
uiHelpers.showUI(win);
};
return module;
})();
var settingsWindow = (function() {
var module = {};
module.buildUI = function() {
settings = setupSettings(settingsFolder, settingsFileName, settingsProps);
// SETTINGSWIN
// ===========
var win = new Window("palette", undefined, undefined, {resizeable: true});
win.text = "Settings";
win.orientation = "column";
win.alignChildren = ["fill","top"];
win.spacing = 1;
win.margins = 5;
// MAINSETTINGS
// ============
var mainSettings = win.add("group", undefined, {name: "mainSettings"});
mainSettings.orientation = "column";
mainSettings.alignChildren = ["fill","center"];
mainSettings.spacing = 10;
mainSettings.margins = 13;
var button1 = mainSettings.add("button", undefined, undefined, {name: "button1"});
button1.helpTip = "Opens the folder where the settings file is located.";
button1.text = "F";
button1.alignment = ["right","center"];
var divider1 = mainSettings.add("panel", undefined, undefined, {name: "divider1"});
divider1.alignment = "fill";
// PANEL1
// ======
var panel1 = mainSettings.add("panel", undefined, undefined, {name: "panel1"});
panel1.text = "Image Sequence Settings";
panel1.orientation = "column";
panel1.alignChildren = ["fill","top"];
panel1.spacing = 10;
panel1.margins = 10;
// GROUP1
// ======
var group1 = panel1.add("group", undefined, {name: "group1"});
group1.orientation = "row";
group1.alignChildren = ["left","center"];
group1.spacing = 5;
group1.margins = 0;
var statictext1 = group1.add("statictext", undefined, undefined, {name: "statictext1"});
statictext1.text = "Render Preset";
// PANEL1
// ======
var templates = getRenderPresets(settings.props.renderPreset);
var dd1 = group1.add("dropdownlist", undefined, undefined, {name: "dd1", items: templates.presets});
dd1.selection = templates.selection;
dd1.preferredSize.width = 103;
dd1.alignment = ["fill","top"];
// GROUP2
// ======
var group2 = panel1.add("group", undefined, {name: "group2"});
group2.orientation = "column";
group2.alignChildren = ["left","center"];
group2.spacing = 5;
group2.margins = 0;
var checkbox1 = group2.add("checkbox", undefined, undefined, {name: "checkbox1"});
checkbox1.text = "Allow skip existing files";
checkbox1.value = settings.props.allowSkipFiles;
var checkbox2 = group2.add("checkbox", undefined, undefined, {name: "checkbox2"});
checkbox2.text = "Use versions in PNG Sequence";
checkbox2.value = settings.props.imageSeqVersions;
// GROUPSETS
// =========
var groupSets = mainSettings.add("group", undefined, {name: "groupSets"});
groupSets.orientation = "row";
groupSets.alignChildren = ["center","center"];
groupSets.spacing = 10;
groupSets.margins = 10;
var saveBtn = groupSets.add("button", undefined, undefined, {name: "saveBtn"});
saveBtn.text = "Save";
var cancelBtn = groupSets.add("button", undefined, undefined, {name: "cancelBtn"});
cancelBtn.text = "Cancel";
saveBtn.onClick = function(){
settingsProps.allowSkipFiles = checkbox1.value;
settingsProps.imageSeqVersions = checkbox2.value;
settingsProps.renderPreset = dd1.selection;
$.writeln(settingsProps.renderPreset);
settings.file.remove();
createJSONFile(settings.file, settingsProps);
win.close();
}
cancelBtn.onClick = function(){
win.close();
}
uiHelpers.onResize(win);
uiHelpers.showUI(win);
};
return module;
})();
var uiHelpers = (function() {
var module = {};
module.onResize = function(win) {
win.onResizing = win.onResize = function() {
this.layout.resize();
};
};
module.refreshUI = function(win) {
win.layout.layout(true);
};
module.showUI = function(win) {
if (win instanceof Window) {
win.center();
win.show();
} else {
win.layout.layout(true);
win.layout.resize();
}
};
return module;
})();
////// FUNCTIONS UTILITIES
function setupSettings(settingsFolder, settingsFileName, sets){
var module = {};
if(!settingsFolder.exists){
if (!settingsFolder.create()){
alert("Can't create the settings folder. The script will not can save preferences");
return;
}
settingsFolder.create();
}
var path = settingsFolder.toString() + "/" + settingsFileName + ".json";
var file = File(path);
if(!file.exists){
createJSONFile(file, sets);
module.props = sets;
}else{
module.props = readJSONFile(file);
}
module.file = file;
return module;
}
function createJSONFile(file, object){
file.open("w");
file.write(JSON.stringify(object));
file.close();
}
function readJSONFile(file){
var currentLine;
var jsonStuff = [];
file.open("r");
while(!file.eof){
currentLine = file.readln();
jsonStuff.push(currentLine);
}
file.close();
jsonStuff = jsonStuff.join("");
var data = JSON.parse(jsonStuff);
return data
}
function getRenderPresets(namePreset){
var module = {};
var comp;
for (i = 1; i <= app.project.numItems; i++){
var item = app.project.item(i);
if(item instanceof CompItem){
comp = item;
break;
}
}
var rq = app.project.renderQueue;
var renderItem = rq.items.add(comp);
rq.showWindow(false);
var oM = renderItem.outputModule(1);
var templates = oM.templates;
module.presets = templates;
for(j = 0; j < templates.length; j++){
var templateItem = templates[j];
if(templateItem == namePreset){
module.selection = j;
break;
}
}
renderItem.remove();
return module;
}
myDock.buildUI();
})(this);
