mirror of
https://github.com/dz0ny/meshcore-sar.git
synced 2026-07-02 09:31:36 +00:00
baf49d27d8
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
103 lines
2.9 KiB
Dart
103 lines
2.9 KiB
Dart
import 'dart:async';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_map/flutter_map.dart';
|
|
|
|
/// Map Debug Info Widget
|
|
/// Displays current zoom level and visible bounds in bottom-left corner
|
|
class MapDebugInfo extends StatefulWidget {
|
|
final MapController mapController;
|
|
|
|
const MapDebugInfo({super.key, required this.mapController});
|
|
|
|
@override
|
|
State<MapDebugInfo> createState() => _MapDebugInfoState();
|
|
}
|
|
|
|
class _MapDebugInfoState extends State<MapDebugInfo> {
|
|
StreamSubscription<MapEvent>? _mapEventSubscription;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
// Listen to map events and trigger rebuild
|
|
_mapEventSubscription = widget.mapController.mapEventStream.listen((event) {
|
|
if (mounted) {
|
|
setState(() {
|
|
// Rebuild when map moves, zooms, or rotates
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
_mapEventSubscription?.cancel();
|
|
super.dispose();
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
try {
|
|
final camera = widget.mapController.camera;
|
|
final bounds = camera.visibleBounds;
|
|
|
|
return Card(
|
|
color: Colors.black.withValues(alpha: 0.7),
|
|
child: Padding(
|
|
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 6),
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
mainAxisSize: MainAxisSize.min,
|
|
children: [
|
|
Text(
|
|
'Z: ${camera.zoom.toStringAsFixed(2)}',
|
|
style: const TextStyle(
|
|
color: Colors.white,
|
|
fontSize: 10,
|
|
fontFamily: 'monospace',
|
|
),
|
|
),
|
|
const SizedBox(height: 2),
|
|
Text(
|
|
'N: ${bounds.north.toStringAsFixed(5)}',
|
|
style: const TextStyle(
|
|
color: Colors.white,
|
|
fontSize: 10,
|
|
fontFamily: 'monospace',
|
|
),
|
|
),
|
|
Text(
|
|
'S: ${bounds.south.toStringAsFixed(5)}',
|
|
style: const TextStyle(
|
|
color: Colors.white,
|
|
fontSize: 10,
|
|
fontFamily: 'monospace',
|
|
),
|
|
),
|
|
Text(
|
|
'E: ${bounds.east.toStringAsFixed(5)}',
|
|
style: const TextStyle(
|
|
color: Colors.white,
|
|
fontSize: 10,
|
|
fontFamily: 'monospace',
|
|
),
|
|
),
|
|
Text(
|
|
'W: ${bounds.west.toStringAsFixed(5)}',
|
|
style: const TextStyle(
|
|
color: Colors.white,
|
|
fontSize: 10,
|
|
fontFamily: 'monospace',
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
} catch (e) {
|
|
// Map not ready yet
|
|
return const SizedBox.shrink();
|
|
}
|
|
}
|
|
}
|