mirror of https://github.com/hnmr293/posex.git
141 lines
4.6 KiB
JavaScript
141 lines
4.6 KiB
JavaScript
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'),
|
|
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'),
|
|
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);
|