diff --git a/lib/features/analysis/widgets/target_calibration.dart b/lib/features/analysis/widgets/target_calibration.dart index 32250aef..0bb96172 100644 --- a/lib/features/analysis/widgets/target_calibration.dart +++ b/lib/features/analysis/widgets/target_calibration.dart @@ -4,6 +4,7 @@ /// Les anneaux sont répartis proportionnellement. library; +import 'dart:math' as math; import 'package:flutter/material.dart'; import '../../../core/theme/app_theme.dart'; import '../../../data/models/target_type.dart'; @@ -57,6 +58,9 @@ class TargetCalibrationState extends State { // Contrôle de l'affichage du scroll d'espacement (désactivé par défaut) bool _showEspacement = false; + // Variable temporaire pour stocker la valeur du rayon au début du pincement tactile + double _baseRadiusBeforeScale = 1.0; + @override void initState() { super.initState(); @@ -125,10 +129,22 @@ class TargetCalibrationState extends State { return Stack( children: [ + // Utilisation d'un Gesture Detector basé sur le Scale pour synchroniser à 1 ou 2 doigts GestureDetector( - onPanStart: (details) => _onPanStart(details, size), - onPanUpdate: (details) => _onPanUpdate(details, size), - onPanEnd: (_) => _onPanEnd(), + onScaleStart: (details) { + _baseRadiusBeforeScale = _radius; + final tapX = details.localFocalPoint.dx / size.width; + final tapY = details.localFocalPoint.dy / size.height; + final distToCenter = _distance(tapX, tapY, _centerX, _centerY); + + if (distToCenter < 0.05 || distToCenter < _radius + 0.02) { + setState(() { + _isDraggingCenter = true; + }); + } + }, + onScaleUpdate: (details) => _onScaleUpdate(details, size), + onScaleEnd: (_) => _onScaleEnd(), child: CustomPaint( size: size, painter: _CalibrationPainter( @@ -156,7 +172,7 @@ class TargetCalibrationState extends State { children: [ // Ligne d'activation pour afficher ou masquer l'espacement Container( - margin: const EdgeInsets.only(bottom: 8), // CORRECTION de la syntaxe de marge + margin: const EdgeInsets.only(bottom: 8), padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 2), decoration: BoxDecoration( color: Colors.black54, @@ -173,7 +189,7 @@ class TargetCalibrationState extends State { height: 28, child: Switch( value: _showEspacement, - activeThumbColor: const Color(0xFF00FF00), // CORRECTION du paramètre déprécié + activeThumbColor: const Color(0xFF00FF00), onChanged: (bool value) { setState(() { _showEspacement = value; @@ -198,9 +214,9 @@ class TargetCalibrationState extends State { const Icon(Icons.zoom_out, color: Colors.white, size: 16), Expanded( child: Slider( - value: _radius.clamp(0.3, 1.2), - min: 0.3, - max: 1.2, + value: _radius.clamp(0.5, 1.1), + min: 0.5, + max: 1.1, activeColor: AppTheme.primaryColor, onChanged: (value) { setState(() { @@ -332,25 +348,17 @@ class TargetCalibrationState extends State { _notifyChange(); } - void _onPanStart(DragStartDetails details, Size size) { - final tapX = details.localPosition.dx / size.width; - final tapY = details.localPosition.dy / size.height; - - final distToCenter = _distance(tapX, tapY, _centerX, _centerY); - - if (distToCenter < 0.05 || distToCenter < _radius + 0.02) { - setState(() { - _isDraggingCenter = true; - }); - } - } - - void _onPanUpdate(DragUpdateDetails details, Size size) { - final deltaX = details.delta.dx / size.width; - final deltaY = details.delta.dy / size.height; - + // Traitement intelligent des gestes tactiles + void _onScaleUpdate(ScaleUpdateDetails details, Size size) { setState(() { - if (_isDraggingCenter) { + if (details.pointerCount == 2) { + // GESTE À DEUX DOIGTS : On calcule le zoom en respectant le range strict (0.3 à 1.2) + _radius = (_baseRadiusBeforeScale * details.scale).clamp(0.5, 1.1); + _initRingRadii(forceRecalculate: true); + } else if (_isDraggingCenter) { + // GESTE À UN SEUL DOIGT : Déplacement fluide du centre de la cible + final deltaX = details.focalPointDelta.dx / size.width; + final deltaY = details.focalPointDelta.dy / size.height; _centerX = _centerX + deltaX; _centerY = _centerY + deltaY; } @@ -359,7 +367,7 @@ class TargetCalibrationState extends State { _notifyChange(); } - void _onPanEnd() { + void _onScaleEnd() { setState(() { _isDraggingCenter = false; _isDraggingRadius = false;