/* PaintApp is a big object containing UI stuff, libraries and helpers */
|
|
define([], function() {
|
|
/* Function to disable all active class inside the toolbar */
|
|
function paletteRemoveActiveClass() {
|
|
for (var i = 0; i < PaintApp.paletteModesButtons.length; i++) {
|
|
PaintApp.paletteModesButtons[i].className = PaintApp.paletteModesButtons[i].className.replace(/(?:^|\s)active(?!\S)/g, '');
|
|
}
|
|
}
|
|
|
|
/* Function to add active class to a specific element */
|
|
function addActiveClassToElement(element) {
|
|
element.className += ' active';
|
|
}
|
|
|
|
/* Switch current drawing mode */
|
|
function switchMode(newMode) {
|
|
saveCanvas();
|
|
|
|
PaintApp.data.mode = newMode;
|
|
PaintApp.handleCurrentFloatingElement();
|
|
|
|
PaintApp.data.tool.onMouseDown = PaintApp.modes[newMode].onMouseDown;
|
|
PaintApp.data.tool.onMouseDrag = PaintApp.modes[newMode].onMouseDrag;
|
|
PaintApp.data.tool.onMouseUp = PaintApp.modes[newMode].onMouseUp;
|
|
}
|
|
|
|
/* Clear the canvas */
|
|
function clearCanvas() {
|
|
var ctx = PaintApp.elements.canvas.getContext('2d');
|
|
ctx.fillStyle = "#ffffff"
|
|
ctx.fillRect(0, 0, parseInt(PaintApp.elements.canvas.style.width), parseInt(PaintApp.elements.canvas.style.height));
|
|
PaintApp.saveCanvas();
|
|
}
|
|
|
|
/* Trigger undo click, undo using the history */
|
|
function undoCanvas() {
|
|
//Removing any floating element
|
|
PaintApp.handleCurrentFloatingElement();
|
|
if (PaintApp.data.history.undo.length < 2) {
|
|
return;
|
|
}
|
|
|
|
PaintApp.modes.Pen.point = undefined;
|
|
var canvas = PaintApp.elements.canvas;
|
|
var ctx = canvas.getContext('2d');
|
|
var img = new Image();
|
|
var imgSrc = PaintApp.data.history.undo[PaintApp.data.history.undo.length - 2];
|
|
var imgSrc2 = PaintApp.data.history.undo[PaintApp.data.history.undo.length - 1];
|
|
|
|
/* Loading of the image stored in history */
|
|
img.onload = function() {
|
|
ctx.save();
|
|
ctx.setTransform(1, 0, 0, 1, 0, 0);
|
|
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
|
ctx.drawImage(img, 0, 0);
|
|
ctx.restore();
|
|
|
|
/* If the activity is shared, will send the instruction to everyone */
|
|
if (PaintApp.data.isShared) {
|
|
try {
|
|
PaintApp.collaboration.sendMessage({
|
|
action: 'toDataURL',
|
|
data: {
|
|
width: PaintApp.elements.canvas.width / window.devicePixelRatio,
|
|
height: PaintApp.elements.canvas.height / window.devicePixelRatio,
|
|
src: PaintApp.collaboration.compress(PaintApp.elements.canvas.toDataURL())
|
|
}
|
|
});
|
|
} catch (e) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
};
|
|
img.src = imgSrc;
|
|
|
|
PaintApp.data.history.redo.push(imgSrc2);
|
|
PaintApp.data.history.undo.pop();
|
|
|
|
/* Update the availability of undo/redo */
|
|
displayUndoRedoButtons();
|
|
|
|
return imgSrc;
|
|
}
|
|
|
|
/* Trigger redo click, undo using the history */
|
|
function redoCanvas() {
|
|
//Removing any floating element
|
|
handleCurrentFloatingElement();
|
|
if (PaintApp.data.history.redo.length === 0) {
|
|
return;
|
|
}
|
|
|
|
PaintApp.modes.Pen.point = undefined;
|
|
var canvas = PaintApp.elements.canvas;
|
|
var ctx = canvas.getContext('2d');
|
|
var img = new Image();
|
|
var imgSrc = PaintApp.data.history.redo[PaintApp.data.history.redo.length - 1];
|
|
|
|
/* Loading of the image stored in history */
|
|
img.onload = function() {
|
|
ctx.save();
|
|
ctx.setTransform(1, 0, 0, 1, 0, 0);
|
|
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
|
ctx.drawImage(img, 0, 0);
|
|
ctx.restore();
|
|
|
|
/* If the activity is shared, will send the instruction to everyone */
|
|
if (PaintApp.data.isShared) {
|
|
try {
|
|
PaintApp.collaboration.sendMessage({
|
|
action: 'toDataURL',
|
|
data: {
|
|
width: PaintApp.elements.canvas.width / window.devicePixelRatio,
|
|
height: PaintApp.elements.canvas.height / window.devicePixelRatio,
|
|
src: PaintApp.collaboration.compress(PaintApp.elements.canvas.toDataURL())
|
|
}
|
|
});
|
|
} catch (e) {}
|
|
}
|
|
};
|
|
img.src = imgSrc;
|
|
|
|
PaintApp.data.history.undo.push(imgSrc);
|
|
PaintApp.data.history.redo.pop();
|
|
|
|
/* Update the availability of undo/redo */
|
|
displayUndoRedoButtons();
|
|
|
|
return imgSrc;
|
|
}
|
|
|
|
/* Update the availability of undo/redo */
|
|
function displayUndoRedoButtons() {
|
|
var notAvailableOpacity = '0.4';
|
|
var availableOpacity = '1';
|
|
|
|
/* If activity is shared and we are not the host we cannot do undo/redo */
|
|
if (PaintApp.data.isShared && !PaintApp.data.isHost) {
|
|
PaintApp.elements.redoButton.style.opacity = notAvailableOpacity;
|
|
PaintApp.elements.undoButton.style.opacity = notAvailableOpacity;
|
|
return;
|
|
}
|
|
|
|
/* Check of the ability to use redo */
|
|
if (PaintApp.data.history.redo.length === 0) {
|
|
PaintApp.elements.redoButton.style.opacity = notAvailableOpacity;
|
|
} else {
|
|
PaintApp.elements.redoButton.style.opacity = availableOpacity;
|
|
}
|
|
|
|
/* Check of the ability to do use undo */
|
|
if (PaintApp.data.history.undo.length <= 1) {
|
|
PaintApp.elements.undoButton.style.opacity = notAvailableOpacity;
|
|
} else {
|
|
PaintApp.elements.undoButton.style.opacity = availableOpacity;
|
|
}
|
|
}
|
|
|
|
/* Storing canvas onto history */
|
|
function saveCanvas() {
|
|
var canvas = PaintApp.elements.canvas;
|
|
try {
|
|
var image = canvas.toDataURL();
|
|
} catch (e) {}
|
|
|
|
/* If doing a new action, setting redo to an empty list */
|
|
if ((PaintApp.data.history.undo.length > 0 && PaintApp.data.history.undo[PaintApp.data.history.undo.length - 1] !== image) || (PaintApp.data.history.undo.length === 0)) {
|
|
PaintApp.data.history.undo.push(image);
|
|
PaintApp.data.history.redo = [];
|
|
}
|
|
|
|
/* Limiting history size*/
|
|
if (PaintApp.data.history.redo.length > PaintApp.data.history.limit) {
|
|
PaintApp.data.history.redo = PaintApp.data.history.redo.slice(1);
|
|
}
|
|
|
|
/* Limiting history size*/
|
|
if (PaintApp.data.history.undo.length > PaintApp.data.history.limit) {
|
|
PaintApp.data.history.undo = PaintApp.data.history.undo.slice(1);
|
|
}
|
|
|
|
/* Refreshing undo / redo */
|
|
displayUndoRedoButtons();
|
|
|
|
/* If sharedActivity and not the host, tell the host to save his copy of the canvas */
|
|
if (PaintApp.data.isShared && !PaintApp.data.isHost) {
|
|
PaintApp.collaboration.sendMessage({
|
|
action: 'saveCanvas'
|
|
});
|
|
}
|
|
}
|
|
|
|
/* Removing floating elements used by copy/paste, stamps, text */
|
|
function handleCurrentFloatingElement() {
|
|
if (PaintApp.data.currentElement !== undefined) {
|
|
if (PaintApp.data.currentElement.type != 'copy/paste') {
|
|
PaintApp.data.currentElement.element.parentElement.removeChild(PaintApp.data.currentElement.element);
|
|
PaintApp.data.currentElement = undefined;
|
|
} else {
|
|
if (PaintApp.data.mode != 'Copy' && PaintApp.data.mode != 'Paste') {
|
|
PaintApp.data.currentElement.element.parentElement.removeChild(PaintApp.data.currentElement.element);
|
|
PaintApp.data.currentElement = undefined;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/* PaintApp, contains the context of the application */
|
|
var PaintApp = {
|
|
libs: {},
|
|
palettes: {},
|
|
elements: {},
|
|
buttons: {},
|
|
paletteModesButtons: [],
|
|
data: {
|
|
isCompressEnabled: true,
|
|
isHost: true,
|
|
history: {
|
|
limit: 15,
|
|
undo: [],
|
|
redo: []
|
|
},
|
|
size: 5,
|
|
color: {
|
|
stroke: '#1500A7',
|
|
fill: '#ff0000'
|
|
},
|
|
tool: undefined
|
|
},
|
|
modes: {},
|
|
switchMode: switchMode,
|
|
undoCanvas: undoCanvas,
|
|
redoCanvas: redoCanvas,
|
|
displayUndoRedoButtons: displayUndoRedoButtons,
|
|
saveCanvas: saveCanvas,
|
|
clearCanvas: clearCanvas,
|
|
paletteRemoveActiveClass: paletteRemoveActiveClass,
|
|
addActiveClassToElement: addActiveClassToElement,
|
|
handleCurrentFloatingElement: handleCurrentFloatingElement
|
|
};
|
|
return PaintApp;
|
|
});
|