diff --git a/lib/features/analysis/analysis_screen.dart b/lib/features/analysis/analysis_screen.dart index dfc69516..ff60665e 100644 --- a/lib/features/analysis/analysis_screen.dart +++ b/lib/features/analysis/analysis_screen.dart @@ -25,7 +25,6 @@ import 'widgets/target_overlay.dart'; import 'widgets/target_calibration.dart'; import 'widgets/score_card.dart'; import 'widgets/grouping_stats.dart'; -import 'widgets/shot_details_sheet.dart'; class AnalysisScreen extends StatelessWidget { final String imagePath; @@ -111,15 +110,11 @@ class _AnalysisScreenContentState extends State<_AnalysisScreenContent> { bool _isAtBottom = false; final ScrollController _scrollController = ScrollController(); - final TransformationController _transformationController = - TransformationController(); final GlobalKey _imageKey = GlobalKey(); - double _currentZoomScale = 1.0; @override void initState() { super.initState(); - _transformationController.addListener(_onTransformChanged); _scrollController.addListener(_onScroll); } @@ -137,31 +132,16 @@ class _AnalysisScreenContentState extends State<_AnalysisScreenContent> { @override void dispose() { - _transformationController.removeListener(_onTransformChanged); - _transformationController.dispose(); _scrollController.removeListener(_onScroll); _scrollController.dispose(); super.dispose(); } - void _onTransformChanged() { - final scale = _transformationController.value.getMaxScaleOnAxis(); - if (scale != _currentZoomScale) { - setState(() { - _currentZoomScale = scale; - }); - } - } - - /// Repasse en mode calibration en réinitialisant le zoom de l'InteractiveViewer. + /// Repasse en mode calibration. /// - /// Sans cette remise à zéro, le facteur de zoom accumulé en mode Plotting - /// persiste dans le TransformationController et se réapplique au retour, - /// ce qui faisait "zoomer" légèrement la photo. On repart donc toujours - /// d'une transformation identité (zoom 1.0). + /// La cible du mode Plotting est désormais un élément fixe (aucun zoom à + /// réinitialiser) : on se contente donc de rebasculer l'état. void _enterCalibration() { - _transformationController.value = Matrix4.identity(); - _currentZoomScale = 1.0; setState(() => _isCalibrating = true); } @@ -416,27 +396,6 @@ class _AnalysisScreenContentState extends State<_AnalysisScreenContent> { padding: const EdgeInsets.all(AppConstants.defaultPadding), child: Column( children: [ - Card( - color: AppTheme.primaryColor.withValues(alpha: 0.18), - child: ListTile( - leading: const Icon( - Icons.edit_location_alt, - color: AppTheme.primaryColor, - ), - title: const Text('Modifier les impacts'), - subtitle: const Text( - 'Ajouter, déplacer ou supprimer des impacts (plein écran)', - ), - trailing: const Icon( - Icons.open_in_full, - size: 16, - ), - // Rouvre l'éditeur plein écran en partageant le provider. - onTap: () => - _openImpactEditor(context.read()), - ), - ), - const SizedBox(height: 12), Card( color: AppTheme.primaryColor.withValues(alpha: 0.1), child: ListTile( @@ -606,20 +565,19 @@ class _AnalysisScreenContentState extends State<_AnalysisScreenContent> { /// Affichage du plotting en LECTURE SEULE. /// - /// L'édition (ajout / déplacement / suppression) se fait désormais - /// exclusivement dans l'éditeur plein écran (ImpactEditorScreen). Ici on se - /// contente d'afficher l'image + l'overlay, avec un zoom de consultation. - /// Le tap sur un impact ouvre simplement ses détails. + /// La cible est un élément d'écran FIXE : elle ne se déplace pas et ne se + /// zoome pas (plus d'InteractiveViewer). Un tap n'importe où sur la cible + /// ouvre directement l'éditeur d'impacts plein écran (ImpactEditorScreen), + /// exactement comme le faisait l'ancien bouton « Modifier les impacts ». + /// C'est là que se fait toute l'édition (ajout / déplacement / suppression), + /// avec un zoom fiable. Widget _buildReadOnlyPlotImage( BuildContext context, AnalysisProvider provider, ) { - return InteractiveViewer( - transformationController: _transformationController, - minScale: 1.0, - maxScale: 10.0, - boundaryMargin: const EdgeInsets.all(80), - panEnabled: true, + return GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () => _openImpactEditor(context.read()), child: Stack( children: [ Image.file( @@ -635,10 +593,7 @@ class _AnalysisScreenContentState extends State<_AnalysisScreenContent> { targetType: provider.targetType!, shots: provider.shots, showRings: true, - zoomScale: _currentZoomScale, - // Lecture seule : tap sur impact -> détails (consultation). - onShotTapped: (shot) => - showShotDetailsSheet(context, provider, shot), + zoomScale: 1.0, ), ), ],