From 0f1923097d8936673ef259cde91e7e6182825b70 Mon Sep 17 00:00:00 2001
From: Adam Procter <adamprocter@researchnot.es>
Date: Fri, 1 Oct 2021 16:22:49 +0100
Subject: [PATCH] starting to add drag

---
 src/components/SpaceBase.vue | 74 ++++++++++++++++++++++++++++++++++--
 src/mixins/drag.js           | 60 +++++++++++++++++++++++++++++
 src/views/Spatial.vue        |  8 +++-
 3 files changed, 137 insertions(+), 5 deletions(-)
 create mode 100644 src/mixins/drag.js

diff --git a/src/components/SpaceBase.vue b/src/components/SpaceBase.vue
index 594e1b8..cf9e098 100644
--- a/src/components/SpaceBase.vue
+++ b/src/components/SpaceBase.vue
@@ -1,29 +1,95 @@
 <template>
-  <div></div>
+  <div v-for="(nodes, index) in myArray" :key="index">
+    <svg
+      xmlns="http://www.w3.org/2000/svg"
+      viewBox="0 0 1000 10000"
+      onload="makeDraggable(evt)"
+    >
+      <g class="draggable-group">
+        <rect width="150" height="200" style="fill: rgb(255, 0, 100)" />
+        <foreignObject id="x" x="10" width="131" height="100">
+          <textarea rows="3" cols="30" v-model="nodes.node_text"></textarea>
+        </foreignObject>
+      </g>
+    </svg>
+  </div>
 </template>
 
 <script>
 // @ is an alias to /src
 import { mapState } from 'vuex'
+import drag from '@/mixins/drag'
 
 export default {
   name: 'SpaceBase',
   components: {},
   data() {
-    return {}
+    return {
+      myArray: [],
+    }
   },
 
   computed: {
     ...mapState({
+      myNodes: (state) => state.myNodes,
       otherNodes: (state) => state.otherNodes,
       allEmoji: (state) => state.allEmoji,
     }),
   },
 
+  props: {
+    added: Boolean,
+  },
+
+  watch: {
+    added: function () {
+      setTimeout(this.loadData, 500)
+    },
+  },
+
+  methods: {
+    loadData() {
+      var nodesFiltered = this.myNodes.myNodes.filter(
+        (nodes) => nodes.node_deleted == false
+      )
+      // this should probably be on the tool bar NOT HERE really
+      this.$store.dispatch('getMynodes')
+      this.$store.dispatch('getEmoji')
+      this.$store.dispatch('getPositions')
+
+      this.myArray = nodesFiltered.reverse()
+    },
+  },
+
+  mixins: [
+    drag('something', function () {
+      // drag
+    }),
+  ],
+
   mounted() {
-    this.$store.dispatch('getPositions')
+    setTimeout(this.loadData, 500)
+    if (localStorage.nogg_name && localStorage.nogg_microcosm) {
+      var devicename = localStorage.nogg_name
+      var microcosm = localStorage.nogg_microcosm
+      this.$store.dispatch('setMicrocosm', { devicename, microcosm })
+      // this.$store.dispatch('getEmoji')
+      // this.$store.dispatch('getPositions')
+    } else {
+      console.log('no')
+      // go home
+    }
   },
 }
 </script>
 
-<style scoped></style>
+<style scoped>
+.draggable,
+.draggable-group {
+  cursor: move;
+}
+
+.static {
+  cursor: not-allowed;
+}
+</style>
diff --git a/src/mixins/drag.js b/src/mixins/drag.js
new file mode 100644
index 0000000..4610b00
--- /dev/null
+++ b/src/mixins/drag.js
@@ -0,0 +1,60 @@
+export default function makeDraggable(evt) {
+  var svg = evt.target
+  svg.addEventListener('mousedown', startDrag)
+  svg.addEventListener('mousemove', drag)
+  svg.addEventListener('mouseup', endDrag)
+  svg.addEventListener('mouseleave', endDrag)
+  svg.addEventListener('touchstart', startDrag)
+  svg.addEventListener('touchmove', drag)
+  svg.addEventListener('touchend', endDrag)
+  svg.addEventListener('touchleave', endDrag)
+  svg.addEventListener('touchcancel', endDrag)
+  function getMousePosition(evt) {
+    var CTM = svg.getScreenCTM()
+    if (evt.touches) {
+      evt = evt.touches[0]
+    }
+    return {
+      x: (evt.clientX - CTM.e) / CTM.a,
+      y: (evt.clientY - CTM.f) / CTM.d,
+    }
+  }
+  var selectedElement, offset, transform
+  function initialiseDragging(evt) {
+    offset = getMousePosition(evt)
+    // Make sure the first transform on the element is a translate transform
+    var transforms = selectedElement.transform.baseVal
+    if (
+      transforms.length === 0 ||
+      transforms.getItem(0).type !== SVGTransform.SVG_TRANSFORM_TRANSLATE
+    ) {
+      // Create an transform that translates by (0, 0)
+      var translate = svg.createSVGTransform()
+      translate.setTranslate(0, 0)
+      selectedElement.transform.baseVal.insertItemBefore(translate, 0)
+    }
+    // Get initial translation
+    transform = transforms.getItem(0)
+    offset.x -= transform.matrix.e
+    offset.y -= transform.matrix.f
+  }
+  function startDrag(evt) {
+    if (evt.target.classList.contains('draggable')) {
+      selectedElement = evt.target
+      initialiseDragging(evt)
+    } else if (evt.target.parentNode.classList.contains('draggable-group')) {
+      selectedElement = evt.target.parentNode
+      initialiseDragging(evt)
+    }
+  }
+  function drag(evt) {
+    if (selectedElement) {
+      evt.preventDefault()
+      var coord = getMousePosition(evt)
+      transform.setTranslate(coord.x - offset.x, coord.y - offset.y)
+    }
+  }
+  function endDrag(evt) {
+    selectedElement = false
+  }
+}
diff --git a/src/views/Spatial.vue b/src/views/Spatial.vue
index ffab25a..502d25e 100644
--- a/src/views/Spatial.vue
+++ b/src/views/Spatial.vue
@@ -1,6 +1,6 @@
 <template>
   <ToolBar @added-node="addedNode" />
-  <SpaceBase />
+  <SpaceBase :added="added" />
 </template>
 
 <script>
@@ -22,6 +22,12 @@ export default {
       added: false,
     }
   },
+
+  methods: {
+    addedNode() {
+      this.added = !this.added
+    },
+  },
 }
 </script>
 
-- 
GitLab