Aves_mio0.88/lib/widgets/activity/dialogs/activity_recalculate_dialog.dart
2026-10-03 12:51:15 +02:00

111 lines
3.5 KiB
Dart

import 'package:aves/model/activity/activity_track.dart';
import 'package:aves/widgets/activity/utils/activity_formatters.dart';
import 'package:flutter/material.dart';
void showActivityRecalculateDialog({
required BuildContext context,
required ActivityTrack activity,
}) {
final fileDistance = activity.fileDistanceMeters ?? activity.distanceMeters;
final fileElevation = activity.fileElevationGainMeters ?? activity.elevationGainMeters;
final recomputedDistance = ActivityFormatters.computeDistanceFromTrack(activity);
final recomputedElevation =
activity.computedElevationGainMeters ??
ActivityFormatters.readDiagnosticDouble(
activity.diagnostics,
'computedElevationGainMeters',
);
showDialog<void>(
context: context,
builder: (context) {
return AlertDialog(
title: const Text('Confronto ricalcolo'),
content: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(activity.displayName),
const SizedBox(height: 12),
_CompareLine(
label: 'Distanza file',
value: ActivityFormatters.distance(fileDistance),
),
_CompareLine(
label: 'Distanza ricalcolata',
value: ActivityFormatters.distance(recomputedDistance),
),
_CompareLine(
label: 'Differenza distanza',
value: ActivityFormatters.distanceDelta(
recomputedDistance,
fileDistance,
),
),
const Divider(height: 24),
_CompareLine(
label: 'D+ file',
value: ActivityFormatters.elevation(fileElevation),
),
_CompareLine(
label: 'D+ ricalcolato',
value: recomputedElevation == null ? 'non disponibile dai punti salvati' : ActivityFormatters.elevation(recomputedElevation),
),
_CompareLine(
label: 'Differenza D+',
value: recomputedElevation == null
? '-'
: ActivityFormatters.elevationDelta(
recomputedElevation,
fileElevation,
),
),
if (recomputedElevation == null) ...[
const SizedBox(height: 12),
const Text(
'Nota: per ricalcolare il D+ servono le quote dei singoli punti. '
'Con il modello attuale la lista contiene solo LatLng; per FIT, GPX e TCX uso il valore calcolato dal parser quando disponibile.',
style: TextStyle(fontSize: 12),
),
],
],
),
actions: [
TextButton(
onPressed: () => Navigator.of(context).pop(),
child: const Text('Chiudi'),
),
],
);
},
);
}
class _CompareLine extends StatelessWidget {
final String label;
final String value;
const _CompareLine({
required this.label,
required this.value,
});
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 2),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Flexible(child: Text(label)),
const SizedBox(width: 16),
Text(
value,
style: const TextStyle(fontWeight: FontWeight.w600),
),
],
),
);
}
}