blob: 97957ead0158a3cb3020cf7b39904ae06d770518 [file] [log] [blame]
/*jslint vars: true, plusplus: true, devel: true, nomen: true, regexp: true, indent: 4, maxerr: 50 */
/*global $, SystemPath, radioData, bodymovin, messageController, mainController */
var compSelectionController = (function () {
'use strict';
var view, compsListContainer, csInterface, renderButton;
var compositions = [];
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>';
function formatStringForEval(str) {
return '"' + str.replace(/\\/g, '\\\\') + '"';
}
function checkCompositions() {
var i = 0, len = compositions.length;
var flag = false;
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 () {
var ob = {}, settingsView, compData, tempData = {}, callback;
var segments, segmentsCheckbox, segmentsTextBox;
function updateSegmentsData() {
if (tempData.segmented) {
segments.addClass('active');
segmentsCheckbox.addClass('selected');
segmentsTextBox.prop('disabled', '');
} else {
segments.removeClass('active');
segmentsCheckbox.removeClass('selected');
segmentsTextBox.prop('disabled', 'disabled');
}
segmentsTextBox.val(tempData.segmentTime);
}
function handleSegmentCheckboxClick() {
tempData.segmented = !tempData.segmented;
updateSegmentsData();
}
function cancelSettings() {
settingsView.hide();
}
function saveSettings() {
tempData.segmentTime = segmentsTextBox.val();
compData = JSON.parse(JSON.stringify(tempData));
callback.apply(null, [compData]);
settingsView.hide();
}
function init() {
settingsView = view.find('.settingsView');
settingsView.hide();
segments = settingsView.find('.segments');
segments.find('.checkboxCombo').on('click', handleSegmentCheckboxClick);
segmentsCheckbox = segments.find('.checkbox');
segmentsTextBox = segments.find('.inputText');
settingsView.find('.buttons .cancel').on('click', cancelSettings);
settingsView.find('.buttons .return').on('click', saveSettings);
updateSegmentsData();
}
function show(data, cb) {
settingsView.show();
compData = data;
tempData = JSON.parse(JSON.stringify(compData));
callback = cb;
updateSegmentsData();
}
ob.init = init;
ob.show = show;
return ob;
}());
function addElemListeners(comp) {
var elem = comp.elem;
function handleStateClick() {
comp.selected = !comp.selected;
if (comp.selected) {
elem.addClass('selected');
comp.anim.play();
} else {
comp.anim.goToAndStop(0);
elem.removeClass('selected');
}
var eScript = 'bm_compsManager.setCompositionSelectionState(' + comp.id + ',' + comp.selected + ')';
csInterface.evalScript(eScript);
checkCompositions();
}
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);
}
function showElemSetings() {
settingsManager.show(comp.settings, saveSettings);
}
elem.find('.stateTd').on('click', handleStateClick);
elem.find('.settingsTd').on('click', showElemSetings);
elem.find('.destinationTd').on('click', handleDestination);
}
function setCompositionData(item) {
var i = 0, len = compositions.length, comp;
while (i < len) {
if (item.id === compositions[i].id) {
comp = compositions[i];
break;
}
i += 1;
}
if (!comp) {
comp = {
id: item.id,
elem: $(elementTemplate),
settings: {}
};
var animContainer = comp.elem.find('.state')[0];
var animData = JSON.parse(radioData);
var params = {
animType: 'canvas',
wrapper: animContainer,
loop: false,
autoplay: false,
prerender: true,
animationData: animData
};
var anim = bodymovin.loadAnimation(params);
comp.anim = anim;
comp.resized = false;
compositions.push(comp);
addElemListeners(comp);
}
comp.active = true;
comp.name = item.name;
comp.selected = item.selected;
comp.destination = item.destination;
comp.settings = item.settings;
var elem = comp.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');
}
compsListContainer.append(comp.elem);
if (!comp.resized) {
comp.anim.resize();
comp.resized = true;
}
}
function markCompsForRemoval() {
var i, len = compositions.length;
for (i = 0; i < len; i += 1) {
compositions[i].active = false;
compositions[i].elem.detach();
}
}
function clearRemovedComps() {
var i, len = compositions.length;
for (i = 0; i < len; i += 1) {
if (!compositions[i].active) {
compositions[i].anim.destroy();
compositions.splice(i, 1);
i -= 1;
len -= 1;
}
}
}
function updateCompositionsList(ev) {
markCompsForRemoval();
var list = JSON.parse(ev.data);
var i, len = list.length;
for (i = 0; i < len; i += 1) {
setCompositionData(list[i]);
}
clearRemovedComps();
checkCompositions();
}
function getCompositionsList() {
csInterface.evalScript('bm_compsManager.getCompositions()');
}
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 init(csIntfc) {
view = $('#compsSelection');
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);
view.hide();
settingsManager.init();
}
function show() {
view.show();
}
function hide() {
view.hide();
}
var ob = {};
ob.init = init;
ob.show = show;
ob.hide = hide;
return ob;
}());