follow mode button, zoom mode and abort behavior tuning

This commit is contained in:
Constantin Leue
2026-08-03 22:29:22 +02:00
parent 2f4353f3fa
commit ba14af8469
4 changed files with 108 additions and 20 deletions
+16 -6
View File
@@ -6,6 +6,7 @@ import '../providers/current_mission_provider.dart';
import '../providers/follow_drone_provider.dart';
import '../providers/map_controller_provider.dart';
import '../providers/telemetry_provider.dart';
import 'drone_follow_icon.dart';
import 'nav_icon_button.dart';
/// Kartensteuerung im Fly-Modus (Doku 3.11): Ortssuche/Home entfallen hier
@@ -16,10 +17,11 @@ import 'nav_icon_button.dart';
class FlyMapControls extends ConsumerWidget {
const FlyMapControls({super.key});
/// Zielzoom beim Aktivieren des Folgemodus - naeher als der
/// Standard-Kartenzoom (siehe MissionMap._initialZoom), damit der Sprung
/// tatsaechlich als Zoom wahrgenommen wird und nicht nur als Verschieben.
static const _followZoom = 18.0;
/// Zielzoom beim Aktivieren des Folgemodus - deutlich weiter herausgezoomt
/// als der Standard-Kartenzoom (siehe MissionMap._initialZoom), damit
/// waehrend des Verfolgens genug Gelaende/Route um die Drohne herum
/// sichtbar bleibt statt nur ihrer unmittelbaren Umgebung.
static const _followZoom = 16.0;
/// Erster Tap zoomt auf die aktuelle Telemetrieposition und aktiviert den
/// Folgemodus (FlyScreen haengt sich darauf ein, zieht die Karte bei
@@ -41,6 +43,14 @@ class FlyMapControls extends ConsumerWidget {
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) {
final waypoints = ref.read(currentMissionProvider);
if (waypoints.isEmpty) {
@@ -48,6 +58,7 @@ class FlyMapControls extends ConsumerWidget {
.showSnackBar(const SnackBar(content: Text('No waypoints to fit')));
return;
}
ref.read(followDroneProvider.notifier).set(false);
fitMapToWaypoints(ref, waypoints);
}
@@ -58,8 +69,7 @@ class FlyMapControls extends ConsumerWidget {
mainAxisSize: MainAxisSize.min,
children: [
NavIconButton(
icon: following ? Icons.gps_fixed : Icons.my_location,
active: following,
iconWidget: DroneFollowIcon(active: following),
onTap: () => _onDronePressed(context, ref),
),
const SizedBox(width: 8),