import 'package:flutter/foundation.dart'; import 'package:latlong2/latlong.dart'; import 'hud_geometry.dart'; import 'state/aircraft_state.dart'; /// The path the aircraft has flown this session, for the minimap. Follows an /// [AircraftState] and keeps a point every [minSpacing] metres, so a 10 Hz /// hover does not grow the list. class FlightTrail extends ChangeNotifier { FlightTrail(this.aircraft, {this.minSpacing = 2, this.maxPoints = 5000}) { aircraft.addListener(_onAircraft); _onAircraft(); } final AircraftState aircraft; final double minSpacing; // m final int maxPoints; final List _points = []; List get points => List.unmodifiable(_points); void _onAircraft() { final double? lat = aircraft.latitude, lon = aircraft.longitude; if (lat == null || lon == null || (lat == 0 && lon == 0)) return; if (_points.isNotEmpty) { final LatLng last = _points.last; if (HudGeometry.distance(last.latitude, last.longitude, lat, lon) < minSpacing) return; } _points.add(LatLng(lat, lon)); if (_points.length > maxPoints) _points.removeRange(0, _points.length - maxPoints); notifyListeners(); } void clear() { if (_points.isEmpty) return; _points.clear(); notifyListeners(); } @override void dispose() { aircraft.removeListener(_onAircraft); super.dispose(); } }