From f805796af9d0ba3b34c2ffb992775404ebb54616 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Sun, 19 Mar 2023 11:28:01 -0700 Subject: [PATCH] Breadcrumb lines for today for node details --- .../Views/Map/Custom/MapViewSwiftUI.swift | 93 +++++++++++-------- Meshtastic/Views/Nodes/NodeDetail.swift | 2 +- Meshtastic/Views/Nodes/NodeMap.swift | 1 + 3 files changed, 58 insertions(+), 38 deletions(-) diff --git a/Meshtastic/Views/Map/Custom/MapViewSwiftUI.swift b/Meshtastic/Views/Map/Custom/MapViewSwiftUI.swift index 46a6d070..f208339d 100644 --- a/Meshtastic/Views/Map/Custom/MapViewSwiftUI.swift +++ b/Meshtastic/Views/Map/Custom/MapViewSwiftUI.swift @@ -21,7 +21,7 @@ struct MapViewSwiftUI: UIViewRepresentable { let mapViewType: MKMapType let userTrackingMode: MKUserTrackingMode let centeringMode: CenteringMode - + let showBreadcrumbLines: Bool let centerOnPositionsOnly: Bool @AppStorage("meshMapRecentering") private var recenter: Bool = false @@ -120,6 +120,16 @@ struct MapViewSwiftUI: UIViewRepresentable { DispatchQueue.main.async { self.presentCustomMapOverlayHash = self.customMapOverlay self.loadedLastUpdatedLocalMapFile = self.lastUpdatedLocalMapFile + + if showBreadcrumbLines { + let nodePositions = positions.filter { $0.time! > Calendar.current.startOfDay(for: Date()) } + let lineCoords = nodePositions.map ({ + (position) -> CLLocationCoordinate2D in + return position.nodeCoordinate! + }) + let polyline = MKPolyline(coordinates: lineCoords, count: nodePositions.count) + mapView.addOverlay(polyline) + } } } @@ -334,45 +344,54 @@ struct MapViewSwiftUI: UIViewRepresentable { public func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer { - if let index = self.overlays.firstIndex(where: { overlay_ in overlay_.shape.hash == overlay.hash }) { +// if let index = self.overlays.firstIndex(where: { overlay_ in overlay_.shape.hash == overlay.hash }) { - let unwrappedOverlay = self.overlays[index] - if let circleOverlay = unwrappedOverlay.shape as? MKCircle { - let renderer = MKCircleRenderer(circle: circleOverlay) - renderer.fillColor = unwrappedOverlay.fillColor - renderer.strokeColor = unwrappedOverlay.strokeColor - renderer.lineWidth = unwrappedOverlay.lineWidth - return renderer - } else if let polygonOverlay = unwrappedOverlay.shape as? MKPolygon { - let renderer = MKPolygonRenderer(polygon: polygonOverlay) - renderer.fillColor = unwrappedOverlay.fillColor - renderer.strokeColor = unwrappedOverlay.strokeColor - renderer.lineWidth = unwrappedOverlay.lineWidth - return renderer - } else if let multiPolygonOverlay = unwrappedOverlay.shape as? MKMultiPolygon { - let renderer = MKMultiPolygonRenderer(multiPolygon: multiPolygonOverlay) - renderer.fillColor = unwrappedOverlay.fillColor - renderer.strokeColor = unwrappedOverlay.strokeColor - renderer.lineWidth = unwrappedOverlay.lineWidth - return renderer - } else if let polyLineOverlay = unwrappedOverlay.shape as? MKPolyline { - let renderer = MKPolylineRenderer(polyline: polyLineOverlay) - renderer.fillColor = unwrappedOverlay.fillColor - renderer.strokeColor = unwrappedOverlay.strokeColor - renderer.lineWidth = unwrappedOverlay.lineWidth - return renderer - } else if let multiPolylineOverlay = unwrappedOverlay.shape as? MKMultiPolyline { - let renderer = MKMultiPolylineRenderer(multiPolyline: multiPolylineOverlay) - renderer.fillColor = unwrappedOverlay.fillColor - renderer.strokeColor = unwrappedOverlay.strokeColor - renderer.lineWidth = unwrappedOverlay.lineWidth - return renderer - } else { - return MKOverlayRenderer() - } - } else if let tileOverlay = overlay as? MKTileOverlay { +// let unwrappedOverlay = self.overlays[index] +// if let circleOverlay = unwrappedOverlay.shape as? MKCircle { +// let renderer = MKCircleRenderer(circle: circleOverlay) +// renderer.fillColor = unwrappedOverlay.fillColor +// renderer.strokeColor = unwrappedOverlay.strokeColor +// renderer.lineWidth = unwrappedOverlay.lineWidth +// return renderer +// } else +// if let polygonOverlay = unwrappedOverlay.shape as? MKPolygon { +// let renderer = MKPolygonRenderer(polygon: polygonOverlay) +// renderer.fillColor = unwrappedOverlay.fillColor +// renderer.strokeColor = unwrappedOverlay.strokeColor +// renderer.lineWidth = unwrappedOverlay.lineWidth +// return renderer +// } else if let multiPolygonOverlay = unwrappedOverlay.shape as? MKMultiPolygon { +// let renderer = MKMultiPolygonRenderer(multiPolygon: multiPolygonOverlay) +// renderer.fillColor = unwrappedOverlay.fillColor +// renderer.strokeColor = unwrappedOverlay.strokeColor +// renderer.lineWidth = unwrappedOverlay.lineWidth +// return renderer +// } else if let polyLineOverlay = unwrappedOverlay.shape as? MKPolyline { +// let renderer = MKPolylineRenderer(polyline: polyLineOverlay) +// renderer.fillColor = unwrappedOverlay.fillColor +// renderer.strokeColor = unwrappedOverlay.strokeColor +// renderer.lineWidth = unwrappedOverlay.lineWidth +// return renderer +// } else if let multiPolylineOverlay = unwrappedOverlay.shape as? MKMultiPolyline { +// let renderer = MKMultiPolylineRenderer(multiPolyline: multiPolylineOverlay) +// renderer.fillColor = unwrappedOverlay.fillColor +// renderer.strokeColor = unwrappedOverlay.strokeColor +// renderer.lineWidth = unwrappedOverlay.lineWidth +// return renderer +// } +// else { +// return MKOverlayRenderer() +// } +// } else + if let tileOverlay = overlay as? MKTileOverlay { return MKTileOverlayRenderer(tileOverlay: tileOverlay) } else { + if let routePolyline = overlay as? MKPolyline { + let renderer = MKPolylineRenderer(polyline: routePolyline) + renderer.strokeColor = UIColor.systemBlue + renderer.lineWidth = 5 + return renderer + } return MKOverlayRenderer() } } diff --git a/Meshtastic/Views/Nodes/NodeDetail.swift b/Meshtastic/Views/Nodes/NodeDetail.swift index d914ec74..c5cafe02 100644 --- a/Meshtastic/Views/Nodes/NodeDetail.swift +++ b/Meshtastic/Views/Nodes/NodeDetail.swift @@ -71,10 +71,10 @@ struct NodeDetail: View { mapViewType: mapType, userTrackingMode: MKUserTrackingMode.none, centeringMode: .allPositions, + showBreadcrumbLines: true, centerOnPositionsOnly: true, customMapOverlay: self.customMapOverlay, overlays: self.overlays - ) VStack(alignment: .leading) { Spacer() diff --git a/Meshtastic/Views/Nodes/NodeMap.swift b/Meshtastic/Views/Nodes/NodeMap.swift index 3a9d3de5..7dbad566 100644 --- a/Meshtastic/Views/Nodes/NodeMap.swift +++ b/Meshtastic/Views/Nodes/NodeMap.swift @@ -84,6 +84,7 @@ struct NodeMap: View { mapViewType: mapType, userTrackingMode: userTrackingMode, centeringMode: mapCenteringMode, + showBreadcrumbLines: false, centerOnPositionsOnly: false, customMapOverlay: self.customMapOverlay, overlays: self.overlays