Popup preview : refactor, cross browser, WIP

- moved preview controllers to pskl.controller.preview
- renamed PreviewFilmController to FramesListController
- renamed AnimatedPreviewController to PreviewController
- fixed init of popup preview on IE (use ownerDocument to create
  TiledFrameRenderer container) => should try with innerHTML
- moved open popup button inside the minimap (show on hover)
This commit is contained in:
jdescottes 2015-02-28 10:56:15 +01:00
parent 68a807ccb5
commit bcecd3058b
20 changed files with 260 additions and 136 deletions

View File

@ -80,3 +80,27 @@
.preview-toggle-onion-skin-enabled:hover { .preview-toggle-onion-skin-enabled:hover {
color : gold; color : gold;
} }
.open-popup-preview-button {
position : absolute;
z-index: 500;
right : 10px;
top : 10px;
width : 24px;
height: 18px;
border : 2px solid white;
background : rgba(0,0,0,0.3);
cursor : pointer;
opacity: 0;
transition: 0.3s opacity, 0.3s border-color;
}
.minimap-container:hover .open-popup-preview-button {
opacity: 1;
}
.open-popup-preview-button:hover {
border-color: gold;
}

View File

@ -57,14 +57,14 @@
this.drawingController = new pskl.controller.DrawingController(this.piskelController, this.paletteController, $('#drawing-canvas-container')); this.drawingController = new pskl.controller.DrawingController(this.piskelController, this.paletteController, $('#drawing-canvas-container'));
this.drawingController.init(); this.drawingController.init();
this.animationController = new pskl.controller.AnimatedPreviewController(this.piskelController, $('#animated-preview-canvas-container')); this.previewController = new pskl.controller.preview.PreviewController(this.piskelController, $('#animated-preview-canvas-container'));
this.animationController.init(); this.previewController.init();
this.minimapController = new pskl.controller.MinimapController(this.piskelController, this.animationController, this.drawingController, $('.minimap-container')); this.minimapController = new pskl.controller.MinimapController(this.piskelController, this.previewController, this.drawingController, $('.minimap-container'));
this.minimapController.init(); this.minimapController.init();
this.previewFilmController = new pskl.controller.PreviewFilmController(this.piskelController, $('#preview-list')); this.framesListController = new pskl.controller.FramesListController(this.piskelController, $('#preview-list'));
this.previewFilmController.init(); this.framesListController.init();
this.layersListController = new pskl.controller.LayersListController(this.piskelController); this.layersListController = new pskl.controller.LayersListController(this.piskelController);
this.layersListController.init(); this.layersListController.init();
@ -144,7 +144,7 @@
pskl.utils.serialization.Deserializer.deserialize(serializedPiskel, function (piskel) { pskl.utils.serialization.Deserializer.deserialize(serializedPiskel, function (piskel) {
piskel.setDescriptor(descriptor); piskel.setDescriptor(descriptor);
pskl.app.piskelController.setPiskel(piskel); pskl.app.piskelController.setPiskel(piskel);
pskl.app.animationController.setFPS(fps); pskl.app.previewController.setFPS(fps);
}); });
}, },
@ -165,8 +165,8 @@
render : function (delta) { render : function (delta) {
this.drawingController.render(delta); this.drawingController.render(delta);
this.animationController.render(delta); this.previewController.render(delta);
this.previewFilmController.render(delta); this.framesListController.render(delta);
}, },
getFirstFrameAsPng : function () { getFirstFrameAsPng : function () {

View File

@ -8,7 +8,7 @@
NEW_FRAME : 'newframe' NEW_FRAME : 'newframe'
}; };
ns.PreviewFilmController = function (piskelController, container) { ns.FramesListController = function (piskelController, container) {
this.piskelController = piskelController; this.piskelController = piskelController;
this.container = container; this.container = container;
@ -21,7 +21,7 @@
this.cachedFrameProcessor.setOutputCloner(this.clonePreviewCanvas_.bind(this)); this.cachedFrameProcessor.setOutputCloner(this.clonePreviewCanvas_.bind(this));
}; };
ns.PreviewFilmController.prototype.init = function() { ns.FramesListController.prototype.init = function() {
$.subscribe(Events.TOOL_RELEASED, this.flagForRedraw_.bind(this)); $.subscribe(Events.TOOL_RELEASED, this.flagForRedraw_.bind(this));
$.subscribe(Events.PISKEL_RESET, this.flagForRedraw_.bind(this)); $.subscribe(Events.PISKEL_RESET, this.flagForRedraw_.bind(this));
$.subscribe(Events.USER_SETTINGS_CHANGED, this.flagForRedraw_.bind(this)); $.subscribe(Events.USER_SETTINGS_CHANGED, this.flagForRedraw_.bind(this));
@ -33,22 +33,22 @@
this.updateScrollerOverflows(); this.updateScrollerOverflows();
}; };
ns.PreviewFilmController.prototype.flagForRedraw_ = function () { ns.FramesListController.prototype.flagForRedraw_ = function () {
this.redrawFlag = true; this.redrawFlag = true;
}; };
ns.PreviewFilmController.prototype.refreshZoom_ = function () { ns.FramesListController.prototype.refreshZoom_ = function () {
this.zoom = this.calculateZoom_(); this.zoom = this.calculateZoom_();
}; };
ns.PreviewFilmController.prototype.render = function () { ns.FramesListController.prototype.render = function () {
if (this.redrawFlag) { if (this.redrawFlag) {
this.createPreviews_(); this.createPreviews_();
this.redrawFlag = false; this.redrawFlag = false;
} }
}; };
ns.PreviewFilmController.prototype.updateScrollerOverflows = function () { ns.FramesListController.prototype.updateScrollerOverflows = function () {
var scroller = $('#preview-list-scroller'); var scroller = $('#preview-list-scroller');
var scrollerHeight = scroller.height(); var scrollerHeight = scroller.height();
var scrollTop = scroller.scrollTop(); var scrollTop = scroller.scrollTop();
@ -70,7 +70,7 @@
wrapper.toggleClass('bottom-overflow-visible', overflowBottom); wrapper.toggleClass('bottom-overflow-visible', overflowBottom);
}; };
ns.PreviewFilmController.prototype.onContainerClick_ = function (event) { ns.FramesListController.prototype.onContainerClick_ = function (event) {
var target = pskl.utils.Dom.getParentWithData(event.target, 'tileAction'); var target = pskl.utils.Dom.getParentWithData(event.target, 'tileAction');
if (!target) { if (!target) {
return; return;
@ -92,7 +92,7 @@
} }
}; };
ns.PreviewFilmController.prototype.createPreviews_ = function () { ns.FramesListController.prototype.createPreviews_ = function () {
this.container.html(""); this.container.html("");
// Manually remove tooltips since mouseout events were shortcut by the DOM refresh: // Manually remove tooltips since mouseout events were shortcut by the DOM refresh:
@ -122,7 +122,7 @@
/** /**
* @private * @private
*/ */
ns.PreviewFilmController.prototype.initDragndropBehavior_ = function () { ns.FramesListController.prototype.initDragndropBehavior_ = function () {
$("#preview-list").sortable({ $("#preview-list").sortable({
placeholder: "preview-tile-drop-proxy", placeholder: "preview-tile-drop-proxy",
@ -135,7 +135,7 @@
/** /**
* @private * @private
*/ */
ns.PreviewFilmController.prototype.onUpdate_ = function( event, ui ) { ns.FramesListController.prototype.onUpdate_ = function( event, ui ) {
var originFrameId = parseInt(ui.item.data("tile-number"), 10); var originFrameId = parseInt(ui.item.data("tile-number"), 10);
var targetInsertionId = $('.preview-tile').index(ui.item); var targetInsertionId = $('.preview-tile').index(ui.item);
@ -148,7 +148,7 @@
* @private * @private
* TODO(vincz): clean this giant rendering function & remove listeners. * TODO(vincz): clean this giant rendering function & remove listeners.
*/ */
ns.PreviewFilmController.prototype.createPreviewTile_ = function(tileNumber) { ns.FramesListController.prototype.createPreviewTile_ = function(tileNumber) {
var currentFrame = this.piskelController.getCurrentLayer().getFrameAt(tileNumber); var currentFrame = this.piskelController.getCurrentLayer().getFrameAt(tileNumber);
var previewTileRoot = document.createElement("li"); var previewTileRoot = document.createElement("li");
@ -213,12 +213,12 @@
return previewTileRoot; return previewTileRoot;
}; };
ns.PreviewFilmController.prototype.getCanvasForFrame = function (frame) { ns.FramesListController.prototype.getCanvasForFrame = function (frame) {
var canvas = this.cachedFrameProcessor.get(frame, this.zoom); var canvas = this.cachedFrameProcessor.get(frame, this.zoom);
return canvas; return canvas;
}; };
ns.PreviewFilmController.prototype.frameToPreviewCanvas_ = function (frame) { ns.FramesListController.prototype.frameToPreviewCanvas_ = function (frame) {
var canvasRenderer = new pskl.rendering.CanvasRenderer(frame, this.zoom); var canvasRenderer = new pskl.rendering.CanvasRenderer(frame, this.zoom);
canvasRenderer.drawTransparentAs(Constants.TRANSPARENT_COLOR); canvasRenderer.drawTransparentAs(Constants.TRANSPARENT_COLOR);
var canvas = canvasRenderer.render(); var canvas = canvasRenderer.render();
@ -226,7 +226,7 @@
return canvas; return canvas;
}; };
ns.PreviewFilmController.prototype.clonePreviewCanvas_ = function (canvas) { ns.FramesListController.prototype.clonePreviewCanvas_ = function (canvas) {
var clone = pskl.utils.CanvasUtils.clone(canvas); var clone = pskl.utils.CanvasUtils.clone(canvas);
clone.classList.add('tile-view', 'canvas'); clone.classList.add('tile-view', 'canvas');
return clone; return clone;
@ -235,7 +235,7 @@
/** /**
* Calculate the preview zoom depending on the piskel size * Calculate the preview zoom depending on the piskel size
*/ */
ns.PreviewFilmController.prototype.calculateZoom_ = function () { ns.FramesListController.prototype.calculateZoom_ = function () {
var frame = this.piskelController.getCurrentFrame(); var frame = this.piskelController.getCurrentFrame();
var frameSize = Math.max(frame.getHeight(), frame.getWidth()); var frameSize = Math.max(frame.getHeight(), frame.getWidth());

View File

@ -1,9 +1,9 @@
(function () { (function () {
var ns = $.namespace('pskl.controller'); var ns = $.namespace('pskl.controller');
ns.MinimapController = function (piskelController, animationController, drawingController, container) { ns.MinimapController = function (piskelController, previewController, drawingController, container) {
this.piskelController = piskelController; this.piskelController = piskelController;
this.animationController = animationController; this.previewController = previewController;
this.drawingController = drawingController; this.drawingController = drawingController;
this.container = container; this.container = container;
@ -50,11 +50,11 @@
// if the sprite is not a square, a margin is needed on the appropriate coordinate // if the sprite is not a square, a margin is needed on the appropriate coordinate
// before adding the offset coming from the drawing area // before adding the offset coming from the drawing area
var leftMargin = (containerWidth - Math.max(minimapSize.width, previewSize.width))/2; var leftMargin = (containerWidth - Math.max(minimapSize.width, previewSize.width))/2;
var leftOffset = offset.x * this.animationController.getZoom(); var leftOffset = offset.x * this.previewController.getZoom();
var left = leftMargin + leftOffset; var left = leftMargin + leftOffset;
var topMargin = (containerHeight - Math.max(minimapSize.height, previewSize.height))/2; var topMargin = (containerHeight - Math.max(minimapSize.height, previewSize.height))/2;
var topOffset = offset.y * this.animationController.getZoom(); var topOffset = offset.y * this.previewController.getZoom();
var top = topMargin + topOffset; var top = topMargin + topOffset;
this.minimapEl.style.display = 'block'; this.minimapEl.style.display = 'block';
@ -69,7 +69,7 @@
ns.MinimapController.prototype.getMinimapSize_ = function () { ns.MinimapController.prototype.getMinimapSize_ = function () {
// Calculate the ratio to translate drawing area sizes to animated preview sizes // Calculate the ratio to translate drawing area sizes to animated preview sizes
var drawingAreaZoom = this.drawingController.getRenderer().getZoom(); var drawingAreaZoom = this.drawingController.getRenderer().getZoom();
var animatedPreviewZoom = this.animationController.getZoom(); var animatedPreviewZoom = this.previewController.getZoom();
var ratio = drawingAreaZoom / animatedPreviewZoom; var ratio = drawingAreaZoom / animatedPreviewZoom;
var displaySize = this.drawingController.getRenderer().getDisplaySize(); var displaySize = this.drawingController.getRenderer().getDisplaySize();
@ -84,8 +84,8 @@
ns.MinimapController.prototype.getPreviewSize_ = function () { ns.MinimapController.prototype.getPreviewSize_ = function () {
var frame = this.piskelController.getCurrentFrame(); var frame = this.piskelController.getCurrentFrame();
var previewWidth = frame.getWidth() * this.animationController.getZoom(); var previewWidth = frame.getWidth() * this.previewController.getZoom();
var previewHeight = frame.getHeight() * this.animationController.getZoom(); var previewHeight = frame.getHeight() * this.previewController.getZoom();
return { return {
width : previewWidth, width : previewWidth,
@ -114,7 +114,7 @@
}; };
ns.MinimapController.prototype.getCoordinatesCenteredAround_ = function (x, y) { ns.MinimapController.prototype.getCoordinatesCenteredAround_ = function (x, y) {
var frameCoords = this.animationController.getCoordinates(x, y); var frameCoords = this.previewController.getCoordinates(x, y);
var frameWidth = this.piskelController.getCurrentFrame().getWidth(); var frameWidth = this.piskelController.getCurrentFrame().getWidth();
var frameHeight = this.piskelController.getCurrentFrame().getHeight(); var frameHeight = this.piskelController.getCurrentFrame().getHeight();

View File

@ -1,45 +0,0 @@
(function () {
var ns = $.namespace('pskl.controller');
ns.PopupPreviewController = function (piskelController) {
this.popup = null;
this.renderer = null;
};
ns.PopupPreviewController.prototype.init = function () {
pskl.utils.Event.addEventListener('.open-popup-preview-button', 'click', this.onOpenPopupPreviewClick_, this);
pskl.utils.Event.addEventListener(window, 'unload', this.onMainWindowUnload_, this);
};
ns.PopupPreviewController.prototype.isOpen = function () {
return !!this.popup;
};
ns.PopupPreviewController.prototype.onOpenPopupPreviewClick_ = function () {
if (!this.isOpen()) {
this.popup = this.createPopup_();
window.setTimeout(function () {
var container = this.popup.document.querySelector('.preview-container');
this.renderer = new pskl.rendering.frame.TiledFrameRenderer($(container));
}.bind(this), 200);
}
};
ns.PopupPreviewController.prototype.createPopup_ = function () {
var popup = window.open('about:blank', '', 'width=320,height=320');
popup.document.body.innerHTML = pskl.utils.Template.get('popup-preview-partial');
return popup;
};
ns.PopupPreviewController.prototype.render = function (frame) {
if (this.isOpen() && this.renderer) {
this.renderer.render(frame);
}
};
ns.PopupPreviewController.prototype.onMainWindowUnload_ = function () {
if (this.isOpen()) {
this.popup.close();
}
};
})();

View File

@ -140,6 +140,6 @@
var piskel = pskl.model.Piskel.fromLayers([layer], descriptor); var piskel = pskl.model.Piskel.fromLayers([layer], descriptor);
pskl.app.piskelController.setPiskel(piskel); pskl.app.piskelController.setPiskel(piskel);
pskl.app.animationController.setFPS(Constants.DEFAULT.FPS); pskl.app.previewController.setFPS(Constants.DEFAULT.FPS);
}; };
})(); })();

View File

@ -38,12 +38,12 @@
/** /**
* TODO : this should be removed * TODO : this should be removed
* FPS should be stored in the Piskel model and not in the * FPS should be stored in the Piskel model and not in the
* animationController * previewController
* Then piskelController should be able to return this information * Then piskelController should be able to return this information
* @return {Number} Frames per second for the current animation * @return {Number} Frames per second for the current animation
*/ */
ns.PiskelController.prototype.getFPS = function () { ns.PiskelController.prototype.getFPS = function () {
return pskl.app.animationController.getFPS(); return pskl.app.previewController.getFPS();
}; };
ns.PiskelController.prototype.getLayers = function () { ns.PiskelController.prototype.getLayers = function () {

View File

@ -0,0 +1,82 @@
(function () {
var ns = $.namespace('pskl.controller.preview');
ns.PopupPreviewController = function (piskelController) {
this.piskelController = piskelController;
this.popup = null;
this.renderer = null;
this.renderFlag = false;
};
ns.PopupPreviewController.prototype.init = function () {
pskl.utils.Event.addEventListener(window, 'unload', this.onMainWindowUnload_, this);
};
ns.PopupPreviewController.prototype.isOpen = function () {
return !!this.popup;
};
ns.PopupPreviewController.prototype.open = function () {
if (!this.isOpen()) {
this.popup = window.open('/popup-preview.html', '', 'width=320,height=320');
}
};
ns.PopupPreviewController.prototype.onPopupLoaded = function () {
pskl.utils.Event.addEventListener(this.popup, 'resize', this.onWindowResize_, this);
pskl.utils.Event.addEventListener(this.popup, 'unload', this.onPopupClosed_, this);
var container = this.popup.document.querySelector('.preview-container');
this.renderer = new pskl.rendering.frame.TiledFrameRenderer($(container));
this.updateZoom_();
this.renderFlag = true;
};
ns.PopupPreviewController.prototype.render = function (frame) {
if (this.isOpen() && this.renderer) {
this.renderer.render(frame);
this.renderFlag = false;
}
};
ns.PopupPreviewController.prototype.onWindowResize_ = function (frame) {
this.updateZoom_();
this.renderFlag = true;
};
ns.PopupPreviewController.prototype.updateZoom_ = function () {
var documentElement = this.popup.document.documentElement;
var wZoom = documentElement.clientWidth / this.piskelController.getWidth();
var hZoom = documentElement.clientHeight / this.piskelController.getHeight();
var zoom = Math.min(wZoom, hZoom);
this.renderer.setZoom(zoom);
var height = this.piskelController.getHeight() * zoom;
var width = this.piskelController.getWidth() * zoom;
var container = this.popup.document.querySelector('.preview-container');
container.style.height = height + 'px';
container.style.width = width + 'px';
var horizontalMargin = (documentElement.clientHeight - height) / 2;
container.style.marginTop = horizontalMargin + 'px';
container.style.marginBottom = horizontalMargin + 'px';
var verticalMargin = (documentElement.clientWidth - width) / 2;
container.style.marginLeft = verticalMargin + 'px';
container.style.marginRight = verticalMargin + 'px';
};
ns.PopupPreviewController.prototype.onPopupClosed_ = function () {
var popup = this.popup;
console.log(popup);
this.popup = null;
};
ns.PopupPreviewController.prototype.onMainWindowUnload_ = function () {
if (this.isOpen()) {
this.popup.close();
}
};
})();

View File

@ -1,10 +1,10 @@
(function () { (function () {
var ns = $.namespace('pskl.controller'); var ns = $.namespace('pskl.controller.preview');
// Preview is a square of PREVIEW_SIZE x PREVIEW_SIZE // Preview is a square of PREVIEW_SIZE x PREVIEW_SIZE
var PREVIEW_SIZE = 200; var PREVIEW_SIZE = 200;
ns.AnimatedPreviewController = function (piskelController, container) { ns.PreviewController = function (piskelController, container) {
this.piskelController = piskelController; this.piskelController = piskelController;
this.container = container; this.container = container;
@ -21,10 +21,10 @@
var frame = this.piskelController.getCurrentFrame(); var frame = this.piskelController.getCurrentFrame();
this.renderer = new pskl.rendering.frame.TiledFrameRenderer(this.container); this.renderer = new pskl.rendering.frame.TiledFrameRenderer(this.container);
this.popupPreviewController = new pskl.controller.PopupPreviewController(); this.popupPreviewController = new ns.PopupPreviewController(piskelController);
}; };
ns.AnimatedPreviewController.prototype.init = function () { ns.PreviewController.prototype.init = function () {
// the oninput event won't work on IE10 unfortunately, but at least will provide a // the oninput event won't work on IE10 unfortunately, but at least will provide a
// consistent behavior across all other browsers that support the input type range // consistent behavior across all other browsers that support the input type range
// see https://bugzilla.mozilla.org/show_bug.cgi?id=853670 // see https://bugzilla.mozilla.org/show_bug.cgi?id=853670
@ -34,6 +34,8 @@
this.toggleOnionSkinEl = document.querySelector('.preview-toggle-onion-skin'); this.toggleOnionSkinEl = document.querySelector('.preview-toggle-onion-skin');
this.toggleOnionSkinEl.addEventListener('click', this.toggleOnionSkin_.bind(this)); this.toggleOnionSkinEl.addEventListener('click', this.toggleOnionSkin_.bind(this));
pskl.utils.Event.addEventListener('.open-popup-preview-button', 'click', this.onOpenPopupPreviewClick_, this);
pskl.app.shortcutService.addShortcut('alt+O', this.toggleOnionSkin_.bind(this)); pskl.app.shortcutService.addShortcut('alt+O', this.toggleOnionSkin_.bind(this));
$.subscribe(Events.FRAME_SIZE_CHANGED, this.onFrameSizeChange_.bind(this)); $.subscribe(Events.FRAME_SIZE_CHANGED, this.onFrameSizeChange_.bind(this));
@ -50,7 +52,11 @@
this.updateContainerDimensions_(); this.updateContainerDimensions_();
}; };
ns.AnimatedPreviewController.prototype.onUserSettingsChange_ = function (evt, name, value) { ns.PreviewController.prototype.onOpenPopupPreviewClick_ = function () {
this.popupPreviewController.open();
};
ns.PreviewController.prototype.onUserSettingsChange_ = function (evt, name, value) {
if (name == pskl.UserSettings.ONION_SKIN) { if (name == pskl.UserSettings.ONION_SKIN) {
this.updateOnionSkinPreview_(); this.updateOnionSkinPreview_();
} else if (name == pskl.UserSettings.MAX_FPS) { } else if (name == pskl.UserSettings.MAX_FPS) {
@ -61,7 +67,7 @@
} }
}; };
ns.AnimatedPreviewController.prototype.updateOnionSkinPreview_ = function () { ns.PreviewController.prototype.updateOnionSkinPreview_ = function () {
var enabledClassname = 'preview-toggle-onion-skin-enabled'; var enabledClassname = 'preview-toggle-onion-skin-enabled';
if (pskl.UserSettings.get(pskl.UserSettings.ONION_SKIN)) { if (pskl.UserSettings.get(pskl.UserSettings.ONION_SKIN)) {
this.toggleOnionSkinEl.classList.add(enabledClassname); this.toggleOnionSkinEl.classList.add(enabledClassname);
@ -70,23 +76,23 @@
} }
}; };
ns.AnimatedPreviewController.prototype.updateMaxFPS_ = function () { ns.PreviewController.prototype.updateMaxFPS_ = function () {
var maxFps = pskl.UserSettings.get(pskl.UserSettings.MAX_FPS); var maxFps = pskl.UserSettings.get(pskl.UserSettings.MAX_FPS);
this.fpsRangeInput.get(0).setAttribute('max', maxFps); this.fpsRangeInput.get(0).setAttribute('max', maxFps);
this.setFPS(Math.min(this.fps, maxFps)); this.setFPS(Math.min(this.fps, maxFps));
}; };
ns.AnimatedPreviewController.prototype.updateZoom_ = function () { ns.PreviewController.prototype.updateZoom_ = function () {
var isTiled = pskl.UserSettings.get(pskl.UserSettings.TILED_PREVIEW); var isTiled = pskl.UserSettings.get(pskl.UserSettings.TILED_PREVIEW);
var zoom = isTiled ? 1 : this.calculateZoom_(); var zoom = isTiled ? 1 : this.calculateZoom_();
this.renderer.setZoom(zoom); this.renderer.setZoom(zoom);
}; };
ns.AnimatedPreviewController.prototype.getZoom = function () { ns.PreviewController.prototype.getZoom = function () {
return this.calculateZoom_(); return this.calculateZoom_();
}; };
ns.AnimatedPreviewController.prototype.getCoordinates = function(x, y) { ns.PreviewController.prototype.getCoordinates = function(x, y) {
var containerOffset = this.container.offset(); var containerOffset = this.container.offset();
x = x - containerOffset.left; x = x - containerOffset.left;
y = y - containerOffset.top; y = y - containerOffset.top;
@ -97,12 +103,12 @@
}; };
}; };
ns.AnimatedPreviewController.prototype.onFPSSliderChange = function (evt) { ns.PreviewController.prototype.onFPSSliderChange = function (evt) {
this.setFPS(parseInt(this.fpsRangeInput[0].value, 10)); this.setFPS(parseInt(this.fpsRangeInput[0].value, 10));
}; };
ns.AnimatedPreviewController.prototype.setFPS = function (fps) { ns.PreviewController.prototype.setFPS = function (fps) {
if (typeof fps === 'number') { if (typeof fps === 'number') {
this.fps = fps; this.fps = fps;
// reset // reset
@ -114,23 +120,24 @@
} }
}; };
ns.AnimatedPreviewController.prototype.getFPS = function () { ns.PreviewController.prototype.getFPS = function () {
return this.fps; return this.fps;
}; };
ns.AnimatedPreviewController.prototype.render = function (delta) { ns.PreviewController.prototype.render = function (delta) {
this.elapsedTime += delta; this.elapsedTime += delta;
var index = this.getNextIndex_(delta); var index = this.getNextIndex_(delta);
if (this.renderFlag || this.currentIndex != index) { if (this.shoudlRender_() || this.currentIndex != index) {
this.currentIndex = index; this.currentIndex = index;
var frame = this.piskelController.getFrameAt(this.currentIndex); var frame = this.piskelController.getFrameAt(this.currentIndex);
this.renderer.render(frame); this.renderer.render(frame);
this.popupPreviewController.render(frame);
this.renderFlag = false; this.renderFlag = false;
this.popupPreviewController.render(frame);
} }
}; };
ns.AnimatedPreviewController.prototype.getNextIndex_ = function (delta) { ns.PreviewController.prototype.getNextIndex_ = function (delta) {
if (this.fps === 0) { if (this.fps === 0) {
return this.piskelController.getCurrentFrameIndex(); return this.piskelController.getCurrentFrameIndex();
} else { } else {
@ -146,7 +153,7 @@
/** /**
* Calculate the preview zoom depending on the framesheet size * Calculate the preview zoom depending on the framesheet size
*/ */
ns.AnimatedPreviewController.prototype.calculateZoom_ = function () { ns.PreviewController.prototype.calculateZoom_ = function () {
var frame = this.piskelController.getCurrentFrame(); var frame = this.piskelController.getCurrentFrame();
var hZoom = PREVIEW_SIZE / frame.getHeight(), var hZoom = PREVIEW_SIZE / frame.getHeight(),
wZoom = PREVIEW_SIZE / frame.getWidth(); wZoom = PREVIEW_SIZE / frame.getWidth();
@ -154,12 +161,12 @@
return Math.min(hZoom, wZoom); return Math.min(hZoom, wZoom);
}; };
ns.AnimatedPreviewController.prototype.onFrameSizeChange_ = function () { ns.PreviewController.prototype.onFrameSizeChange_ = function () {
this.updateZoom_(); this.updateZoom_();
this.updateContainerDimensions_(); this.updateContainerDimensions_();
}; };
ns.AnimatedPreviewController.prototype.updateContainerDimensions_ = function () { ns.PreviewController.prototype.updateContainerDimensions_ = function () {
var containerEl = this.container.get(0); var containerEl = this.container.get(0);
var isTiled = pskl.UserSettings.get(pskl.UserSettings.TILED_PREVIEW); var isTiled = pskl.UserSettings.get(pskl.UserSettings.TILED_PREVIEW);
var height, width; var height, width;
@ -186,11 +193,15 @@
containerEl.style.marginRight = verticalMargin + 'px'; containerEl.style.marginRight = verticalMargin + 'px';
}; };
ns.AnimatedPreviewController.prototype.setRenderFlag_ = function (bool) { ns.PreviewController.prototype.setRenderFlag_ = function (bool) {
this.renderFlag = bool; this.renderFlag = bool;
}; };
ns.AnimatedPreviewController.prototype.toggleOnionSkin_ = function () { ns.PreviewController.prototype.shoudlRender_ = function () {
return this.renderFlag || this.popupPreviewController.renderFlag;
};
ns.PreviewController.prototype.toggleOnionSkin_ = function () {
var currentValue = pskl.UserSettings.get(pskl.UserSettings.ONION_SKIN); var currentValue = pskl.UserSettings.get(pskl.UserSettings.ONION_SKIN);
pskl.UserSettings.set(pskl.UserSettings.ONION_SKIN, !currentValue); pskl.UserSettings.set(pskl.UserSettings.ONION_SKIN, !currentValue);
}; };

View File

@ -69,7 +69,7 @@
pskl.utils.PiskelFileUtils.loadFromFile(file, function (piskel, descriptor, fps) { pskl.utils.PiskelFileUtils.loadFromFile(file, function (piskel, descriptor, fps) {
piskel.setDescriptor(descriptor); piskel.setDescriptor(descriptor);
pskl.app.piskelController.setPiskel(piskel); pskl.app.piskelController.setPiskel(piskel);
pskl.app.animationController.setFPS(fps); pskl.app.previewController.setFPS(fps);
}); });
this.closeDrawer_(); this.closeDrawer_();
} }

View File

@ -5,7 +5,9 @@
this.container = container; this.container = container;
this.setZoom(zoom); this.setZoom(zoom);
this.displayContainer = document.createElement('div'); var containerEl = container.get(0);
var containerDocument = containerEl.ownerDocument;
this.displayContainer = containerDocument.createElement('div');
this.displayContainer.classList.add('tiled-frame-container'); this.displayContainer.classList.add('tiled-frame-container');
container.get(0).appendChild(this.displayContainer); container.get(0).appendChild(this.displayContainer);

View File

@ -56,7 +56,7 @@
pskl.utils.serialization.Deserializer.deserialize(previousPiskel, function (piskel) { pskl.utils.serialization.Deserializer.deserialize(previousPiskel, function (piskel) {
piskel.setDescriptor(new pskl.model.piskel.Descriptor(previousInfo.name, previousInfo.description, true)); piskel.setDescriptor(new pskl.model.piskel.Descriptor(previousInfo.name, previousInfo.description, true));
pskl.app.piskelController.setPiskel(piskel); pskl.app.piskelController.setPiskel(piskel);
pskl.app.animationController.setFPS(previousInfo.fps); pskl.app.previewController.setFPS(previousInfo.fps);
}); });
}; };

View File

@ -56,7 +56,7 @@
if (window.confirm('This will replace your current animation')) { if (window.confirm('This will replace your current animation')) {
piskel.setDescriptor(descriptor); piskel.setDescriptor(descriptor);
pskl.app.piskelController.setPiskel(piskel); pskl.app.piskelController.setPiskel(piskel);
pskl.app.animationController.setFPS(fps); pskl.app.previewController.setFPS(fps);
} }
}; };

View File

@ -29,7 +29,7 @@
pskl.utils.serialization.Deserializer.deserialize(serializedPiskel, function (piskel) { pskl.utils.serialization.Deserializer.deserialize(serializedPiskel, function (piskel) {
piskel.setDescriptor(new pskl.model.piskel.Descriptor(name, description, true)); piskel.setDescriptor(new pskl.model.piskel.Descriptor(name, description, true));
pskl.app.piskelController.setPiskel(piskel); pskl.app.piskelController.setPiskel(piskel);
pskl.app.animationController.setFPS(fps); pskl.app.previewController.setFPS(fps);
}); });
}; };

View File

@ -83,10 +83,10 @@
"js/controller/CursorCoordinatesController.js", "js/controller/CursorCoordinatesController.js",
"js/controller/DrawingController.js", "js/controller/DrawingController.js",
"js/controller/drawing/DragHandler.js", "js/controller/drawing/DragHandler.js",
"js/controller/PreviewFilmController.js", "js/controller/FramesListController.js",
"js/controller/LayersListController.js", "js/controller/LayersListController.js",
"js/controller/PopupPreviewController.js", "js/controller/preview/PopupPreviewController.js",
"js/controller/AnimatedPreviewController.js", "js/controller/preview/PreviewController.js",
"js/controller/MinimapController.js", "js/controller/MinimapController.js",
"js/controller/ToolController.js", "js/controller/ToolController.js",
"js/controller/PaletteController.js", "js/controller/PaletteController.js",

View File

@ -29,6 +29,6 @@
"css/spectrum/spectrum-overrides.css", "css/spectrum/spectrum-overrides.css",
"css/bootstrap/bootstrap.css", "css/bootstrap/bootstrap.css",
"css/bootstrap/bootstrap-tooltip-custom.css", "css/bootstrap/bootstrap-tooltip-custom.css",
"css/preview-film-section.css", "css/frames-list.css",
"css/minimap.css" "css/minimap.css"
]; ];

74
src/popup-preview.html Normal file
View File

@ -0,0 +1,74 @@
<!doctype html>
<html>
<head>
<style>
body,
.popup-container ,
.preview-container,
.tiled-frame-container {
width : 100%;
height : 100%;
}
body {
margin: 0;
}
.popup-container {
position: absolute;
background : #333;
}
.preview-container {
position: relative;
}
.tiled-frame-container {
position: relative;
background-repeat : no-repeat;
}
.canvas-container .canvas-background {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
}
.light-picker-background,
.light-canvas-background .canvas-background {
background: url(../img/canvas_background/light_canvas_background.png) repeat;
}
.medium-picker-background,
.medium-canvas-background .canvas-background {
background: url(../img/canvas_background/medium_canvas_background.png) repeat;
}
.lowcont-medium-picker-background,
.lowcont-medium-canvas-background .canvas-background {
background: url(../img/canvas_background/lowcont_medium_canvas_background.png) repeat;
}
.lowcont-dark-picker-background,
.lowcont-dark-canvas-background .canvas-background {
background: url(../img/canvas_background/lowcont_dark_canvas_background.png) repeat;
}
</style>
<title>Preview</title>
</head>
<body>
<div class="popup-container lowcont-dark-canvas-background ">
<div class="preview-container canvas-container">
<div class="canvas-background"></div>
</div>
</div>
<script type="text/javascript">
window.addEventListener('load', function () {
window.opener.pskl.app.previewController.popupPreviewController.onPopupLoaded()
});
</script>
</body>
</html>

View File

@ -6,28 +6,4 @@
<div class="progress-bar-item progress-bar-status">{{status}}%</div> <div class="progress-bar-item progress-bar-status">{{status}}%</div>
</div> </div>
</script> </script>
<script type="text/template" id="popup-preview-partial">
<style>
body {
margin: 0;
}
.preview-container {
width : 100%;
height : 100%;
}
.tiled-frame-container {
height: 100%;
width: 100%;
position: relative;
background-repeat : repeat;
}
</style>
<div class="popup-container">
<div class="preview-container"></div>
</div>
</script>
</div> </div>

View File

@ -1,5 +1,6 @@
<div id="animated-preview-container" class="preview-container"> <div id="animated-preview-container" class="preview-container">
<div class="canvas-container-wrapper minimap-container"> <div class="canvas-container-wrapper minimap-container">
<div class="open-popup-preview-button" title="Open preview in popup" rel="tooltip" data-placement="bottom"></div>
<div id="animated-preview-canvas-container" class="canvas-container"> <div id="animated-preview-canvas-container" class="canvas-container">
<div class="canvas-background"></div> <div class="canvas-background"></div>
</div> </div>
@ -13,6 +14,5 @@
<input id="preview-fps" class="range-fps" type="range" min="0" max="24"/> <input id="preview-fps" class="range-fps" type="range" min="0" max="24"/>
</div> </div>
<div> <div>
<button class="open-popup-preview-button">Open in popup</button>
</div> </div>
</div> </div>