166 lines
4.4 KiB
Dart
166 lines
4.4 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter/widgets.dart';
|
|
import 'package:flutter_map/flutter_map.dart';
|
|
import 'package:latlong2/latlong.dart';
|
|
import 'package:libacflutter/Constants.dart';
|
|
import 'package:timetrack/data.dart';
|
|
|
|
class MapPage extends StatefulWidget {
|
|
MapPage({super.key});
|
|
|
|
@override
|
|
State<StatefulWidget> createState() {
|
|
return _MapPage();
|
|
}
|
|
}
|
|
|
|
class _MapPage extends State<MapPage> {
|
|
MapController controller = MapController();
|
|
LatLng initialPosition = LatLng(0, 0);
|
|
List<LatLng> PointMap = [];
|
|
List<Marker> Markers = [];
|
|
bool autorefresh = true;
|
|
|
|
@override
|
|
void initState() {
|
|
SessionData.Calls.MapCallback = call;
|
|
super.initState();
|
|
}
|
|
|
|
void call() {
|
|
if (autorefresh) {
|
|
didChangeDependencies();
|
|
}
|
|
setState(() {});
|
|
}
|
|
|
|
@override
|
|
void didChangeDependencies() {
|
|
PointMap = [];
|
|
Markers = [];
|
|
|
|
var firstPos = SessionData.positions[0];
|
|
initialPosition = LatLng(firstPos.latitude, firstPos.longitude);
|
|
|
|
for (var position in SessionData.positions) {
|
|
PointMap.add(LatLng(position.latitude, position.longitude));
|
|
}
|
|
|
|
print("Total trips: ${SessionData.Trips.length}");
|
|
|
|
for (var trip in SessionData.Trips) {
|
|
for (var dropOff in trip.deliveries) {
|
|
Markers.add(
|
|
Marker(
|
|
point: LatLng(
|
|
dropOff.endLocation!.latitude,
|
|
dropOff.endLocation!.longitude,
|
|
),
|
|
child: Stack(
|
|
children: [
|
|
IconButton(
|
|
onPressed: () {
|
|
showDialog(
|
|
context: context,
|
|
builder: (builder) {
|
|
return AlertDialog(
|
|
title: Text(
|
|
"Trip #${SessionData.Trips.indexOf(trip) + 1}; DropOff #${trip.deliveries.indexOf(dropOff) + 1}",
|
|
),
|
|
content: Text(
|
|
"Pay: \$${trip.BasePay}\nTip: \$${dropOff.TipAmount}",
|
|
),
|
|
);
|
|
},
|
|
);
|
|
},
|
|
icon: Icon(
|
|
Icons.location_on_rounded,
|
|
size: 24,
|
|
color: Colors.red,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
print("Marker added");
|
|
}
|
|
}
|
|
|
|
setState(() {});
|
|
super.didChangeDependencies();
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
SessionData.Calls.MapCallback = null;
|
|
|
|
controller.dispose();
|
|
super.dispose();
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
appBar: AppBar(
|
|
title: Text("Time Tracker - Map View"),
|
|
backgroundColor: LibACFlutterConstants.TITLEBAR_COLOR,
|
|
actions: [
|
|
IconButton(
|
|
onPressed: () async {
|
|
didChangeDependencies();
|
|
},
|
|
icon: Icon(Icons.refresh),
|
|
),
|
|
IconButton(
|
|
onPressed: () {
|
|
autorefresh = !autorefresh;
|
|
},
|
|
icon:
|
|
autorefresh
|
|
? Icon(Icons.play_disabled)
|
|
: Icon(Icons.play_circle),
|
|
),
|
|
],
|
|
),
|
|
body: GestureDetector(
|
|
onTap: FocusScope.of(context).unfocus,
|
|
child: SafeArea(
|
|
child: FlutterMap(
|
|
mapController: controller,
|
|
options: MapOptions(
|
|
minZoom: 1,
|
|
maxZoom: 30,
|
|
initialZoom: 15,
|
|
initialCenter: initialPosition,
|
|
keepAlive: false,
|
|
),
|
|
children: [
|
|
TileLayer(
|
|
urlTemplate: "https://tile.openstreetmap.org/{z}/{x}/{y}.png",
|
|
userAgentPackageName: "dev.zontreck.timetrack",
|
|
),
|
|
PolylineLayer(
|
|
polylines: [
|
|
Polyline(
|
|
points: PointMap,
|
|
color: Colors.blue,
|
|
borderStrokeWidth: 8,
|
|
borderColor: Colors.blue,
|
|
),
|
|
],
|
|
),
|
|
MarkerLayer(markers: Markers),
|
|
RichAttributionWidget(
|
|
attributions: [
|
|
TextSourceAttribution('OpenStreetMap contributors'),
|
|
],
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|