]> git.r.bdr.sh - rbdr/map/blobdiff - Map/MapRenderComponents/MapVertices.swift
Fix performance and undo
[rbdr/map] / Map / MapRenderComponents / MapVertices.swift
index 71f85be82a1b477d71db522c771db4efb21cd84f..24d49b8095061abc8567298fcaa3828c50128b96 100644 (file)
@@ -15,12 +15,7 @@ struct MapVertices: View {
 
   var body: some View {
     ForEach(vertices, id: \.id) { vertex in
-      Path { path in
-        path.addEllipse(
-          in: CGRect(
-            origin: CGPoint(x: w(vertex.position.x), y: h(vertex.position.y)), size: vertexSize
-          ))
-      }.fill(color.foreground)
+      getVertexShape(vertex).fill(color.foreground)
       Text(vertex.label).foregroundColor(color.secondary).offset(
         CGSize(
           width: w(vertex.position.x) + vertexSize.width + padding,
@@ -35,6 +30,52 @@ struct MapVertices: View {
   func w(_ dimension: CGFloat) -> CGFloat {
     max(0.0, min(mapSize.width, dimension * mapSize.width / 100.0))
   }
+
+  func getVertexShape(_ vertex: Vertex) -> Path {
+    switch vertex.shape {
+    case .circle:
+      return Path { path in
+        path.addEllipse(
+          in: CGRect(
+            origin: CGPoint(x: w(vertex.position.x), y: h(vertex.position.y)), size: vertexSize
+          ))
+      }
+    case .square:
+      return Path { path in
+        path.addRect(
+          CGRect(
+            x: w(vertex.position.x), y: h(vertex.position.y), width: vertexSize.width,
+            height: vertexSize.height
+          ))
+      }
+    case .triangle:
+      return Path { path in
+        path.move(to: CGPoint(x: w(vertex.position.x), y: h(vertex.position.y) + vertexSize.height))
+        path.addLine(
+          to: CGPoint(
+            x: w(vertex.position.x) + vertexSize.width, y: h(vertex.position.y) + vertexSize.height)
+        )
+        path.addLine(
+          to: CGPoint(x: w(vertex.position.x) + vertexSize.width / 2.0, y: h(vertex.position.y)))
+        path.addLine(
+          to: CGPoint(x: w(vertex.position.x), y: h(vertex.position.y) + vertexSize.height))
+        path.closeSubpath()
+      }
+    case .x:
+      return Path { path in
+        path.move(to: CGPoint(x: w(vertex.position.x), y: h(vertex.position.y)))
+        path.addLine(
+          to: CGPoint(
+            x: w(vertex.position.x) + vertexSize.width, y: h(vertex.position.y) + vertexSize.height)
+        )
+        path.closeSubpath()
+        path.move(to: CGPoint(x: w(vertex.position.x) + vertexSize.width, y: h(vertex.position.y)))
+        path.addLine(
+          to: CGPoint(x: w(vertex.position.x), y: h(vertex.position.y) + vertexSize.height))
+        path.closeSubpath()
+      }.strokedPath(StrokeStyle(lineWidth: 5.0, lineCap: .butt))
+    }
+  }
 }
 
 struct MapVertices_Previews: PreviewProvider {