/* Copy mode will also to copy an area, this mode is intended to work with the paste made */
|
|
define([], function() {
|
|
|
|
function initGui() {
|
|
PaintApp.elements.copyButton = document.getElementById('copy-button');
|
|
PaintApp.paletteModesButtons.push(PaintApp.elements.copyButton);
|
|
PaintApp.elements.copyButton.addEventListener('click', function() {
|
|
PaintApp.paletteRemoveActiveClass();
|
|
PaintApp.addActiveClassToElement(PaintApp.elements.copyButton);
|
|
PaintApp.switchMode('Copy');
|
|
});
|
|
}
|
|
|
|
var Copy = {
|
|
initGui: initGui,
|
|
begin: undefined,
|
|
end: undefined,
|
|
onMouseDown: function(event) {
|
|
if (PaintApp.data.currentElement) {
|
|
PaintApp.data.currentElement.element.parentElement.removeChild(PaintApp.data.currentElement.element);
|
|
PaintApp.data.currentElement = undefined;
|
|
}
|
|
|
|
begin = event.point;
|
|
var left = event.point.x + 'px';
|
|
var top = event.point.y + 55 + 'px';
|
|
|
|
/* We are creating a floating div where the user clicked */
|
|
|
|
var element = document.createElement('div');
|
|
element.style.position = 'absolute';
|
|
element.style.padding = '0px';
|
|
element.style.width = '1px';
|
|
element.style.height = '1px';
|
|
element.style.opacity = '0.5';
|
|
element.style.pointerEvents = 'none';
|
|
element.style.borderRadius = '0px';
|
|
element.style.border = '5px dotted #500';
|
|
element.style.left = left;
|
|
element.style.top = top;
|
|
element.style.verticalAlign = 'bottom';
|
|
|
|
document.body.appendChild(element);
|
|
/* Left and top relies on getBoundingClientRect so we need to set values after the DOM append */
|
|
|
|
element.style.left = parseInt(left) - element.getBoundingClientRect().width / 2 + 'px';
|
|
element.style.top = parseInt(top) - element.getBoundingClientRect().height / 2 + 'px';
|
|
|
|
/* We store the currentElement */
|
|
PaintApp.data.currentElement = {
|
|
type: 'copy/paste',
|
|
element: element,
|
|
startPoint: {
|
|
x: parseInt(element.style.left) + element.getBoundingClientRect().width / 2,
|
|
y: parseInt(element.style.top) + element.getBoundingClientRect().height / 2
|
|
}
|
|
};
|
|
},
|
|
|
|
onMouseDrag: function(event) {
|
|
/* We resize the floating element with the user drag */
|
|
|
|
var end = event.point;
|
|
if (begin.x <= end.x) {
|
|
PaintApp.data.currentElement.element.style.width = end.x - begin.x + 'px';
|
|
} else {
|
|
PaintApp.data.currentElement.element.style.width = 0 + 'px';
|
|
}
|
|
if (begin.y <= end.y) {
|
|
PaintApp.data.currentElement.element.style.height = Math.abs(begin.y - end.y) + 'px';
|
|
} else {
|
|
PaintApp.data.currentElement.element.style.height = 0 + 'px';
|
|
}
|
|
},
|
|
|
|
onMouseUp: function(event) {
|
|
/* When the user stops clicking we will do a calculation of the selected area */
|
|
|
|
var end = event.point;
|
|
end.y = end.y + 55;
|
|
var width = parseInt(PaintApp.data.currentElement.element.style.width);
|
|
var height = parseInt(PaintApp.data.currentElement.element.style.height);
|
|
var canvas = PaintApp.elements.canvas;
|
|
var ctx = PaintApp.elements.canvas.getContext('2d');
|
|
|
|
if (begin.x < end.x && begin.y < end.y) {
|
|
/* We save the whole canvas and then cut the selection corresponding to the floating selection */
|
|
try {
|
|
PaintApp.modes.Paste.data = canvas.toDataURL();
|
|
} catch (e) {
|
|
return;
|
|
}
|
|
var imgData = ctx.getImageData(begin.x * window.devicePixelRatio, begin.y * window.devicePixelRatio, width * window.devicePixelRatio, height * window.devicePixelRatio);
|
|
canvas = document.createElement('canvas');
|
|
canvas.width = width * window.devicePixelRatio;
|
|
canvas.height = height * window.devicePixelRatio;
|
|
canvas.getContext('2d').putImageData(imgData, 0, 0);
|
|
try {
|
|
imgData = canvas.toDataURL();
|
|
} catch (e) {
|
|
return;
|
|
}
|
|
|
|
/* We fill the paste mode with the image, width and height and then switch to paste mode */
|
|
PaintApp.modes.Paste.dataImage = {
|
|
width: width / window.devicePixelRatio,
|
|
height: height / window.devicePixelRatio,
|
|
data: imgData
|
|
};
|
|
PaintApp.elements.pasteButton.click();
|
|
}
|
|
}
|
|
};
|
|
return Copy;
|
|
});
|