taking svg snapshot from after effects
diff --git a/build/extension/bodymovin.zxp b/build/extension/bodymovin.zxp
index 041feed..4c8b851 100644
--- a/build/extension/bodymovin.zxp
+++ b/build/extension/bodymovin.zxp
Binary files differ
diff --git a/extension/css/snapshot.css b/extension/css/snapshot.css
index b2d8351..f9790c0 100644
--- a/extension/css/snapshot.css
+++ b/extension/css/snapshot.css
@@ -15,12 +15,101 @@
width: 100%;
}
+#snapshot .header{
+ padding-top: 10px;
+ padding-bottom: 10px;
+}
+
+#snapshot .header .buttons{
+ margin-top: 10px;
+}
+
#snapshot h1{
- color: #EAD3A8;
+ color: #D23641;
+ margin: 0;
}
#snapshot .animContainer{
width: 100%;
- height: 400px;
+ background-color: #6E6568;
+}
+
+#snapshot .controls{
+ height: 40px;
+ width: 100%;
+ background-color: #EAD3A8;
+ border-top: 1px solid #484043;
+ position: relative;
+}
+
+#snapshot .controls .snapshotButton{
+ float: left;
+ margin-top: 5px;
+ margin-left: 4px;
+}
+
+#snapshot .controls .slider{
+ width: 100%;
+ height: 2px;
+ background-color: #D23641;
+ cursor: pointer;
+}
+
+#snapshot .controls .thumb{
+ width: 10px;
+ height: 10px;
+ border-radius: 50%;
+ background-color: #D23641;
+ border: 1px solid #FFFFFF;
+ position: absolute;
+ left: -5px;
+ top: -5px;
+ cursor: pointer;
+ pointer-events: none;
+}
+
+#snapshot .controls .frames{
+ float: right;
+ padding: 10px;
+ color: #D23641;
+ font-size: 12px;
+ line-height: 20px;
+}
+
+#snapshot .controls .frames .current{
+ background-color: #484043;
+ display: inline-block;
+ vertical-align: top;
+ min-width: 20px;
+ height: 20px;
+ padding: 0px 2px;
+ text-align: right;
+}
+
+#snapshot .controls .frames .total{
+ display: inline-block;
+ vertical-align: top;
+}
+
+#snapshot .rendersSelection {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-color: rgba(0,0,0,.8);
+}
+
+#snapshot .rendersSelection .listContainer{
+ text-align: center;
+}
+
+#snapshot .rendersSelection .topSpace{
+ height: 10%;
+}
+
+#snapshot .rendersSelection .listContainer .generalButton{
+ display: block;
+ margin: auto;
}
\ No newline at end of file
diff --git a/extension/index.html b/extension/index.html
index 8bcffe2..feae247 100644
--- a/extension/index.html
+++ b/extension/index.html
@@ -48,14 +48,33 @@
</div>
</div>
<div id='snapshot'>
- <h1>Select animation</h1>
- <div class='buttons'>
- <button class='generalButton rightFloat current'>Current renders</button>
- <div class='buttonSeparator rightFloat'></div>
- <button class='generalButton rightFloat browse'>Browse</button>
- <button class='generalButton return'>Back</button>
+ <div class='header'>
+ <h1>Select animation</h1>
+ <div class='buttons'>
+ <button class='generalButton rightFloat current'>Current renders</button>
+ <div class='buttonSeparator rightFloat'></div>
+ <button class='generalButton rightFloat browse'>Browse</button>
+ <button class='generalButton return'>Back</button>
+ </div>
</div>
<div class="animContainer"></div>
+ <div class="controls">
+ <div class="slider"></div>
+ <div class="thumb"></div>
+ <button class="snapshotButton generalButton highlightButton">Take Snapshot</button>
+ <div class="frames">
+ <div class="current" contenteditable="true"></div>
+ <div class="total" >/<span class='value'></span></div>
+ </div>
+ </div>
+ <div class="rendersSelection">
+ <div class="topSpace"></div>
+ <div class="listContainer">
+
+ </div>
+ <div>
+ </div>
+ </div>
</div>
<div id='info'>
<div class='buttons'>
diff --git a/extension/js/controllers/CompRenderController.js b/extension/js/controllers/CompRenderController.js
index 822f63f..121efd0 100644
--- a/extension/js/controllers/CompRenderController.js
+++ b/extension/js/controllers/CompRenderController.js
@@ -90,6 +90,7 @@
}
if (messageData.isFinished) {
elem.addClass('rendered');
+ compData.renderData = messageData.data.substr(7);
}
}
@@ -134,9 +135,14 @@
view.hide();
}
+ function getCompositions() {
+ return compositions;
+ }
+
ob.init = init;
ob.show = show;
ob.hide = hide;
+ ob.getCompositions = getCompositions;
return ob;
}());
\ No newline at end of file
diff --git a/extension/js/controllers/snapshotController.js b/extension/js/controllers/snapshotController.js
index a5d461b..748dbe6 100644
--- a/extension/js/controllers/snapshotController.js
+++ b/extension/js/controllers/snapshotController.js
@@ -1,15 +1,24 @@
/*jslint vars: true, plusplus: true, devel: true, nomen: true, regexp: true, indent: 4, maxerr: 50 */
-/*global $, alertData, successData, bodymovin, mainController */
+/*global $, alertData, successData, bodymovin, mainController, compRenderController, messageController */
var snapshotController = (function () {
'use strict';
- var ob = {}, view, csInterface, anim, animContainer, showing = false;
+ var ob = {}, view, csInterface, anim, header, controls, current, animContainer, slider, thumb, snapshotButton, $window, showing = false;
+ var totalFrames, currentFrame, sliderWidth, rendersSelection, listContainer;
function showSelection() {
mainController.showView('selection');
}
- function displayCurrentRenders() {
-
+ function showControls() {
+ controls.find('.snapshotButton').show();
+ controls.find('.frames .total').show();
+ current.show();
+ }
+
+ function hideControls() {
+ controls.find('.snapshotButton').hide();
+ controls.find('.frames .total').hide();
+ current.hide();
}
function browseFiles() {
@@ -17,29 +26,134 @@
csInterface.evalScript(eScript);
}
- function handleFilePath(ev) {
- var jsonData = JSON.parse(ev.data.substr(7));
- //var result = window.cep.fs.readFile(path);
+ function updateControls(origin) {
+ if (origin !== 'input') {
+ controls.find('.frames .current').html(currentFrame);
+ }
+ if (anim) {
+ anim.goToAndStop(currentFrame + 1, true);
+ }
+ var x = (currentFrame / totalFrames) * sliderWidth;
+ thumb.css('left', x - 5 + 'px');
+ }
+
+ function loadAnimation(data) {
+ var jsonData = JSON.parse(data);
+ totalFrames = jsonData.animation.totalFrames;
+ controls.find('.frames .total .value').html(totalFrames);
+ currentFrame = 1;
if (anim) {
anim.destroy();
}
+ updateControls();
var params = {
animType: 'svg',
- wrapper: animContainer,
+ wrapper: animContainer[0],
loop: false,
autoplay: false,
prerender: true,
animationData: jsonData
};
anim = bodymovin.loadAnimation(params);
+ showControls();
+ }
+
+ function addSelectionListener(elem, data) {
+ elem.on('click', function () {
+ rendersSelection.hide();
+ loadAnimation(data.renderData);
+ });
+ }
+
+ function displayCurrentRenders() {
+ var compositions = compRenderController.getCompositions();
+ if (!compositions || compositions.length === 0) {
+ messageController.showMessage({type: 'alert', message: 'You have no recent renders.\n Try browsing your files'});
+ } else if (compositions.length === 1) {
+ loadAnimation(compositions[0].renderData);
+ } else {
+ rendersSelection.show();
+ listContainer.empty();
+ var i, len = compositions.length;
+ var li;
+ for (i = 0; i < len; i += 1) {
+ li = $('<button class="generalButton">');
+ li.html(compositions[i].name);
+ listContainer.append(li);
+ addSelectionListener(li, compositions[i]);
+ }
+ }
+ }
+
+ function handleFilePath(ev) {
+ loadAnimation(ev.data.substr(7));
}
function handleWindowResize() {
if (!showing) {
return;
}
- console.log($(window).height());
- console.log($(window).width());
+ animContainer.css('height', $window.height() - 2 - header.outerHeight() - controls.outerHeight() + 'px');
+ sliderWidth = slider.width();
+
+ }
+
+ function frameChangeHandler() {
+ var num = parseInt(current.html(), 10);
+ if (isNaN(num)) {
+ return;
+ }
+ if (num < 0) {
+ num = 0;
+ } else if (num >= totalFrames) {
+ num = totalFrames - 1;
+ }
+ currentFrame = num;
+ updateControls('input');
+ }
+
+ function updateSliderValue(pageX) {
+ var x = pageX - slider.offset().left;
+ var perc = x / sliderWidth;
+ if (perc < 0) {
+ perc = 0;
+ } else if (perc > 1) {
+ perc = 1;
+ }
+ currentFrame = Math.round(perc * totalFrames);
+ updateControls();
+ }
+
+ function sliderMove(ev) {
+ updateSliderValue(ev.pageX);
+ }
+
+ function sliderUp(ev) {
+ $window.off('mousemove', sliderMove);
+ $window.off('mouseup', sliderUp);
+ }
+
+ function sliderDown(ev) {
+ $window.on('mouseup', sliderUp);
+ $window.on('mousemove', sliderMove);
+ updateSliderValue(ev.pageX);
+ }
+
+ function addSliderListeners() {
+
+ slider = controls.find('.slider');
+ thumb = controls.find('.thumb');
+ slider.on('mousedown', sliderDown);
+ }
+
+ function saveSnapshot() {
+ var svgData = animContainer[0].innerHTML;
+ var result = window.cep.fs.showSaveDialogEx('Select location', '', ['*.svg'], 'snapshot.svg');
+ var targetFilePath = result.data;
+ var writeResult = window.cep.fs.writeFile(targetFilePath, svgData);
+ if (0 !== writeResult.err) {
+ console.log('faillled');
+ }
}
function init(csIntfc) {
@@ -49,15 +163,27 @@
view.find('.buttons .current').on('click', displayCurrentRenders);
view.find('.buttons .browse').on('click', browseFiles);
view.find('.return').on('click', showSelection);
- animContainer = view.find('.animContainer')[0];
+ animContainer = view.find('.animContainer');
+ controls = view.find('.controls');
+ controls.find('.snapshotButton').on('click', saveSnapshot);
+ current = controls.find('.frames .current');
+ current.on('input', frameChangeHandler);
+ header = view.find('.header');
+ rendersSelection = view.find('.rendersSelection');
+ listContainer = rendersSelection.find('.listContainer');
+ rendersSelection.hide();
+ $window = $(window);
csInterface.addEventListener('bm:file:path', handleFilePath);
$(window).on('resize', handleWindowResize);
+ addSliderListeners();
+ hideControls();
}
function show() {
if (!showing) {
showing = true;
view.show();
+ handleWindowResize();
}
}
@@ -65,6 +191,8 @@
if (showing) {
showing = false;
view.hide();
+ slider.off('mouseup', sliderUp);
+ slider.off('mousemove', sliderMove);
}
}
diff --git a/extension/jsx/renderManager.jsx b/extension/jsx/renderManager.jsx
index ba0813d..67ef0ef 100644
--- a/extension/jsx/renderManager.jsx
+++ b/extension/jsx/renderManager.jsx
@@ -3,7 +3,7 @@
var bm_renderManager = (function () {
'use strict';
- var ob = {}, pendingLayers = [], pendingComps = [], destinationPath, currentCompID, totalLayers, currentLayer;
+ var ob = {}, pendingLayers = [], pendingComps = [], destinationPath, currentCompID, currentComp, totalLayers, currentLayer;
function verifyTrackLayer(layerData, comp, pos) {
var nextLayerInfo = comp.layers[pos + 2];
@@ -107,7 +107,7 @@
} catch (err) {
bm_eventDispatcher.sendEvent('bm:alert', {message: 'Could not write file.<br /> Make sure you have enabled scripts to write files. <br /> Edit > Preferences > General > Allow Scripts to Write Files and Access Network '});
}
- bm_eventDispatcher.sendEvent('bm:render:update', {type: 'update', message: 'Render finished ', compId: currentCompID, progress: 1, isFinished: true});
+ bm_eventDispatcher.sendEvent('bm:render:update', {type: 'update', message: 'Render finished ', compId: currentCompID, progress: 1, isFinished: true, data: '__PFX__' + string});
bm_compsManager.renderComplete();
}