diff --git a/src/components/ImageCollection.vue b/src/components/ImageCollection.vue index d7753b8..db0da32 100644 --- a/src/components/ImageCollection.vue +++ b/src/components/ImageCollection.vue @@ -17,6 +17,14 @@ function onFileChange(event: Event): void { } reader.readAsDataURL(files[0]); } + +function onDragStart(event: DragEvent, idx: number): void { + event.dataTransfer!.setData('text/plain', idx.toString()); +} + +defineExpose({ + images +}) diff --git a/src/components/ImageEditor.vue b/src/components/ImageEditor.vue index 809253f..312a188 100644 --- a/src/components/ImageEditor.vue +++ b/src/components/ImageEditor.vue @@ -4,6 +4,8 @@ import { blackAndWhite, grayScale } from '../processing/gray-scale.ts'; import ImageCollection from './ImageCollection.vue'; const canvas = ref(null); +const collection = ref(); +const overlay = ref(null); const currentWidth = ref(100); const currentHeight = ref(100); let img: HTMLImageElement; @@ -44,11 +46,45 @@ function onChangeSlideHeight() { canvas.value!.height = height; ctx.drawImage(img, 0, 0, canvas.value!.width, height); } + +function onDragOver(event: DragEvent) { + event.preventDefault(); + event.dataTransfer!.dropEffect = 'copy'; + if (event.offsetX > canvas.value!.width / 2) { + overlay.value = 'right'; + } else { + overlay.value = 'bottom'; + } +} + +function onDrop(event: DragEvent) { + event.preventDefault(); + overlay.value = null; + const id = event.dataTransfer!.getData('text/plain'); + const img: HTMLImageElement = collection.value!.images[parseInt(id)]; + if (event.offsetX > canvas.value!.width / 2) { + const dx = canvas.value!.width; + const imageData = ctx.getImageData(0, 0, canvas.value!.width, canvas.value!.height); + canvas.value!.width += img.width; + ctx.putImageData(imageData, 0, 0) + ctx.drawImage(img, dx, 0); + } else { + const dy = canvas.value!.height; + const imageData = ctx.getImageData(0, 0, canvas.value!.width, canvas.value!.height); + canvas.value!.height += img.height; + ctx.putImageData(imageData, 0, 0) + ctx.drawImage(img, 0, dy); + } +} + +function onDragLeave() { + overlay.value = null; +}