From 92e400f26524efeb9d644eb3bca8b521c51814a5 Mon Sep 17 00:00:00 2001
From: koehr <n@koehr.in>
Date: Tue, 4 Jan 2022 16:25:18 +0100
Subject: [PATCH] select objects via system diagram

---
 src/App.vue                      |  5 ++++-
 src/app.css                      |  5 +++--
 src/components/SystemDiagram.vue | 24 ++++++++++++++++++++++--
 3 files changed, 29 insertions(+), 5 deletions(-)

diff --git a/src/App.vue b/src/App.vue
index e833e94..cacdae4 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -4,7 +4,7 @@
     @select:font="setFont($event)"
     @select:theme="setTheme($event)"
   />
-  <SystemDiagram v-bind="{ star, objects }" />
+  <SystemDiagram v-bind="{ star, objects, selectedObject }" @select="selectObject" />
 
   <section id="settings">
     <ObjectSettings v-if="selectedObject"
@@ -62,6 +62,9 @@ function editObject (object) {
   }
   selectedObject.value = object
 }
+function selectObject (object) {
+  selectedObject.value = object
+}
 
 function deleteObject (object) {
   if (deletedObject.value) {
diff --git a/src/app.css b/src/app.css
index 40cc61b..0f644e9 100644
--- a/src/app.css
+++ b/src/app.css
@@ -128,8 +128,9 @@ text.tilted { transform: rotate(-45deg) translate(0, 100%); transform-origin: le
 .object > line { stroke-width: .5; }
 .satellite { text-anchor: start; font-size: .7em; }
 .rings { stroke: var(--fg-graphic); fill: none; transform: skew(-45deg); transform-origin: 50%; }
-.object:hover { fill: var(--hl-graphic); }
-.object:hover > line, .object:hover .rings { stroke: var(--hl-graphic); }
+.object:hover, .object.selected { fill: var(--hl-graphic); }
+.object:hover > line, .object:hover .rings,
+.object.selected > line, .object.selected .rings { stroke: var(--hl-graphic); }
 
 h1 {
   font-family: xolonium;
diff --git a/src/components/SystemDiagram.vue b/src/components/SystemDiagram.vue
index 64d527c..49aa4ed 100644
--- a/src/components/SystemDiagram.vue
+++ b/src/components/SystemDiagram.vue
@@ -3,7 +3,13 @@
     <line id="axis" x1="0" y1="150" x2="1000" y2="150" />
     <circle id="star" :r="star.radius" :cx="starCX" cy="150" />
 
-    <g class="object" :id="o.name" v-for="o in objects">
+    <g v-for="o in objects"
+      class="object"
+      :class="{ selected: o === selectedObject }"
+      :id="o.name"
+      @mousedown.left="startDragging(o)"
+      @mouseup.left="stopDragging"
+    >
       <g class="rings" v-for="i in o.rings">
         <circle :r="o.radius - 5 + 2*i" :cx="o.distance" cy="150" />
       </g>
@@ -25,16 +31,30 @@
 </template>
 
 <script setup>
-import { computed } from 'vue'
+import { ref, computed } from 'vue'
 import steepCurve from '../steep-curve'
 
 const props = defineProps({
   star: Object,
   objects: Array,
+  selectedObject: Object,
 })
 
+const emit = defineEmits([ 'select' ])
+
 const starCX = computed(() => {
   const r = props.star.radius
   return -1 * r * steepCurve(r, 50, 0.955)
 })
+
+const draggedObject = ref(null)
+
+function startDragging (object) {
+  emit('select', object)
+  draggedObject.value = object
+}
+function stopDragging () {
+  draggedObject.value = null
+}
+
 </script>