blob: b30e19104e253c987455c5fde5b9a697d0e14b28 [file] [log] [blame]
/*jslint vars: true, plusplus: true, devel: true, nomen: true, regexp: true, indent: 4, maxerr: 50 */
/*global $, renderingData, folderData, bodymovin, LocalStorageManager, Mustache */
var compRenderController = (function () {
'use strict';
var view, renders, csInterface, compositions, cancelButton, returnButton;
var ob = {};
var fontsStorage, textHelper;
function addFolderEvent(elem, data) {
elem.on('click', function () {
var eScript = 'bm_compsManager.browseFolder(' + data.id + ')';
csInterface.evalScript(eScript);
});
elem.on('mouseover', function () {
data.folderAnim.goToAndStop(0);
data.folderAnim.play();
});
}
function destroyCompositions() {
if (compositions) {
var i, len = compositions.length;
for (i = 0; i < len; i += 1) {
compositions[i].anim.destroy();
compositions[i].folderAnim.destroy();
}
}
}
function renderStartHandler(ev) {
renders.empty();
if (typeof ev.data === 'string') {
compositions = JSON.parse(ev.data);
} else {
compositions = JSON.parse(JSON.stringify(ev.data));
}
var i, len = compositions.length, elem;
for (i = 0; i < len; i += 1) {
var template = document.getElementById('elementTemplate').innerHTML;
var output = Mustache.render(template, compositions[i]);
elem = $(output);
//elem.find('.compName').html(compositions[i].name);
elem.find('.statusText').html('Queued');
addFolderEvent(elem.find('.buttonHover'), compositions[i]);
compositions[i].elem = elem;
renders.append(elem);
var animContainer = elem.find('.compAnim')[0];
var animData = JSON.parse(renderingData);
var params = {
animType: 'svg',
wrapper: animContainer,
loop: true,
autoplay: true,
prerender: true,
animationData: animData
};
var anim = bodymovin.loadAnimation(params);
compositions[i].anim = anim;
animContainer = elem.find('.folder')[0];
animData = JSON.parse(folderData);
params = {
animType: 'svg',
wrapper: animContainer,
loop: false,
autoplay: false,
prerender: true,
animationData: animData
};
anim = bodymovin.loadAnimation(params);
compositions[i].folderAnim = anim;
}
cancelButton.show();
returnButton.hide();
}
function renderUpdateHandler(ev) {
var messageData = ev.data;
var id = messageData.compId.toString();
var i = 0, len = compositions.length;
while (i < len) {
if (id === compositions[i].id.toString()) {
break;
}
i += 1;
}
var compData = compositions[i];
var elem = compData.elem;
if (messageData.type === 'update') {
elem.find('.statusText').html(messageData.message);
if (messageData.progress) {
elem.find('.progressBar').css('width', (messageData.progress * 100) + '%');
}
}
if (messageData.isFinished) {
elem.addClass('rendered');
compData.fsPath = messageData.fsPath;
}
}
function getStoredFontData(name) {
var i = 0, len = fontsStorage.length;
while (i < len) {
if (fontsStorage[i].fName === name) {
return fontsStorage[i];
}
i += 1;
}
var ob = {
fName : name,
fFamily : name,
fWeight : 'normal',
fStyle : 'normal',
fPath : '',
fClass : '',
fOrigin: 'p'
};
fontsStorage.push(ob);
return ob;
}
function saveFontsData(fontsContainer, fonts) {
var fontsList = fontsContainer.find('.fontsList');
var fontsInfo = {
list: []
};
var fontOb;
var list = fontsInfo.list;
var children = fontsList.children();
children.each(function (index, item) {
fontOb = {};
fontOb.fName = fonts[index].name;
fontOb.fPath = $(item).find('.fontPath')[0].value;
fontOb.fClass = $(item).find('.fontClass')[0].value;
fontOb.fFamily = $(item).find('.fontFamily')[0].value;
fontOb.fWeight = $(item).find('.fontWeight')[0].value;
fontOb.fStyle = $(item).find('.fontStyle')[0].value;
var checked = $(item).find('input[type=radio]:checked');
var radioVal = checked.val();
fontOb.fOrigin = radioVal || 'n';
var storedOb = getStoredFontData(fonts[index].name);
storedOb.fPath = fontOb.fPath;
storedOb.fClass = fontOb.fClass;
storedOb.fFamily = fontOb.fFamily;
storedOb.fWeight = fontOb.fontWeight;
storedOb.fStyle = fontOb.fontStyle;
storedOb.fOrigin = fontOb.fOrigin;
list.push(fontOb);
});
LocalStorageManager.setItem('fonts', fontsStorage);
var fontsInfoString = JSON.stringify(fontsInfo);
var eScript = 'bm_renderManager.setFontData(' + fontsInfoString + ')';
csInterface.evalScript(eScript);
}
function renderFontsHandler(ev) {
var messageData = ev.data;
var id = messageData.compId.toString();
var i = 0, len = compositions.length;
while (i < len) {
if (id === compositions[i].id.toString()) {
break;
}
i += 1;
}
var compData = compositions[i];
var elem = compData.elem;
var fonts;
if ((typeof messageData.fonts) === 'string') {
fonts = JSON.parse(messageData.fonts);
} else {
fonts = messageData.fonts;
}
elem.find('.statusText').html('Select font families and font paths if necessary.');
var fontsContainer = elem.find('.fontsContainer');
fontsContainer.show();
var fontsList = fontsContainer.find('.fontsList');
len = fonts.length;
var fontElem, storedData, template, output;
for (i = 0; i < len; i += 1) {
fonts[i].__index = i;
storedData = getStoredFontData(fonts[i].name);
template = document.getElementById('fontTemplate').innerHTML;
output = Mustache.render(template, {fontData: fonts[i], storedData: storedData});
fontElem = $(output);
if (storedData.fOrigin) {
fontElem.find("input[type=radio][value=" + storedData.fOrigin + "]").prop('checked', true);
}
fontsList.append(fontElem);
}
fontsContainer.find('button.continue').on('click', function () {
saveFontsData(fontsContainer, fonts);
fontsContainer.hide();
});
}
function renderAtlasHandler(ev) {
var messageData = ev.data;
bm_binpacker.reset();
bm_binpacker.addBlocks(messageData.images);
var atlasPack = bm_binpacker.getPack();
var atlasDataString = JSON.stringify(atlasPack);
var eScript = 'bm_renderManager.setAtlasData(' + atlasDataString + ')';
csInterface.evalScript(eScript);
}
function renderCharsHandler(ev) {
var messageData = ev.data;
var chars;
if ((typeof messageData.chars) === 'string') {
chars = JSON.parse(messageData.chars);
} else {
chars = messageData.chars;
}
var i, len = chars.length;
for (i = 0; i < len; i += 1) {
var styles = chars[i].style.split(' ');
var j, jLen = styles.length;
var fStyle = 'normal';
var fWeight = 'normal';
for (j = 0; j < jLen; j += 1) {
if (styles[j].toLowerCase() === 'italic') {
fStyle = 'italic';
} else if (styles[j].toLowerCase() === 'black') {
fWeight = '900';
} else if (styles[j].toLowerCase() === 'extrabold') {
fWeight = '800';
} else if (styles[j].toLowerCase() === 'bold') {
fWeight = '700';
} else if (styles[j].toLowerCase() === 'semibold') {
fWeight = '600';
} else if (styles[j].toLowerCase() === 'medium') {
fWeight = '500';
} else if (styles[j].toLowerCase() === 'regular' || styles[j].toLowerCase() === 'normal') {
fWeight = '400';
} else if (styles[j].toLowerCase() === 'extralight') {
fWeight = '300';
} else if (styles[j].toLowerCase() === 'light' || styles[j].toLowerCase() === 'thin') {
fWeight = '200';
}
}
textHelper.setAttribute('font-style', fStyle);
textHelper.setAttribute('font-weight', fWeight);
textHelper.setAttribute('font-family', chars[i].fFamily);
textHelper.setAttribute('font-size', chars[i].size);
textHelper.setAttribute('font-size', 100);
textHelper.textContent = chars[i].ch === ' ' ? '\u00A0' : chars[i].ch;
/* Not using this for now.
var cLength = textHelper.getComputedTextLength();
chars[i].w = cLength;
*/
delete chars[i].font;
}
var charsInfoString = JSON.stringify(chars);
var eScript = 'bm_renderManager.setCharsData(' + charsInfoString + ')';
csInterface.evalScript(eScript);
}
function renderCompleteHandler() {
cancelButton.hide();
returnButton.show();
}
function init(csIntfc) {
fontsStorage = LocalStorageManager.getItem('fonts');
if (fontsStorage === null) {
fontsStorage = [];
LocalStorageManager.setItem('fonts', fontsStorage);
}
view = $('#compsRender');
renders = view.find('.renders');
view.hide();
csInterface = csIntfc;
csInterface.addEventListener('bm:render:start', renderStartHandler);
csInterface.addEventListener('bm:render:update', renderUpdateHandler);
csInterface.addEventListener('bm:render:complete', renderCompleteHandler);
csInterface.addEventListener('bm:render:fonts', renderFontsHandler);
csInterface.addEventListener('bm:render:chars', renderCharsHandler);
csInterface.addEventListener('bm:render:atlas', renderAtlasHandler);
cancelButton = view.find('.cancel');
returnButton = view.find('.return');
cancelButton.on('click', function () {
var eScript = 'bm_compsManager.cancel()';
csInterface.evalScript(eScript);
});
returnButton.on('click', function () {
var eScript = 'bm_compsManager.cancel()';
csInterface.evalScript(eScript);
});
returnButton.hide();
textHelper = document.getElementById('textHelper');
textHelper.setAttributeNS("http://www.w3.org/XML/1998/namespace", "xml:space", "preserve");
}
function show() {
view.show();
}
function hide() {
if (compositions) {
var i, len = compositions.length;
for (i = 0; i < len; i += 1) {
compositions[i].anim.goToAndStop(0);
}
}
view.hide();
}
function getCompositions() {
return compositions;
}
ob.init = init;
ob.show = show;
ob.hide = hide;
ob.getCompositions = getCompositions;
return ob;
}());