viewof strokes = {
let canvas =
(this && this.querySelector('canvas')) ?? DOM.canvas(width, height);
let context = canvas.getContext('2d');
function clear() {
context.clearRect(0, 0, width, height);
}
let me = html`<div style=${{ userSelect: 'none' }}>
<button onClick=${() => clear()}>Clear</button>
${canvas}
</div>`;
me.value = (this && this.value) ?? [];
function repaint_strokes() {
clear();
me.value = me.value.slice(0, -2);
console.log(me.value);
for (let drawing of me.value) {
for (let segment of drawing.segments) {
draw(segment);
}
}
triggerInput();
}
let triggerInput = _.debounce(() => {
me.dispatchEvent(new CustomEvent('input'));
}, 100);
function draw(segment) {
let {
color,
stroke: { pressure, from, to }
} = segment;
if (from) {
context.beginPath();
context.lineWidth = 2 + 2 * (10 * pressure ** 3);
context.strokeStyle = color;
context.moveTo(...from);
context.lineTo(...to);
context.lineCap = "round";
context.stroke();
}
}
d3.select(canvas)
.on("touchmove", e => e.preventDefault())
.on("pointerenter", () => (canvas.dbltap = canvas.dbltap || trackDbltap()))
.on("pointerdown", e => {
if (canvas.dbltap(e)) {
repaint_strokes();
return;
}
let untrack = trackPointer(e, {
start: stroke => {
let segment = {
stroke: stroke,
color: brush_color
};
draw(segment);
me.value.push({
segments: [segment]
});
triggerInput();
},
move: stroke => {
let segment = {
stroke: stroke,
color: brush_color
};
draw(segment);
me.value[me.value.length - 1].segments.push(segment);
triggerInput();
},
out: p => console.log("out", p),
end: p => console.log("end", p)
});
invalidation.then(untrack);
});
return me;
}