Location search starts a new mission; shrink and center header bar

Ortssuche verschob bisher nur die Karte - der HTML-Demonstrator beginnt
bei einer Suche immer eine neue, nach dem gefundenen Ort benannte
Mission (setMissionFromPlace(), aufgerufen aus doSearch()). Vorherige
Aenderungen gehen dabei nicht verloren, da flushPendingAutosave()
(hier: CurrentMissionMetaNotifier._flushNow()) zuerst noch ausstehende
Autosaves schreibt.

Die Nominatim-Suche wurde dafuer aus MapSearchControls in einen
eigenstaendigen NominatimService extrahiert (analog WindService):
injectable http.Client, damit sich die Suche in Tests ohne echten
Netzwerkzugriff ueberschreiben laesst. CurrentMissionMetaNotifier bekam
dafuer startNewFromPlace() (startNew() intern darauf umgebaut, um
Duplikation zu vermeiden).

Kopfleiste von 86%/64% (Plan-/Fly-Modus) auf einheitlich 70%
Bildschirmbreite verkleinert - zentriert war sie durch Align(topCenter)
+ FractionallySizedBox bereits strukturell korrekt, wirkte bei der
vollen Breite aber unausgewogen.

Verifiziert: flutter analyze (0 issues), flutter test (64/64, davon 4
neue NominatimService-Tests und 1 neuer Widget-Test fuer den
Missions-Reset bei Ortssuche), manuell auf Pixel_10a-Emulator - Suche
nach "Rotterdam" setzt Fusszeile auf "Mission: Rotterdam" mit 0
Wegpunkten trotz zuvor bestehender Mission mit Wegpunkten.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Constantin Leue
2026-07-28 15:22:36 +02:00
co-authored by Claude Sonnet 5
parent aaec7f0f72
commit 926d805156
7 changed files with 234 additions and 21 deletions
@@ -59,12 +59,20 @@ class CurrentMissionMetaNotifier extends Notifier<MissionMeta> {
/// Analog startNewMission() im HTML-Demonstrator: sichert zuerst noch
/// ausstehende Aenderungen der bisherigen Mission, dann leerer Neustart.
Future<void> startNew() async {
Future<void> startNew() => _startNew(const MissionMeta());
/// Analog setMissionFromPlace() im HTML-Demonstrator: eine Ortssuche (oder
/// GPS-Ortung) beginnt immer eine neue, leere Mission, benannt nach dem
/// gefundenen Ort - nicht nur ein Kartensprung.
Future<void> startNewFromPlace(String label) =>
_startNew(MissionMeta(name: label, placeName: label));
Future<void> _startNew(MissionMeta newState) async {
await _flushNow();
_suppressAutosave = true;
ref.read(currentMissionProvider.notifier).replaceAll(const []);
_suppressAutosave = false;
state = const MissionMeta();
state = newState;
await ref.read(appSettingsRepositoryProvider).setCurrentMissionId(null);
}