import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:latlong2/latlong.dart'; import '../../../domain/waypoint/flat_waypoint_list.dart'; import '../../providers/current_mission_provider.dart'; import '../../widgets/mission_map.dart'; import '../../widgets/reticle_button.dart'; /// Missionsplanung: Karte + Wegpunktliste (Architektur-Doku 3.6/3.7). /// Kein eigenes Scaffold - die Kopfleiste (Plan/Fly-Umschalter) und der /// gemeinsame Scaffold-Rahmen liegen im AppShell darueber. Wegpunktliste, /// Draeder und Bottom-Bar folgen als naechster Schritt. class PlanScreen extends ConsumerStatefulWidget { const PlanScreen({super.key}); @override ConsumerState createState() => _PlanScreenState(); } class _PlanScreenState extends ConsumerState { final _mapController = MapController(); // TODO: aus dem aktiven Drohnen-Profil (Doku 3.5) uebernehmen, sobald die // Profilverwaltung existiert. Werte entsprechen dem Default-Profil // T1 Ranger im HTML-Demonstrator (curAlt=60, cruiseSpeed=15, catchRadius=60). static const _defaultAltitudeM = 60.0; static const _defaultSpeedMs = 15.0; static const _defaultCatchRadiusM = 60.0; @override void dispose() { _mapController.dispose(); super.dispose(); } void _addWaypointAtMapCenter() { final center = _mapController.camera.center; ref.read(currentMissionProvider.notifier).addWaypoint( Waypoint( lat: center.latitude, lon: center.longitude, altitudeM: _defaultAltitudeM, speedMs: _defaultSpeedMs, catchRadiusM: _defaultCatchRadiusM, ), ); } @override Widget build(BuildContext context) { final waypoints = ref.watch(currentMissionProvider); return Stack( children: [ MissionMap( mapController: _mapController, waypointMarkers: [ for (final wp in waypoints) CircleMarker( point: LatLng(wp.lat, wp.lon), radius: 6, color: const Color(0xFF2B2B28), borderStrokeWidth: 1.5, borderColor: Colors.white, ), ], ), Align( alignment: Alignment.center, child: ReticleButton(onTap: _addWaypointAtMapCenter), ), ], ); } }