From 943c7fc54c771f90127d4204f3adcc59a8607afe Mon Sep 17 00:00:00 2001
From: Julian Leucker <leuckerj@gmail.com>
Date: Thu, 16 Feb 2023 12:18:12 +0100
Subject: [PATCH] Calculate new position better by using mouse coordinates as
 well

---
 src/DragContainer.vue |  3 +++
 src/DragGrid.vue      | 14 ++++++++++----
 2 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/src/DragContainer.vue b/src/DragContainer.vue
index 2e657c6..df4a865 100644
--- a/src/DragContainer.vue
+++ b/src/DragContainer.vue
@@ -17,6 +17,7 @@ export default {
     handleDragStart(event) {
       if (this.isDisabled) return;
       this.$refs.wrapper.style.cursor = "grabbing";
+      let rect = event.target.getBoundingClientRect();
       event.dataTransfer.setData(
         "vueDrag/gridItem",
         JSON.stringify({
@@ -28,6 +29,8 @@ export default {
           data: this.data,
           context: this.context,
           originGridId: this.gridId,
+          mouseX: event.clientX - rect.x - rect.width / (2 * this.w), // relative to center of the top left square
+          mouseY: event.clientY - rect.y - rect.height / (2 * this.h),
         })
       );
     },
diff --git a/src/DragGrid.vue b/src/DragGrid.vue
index c5f4707..78a6cb7 100644
--- a/src/DragGrid.vue
+++ b/src/DragGrid.vue
@@ -146,7 +146,10 @@ export default {
       let data = event.dataTransfer.getData("vueDrag/gridItem");
       if (!data) return;
       let element = JSON.parse(data);
-      let coords = this.getCoords(event.pageX, event.pageY);
+      let coords = this.getCoords(
+        event.clientX - element.mouseX,
+        event.clientY - element.mouseY
+      );
 
       if (element.context !== this.context || this.noHighlight) {
         this.$refs.highlightContainer.style.display = "none";
@@ -186,7 +189,10 @@ export default {
         return;
       }
 
-      let coords = this.getCoords(event.pageX, event.pageY);
+      let coords = this.getCoords(
+        event.clientX - element.mouseX,
+        event.clientY - element.mouseY
+      );
 
       let newPositionValid = true;
 
@@ -236,8 +242,8 @@ export default {
     getCoords(x, y) {
       let rect = this.$el.getBoundingClientRect();
       return {
-        x: Math.ceil((x - rect.x - window.scrollX) / (rect.width / this.cols)),
-        y: Math.ceil((y - rect.y - window.scrollY) / (rect.height / this.rows)),
+        x: Math.ceil((x - rect.x) / (rect.width / this.cols)),
+        y: Math.ceil((y - rect.y) / (rect.height / this.rows)),
       };
     },
     getInt(property, item) {
-- 
GitLab