Add location search, home/fit map buttons, and slim OSM attribution
- TopNavBar: Nominatim geocoding search field plus Home (center on first waypoint) and Fit (zoom to mission bounds) buttons (HTML prototype: #searchWrap/#homeBtn/#fitBtn). Both show a SnackBar instead of doing nothing when there are no waypoints yet. - Renders as its own bar just below TopModeBar rather than fused into the same pill: TopModeBar lives in AppShell, a layer above PlanScreen, which owns the MapController these actions actually need. Fusing them would need lifting the MapController to shared state - reasonable follow-up if pixel-fidelity with the prototype's single bar matters later, but not necessary for the functionality itself. - Replaced SimpleAttributionWidget with a compact custom attribution: OSM's tile usage policy requires visible attribution to stay, so instead of removing it (as first asked) I shrank it and dropped the "flutter_map |" prefix per the user's follow-up choice, so it reads cleanly against the now-opaque bottom bar instead of looking like a second banner. Added 5 tests (nav bar renders, home/fit SnackBars with no waypoints, empty search is a no-op). All 26 tests and flutter analyze pass. Verified on the Pixel_10a emulator: searched "Berlin" and confirmed the map flew there, dropped a waypoint, panned far away, and confirmed Home re-centers and snaps onto it exactly. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
3091476771
commit
dc8e6f9d6e
@@ -72,13 +72,38 @@ class MissionMap extends StatelessWidget {
|
||||
],
|
||||
),
|
||||
CircleLayer(circles: waypointMarkers),
|
||||
SimpleAttributionWidget(
|
||||
alignment: Alignment.bottomLeft,
|
||||
source: const Text('OpenStreetMap contributors'),
|
||||
onTap: () =>
|
||||
launchUrl(Uri.parse('https://www.openstreetmap.org/copyright')),
|
||||
),
|
||||
const _CompactAttribution(),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/// Schlanke Pflicht-Attribution fuer die OSM-Kacheln (Tile Usage Policy) -
|
||||
/// bewusst ohne den "flutter_map |"-Praefix von SimpleAttributionWidget und
|
||||
/// dezenter gestaltet, damit sie nicht wie ein zweiter Balken ueber der
|
||||
/// Bottom-Bar wirkt. Bleibt sichtbar und antippbar, da die Policy sichtbare
|
||||
/// Namensnennung verlangt.
|
||||
class _CompactAttribution extends StatelessWidget {
|
||||
const _CompactAttribution();
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return SafeArea(
|
||||
child: Align(
|
||||
alignment: Alignment.bottomLeft,
|
||||
child: GestureDetector(
|
||||
onTap: () =>
|
||||
launchUrl(Uri.parse('https://www.openstreetmap.org/copyright')),
|
||||
child: Container(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 1),
|
||||
color: Colors.white.withValues(alpha: 0.5),
|
||||
child: const Text(
|
||||
'© OpenStreetMap contributors',
|
||||
style: TextStyle(fontSize: 9, color: Colors.black87),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user