A web TODO list application
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

99 lines
2.5 KiB

{{ define "paint" }}
<canvas class="row border border-secondary" id="drawingCanvas" width="256" height="256"></canvas>
<input class="row border border-secondary" type="color" id="colorPicker" value="#000000" aria-label="Drawing color">
<script>
const canvas = document.getElementById('drawingCanvas');
const ctx = canvas.getContext('2d');
const colorPicker = document.getElementById('colorPicker');
let drawing = false;
function startDrawing(x, y) {
drawing = true;
ctx.beginPath();
ctx.moveTo(x, y);
};
function draw(x, y){
if (drawing) {
ctx.strokeStyle = colorPicker.value;
ctx.lineWidth = 5;
ctx.lineTo(x, y);
ctx.stroke();
}
};
function stopDrawing() {
drawing = false;
ctx.closePath();
};
function getMousePos(event) {
const rect = canvas.getBoundingClientRect();
return {
x: event.clientX - rect.left,
y: event.clientY - rect.top
};
};
function getTouchPos(event) {
const rect = canvas.getBoundingClientRect();
return {
x: event.touches[0].clientX - rect.left,
y: event.touches[0].clientY - rect.top
};
};
// Mouse events
canvas.addEventListener('mousedown', (e) => {
const pos = getMousePos(e);
startDrawing(pos.x, pos.y);
});
canvas.addEventListener('mousemove', (e) => {
const pos = getMousePos(e);
draw(pos.x, pos.y);
});
canvas.addEventListener('mouseup', stopDrawing);
canvas.addEventListener('mouseleave', stopDrawing);
// Touch events
canvas.addEventListener('touchstart', (e) => {
e.preventDefault(); // Prevent scrolling
const pos = getTouchPos(e);
startDrawing(pos.x, pos.y);
});
canvas.addEventListener('touchmove', (e) => {
e.preventDefault(); // Prevent scrolling
const pos = getTouchPos(e);
draw(pos.x, pos.y);
});
canvas.addEventListener('touchend', stopDrawing);
// Fills with white
function clearCanvas() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
}
function isCanvasEmpty() {
const pixels = new Uint32Array(
ctx.getImageData(0, 0, canvas.width, canvas.height).data.buffer
);
return !pixels.some(color => color !== 0);
}
function getCanvasImage() {
if (!isCanvasEmpty()) {
return canvas.toDataURL("image/png");
}
return null;
}
</script>
{{ end }}