Filling dropdowns with options from project
This commit is contained in:
parent
76deebdf6a
commit
14eeebfa80
|
@ -25,6 +25,28 @@ Array.prototype.includes||(Array.prototype.includes=function(r,t){if(null==this)
|
||||||
// Polyfill for JSON
|
// Polyfill for JSON
|
||||||
"object"!=typeof JSON&&(JSON={}),function(){"use strict";function f(a){return a<10?"0"+a:a}function this_value(){return this.valueOf()}function quote(a){return rx_escapable.lastIndex=0,rx_escapable.test(a)?'"'+a.replace(rx_escapable,function(a){var b=meta[a];return"string"==typeof b?b:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function str(a,b){var c,d,e,f,h,g=gap,i=b[a];switch(i&&"object"==typeof i&&"function"==typeof i.toJSON&&(i=i.toJSON(a)),"function"==typeof rep&&(i=rep.call(b,a,i)),typeof i){case"string":return quote(i);case"number":return isFinite(i)?String(i):"null";case"boolean":case"null":return String(i);case"object":if(!i)return"null";if(gap+=indent,h=[],"[object Array]"===Object.prototype.toString.apply(i)){for(f=i.length,c=0;c<f;c+=1)h[c]=str(c,i)||"null";return e=0===h.length?"[]":gap?"[\n"+gap+h.join(",\n"+gap)+"\n"+g+"]":"["+h.join(",")+"]",gap=g,e}if(rep&&"object"==typeof rep)for(f=rep.length,c=0;c<f;c+=1)"string"==typeof rep[c]&&(d=rep[c],(e=str(d,i))&&h.push(quote(d)+(gap?": ":":")+e));else for(d in i)Object.prototype.hasOwnProperty.call(i,d)&&(e=str(d,i))&&h.push(quote(d)+(gap?": ":":")+e);return e=0===h.length?"{}":gap?"{\n"+gap+h.join(",\n"+gap)+"\n"+g+"}":"{"+h.join(",")+"}",gap=g,e}}var rx_one=/^[\],:{}\s]*$/,rx_two=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,rx_three=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,rx_four=/(?:^|:|,)(?:\s*\[)+/g,rx_escapable=/[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,rx_dangerous=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;"function"!=typeof Date.prototype.toJSON&&(Date.prototype.toJSON=function(){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null},Boolean.prototype.toJSON=this_value,Number.prototype.toJSON=this_value,String.prototype.toJSON=this_value);var gap,indent,meta,rep;"function"!=typeof JSON.stringify&&(meta={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},JSON.stringify=function(a,b,c){var d;if(gap="",indent="","number"==typeof c)for(d=0;d<c;d+=1)indent+=" ";else"string"==typeof c&&(indent=c);if(rep=b,b&&"function"!=typeof b&&("object"!=typeof b||"number"!=typeof b.length))throw new Error("JSON.stringify");return str("",{"":a})}),"function"!=typeof JSON.parse&&(JSON.parse=function(text,reviver){function walk(a,b){var c,d,e=a[b];if(e&&"object"==typeof e)for(c in e)Object.prototype.hasOwnProperty.call(e,c)&&(d=walk(e,c),void 0!==d?e[c]=d:delete e[c]);return reviver.call(a,b,e)}var j;if(text=String(text),rx_dangerous.lastIndex=0,rx_dangerous.test(text)&&(text=text.replace(rx_dangerous,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})),rx_one.test(text.replace(rx_two,"@").replace(rx_three,"]").replace(rx_four,"")))return j=eval("("+text+")"),"function"==typeof reviver?walk({"":j},""):j;throw new SyntaxError("JSON.parse")})}();
|
"object"!=typeof JSON&&(JSON={}),function(){"use strict";function f(a){return a<10?"0"+a:a}function this_value(){return this.valueOf()}function quote(a){return rx_escapable.lastIndex=0,rx_escapable.test(a)?'"'+a.replace(rx_escapable,function(a){var b=meta[a];return"string"==typeof b?b:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function str(a,b){var c,d,e,f,h,g=gap,i=b[a];switch(i&&"object"==typeof i&&"function"==typeof i.toJSON&&(i=i.toJSON(a)),"function"==typeof rep&&(i=rep.call(b,a,i)),typeof i){case"string":return quote(i);case"number":return isFinite(i)?String(i):"null";case"boolean":case"null":return String(i);case"object":if(!i)return"null";if(gap+=indent,h=[],"[object Array]"===Object.prototype.toString.apply(i)){for(f=i.length,c=0;c<f;c+=1)h[c]=str(c,i)||"null";return e=0===h.length?"[]":gap?"[\n"+gap+h.join(",\n"+gap)+"\n"+g+"]":"["+h.join(",")+"]",gap=g,e}if(rep&&"object"==typeof rep)for(f=rep.length,c=0;c<f;c+=1)"string"==typeof rep[c]&&(d=rep[c],(e=str(d,i))&&h.push(quote(d)+(gap?": ":":")+e));else for(d in i)Object.prototype.hasOwnProperty.call(i,d)&&(e=str(d,i))&&h.push(quote(d)+(gap?": ":":")+e);return e=0===h.length?"{}":gap?"{\n"+gap+h.join(",\n"+gap)+"\n"+g+"}":"{"+h.join(",")+"}",gap=g,e}}var rx_one=/^[\],:{}\s]*$/,rx_two=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,rx_three=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,rx_four=/(?:^|:|,)(?:\s*\[)+/g,rx_escapable=/[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,rx_dangerous=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;"function"!=typeof Date.prototype.toJSON&&(Date.prototype.toJSON=function(){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null},Boolean.prototype.toJSON=this_value,Number.prototype.toJSON=this_value,String.prototype.toJSON=this_value);var gap,indent,meta,rep;"function"!=typeof JSON.stringify&&(meta={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},JSON.stringify=function(a,b,c){var d;if(gap="",indent="","number"==typeof c)for(d=0;d<c;d+=1)indent+=" ";else"string"==typeof c&&(indent=c);if(rep=b,b&&"function"!=typeof b&&("object"!=typeof b||"number"!=typeof b.length))throw new Error("JSON.stringify");return str("",{"":a})}),"function"!=typeof JSON.parse&&(JSON.parse=function(text,reviver){function walk(a,b){var c,d,e=a[b];if(e&&"object"==typeof e)for(c in e)Object.prototype.hasOwnProperty.call(e,c)&&(d=walk(e,c),void 0!==d?e[c]=d:delete e[c]);return reviver.call(a,b,e)}var j;if(text=String(text),rx_dangerous.lastIndex=0,rx_dangerous.test(text)&&(text=text.replace(rx_dangerous,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})),rx_one.test(text.replace(rx_two,"@").replace(rx_three,"]").replace(rx_four,"")))return j=eval("("+text+")"),"function"==typeof reviver?walk({"":j},""):j;throw new SyntaxError("JSON.parse")})}();
|
||||||
|
|
||||||
|
function last(array) {
|
||||||
|
return array[array.length - 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
function identity(x) { return x; }
|
||||||
|
|
||||||
|
function toArray(list) {
|
||||||
|
var result = [];
|
||||||
|
for (var i = 0; i < list.length; i++) {
|
||||||
|
result.push(list[i]);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
function toArrayBase1(list) {
|
||||||
|
var result = [];
|
||||||
|
for (var i = 1; i <= list.length; i++) {
|
||||||
|
result.push(list[i]);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
// ExtendScript's resource strings are a pain to write.
|
// ExtendScript's resource strings are a pain to write.
|
||||||
// This function allows them to be written in JSON notation, then converts them into the required
|
// This function allows them to be written in JSON notation, then converts them into the required
|
||||||
// format.
|
// format.
|
||||||
|
@ -61,6 +83,45 @@ var controlFunctions = (function() {
|
||||||
return result;
|
return result;
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
// Returns the path of a project item within the project
|
||||||
|
function getItemPath(item) {
|
||||||
|
if (item === app.project.rootFolder) {
|
||||||
|
return '/';
|
||||||
|
}
|
||||||
|
|
||||||
|
var result = item.name;
|
||||||
|
while (item.parentFolder !== app.project.rootFolder) {
|
||||||
|
result = item.parentFolder.name + ' / ' + result;
|
||||||
|
item = item.parentFolder;
|
||||||
|
}
|
||||||
|
return '/ ' + result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Selects the item within an item control whose text matches the specified text.
|
||||||
|
// If no such item exists, selects the first item, if present.
|
||||||
|
function selectByTextOrFirst(itemControl, text) {
|
||||||
|
var targetItem = toArray(itemControl.items).find(function(item) {
|
||||||
|
return item.text === text;
|
||||||
|
});
|
||||||
|
if (!targetItem && itemControl.items.length) {
|
||||||
|
targetItem = itemControl.items[0];
|
||||||
|
}
|
||||||
|
if (targetItem) {
|
||||||
|
itemControl.selection = targetItem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getWaveFileProjectItems() {
|
||||||
|
var result = toArrayBase1(app.project.items).filter(function(item) {
|
||||||
|
var isAudioFootage = item instanceof FootageItem && item.hasAudio && !item.hasVideo;
|
||||||
|
if (!isAudioFootage) return false;
|
||||||
|
|
||||||
|
var isWaveFile = item.file && item.file.exists && item.file.name.match(/\.wav$/i);
|
||||||
|
return isWaveFile;
|
||||||
|
});
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
function createDialogWindow() {
|
function createDialogWindow() {
|
||||||
var resourceString;
|
var resourceString;
|
||||||
with (controlFunctions) {
|
with (controlFunctions) {
|
||||||
|
@ -139,6 +200,31 @@ function createDialogWindow() {
|
||||||
cancelButton: window.buttons.cancel
|
cancelButton: window.buttons.cancel
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Add audio file options
|
||||||
|
getWaveFileProjectItems().forEach(function(projectItem) {
|
||||||
|
var listItem = controls.audioFile.add('item', getItemPath(projectItem));
|
||||||
|
listItem.projectItem = projectItem;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Add mouth composition options
|
||||||
|
var comps = toArrayBase1(app.project.items).filter(function (item) {
|
||||||
|
return item instanceof CompItem;
|
||||||
|
});
|
||||||
|
comps.forEach(function(projectItem) {
|
||||||
|
var listItem = controls.mouthComp.add('item', getItemPath(projectItem));
|
||||||
|
listItem.projectItem = projectItem;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Add target folder options
|
||||||
|
var projectFolders = toArrayBase1(app.project.items).filter(function (item) {
|
||||||
|
return item instanceof FolderItem;
|
||||||
|
});
|
||||||
|
projectFolders.unshift(app.project.rootFolder);
|
||||||
|
projectFolders.forEach(function(projectFolder) {
|
||||||
|
var listItem = controls.targetFolder.add('item', getItemPath(projectFolder));
|
||||||
|
listItem.projectItem = projectFolder;
|
||||||
|
});
|
||||||
|
|
||||||
// Align controls
|
// Align controls
|
||||||
window.onShow = function() {
|
window.onShow = function() {
|
||||||
// Give uniform width to all labels
|
// Give uniform width to all labels
|
||||||
|
@ -164,6 +250,38 @@ function createDialogWindow() {
|
||||||
window.layout.layout(true);
|
window.layout.layout(true);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var updating = false;
|
||||||
|
|
||||||
|
function update() {
|
||||||
|
if (updating) return;
|
||||||
|
|
||||||
|
updating = true;
|
||||||
|
try {
|
||||||
|
// Handle auto frame rate
|
||||||
|
var autoFrameRate = controls.autoFrameRate.value;
|
||||||
|
controls.frameRate.enabled = !autoFrameRate;
|
||||||
|
if (autoFrameRate) {
|
||||||
|
// Take frame rate from mouth comp
|
||||||
|
var mouthComp = (controls.mouthComp.selection || {}).projectItem;
|
||||||
|
controls.frameRate.text = mouthComp ? mouthComp.frameRate : '';
|
||||||
|
} else {
|
||||||
|
// Sanitize frame rate
|
||||||
|
var sanitizedFrameRate = controls.frameRate.text.match(/\d*\.?\d*/)[0];
|
||||||
|
if (sanitizedFrameRate !== controls.frameRate.text) {
|
||||||
|
controls.frameRate.text = sanitizedFrameRate;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
updating = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle changes
|
||||||
|
update();
|
||||||
|
controls.mouthComp.onChange = update;
|
||||||
|
controls.frameRate.onChanging = update;
|
||||||
|
controls.autoFrameRate.onClick = update;
|
||||||
|
|
||||||
// Handle animation
|
// Handle animation
|
||||||
controls.animateButton.onClick = function() {
|
controls.animateButton.onClick = function() {
|
||||||
// TODO: validate
|
// TODO: validate
|
||||||
|
|
Loading…
Reference in New Issue