Files
mileograph_flutter/lib/components/pages/calculator_details.dart
petegregoryy 45bd872b23
All checks were successful
Release / meta (push) Successful in 1m39s
Release / linux-build (push) Successful in 1m55s
Release / web-build (push) Successful in 3m12s
Release / android-build (push) Successful in 6m48s
Release / release-master (push) Successful in 22s
Release / release-dev (push) Successful in 28s
add support for network calculation from the calculator
2026-01-27 00:41:27 +00:00

122 lines
3.6 KiB
Dart

import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:mileograph_flutter/components/calculator/route_summary_widget.dart';
import 'package:mileograph_flutter/objects/objects.dart';
import 'package:mileograph_flutter/services/distance_unit_service.dart';
import 'package:provider/provider.dart';
class CalculatorDetailsPage extends StatelessWidget {
const CalculatorDetailsPage({
super.key,
required this.result,
});
final Object? result;
@override
Widget build(BuildContext context) {
final parsed = result is RouteResult ? result as RouteResult : null;
if (parsed == null) {
return Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextButton.icon(
onPressed: () => context.pop(),
icon: const Icon(Icons.arrow_back),
label: const Text('Back'),
),
const SizedBox(height: 12),
const Text(
'No route details available.',
),
],
),
);
}
final networks = List<NetworkMileage>.from(parsed.networkMileage)
..sort((a, b) => b.miles.compareTo(a.miles));
final countries = List<CountryMileage>.from(parsed.countryMileage)
..sort((a, b) => b.miles.compareTo(a.miles));
return Scaffold(
endDrawer: _NetworksDrawer(
networks: networks,
countries: countries,
),
body: Builder(
builder: (scaffoldContext) => Padding(
padding: const EdgeInsets.all(16.0),
child: RouteDetailsView(
route: parsed.calculatedRoute,
costs: parsed.costs,
routingPoints: parsed.inputRoute.toSet(),
onBack: () => context.pop(),
onNetworksPressed: () =>
Scaffold.of(scaffoldContext).openEndDrawer(),
),
),
),
);
}
}
class _NetworksDrawer extends StatelessWidget {
const _NetworksDrawer({
required this.networks,
required this.countries,
});
final List<NetworkMileage> networks;
final List<CountryMileage> countries;
@override
Widget build(BuildContext context) {
final distanceUnits = context.watch<DistanceUnitService>();
return Drawer(
child: SafeArea(
child: ListView(
padding: const EdgeInsets.all(16),
children: [
Text(
'Networks',
style: Theme.of(context).textTheme.titleMedium,
),
const SizedBox(height: 8),
if (networks.isEmpty)
const Text('No network mileage data.')
else
...networks.map(
(entry) => ListTile(
contentPadding: EdgeInsets.zero,
title: Text(entry.network),
trailing:
Text(distanceUnits.format(entry.miles, decimals: 2)),
),
),
const SizedBox(height: 16),
Text(
'Countries',
style: Theme.of(context).textTheme.titleMedium,
),
const SizedBox(height: 8),
if (countries.isEmpty)
const Text('No country mileage data.')
else
...countries.map(
(entry) => ListTile(
contentPadding: EdgeInsets.zero,
title: Text(entry.country),
trailing:
Text(distanceUnits.format(entry.miles, decimals: 2)),
),
),
],
),
),
);
}
}