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