diff --git a/js/texturing/color.js b/js/texturing/color.js index 459a419d..cdae2eba 100644 --- a/js/texturing/color.js +++ b/js/texturing/color.js @@ -451,7 +451,7 @@ Interface.definePanels(() => { if (isApp) { ipcRenderer.on('set-main-color', (event, arg) => { - ColorPanel.set(arg, true); + ColorPanel.set(arg); }) } diff --git a/js/texturing/layers.js b/js/texturing/layers.js index b22b6f37..f4d0252c 100644 --- a/js/texturing/layers.js +++ b/js/texturing/layers.js @@ -153,12 +153,34 @@ class TextureLayer { setSize(width, height) { this.canvas.width = width; this.canvas.height = height; + return this; } toggleVisibility() { Undo.initEdit({layers: [this]}); this.visible = !this.visible; this.texture.updateChangesAfterEdit(); Undo.finishEdit('Toggle layer visibility'); + return this; + } + scrollTo() { + let el = document.querySelector(`#layers_list > li[layer_id="${this.uuid}"]`); + if (el) { + el.scrollIntoView({behavior: 'smooth', block: 'nearest'}); + } + return this; + } + addForEditing() { + let i = this.texture.layers.indexOf(this.texture.selected_layer); + if (i == -1) { + this.texture.layers.push(this); + } else { + this.texture.layers.splice(i+1, 0, this); + } + this.select(); + Vue.nextTick(() => { + this.scrollTo(); + }); + return this; } mergeDown(undo = true) { let down_layer = this.texture.layers[this.texture.layers.indexOf(this) - 1]; @@ -369,11 +391,30 @@ SharedActions.add('duplicate', { copy.name += '-copy'; Undo.initEdit({textures: [texture]}); let layer = new TextureLayer(copy, texture); - texture.layers.push(layer); - layer.select(); + layer.addForEditing(); Undo.finishEdit('Duplicate layer'); } }) +SharedActions.add('copy', { + subject: 'layer', + condition: () => Prop.active_panel == 'layers' && TextureLayer.selected, + run() { + let layer = TextureLayer.selected; + let copy = layer.getUndoCopy(true); + Clipbench.layer = copy; + } +}) +SharedActions.add('paste', { + subject: 'layer', + condition: () => Prop.active_panel == 'layers' && Texture.selected && Clipbench.layer, + run() { + let texture = Texture.selected; + Undo.initEdit({textures: [texture]}); + let layer = new TextureLayer(Clipbench.layer, texture); + layer.addForEditing(); + Undo.finishEdit('Paste layer'); + } +}) BARS.defineActions(() => { new Action('create_empty_layer', { @@ -387,8 +428,7 @@ BARS.defineActions(() => { name: `layer #${texture.layers.length+1}` }, texture); layer.setSize(texture.width, texture.height); - texture.layers.push(layer); - layer.select(); + layer.addForEditing(); Undo.finishEdit('Create empty layer'); BARS.updateConditions(); } diff --git a/js/texturing/painter.js b/js/texturing/painter.js index cbd6f302..c770d741 100644 --- a/js/texturing/painter.js +++ b/js/texturing/painter.js @@ -2099,8 +2099,7 @@ SharedActions.add('duplicate', { let image_data = canvas.getContext('2d').getImageData(0, 0, canvas.width, canvas.height); new_layer.setSize(canvas.width, canvas.height); new_layer.ctx.putImageData(image_data, 0, 0); - texture.layers.push(new_layer); - new_layer.select(); + new_layer.addForEditing(); new_layer.setLimbo(); texture.updateLayerChanges(true); texture.saved = false; diff --git a/js/texturing/textures.js b/js/texturing/textures.js index 9ec842b9..49e944e9 100644 --- a/js/texturing/textures.js +++ b/js/texturing/textures.js @@ -1358,8 +1358,7 @@ class Texture { let image_data = this.ctx.getImageData(0, 0, this.width, this.height); layer.setSize(this.width, this.height); layer.ctx.putImageData(image_data, 0, 0); - this.layers.push(layer); - layer.select(); + layer.addForEditing(); } if (undo) Undo.finishEdit('Enable layers on texture'); updateInterfacePanels();