From: Mischa POSLAWSKY Date: Wed, 5 Jan 2022 00:36:16 +0000 (+0100) Subject: word/edit: croppie js thumbnail selection interface X-Git-Tag: v1.13~45 X-Git-Url: http://git.shiar.nl/sheet.git/commitdiff_plain/v1.12-226-gca5f2bee8e word/edit: croppie js thumbnail selection interface Replace the unintuitive coordinate helper by a free (mit) external library (~9kB compressed) to select and preview an image crop window. Reference: --- diff --git a/word/edit.plp b/word/edit.plp index 9af73cd..1d766b9 100644 --- a/word/edit.plp +++ b/word/edit.plp @@ -10,6 +10,8 @@ Html({ raw => <<'EOT', + + EOT }); diff --git a/word/editor.js b/word/editor.js index cee26ac..aeab4cc 100644 --- a/word/editor.js +++ b/word/editor.js @@ -107,23 +107,26 @@ document.addEventListener('DOMContentLoaded', () => { let thumbpreview = document.getElementById('convertpreview'); if (thumbpreview && imgpreview) { thumbpreview.onclick = e => { - let imgselect = imgpreview; /* TODO clone */ - imgselect.hidden = false; - imgselect.classList.add('popup'); - imgselect.onmousemove = e => { - let border = imgselect.getBoundingClientRect(); - let pos = [ - Math.round(1000 * (e.clientX - border.x) / border.width), - Math.round(1000 * (e.clientY - border.y) / border.height) - ]; - return pos; - }; - imgselect.onclick = e => { - let imgoption = document.getElementById('convert'); - imgoption.value += (imgoption.value && '-') + imgselect.onmousemove(e); - imgselect.hidden = true; - imgselect.classList.remove('popup'); - }; + const cropinput = document.getElementById('crop32'); + let border = { width: 600, height: 400 }; + let crop = new Croppie(thumbpreview, { + boundary: { width: border.width * 1.3, height: border.height * 1.2 }, + viewport: border, + update: e => { + cropinput.value = e.points.map((pos, axis) => { + Math.round(1000 * pos / (axis % 2 ? border.height : border.width)) + }).join(','); + }, + }); + crop.bind({ + url: imgpreview.src, + points: cropinput.value.split(/[^0-9]/).map((rel, axis) => { + return rel * (axis % 2 ? border.height : border.width) / 1000 + }), + }); + crop.elements.overlay.addEventListener('dblclick', e => { + crop.destroy(); + }); }; }