first pass at operator profiles

This commit is contained in:
stopflock
2025-08-29 15:09:19 -05:00
parent 04a6d129b7
commit 208b3486f3
15 changed files with 669 additions and 13 deletions
+31
View File
@@ -0,0 +1,31 @@
import 'package:flutter/material.dart';
import '../models/operator_profile.dart';
import '../services/operator_profile_service.dart';
class OperatorProfileState extends ChangeNotifier {
final List<OperatorProfile> _profiles = [];
List<OperatorProfile> get profiles => List.unmodifiable(_profiles);
Future<void> init() async {
_profiles.addAll(await OperatorProfileService().load());
}
void addOrUpdateProfile(OperatorProfile p) {
final idx = _profiles.indexWhere((x) => x.id == p.id);
if (idx >= 0) {
_profiles[idx] = p;
} else {
_profiles.add(p);
}
OperatorProfileService().save(_profiles);
notifyListeners();
}
void deleteProfile(OperatorProfile p) {
_profiles.removeWhere((x) => x.id == p.id);
OperatorProfileService().save(_profiles);
notifyListeners();
}
}
+13
View File
@@ -2,12 +2,14 @@ import 'package:flutter/material.dart';
import 'package:latlong2/latlong.dart';
import '../models/camera_profile.dart';
import '../models/operator_profile.dart';
import '../models/osm_camera_node.dart';
// ------------------ AddCameraSession ------------------
class AddCameraSession {
AddCameraSession({required this.profile, this.directionDegrees = 0});
CameraProfile profile;
OperatorProfile? operatorProfile;
double directionDegrees;
LatLng? target;
}
@@ -23,6 +25,7 @@ class EditCameraSession {
final OsmCameraNode originalNode; // The original camera being edited
CameraProfile profile;
OperatorProfile? operatorProfile;
double directionDegrees;
LatLng target; // Current position (can be dragged)
}
@@ -84,6 +87,7 @@ class SessionState extends ChangeNotifier {
void updateSession({
double? directionDeg,
CameraProfile? profile,
OperatorProfile? operatorProfile,
LatLng? target,
}) {
if (_session == null) return;
@@ -97,6 +101,10 @@ class SessionState extends ChangeNotifier {
_session!.profile = profile;
dirty = true;
}
if (operatorProfile != _session!.operatorProfile) {
_session!.operatorProfile = operatorProfile;
dirty = true;
}
if (target != null) {
_session!.target = target;
dirty = true;
@@ -107,6 +115,7 @@ class SessionState extends ChangeNotifier {
void updateEditSession({
double? directionDeg,
CameraProfile? profile,
OperatorProfile? operatorProfile,
LatLng? target,
}) {
if (_editSession == null) return;
@@ -120,6 +129,10 @@ class SessionState extends ChangeNotifier {
_editSession!.profile = profile;
dirty = true;
}
if (operatorProfile != _editSession!.operatorProfile) {
_editSession!.operatorProfile = operatorProfile;
dirty = true;
}
if (target != null && target != _editSession!.target) {
_editSession!.target = target;
dirty = true;
+4 -8
View File
@@ -30,6 +30,7 @@ class UploadQueueState extends ChangeNotifier {
coord: session.target!,
direction: session.directionDegrees,
profile: session.profile,
operatorProfile: session.operatorProfile,
uploadMode: uploadMode,
);
@@ -40,10 +41,7 @@ class UploadQueueState extends ChangeNotifier {
// Create a temporary node with a negative ID (to distinguish from real OSM nodes)
// Using timestamp as negative ID to ensure uniqueness
final tempId = -DateTime.now().millisecondsSinceEpoch;
final tags = Map<String, String>.from(upload.profile.tags);
if (upload.profile.requiresDirection) {
tags['direction'] = upload.direction.toStringAsFixed(0);
}
final tags = upload.getCombinedTags();
tags['_pending_upload'] = 'true'; // Mark as pending for potential UI distinction
final tempNode = OsmCameraNode(
@@ -65,6 +63,7 @@ class UploadQueueState extends ChangeNotifier {
coord: session.target,
direction: session.directionDegrees,
profile: session.profile,
operatorProfile: session.operatorProfile,
uploadMode: uploadMode,
originalNodeId: session.originalNode.id, // Track which node we're editing
);
@@ -86,10 +85,7 @@ class UploadQueueState extends ChangeNotifier {
// 2. Create new temp node for the edited camera (purple ring) at new location
final tempId = -DateTime.now().millisecondsSinceEpoch;
final editedTags = Map<String, String>.from(upload.profile.tags);
if (upload.profile.requiresDirection) {
editedTags['direction'] = upload.direction.toStringAsFixed(0);
}
final editedTags = upload.getCombinedTags();
editedTags['_pending_upload'] = 'true'; // Mark as pending upload
editedTags['_original_node_id'] = session.originalNode.id.toString(); // Track original for line drawing