follow mode behaviour tuned: load mission and jump to wayoinnt cancels follow mode
This commit is contained in:
@@ -4,6 +4,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|||||||
import 'package:latlong2/latlong.dart';
|
import 'package:latlong2/latlong.dart';
|
||||||
|
|
||||||
import '../../domain/waypoint/flat_waypoint_list.dart';
|
import '../../domain/waypoint/flat_waypoint_list.dart';
|
||||||
|
import 'follow_drone_provider.dart';
|
||||||
|
|
||||||
/// Ein einziger, app-lebenslanger MapController statt einer pro
|
/// Ein einziger, app-lebenslanger MapController statt einer pro
|
||||||
/// PlanScreen-Mount neu erzeugten Instanz.
|
/// PlanScreen-Mount neu erzeugten Instanz.
|
||||||
@@ -54,5 +55,16 @@ void fitMapControllerToWaypoints(MapController controller, List<Waypoint> waypoi
|
|||||||
/// ConsumerStatefulWidget mit [WidgetRef]) - geteilt zwischen dem manuellen
|
/// ConsumerStatefulWidget mit [WidgetRef]) - geteilt zwischen dem manuellen
|
||||||
/// Fit-Button (MapSearchControls/FlyMapControls) und den map-bezogenen
|
/// Fit-Button (MapSearchControls/FlyMapControls) und den map-bezogenen
|
||||||
/// Warnungs-Aktionen (Doku 3.10).
|
/// Warnungs-Aktionen (Doku 3.10).
|
||||||
void fitMapToWaypoints(WidgetRef ref, List<Waypoint> waypoints) =>
|
///
|
||||||
fitMapControllerToWaypoints(ref.read(mapControllerProvider), waypoints);
|
/// Beendet dabei immer auch den Kartenfolgemodus (followDroneProvider,
|
||||||
|
/// Doku 3.11) - dieser Fit bewegt die Kamera ueber denselben MapController
|
||||||
|
/// wie die Telemetrie-Nachfuehrung (source == mapController), FlyScreens
|
||||||
|
/// Abbruch bei manueller Karteninteraktion greift hier also nicht. Ohne
|
||||||
|
/// diesen expliziten Abbruch wuerde der naechste Telemetrie-Frame die
|
||||||
|
/// Kamera sofort wieder von der gerade eingestellten Uebersicht weg auf die
|
||||||
|
/// Drohne zurueckziehen. In Plan-Modus/Mock-Kontexten ohne aktiven
|
||||||
|
/// Folgemodus ist der Aufruf ein no-op.
|
||||||
|
void fitMapToWaypoints(WidgetRef ref, List<Waypoint> waypoints) {
|
||||||
|
ref.read(followDroneProvider.notifier).set(false);
|
||||||
|
fitMapControllerToWaypoints(ref.read(mapControllerProvider), waypoints);
|
||||||
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|||||||
import '../../domain/waypoint/flat_waypoint_list.dart';
|
import '../../domain/waypoint/flat_waypoint_list.dart';
|
||||||
import 'current_mission_provider.dart';
|
import 'current_mission_provider.dart';
|
||||||
import 'database_provider.dart';
|
import 'database_provider.dart';
|
||||||
|
import 'follow_drone_provider.dart';
|
||||||
import 'map_controller_provider.dart';
|
import 'map_controller_provider.dart';
|
||||||
|
|
||||||
/// Metadaten der aktuell in Bearbeitung befindlichen Mission - ergaenzt
|
/// Metadaten der aktuell in Bearbeitung befindlichen Mission - ergaenzt
|
||||||
@@ -100,7 +101,13 @@ class CurrentMissionMetaNotifier extends Notifier<MissionMeta> {
|
|||||||
/// nutzt dieselbe Padding-Logik wie der manuelle Fit-Button
|
/// nutzt dieselbe Padding-Logik wie der manuelle Fit-Button
|
||||||
/// (fitMapControllerToWaypoints), damit beide nicht wieder auseinander-
|
/// (fitMapControllerToWaypoints), damit beide nicht wieder auseinander-
|
||||||
/// laufen koennen.
|
/// laufen koennen.
|
||||||
|
///
|
||||||
|
/// Beendet dabei ebenfalls den Kartenfolgemodus (followDroneProvider,
|
||||||
|
/// Doku 3.11, siehe fitMapToWaypoints in map_controller_provider.dart) -
|
||||||
|
/// das Laden einer anderen Mission waehrend des Verfolgens soll auf der
|
||||||
|
/// neuen Mission stehen bleiben, nicht sofort wieder zur Drohne springen.
|
||||||
void _fitMapToWaypoints(List<Waypoint> waypoints) {
|
void _fitMapToWaypoints(List<Waypoint> waypoints) {
|
||||||
|
ref.read(followDroneProvider.notifier).set(false);
|
||||||
fitMapControllerToWaypoints(ref.read(mapControllerProvider), waypoints);
|
fitMapControllerToWaypoints(ref.read(mapControllerProvider), waypoints);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -71,6 +71,11 @@ class _FlyScreenState extends ConsumerState<FlyScreen> {
|
|||||||
final waypoints = ref.read(currentMissionProvider);
|
final waypoints = ref.read(currentMissionProvider);
|
||||||
if (index < 0 || index >= waypoints.length) return;
|
if (index < 0 || index >= waypoints.length) return;
|
||||||
final wp = waypoints[index];
|
final wp = waypoints[index];
|
||||||
|
// Programmatischer Sprung (source == mapController) - _onMapEvent
|
||||||
|
// erkennt das nicht als manuelle Geste, der Folgemodus muss also
|
||||||
|
// explizit beendet werden (sonst zieht der naechste Telemetrie-Frame
|
||||||
|
// die Kamera sofort wieder vom antippten Wegpunkt weg).
|
||||||
|
ref.read(followDroneProvider.notifier).set(false);
|
||||||
_mapController.move(LatLng(wp.lat, wp.lon), _mapController.camera.zoom);
|
_mapController.move(LatLng(wp.lat, wp.lon), _mapController.camera.zoom);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -43,14 +43,6 @@ class FlyMapControls extends ConsumerWidget {
|
|||||||
ref.read(followDroneProvider.notifier).set(true);
|
ref.read(followDroneProvider.notifier).set(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Beendet den Folgemodus explizit, statt sich auf den Abbruch bei
|
|
||||||
/// manueller Karteninteraktion in FlyScreen zu verlassen (FlyScreen._
|
|
||||||
/// onMapEvent) - fitMapToWaypoints() bewegt die Kamera ueber denselben
|
|
||||||
/// MapController (source == mapController), gilt dort also nicht als
|
|
||||||
/// manuelle Geste und wuerde den Folgemodus sonst aktiv lassen. Ohne
|
|
||||||
/// diesen Abbruch wuerde der naechste Telemetrie-Frame die Kamera sofort
|
|
||||||
/// wieder von der gerade eingestellten Missionsuebersicht weg auf die
|
|
||||||
/// Drohne zurueckziehen.
|
|
||||||
void _onFitPressed(BuildContext context, WidgetRef ref) {
|
void _onFitPressed(BuildContext context, WidgetRef ref) {
|
||||||
final waypoints = ref.read(currentMissionProvider);
|
final waypoints = ref.read(currentMissionProvider);
|
||||||
if (waypoints.isEmpty) {
|
if (waypoints.isEmpty) {
|
||||||
@@ -58,7 +50,8 @@ class FlyMapControls extends ConsumerWidget {
|
|||||||
.showSnackBar(const SnackBar(content: Text('No waypoints to fit')));
|
.showSnackBar(const SnackBar(content: Text('No waypoints to fit')));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ref.read(followDroneProvider.notifier).set(false);
|
// Beendet den Folgemodus mit (siehe fitMapToWaypoints-Doku in
|
||||||
|
// map_controller_provider.dart).
|
||||||
fitMapToWaypoints(ref, waypoints);
|
fitMapToWaypoints(ref, waypoints);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user