diff --git a/lib/state/upload_queue_state.dart b/lib/state/upload_queue_state.dart index ecd1cad..b1cd21f 100644 --- a/lib/state/upload_queue_state.dart +++ b/lib/state/upload_queue_state.dart @@ -85,6 +85,7 @@ class UploadQueueState extends ChangeNotifier { final editedTags = Map.from(upload.profile.tags); editedTags['direction'] = upload.direction.toStringAsFixed(0); editedTags['_pending_upload'] = 'true'; // Mark as pending upload + editedTags['_original_node_id'] = session.originalNode.id.toString(); // Track original for line drawing final editedNode = OsmCameraNode( id: tempId, diff --git a/lib/widgets/map_view.dart b/lib/widgets/map_view.dart index 7931b23..84286be 100644 --- a/lib/widgets/map_view.dart +++ b/lib/widgets/map_view.dart @@ -312,9 +312,13 @@ class MapViewState extends State { editSession: editSession, ); + // Build edit lines connecting original cameras to their edited positions + final editLines = _buildEditLines(cameras); + return Stack( children: [ PolygonLayer(polygons: overlays), + if (editLines.isNotEmpty) PolylineLayer(polylines: editLines), MarkerLayer(markers: markers), ], ); @@ -390,5 +394,37 @@ class MapViewState extends State { ], ); } + + /// Build polylines connecting original cameras to their edited positions + List _buildEditLines(List cameras) { + final lines = []; + + // Create a lookup map of original node IDs to their coordinates + final originalNodes = {}; + for (final camera in cameras) { + if (camera.tags['_pending_edit'] == 'true') { + originalNodes[camera.id] = camera.coord; + } + } + + // Find edited cameras and draw lines to their originals + for (final camera in cameras) { + final originalIdStr = camera.tags['_original_node_id']; + if (originalIdStr != null && camera.tags['_pending_upload'] == 'true') { + final originalId = int.tryParse(originalIdStr); + final originalCoord = originalId != null ? originalNodes[originalId] : null; + + if (originalCoord != null) { + lines.add(Polyline( + points: [originalCoord, camera.coord], + color: Colors.orange.withOpacity(0.7), + strokeWidth: 2.0, + )); + } + } + } + + return lines; + } }