const POSES = new Map(); function notify(str, type) { if (type === undefined) type = 'success'; switch (type) { case 'success': console.log(str); break; case 'info': console.log(str); break; case 'warn': console.warn(str); break; case 'error': console.error(str); break; } const p = document.createElement('p'); p.textContent = str; p.classList.add('item', type); const cont = document.querySelector('#notifications'); cont.appendChild(p); setTimeout(() => cont.removeChild(p), 3000); } async function save_pose(obj) { const res = await fetch('/pose/save', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(obj), }); const result = await res.json(); if (result.ok) reload_poses(); return result; } async function delete_pose(name) { const res = await fetch('/pose/delete', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name }), }); const result = await res.json(); notify(result.result, result.ok ? 'success' : 'error'); if (result.ok) reload_poses(); return result; } async function reload_poses() { POSES.clear(); const res = await fetch('/pose/all'); const cont = document.querySelector('#saved_poses'); cont.innerHTML = ''; const df = document.createDocumentFragment(); for (let data of await res.json()) { POSES.set(data.name, data); const fig = document.createElement('figure') const img = document.createElement('img'); const cap = document.createElement('figcaption'); const clo = document.createElement('div'); const clo2 = document.createElement('span'); fig.dataset.poseName = data.name; cap.textContent = data.name; clo.textContent = 'x'; clo.classList.add('close'); clo2.classList.add('close2'); clo2.textContent = 'delete'; clo.appendChild(clo2); img.src = 'data:image/png;base64,' + data.image; img.title = data.name; fig.append(clo, img, cap); df.appendChild(fig); } cont.appendChild(df); } document.addEventListener('DOMContentLoaded', async () => { const ui = { container: document.querySelector('#cont'), canvas: document.querySelector('#main_canvas'), notation: document.querySelector('#notation'), indicator1: document.querySelector('#body_indicator1'), indicator2: document.querySelector('#body_indicator2'), all_reset: document.querySelector('#all_reset'), reset_camera: document.querySelector('#reset_camera'), reset_pose: document.querySelector('#reset_pose'), fixed_roll: document.querySelector('#fixed_roll'), add_body: document.querySelector('#add_body'), remove_body: document.querySelector('#remove_body'), canvas_width: document.querySelector('#canvas_width'), canvas_height: document.querySelector('#canvas_height'), bg: document.querySelector('#bg_file'), reset_bg: document.querySelector('#reset_bg'), elliptic_limbs: document.querySelector('#elliptic_limbs'), //joint_radius: document.querySelector('#joint_radius'), limb_width: document.querySelector('#limb_width'), low_fps: document.querySelector('#low_fps'), save: document.querySelector('#save_button'), copy: document.querySelector('#copy_button'), save_pose: document.querySelector('#save_pose'), save_pose_callback: save_pose, notify: notify, }; document.addEventListener('poseload', e => { const obj = POSES.get(e.detail.name); if (obj) ui.loadPose(obj); }, false); const { init, init_3d } = await import('posex'); init(ui); const animate = init_3d(ui); animate(); await reload_poses(); }, false); document.addEventListener('DOMContentLoaded', () => { const get_name = ele => { while (ele && ele !== document) { if (ele.dataset && ele.dataset.poseName !== undefined) return ele.dataset.poseName; ele = ele.parentNode; } return ''; }; document.querySelector('#saved_poses').addEventListener('click', e => { let target = e.target; if (target.tagName === 'IMG') target = target.parentNode; if (target.classList.contains('close2')) target = target.parentNode; if (target.tagName === 'FIGURE') { const name = get_name(target); const ev = new CustomEvent('poseload', { bubbles: true, detail: { name } }); target.dispatchEvent(ev); } else if (target.classList.contains('close')) { const name = get_name(target); if (name.length != 0) { delete_pose(name); } } }, false); }, false);