Talha912 commited on
Commit
741660e
路
verified 路
1 Parent(s): dab62d6

Update edit.html

Browse files
Files changed (1) hide show
  1. edit.html +55 -5
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){const d=document.createElement('div');d.className='blk';d.title='Click to edit';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`;d.onpointerdown=e=>{e.stopPropagation();e.preventDefault();editBlock(bk)};ov.appendChild(d)}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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=>{if(editing||/INPUT|SELECT/.test(document.activeElement.tagName))return;
 
 
 
 
 
 
 
 
 
 
 
 
 
288
  if((e.key==='Delete'||e.key==='Backspace')&&sel){e.preventDefault();del()}
289
- if((e.ctrlKey||e.metaKey)&&e.key==='z'){e.preventDefault();$('undoBtn').click()}
290
- if((e.ctrlKey||e.metaKey)&&e.key==='c'&&sel){const o=cur();if(o){clip=JSON.stringify(o);try{if(o.type==='text'&&navigator.clipboard&&o.text)navigator.clipboard.writeText(o.text).catch(()=>{});}catch(_){}toast('Object copied. Use Ctrl+V to duplicate it on a page.')}}
291
- if((e.ctrlKey||e.metaKey)&&e.key==='v'&&clip&&doc&&mode==='text'){e.preventDefault();const c=JSON.parse(clip);c.id=uid();c.page=page;delete c.key;delete c.orig;delete c.st;c.x+=14;c.y+=14;snap();objs.push(c);sel=c.id;clip=JSON.stringify(c);render()}});
 
 
 
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()};