diff --git a/js/Input.js b/js/Input.js index 093ab46..2f9fd38 100644 --- a/js/Input.js +++ b/js/Input.js @@ -75,11 +75,9 @@ const Input = (() => { //if no document has been created yet or there is a dialog box open ignore hotkeys if (!Startup.documentCreated() || Dialogue.isOpen()) return; - // if (e.key === "Escape") { - if (!selectionCanceled) { - tool.pencil.switchTo(); - } + console.log("esc"); + Events.emit("esc-pressed"); } else { switch (keyboardEvent.keyCode) { diff --git a/js/tools/MoveSelectionTool.js b/js/tools/MoveSelectionTool.js index 47771f3..5082957 100644 --- a/js/tools/MoveSelectionTool.js +++ b/js/tools/MoveSelectionTool.js @@ -3,12 +3,47 @@ class MoveSelectionTool extends Tool { selectionTool = undefined; endTool = undefined; switchFunc = undefined; + lastCopiedSelection = undefined; constructor (name, options, switchFunc, endTool) { super(name, options, switchFunc); this.switchFunc = switchFunc; this.endTool = endTool; + + Events.onCustom("esc-pressed", this.endSelection.bind(this)); + + Events.onCustom("ctrl+c", this.copySelection.bind(this)); + Events.onCustom("ctrl+x", this.cutSelection.bind(this)); + Events.onCustom("ctrl+v", this.pasteSelection.bind(this)); + } + + copySelection() { + this.lastCopiedSelection = this.currSelection; + } + + cutSelection() { + this.lastCopiedSelection = this.currSelection; + this.endSelection(); + this.currSelection = this.lastCopiedSelection; + // Cut the data + currentLayer.context.clearRect(this.currSelection.left, this.currSelection.top, + this.currSelection.width, this.currSelection.height); + } + + pasteSelection() { + if (this.lastCopiedSelection === undefined) + return; + // Finish the current selection and start a new one with the same data + this.endSelection(); + this.switchFunc(this); + this.currSelection = this.lastCopiedSelection; + + // Putting the vfx layer on top of everything + VFXLayer.canvas.style.zIndex = MAX_Z_INDEX; + this.onDrag(this.currMousePos); + + new HistoryState().EditCanvas(); } onStart(mousePos) { @@ -22,18 +57,16 @@ class MoveSelectionTool extends Tool { onDrag(mousePos) { super.onDrag(mousePos); - if (this.cursorInSelectedArea(mousePos)) { - this.currSelection = this.selectionTool.moveAnts(mousePos[0]/zoom, - mousePos[1]/zoom, this.currSelection.width, this.currSelection.height); + this.currSelection = this.selectionTool.moveAnts(mousePos[0]/zoom, + mousePos[1]/zoom, this.currSelection.width, this.currSelection.height); - // clear the entire tmp layer - TMPLayer.context.clearRect(0, 0, TMPLayer.canvas.width, TMPLayer.canvas.height); - // put the image data on the tmp layer with offset - TMPLayer.context.putImageData( - this.currSelection.data, - Math.round(mousePos[0] / zoom) - this.currSelection.width / 2, - Math.round(mousePos[1] / zoom) - this.currSelection.height / 2); - } + // clear the entire tmp layer + TMPLayer.context.clearRect(0, 0, TMPLayer.canvas.width, TMPLayer.canvas.height); + // put the image data on the tmp layer with offset + TMPLayer.context.putImageData( + this.currSelection.data, + Math.round(mousePos[0] / zoom) - this.currSelection.width / 2, + Math.round(mousePos[1] / zoom) - this.currSelection.height / 2); } onEnd(mousePos) { @@ -80,6 +113,8 @@ class MoveSelectionTool extends Tool { } endSelection() { + if (this.currSelection == undefined) + return; // Clearing the tmp (move preview) and vfx (ants) layers TMPLayer.context.clearRect(0, 0, TMPLayer.canvas.width, TMPLayer.canvas.height); VFXLayer.context.clearRect(0, 0, VFXLayer.canvas.width, VFXLayer.canvas.height); @@ -90,7 +125,7 @@ class MoveSelectionTool extends Tool { this.currSelection.left, this.currSelection.top, this.currSelection.width+1, this.currSelection.height+1 ); - let pasteData = this.currSelection.data.data; + let pasteData = this.currSelection.data.data.slice(); for (let i=0; i