You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
160 lines
4.3 KiB
160 lines
4.3 KiB
function on_down(e) { |
|
if (e.button === 1) { |
|
elements.canvas0.classList.add('moving'); |
|
storage.state.moving = true; |
|
storage.state.mousedown = true; |
|
return; |
|
} |
|
|
|
if (e.button != 0) { |
|
return; |
|
} |
|
|
|
if (storage.state.moving) { |
|
storage.state.mousedown = true; |
|
return; |
|
} |
|
|
|
const x = Math.round(e.clientX + window.scrollX); |
|
const y = Math.round(e.clientY + window.scrollY); |
|
|
|
storage.state.drawing = true; |
|
|
|
if (storage.ctx1.lineWidth !== storage.cursor.width) { |
|
storage.ctx1.lineWidth = storage.cursor.width; |
|
} |
|
|
|
storage.cursor.x = x; |
|
storage.cursor.y = y; |
|
|
|
const predraw = predraw_event(x, y); |
|
storage.current_stroke.push(predraw); |
|
|
|
fire_event(predraw); |
|
} |
|
|
|
function on_move(e) { |
|
const last_x = storage.cursor.x; |
|
const last_y = storage.cursor.y; |
|
|
|
const x = storage.cursor.x = Math.round(e.clientX + window.scrollX); |
|
const y = storage.cursor.y = Math.round(e.clientY + window.scrollY); |
|
|
|
if (storage.state.drawing) { |
|
const width = storage.cursor.width; |
|
|
|
storage.ctx1.beginPath(); |
|
|
|
storage.ctx1.moveTo(last_x, last_y); |
|
storage.ctx1.lineTo(x, y); |
|
|
|
storage.ctx1.stroke(); |
|
|
|
const predraw = predraw_event(x, y); |
|
storage.current_stroke.push(predraw); |
|
|
|
fire_event(predraw); |
|
} else if (storage.state.moving && storage.state.mousedown) { |
|
storage.canvas.offset_x -= e.movementX; |
|
storage.canvas.offset_y -= e.movementY; |
|
|
|
if (window.scrollX !== storage.canvas.offset_x || window.scrollY !== storage.canvas.offset_y) { |
|
window.scrollTo(storage.canvas.offset_x, storage.canvas.offset_y); |
|
} |
|
|
|
if (storage.canvas.offset_x > storage.canvas.max_scroll_x) storage.canvas.offset_x = storage.canvas.max_scroll_x; |
|
if (storage.canvas.offset_x < 0) storage.canvas.offset_x = 0; |
|
if (storage.canvas.offset_y > storage.canvas.max_scroll_y) storage.canvas.offset_y = storage.canvas.max_scroll_y; |
|
if (storage.canvas.offset_y < 0) storage.canvas.offset_y = 0; |
|
} |
|
|
|
e.preventDefault(); |
|
} |
|
|
|
async function on_up(e) { |
|
if (storage.state.moving && (e.button === 1 || e.button === 0)) { |
|
storage.state.mousedown = false; |
|
if (!storage.state.spacedown) { |
|
elements.canvas0.classList.remove('moving'); |
|
storage.state.moving = false; |
|
return; |
|
} |
|
} |
|
|
|
if (storage.state.drawing && e.button === 0) { |
|
storage.state.drawing = false; |
|
const event = stroke_event(); |
|
storage.current_stroke = []; |
|
await queue_event(event); |
|
return; |
|
} |
|
} |
|
|
|
function on_keydown(e) { |
|
if (e.code === 'Space' && !storage.state.drawing) { |
|
elements.canvas0.classList.add('moving'); |
|
storage.state.moving = true; |
|
storage.state.spacedown = true; |
|
return; |
|
} |
|
|
|
if (e.code === 'KeyZ' && e.ctrlKey) { |
|
const event = undo_event(); |
|
queue_event(event); |
|
return; |
|
} |
|
} |
|
|
|
function on_keyup(e) { |
|
if (e.code === 'Space' && storage.state.moving) { |
|
elements.canvas0.classList.remove('moving'); |
|
storage.state.moving = false; |
|
storage.state.spacedown = false; |
|
} |
|
} |
|
|
|
function on_leave(e) { |
|
if (storage.state.moving) { |
|
elements.canvas0.classList.remove('moving'); |
|
storage.state.moving = false; |
|
storage.state.holding = false; |
|
return; |
|
} |
|
} |
|
|
|
function on_resize(e) { |
|
storage.canvas.max_scroll_x = storage.canvas.width - window.innerWidth; |
|
storage.canvas.max_scroll_y = storage.canvas.height - window.innerHeight; |
|
} |
|
|
|
async function on_drop(e) { |
|
e.preventDefault(); |
|
const file = e.dataTransfer.files[0]; |
|
const bitmap = await createImageBitmap(file); |
|
|
|
const x = storage.cursor.x - Math.round(bitmap.width / 2); |
|
const y = storage.cursor.y - Math.round(bitmap.height / 2); |
|
|
|
// storage.ctx0.drawImage(bitmap, x, y); |
|
|
|
const form_data = new FormData(); |
|
form_data.append('file', file); |
|
|
|
const resp = await fetch(`/api/image?deskId=${storage.desk_id}`, { |
|
method: 'post', |
|
body: form_data, |
|
}) |
|
|
|
if (resp.ok) { |
|
const image_id = await resp.text(); |
|
const event = image_event(image_id, x, y); |
|
await queue_event(event); |
|
} |
|
|
|
return false; |
|
} |
|
|
|
function cancel(e) { |
|
e.preventDefault(); |
|
return false; |
|
} |