Feature #683: duplicate layer when SHIFT+CLICK on create layer button

This commit is contained in:
juliandescottes 2017-05-11 02:13:44 +02:00 committed by Julian Descottes
parent e6a65c0db4
commit af3d0fa48b
6 changed files with 58 additions and 4 deletions

View File

@ -17,6 +17,7 @@
this.rootEl.addEventListener('click', this.onClick_.bind(this)); this.rootEl.addEventListener('click', this.onClick_.bind(this));
this.toggleLayerPreviewEl.addEventListener('click', this.toggleLayerPreview_.bind(this)); this.toggleLayerPreviewEl.addEventListener('click', this.toggleLayerPreview_.bind(this));
this.initCreateLayerButton_();
this.initToggleLayerPreview_(); this.initToggleLayerPreview_();
this.renderLayerList_(); this.renderLayerList_();
@ -45,6 +46,14 @@
} }
}; };
ns.LayersListController.prototype.initCreateLayerButton_ = function () {
var tooltip = pskl.utils.TooltipFormatter.format('Create a layer', null, [
{key : 'shift', description : 'Clone current layer'}
]);
var addButton = this.rootEl.querySelector('[data-action="add"]');
addButton.setAttribute('title', tooltip);
};
ns.LayersListController.prototype.initToggleLayerPreview_ = function () { ns.LayersListController.prototype.initToggleLayerPreview_ = function () {
var descriptors = [{description : 'Opacity defined in PREFERENCES'}]; var descriptors = [{description : 'Opacity defined in PREFERENCES'}];
var helpText = 'Preview all layers'; var helpText = 'Preview all layers';
@ -117,7 +126,7 @@
var el = evt.target || evt.srcElement; var el = evt.target || evt.srcElement;
var index; var index;
if (el.classList.contains('button')) { if (el.classList.contains('button')) {
this.onButtonClick_(el); this.onButtonClick_(el, evt);
} else if (el.classList.contains('layer-name')) { } else if (el.classList.contains('layer-name')) {
index = pskl.utils.Dom.getData(el, 'layerIndex'); index = pskl.utils.Dom.getData(el, 'layerIndex');
this.piskelController.setCurrentLayerIndex(parseInt(index, 10)); this.piskelController.setCurrentLayerIndex(parseInt(index, 10));
@ -145,14 +154,18 @@
this.renderLayerList_(); this.renderLayerList_();
}; };
ns.LayersListController.prototype.onButtonClick_ = function (button) { ns.LayersListController.prototype.onButtonClick_ = function (button, evt) {
var action = button.getAttribute('data-action'); var action = button.getAttribute('data-action');
if (action == 'up') { if (action == 'up') {
this.piskelController.moveLayerUp(); this.piskelController.moveLayerUp();
} else if (action == 'down') { } else if (action == 'down') {
this.piskelController.moveLayerDown(); this.piskelController.moveLayerDown();
} else if (action == 'add') { } else if (action == 'add') {
if (evt.shiftKey) {
this.piskelController.duplicateCurrentLayer();
} else {
this.piskelController.createLayer(); this.piskelController.createLayer();
}
} else if (action == 'delete') { } else if (action == 'delete') {
this.piskelController.removeCurrentLayer(); this.piskelController.removeCurrentLayer();
} else if (action == 'merge') { } else if (action == 'merge') {

View File

@ -231,6 +231,13 @@
return name; return name;
}; };
ns.PiskelController.prototype.duplicateCurrentLayer = function () {
var layer = this.getCurrentLayer();
var clone = pskl.utils.LayerUtils.clone(layer);
this.piskel.addLayer(clone);
this.setCurrentLayerIndex(this.piskel.getLayers().length - 1);
};
ns.PiskelController.prototype.createLayer = function (name) { ns.PiskelController.prototype.createLayer = function (name) {
if (!name) { if (!name) {
name = this.generateLayerName_(); name = this.generateLayerName_();

View File

@ -31,6 +31,7 @@
this.saveWrap_('duplicateFrameAt', true); this.saveWrap_('duplicateFrameAt', true);
this.saveWrap_('moveFrame', true); this.saveWrap_('moveFrame', true);
this.saveWrap_('createLayer', true); this.saveWrap_('createLayer', true);
this.saveWrap_('duplicateCurrentLayer', true);
this.saveWrap_('mergeDownLayerAt', true); this.saveWrap_('mergeDownLayerAt', true);
this.saveWrap_('moveLayerUp', true); this.saveWrap_('moveLayerUp', true);
this.saveWrap_('moveLayerDown', true); this.saveWrap_('moveLayerDown', true);

View File

@ -2,6 +2,13 @@
var ns = $.namespace('pskl.utils'); var ns = $.namespace('pskl.utils');
ns.LayerUtils = { ns.LayerUtils = {
clone : function (layer) {
var clonedFrames = layer.getFrames().map(function (frame) {
return frame.clone();
});
return pskl.model.Layer.fromFrames(layer.getName() + ' (clone)', clonedFrames);
},
mergeLayers : function (layerA, layerB) { mergeLayers : function (layerA, layerB) {
var framesA = layerA.getFrames(); var framesA = layerA.getFrames();
var framesB = layerB.getFrames(); var framesB = layerB.getFrames();

View File

@ -7,7 +7,7 @@
<div class="toolbox-buttons"> <div class="toolbox-buttons">
<button data-action="add" <button data-action="add"
class="button layers-button piskel-icon-plus" class="button layers-button piskel-icon-plus"
title="Create a new layer" rel="tooltip" data-placement="top" ></button> rel="tooltip" data-placement="top" ></button>
<button data-action="up" <button data-action="up"
class="button layers-button piskel-icon-arrow-up-fat" class="button layers-button piskel-icon-arrow-up-fat"

View File

@ -53,4 +53,30 @@ describe("LayerUtils test", function() {
['rgba(255,0,0,0.5)', B] ['rgba(255,0,0,0.5)', B]
]); ]);
}); });
it("clones a layer", function() {
var grid1 = [
[B, T],
[T, B]
];
var grid2 = [
[R, B],
[B, R]
];
// when
var layer = new pskl.model.Layer('l1');
layer.addFrame(pskl.model.Frame.fromPixelGrid(grid1));
layer.addFrame(pskl.model.Frame.fromPixelGrid(grid2));
// then
var clone = pskl.utils.LayerUtils.clone(layer);
var clonedFrame = clone.getFrameAt(0);
// verify
frameEqualsGrid(clone.getFrameAt(0), grid1);
frameEqualsGrid(clone.getFrameAt(1), grid2);
expect(clone.getName()).toBe('l1 (clone)');
});
}); });