blob: 105d901e0dd8a8b00810a5034aca220232dbf38e [file] [log] [blame]
/*jslint vars: true, plusplus: true, devel: true, nomen: true, regexp: true, indent: 4, maxerr: 50 */
/*global $, SystemPath, radioData, gearData, checkData, bodymovin, messageController, mainController */
var compSelectionController = (function () {
'use strict';
var view, compsListContainer, csInterface, renderButton;
var compositions;
var compElements = {};
var isDataSynced = false;
var elementTemplate = '<tr><td class="td stateTd"><div class="hideExtra state"></div></td><td class="td settingsTd"><div class="hideExtra settings"></div></td><td class="td"><div class="hideExtra name"></div></td><td class="td destinationTd"><div class="hideExtra destination"></div></td></tr>';
var stateData;
var filterInput;
function formatStringForEval(str) {
return '"' + str.replace(/\\/g, '\\\\') + '"';
}
function checkCompositions() {
var i = 0, len = compositions.length, comp, elem;
for(i=0;i<len;i+=1){
comp = compositions[i];
elem = compElements[comp.id].elem;
if(stateData.filterValue && comp.name.indexOf(stateData.filterValue) === -1){
elem.hide();
} else {
elem.show();
}
}
var flag = false;
i = 0;
while (i < len) {
if (compositions[i].selected && compositions[i].destination) {
flag = true;
break;
}
i += 1;
}
if (flag) {
renderButton.removeClass('disabled');
} else {
renderButton.addClass('disabled');
}
}
var settingsManager;
function addElemListeners(comp) {
var elem = compElements[comp.id].elem;
function handleStateClick() {
comp.selected = !comp.selected;
if (comp.selected) {
elem.addClass('selected');
compElements[comp.id].anim.play();
} else {
compElements[comp.id].anim.goToAndStop(0);
elem.removeClass('selected');
}
var eScript = 'bm_compsManager.setCompositionSelectionState(' + comp.id + ',' + comp.selected + ')';
csInterface.evalScript(eScript);
checkCompositions();
mainController.saveData();
}
function handleDestination() {
if (!comp.selected) {
handleStateClick();
}
var eScript = 'bm_compsManager.searchCompositionDestination(' + comp.id + ')';
csInterface.evalScript(eScript);
}
function saveSettings(data) {
comp.settings = data;
var eScript = 'bm_compsManager.setCompositionSettings(' + comp.id + ',' + JSON.stringify(comp.settings) + ')';
csInterface.evalScript(eScript);
mainController.saveData();
}
function showElemSetings() {
settingsManager.show(comp.settings, saveSettings, compositions);
}
function overElemSetings() {
compElements[comp.id].gearAnim.play();
}
function outElemSetings() {
compElements[comp.id].gearAnim.goToAndStop(0);
}
elem.find('.stateTd').on('click', handleStateClick);
elem.find('.settingsTd').on('click', showElemSetings);
elem.find('.settingsTd').hover(overElemSetings, outElemSetings);
elem.find('.destinationTd').on('click', handleDestination);
}
function setCompositionData(item, pos) {
var i = 0, len = compositions.length, comp, isAppended = true;
while (i < len) {
if (item.id === compositions[i].id) {
comp = compositions[i];
break;
}
i += 1;
}
if (!comp) {
comp = {
id: item.id,
settings: {}
};
compositions.push(comp);
} else if(!isDataSynced) {
var eScript = 'bm_compsManager.syncCompositionData(' + comp.id + ',' + JSON.stringify(comp) + ')';
csInterface.evalScript(eScript);
}
if(!compElements[comp.id]){
isAppended = false;
var compElementsData = {};
compElementsData.elem = $(elementTemplate);
var autoplay = false;
if(!isDataSynced && comp.selected) {
autoplay = true;
}
var animContainer = compElementsData.elem.find('.state')[0];
var animData = JSON.parse(radioData);
var params = {
animType: 'svg',
wrapper: animContainer,
loop: false,
autoplay: autoplay,
prerender: true,
animationData: animData
};
var anim = bodymovin.loadAnimation(params);
compElementsData.anim = anim;
animContainer = compElementsData.elem.find('.settings')[0];
animData = JSON.parse(gearData);
params = {
animType: 'svg',
wrapper: animContainer,
loop: false,
autoplay: false,
prerender: true,
animationData: animData
};
anim = bodymovin.loadAnimation(params);
compElementsData.gearAnim = anim;
compElements[comp.id] = compElementsData;
addElemListeners(comp);
}
comp.active = true;
comp.name = item.name;
comp.selected = item.selected;
comp.destination = item.destination;
comp.absoluteURI = item.absoluteURI;
comp.settings = item.settings;
var elem = compElements[comp.id].elem;
elem.find('.name').html(comp.name);
elem.find('.destination').html(comp.destination ? comp.destination.replace(/\\/g, '/') : '...');
if (comp.selected) {
elem.addClass('selected');
} else {
elem.removeClass('selected');
}
if(!isAppended) {
if(pos === 0){
compsListContainer.prepend(elem);
} else {
compsListContainer.find("tr").eq(pos - 1).after(elem);
}
}
}
function markCompsForRemoval() {
var i, len = compositions.length;
for (i = 0; i < len; i += 1) {
compositions[i].active = false;
}
}
function clearRemovedComps() {
var i, len = compositions.length;
for (i = 0; i < len; i += 1) {
if (!compositions[i].active) {
if(compElements[compositions[i].id]){
compElements[compositions[i].id].elem.detach();
compElements[compositions[i].id].anim.destroy();
compElements[compositions[i].id].gearAnim.destroy();
}
compElements[compositions[i].id] = null;
compositions.splice(i, 1);
i -= 1;
len -= 1;
}
}
}
function updateCompositionsList(ev) {
markCompsForRemoval();
var list = messageParser.parse(ev.data);
var i, len = list.length;
for (i = 0; i < len; i += 1) {
setCompositionData(list[i], i);
}
if(!isDataSynced) {
isDataSynced = true;
getCompositionsList();
}
clearRemovedComps();
checkCompositions();
mainController.saveData();
}
function getCompositionsList() {
csInterface.evalScript('bm_compsManager.updateData()');
}
function renderCompositions() {
if (renderButton.hasClass('disabled')) {
messageController.showMessage({message: 'You have no compositions to render<br /> Please select a composition and a destination folder.', type: 'fail'});
return;
}
csInterface.evalScript('bm_compsManager.render()');
}
function showSettings() {
mainController.showView('settings');
}
function showSnapshotView() {
mainController.showView('snapshot');
}
function updateFilter(ev){
stateData.filterValue = ev.target.value;
mainController.saveData();
checkCompositions();
}
function removeAllCompositions(){
if(!compositions){
return;
}
var i, len = compositions.length;
for (i = 0; i < len; i += 1) {
if(compElements[compositions[i].id]){
compElements[compositions[i].id].elem.detach();
compElements[compositions[i].id].anim.destroy();
compElements[compositions[i].id].gearAnim.destroy();
compElements[compositions[i].id] = null;
}
}
}
function setData(data) {
removeAllCompositions();
if(!data.compsSelection.compositions){
data.compsSelection.compositions = [];
data.compsSelection.filterValue = "";
isDataSynced = true;
} else {
isDataSynced = false;
}
stateData = data.compsSelection;
compositions = stateData.compositions;
filterInput.val(data.compsSelection.filterValue);
}
function init(csIntfc) {
view = $('#compsSelection');
settingsManager = SelectionSettings(view);
compsListContainer = view.find('.compsList');
csInterface = csIntfc;
csInterface.addEventListener('bm:compositions:list', updateCompositionsList);
view.find('.refresh').on('click', getCompositionsList);
view.find('.snapshot').on('click', showSnapshotView);
renderButton = view.find('.render');
renderButton.on('click', renderCompositions);
view.find('.settings').on('click', showSettings);
filterInput = view.find('#compsFilter');
filterInput.on('input change',updateFilter);
view.hide();
settingsManager.init();
}
function addFocusListener() {
window.onfocus = getCompositionsList;
}
function removeFocusListener() {
window.onfocus = null;
}
function show() {
view.show();
addFocusListener();
getCompositionsList();
}
function hide() {
view.hide();
removeFocusListener();
}
var ob = {};
ob.init = init;
ob.setData = setData;
ob.show = show;
ob.hide = hide;
return ob;
}());