Update edit.html
Browse files
edit.html
CHANGED
|
@@ -213,7 +213,41 @@ function render(){
|
|
| 213 |
if(!ov)return;const old=ov.querySelector('.editing');
|
| 214 |
if(old){const o=objs.find(x=>x.id===editing);if(o)o.draft=old.innerText.replace(/\n$/,'');old.onblur=null}
|
| 215 |
ov.innerHTML='';ov.className='overlay '+(mode==='text'?'t':mode==='select'?'s':'c');if(tl)tl.classList.toggle('on',mode==='select');
|
| 216 |
-
if(mode==='text')for(const bk of blocks){
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 217 |
for(const o of objs.filter(o=>o.page===page)){
|
| 218 |
const el=document.createElement('div'),s=el.style;el.className='item '+o.type+(sel===o.id?' sel':'');el.dataset.id=o.id;s.left=o.x*zoom+'px';s.top=o.y*zoom+'px';
|
| 219 |
if(o.type==='text'){
|
|
@@ -284,11 +318,27 @@ function setMode(m){endEdit();if(m===mode&&m!=='text')m='text';mode=m;if(m!=='te
|
|
| 284 |
document.querySelectorAll('#tb [data-mode]').forEach(b=>b.onclick=()=>setMode(b.dataset.mode));
|
| 285 |
$('imageInput').onchange=e=>{const f=e.target.files[0];if(!f)return;const r=new FileReader();r.onload=()=>{const im=new Image();im.onload=()=>{const k=Math.min(1,220/im.width);add({type:'image',x:40,y:40,w:im.width*k,h:im.height*k,src:r.result})};im.src=r.result};r.readAsDataURL(f);e.target.value=''};
|
| 286 |
$('undoBtn').onclick=()=>{const s=undo.pop();if(s){objs=JSON.parse(s);sel=editing=null;render()}$('undoBtn').disabled=!undo.length};
|
| 287 |
-
addEventListener('keydown',e=>{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 288 |
if((e.key==='Delete'||e.key==='Backspace')&&sel){e.preventDefault();del()}
|
| 289 |
-
if(
|
| 290 |
-
if(
|
| 291 |
-
|
|
|
|
|
|
|
|
|
|
| 292 |
const go=n=>{if(n<1||n>pages)return;endEdit();page=n;sel=editing=null;draw()};
|
| 293 |
$('prevBtn').onclick=()=>go(page-1);$('nextBtn').onclick=()=>go(page+1);
|
| 294 |
$('zoomIn').onclick=()=>{endEdit();zoom=Math.min(3,zoom+.15);draw()};$('zoomOut').onclick=()=>{endEdit();zoom=Math.max(.5,zoom-.15);draw()};
|
|
|
|
| 213 |
if(!ov)return;const old=ov.querySelector('.editing');
|
| 214 |
if(old){const o=objs.find(x=>x.id===editing);if(o)o.draft=old.innerText.replace(/\n$/,'');old.onblur=null}
|
| 215 |
ov.innerHTML='';ov.className='overlay '+(mode==='text'?'t':mode==='select'?'s':'c');if(tl)tl.classList.toggle('on',mode==='select');
|
| 216 |
+
if(mode==='text')for(const bk of blocks){
|
| 217 |
+
const d=document.createElement('div');d.className='blk';d.title='Click to edit 路 drag to move';
|
| 218 |
+
d.style.cssText=`left:${bk.x*zoom}px;top:${(bk.y-ASC*bk.size)*zoom}px;width:${bk.w*zoom}px;height:${bk.size*1.2*zoom}px`;
|
| 219 |
+
d.onpointerdown=e=>{
|
| 220 |
+
e.stopPropagation();e.preventDefault();
|
| 221 |
+
if(e.button!==0)return;
|
| 222 |
+
const sx=e.clientX,sy=e.clientY;let moved=false,created=null;
|
| 223 |
+
const mv=ev=>{
|
| 224 |
+
const dx=ev.clientX-sx,dy=ev.clientY-sy;
|
| 225 |
+
if(!moved&&Math.hypot(dx,dy)>4){
|
| 226 |
+
moved=true;
|
| 227 |
+
endEdit();
|
| 228 |
+
const key=page+':'+Math.round(bk.x)+':'+Math.round(bk.y);
|
| 229 |
+
created=objs.find(o=>o.key===key&&o.type==='text');
|
| 230 |
+
if(!created){editBlock(bk);created=objs.find(o=>o.key===key&&o.type==='text');editing=null}
|
| 231 |
+
if(created){snap();sel=created.id;d.style.opacity='.35'}
|
| 232 |
+
}
|
| 233 |
+
if(moved&&created){
|
| 234 |
+
created.x=Math.max(0,bk.x+dx/zoom);
|
| 235 |
+
created.y=Math.max(0,bk.y-BL(created.family||fam(bk))*bk.size+dy/zoom);
|
| 236 |
+
const item=ov.querySelector('.item[data-id="'+created.id+'"]');
|
| 237 |
+
if(item){item.style.left=created.x*zoom+'px';item.style.top=created.y*zoom+'px'}
|
| 238 |
+
syncFT();
|
| 239 |
+
}
|
| 240 |
+
};
|
| 241 |
+
const up=ev=>{
|
| 242 |
+
removeEventListener('pointermove',mv);removeEventListener('pointerup',up);removeEventListener('pointercancel',up);
|
| 243 |
+
d.style.opacity='';
|
| 244 |
+
if(moved&&created){render();toast('Text moved. Original position is covered.')}
|
| 245 |
+
else editBlock(bk);
|
| 246 |
+
};
|
| 247 |
+
addEventListener('pointermove',mv);addEventListener('pointerup',up);addEventListener('pointercancel',up);
|
| 248 |
+
};
|
| 249 |
+
ov.appendChild(d)
|
| 250 |
+
}
|
| 251 |
for(const o of objs.filter(o=>o.page===page)){
|
| 252 |
const el=document.createElement('div'),s=el.style;el.className='item '+o.type+(sel===o.id?' sel':'');el.dataset.id=o.id;s.left=o.x*zoom+'px';s.top=o.y*zoom+'px';
|
| 253 |
if(o.type==='text'){
|
|
|
|
| 318 |
document.querySelectorAll('#tb [data-mode]').forEach(b=>b.onclick=()=>setMode(b.dataset.mode));
|
| 319 |
$('imageInput').onchange=e=>{const f=e.target.files[0];if(!f)return;const r=new FileReader();r.onload=()=>{const im=new Image();im.onload=()=>{const k=Math.min(1,220/im.width);add({type:'image',x:40,y:40,w:im.width*k,h:im.height*k,src:r.result})};im.src=r.result};r.readAsDataURL(f);e.target.value=''};
|
| 320 |
$('undoBtn').onclick=()=>{const s=undo.pop();if(s){objs=JSON.parse(s);sel=editing=null;render()}$('undoBtn').disabled=!undo.length};
|
| 321 |
+
addEventListener('keydown',e=>{
|
| 322 |
+
const mod=e.ctrlKey||e.metaKey;
|
| 323 |
+
if(mod&&e.key.toLowerCase()==='v'&&clip&&doc&&mode==='text'){
|
| 324 |
+
e.preventDefault();e.stopPropagation();
|
| 325 |
+
const c=JSON.parse(clip);c.id=uid();c.page=page;delete c.key;delete c.orig;delete c.st;
|
| 326 |
+
const r=ov.getBoundingClientRect();
|
| 327 |
+
if(Number.isFinite(window.lastPointerX)&&Number.isFinite(window.lastPointerY)){
|
| 328 |
+
c.x=Math.max(0,(window.lastPointerX-r.left)/zoom);
|
| 329 |
+
c.y=Math.max(0,(window.lastPointerY-r.top)/zoom);
|
| 330 |
+
}else{c.x+=14;c.y+=14}
|
| 331 |
+
snap();objs.push(c);sel=c.id;editing=null;render();toast('Copied object pasted here.');return;
|
| 332 |
+
}
|
| 333 |
+
if(editing&&!(mod&&['c','x'].includes(e.key.toLowerCase())))return;
|
| 334 |
+
if(/INPUT|SELECT|TEXTAREA/.test(document.activeElement.tagName))return;
|
| 335 |
if((e.key==='Delete'||e.key==='Backspace')&&sel){e.preventDefault();del()}
|
| 336 |
+
if(mod&&e.key.toLowerCase()==='z'){e.preventDefault();$('undoBtn').click()}
|
| 337 |
+
if(mod&&e.key.toLowerCase()==='c'&&sel){
|
| 338 |
+
const o=cur();if(o){clip=JSON.stringify(o);e.preventDefault();toast('Object copied. Click the destination, then press Ctrl+V to paste.')}
|
| 339 |
+
}
|
| 340 |
+
});
|
| 341 |
+
document.addEventListener('pointermove',e=>{window.lastPointerX=e.clientX;window.lastPointerY=e.clientY},{passive:true});
|
| 342 |
const go=n=>{if(n<1||n>pages)return;endEdit();page=n;sel=editing=null;draw()};
|
| 343 |
$('prevBtn').onclick=()=>go(page-1);$('nextBtn').onclick=()=>go(page+1);
|
| 344 |
$('zoomIn').onclick=()=>{endEdit();zoom=Math.min(3,zoom+.15);draw()};$('zoomOut').onclick=()=>{endEdit();zoom=Math.max(.5,zoom-.15);draw()};
|