diff --git a/lib/dev_config.dart b/lib/dev_config.dart index 30173c1..22b8017 100644 --- a/lib/dev_config.dart +++ b/lib/dev_config.dart @@ -57,3 +57,4 @@ const Color kCameraRingColorReal = Color(0xC43F55F3); // Real cameras from OSM - const Color kCameraRingColorMock = Color(0xC4FFFFFF); // Add camera mock point - white const Color kCameraRingColorPending = Color(0xC49C27B0); // Submitted/pending cameras - purple const Color kCameraRingColorEditing = Color(0xC4FF9800); // Camera being edited - orange +const Color kCameraRingColorPendingEdit = Color(0xC4757575); // Original camera with pending edit - grey diff --git a/lib/state/upload_queue_state.dart b/lib/state/upload_queue_state.dart index a01eb54..ecd1cad 100644 --- a/lib/state/upload_queue_state.dart +++ b/lib/state/upload_queue_state.dart @@ -68,17 +68,31 @@ class UploadQueueState extends ChangeNotifier { _queue.add(upload); _saveQueue(); - // Update the original camera in the cache to mark it as having a pending edit - final originalTags = Map.from(session.originalNode.tags); - originalTags['_pending_upload'] = 'true'; // Mark as pending for UI distinction + // Create two cache entries: - final updatedNode = OsmCameraNode( + // 1. Mark the original camera with _pending_edit (grey ring) at original location + final originalTags = Map.from(session.originalNode.tags); + originalTags['_pending_edit'] = 'true'; // Mark original as having pending edit + + final originalNode = OsmCameraNode( id: session.originalNode.id, - coord: session.originalNode.coord, + coord: session.originalNode.coord, // Keep at original location tags: originalTags, ); - CameraCache.instance.addOrUpdate([updatedNode]); + // 2. Create new temp node for the edited camera (purple ring) at new location + final tempId = -DateTime.now().millisecondsSinceEpoch; + final editedTags = Map.from(upload.profile.tags); + editedTags['direction'] = upload.direction.toStringAsFixed(0); + editedTags['_pending_upload'] = 'true'; // Mark as pending upload + + final editedNode = OsmCameraNode( + id: tempId, + coord: upload.coord, // At new location + tags: editedTags, + ); + + CameraCache.instance.addOrUpdate([originalNode, editedNode]); // Notify camera provider to update the map CameraProviderWithCache.instance.notifyListeners(); diff --git a/lib/widgets/camera_icon.dart b/lib/widgets/camera_icon.dart index dd62df2..d3c4d64 100644 --- a/lib/widgets/camera_icon.dart +++ b/lib/widgets/camera_icon.dart @@ -2,10 +2,11 @@ import 'package:flutter/material.dart'; import '../dev_config.dart'; enum CameraIconType { - real, // Blue ring - real cameras from OSM - mock, // White ring - add camera mock point - pending, // Purple ring - submitted/pending cameras - editing, // Orange ring - camera being edited + real, // Blue ring - real cameras from OSM + mock, // White ring - add camera mock point + pending, // Purple ring - submitted/pending cameras + editing, // Orange ring - camera being edited + pendingEdit, // Grey ring - original camera with pending edit } /// Simple camera icon with grey dot and colored ring @@ -24,6 +25,8 @@ class CameraIcon extends StatelessWidget { return kCameraRingColorPending; case CameraIconType.editing: return kCameraRingColorEditing; + case CameraIconType.pendingEdit: + return kCameraRingColorPendingEdit; } } diff --git a/lib/widgets/camera_tag_sheet.dart b/lib/widgets/camera_tag_sheet.dart index 3853d99..c5c897b 100644 --- a/lib/widgets/camera_tag_sheet.dart +++ b/lib/widgets/camera_tag_sheet.dart @@ -12,9 +12,11 @@ class CameraTagSheet extends StatelessWidget { Widget build(BuildContext context) { final appState = context.watch(); - // Check if this camera is editable (not a pending upload) - final isEditable = !node.tags.containsKey('_pending_upload') || - node.tags['_pending_upload'] != 'true'; + // Check if this camera is editable (not a pending upload or pending edit) + final isEditable = (!node.tags.containsKey('_pending_upload') || + node.tags['_pending_upload'] != 'true') && + (!node.tags.containsKey('_pending_edit') || + node.tags['_pending_edit'] != 'true'); void _openEditSheet() { Navigator.pop(context); // Close this sheet first diff --git a/lib/widgets/map/camera_markers.dart b/lib/widgets/map/camera_markers.dart index 40110eb..0ab73b7 100644 --- a/lib/widgets/map/camera_markers.dart +++ b/lib/widgets/map/camera_markers.dart @@ -46,16 +46,25 @@ class _CameraMapMarkerState extends State { @override Widget build(BuildContext context) { - // Check if this is a pending upload - final isPending = widget.node.tags.containsKey('_pending_upload') && - widget.node.tags['_pending_upload'] == 'true'; + // Check camera state + final isPendingUpload = widget.node.tags.containsKey('_pending_upload') && + widget.node.tags['_pending_upload'] == 'true'; + final isPendingEdit = widget.node.tags.containsKey('_pending_edit') && + widget.node.tags['_pending_edit'] == 'true'; + + CameraIconType iconType; + if (isPendingUpload) { + iconType = CameraIconType.pending; + } else if (isPendingEdit) { + iconType = CameraIconType.pendingEdit; + } else { + iconType = CameraIconType.real; + } return GestureDetector( onTap: _onTap, onDoubleTap: _onDoubleTap, - child: CameraIcon( - type: isPending ? CameraIconType.pending : CameraIconType.real, - ), + child: CameraIcon(type: iconType), ); } }