From 7a897cbe988aa2093fd4b34359a3e38b1c729020 Mon Sep 17 00:00:00 2001 From: qguillaume Date: Mon, 8 Jun 2026 22:00:34 +0200 Subject: [PATCH] feat: amelioration de la detection des cercles sans mlkit --- lib/features/analysis/analysis_screen.dart | 11 ++++++++++- .../analysis/widgets/target_calibration.dart | 10 ++++++++++ lib/features/analysis/widgets/target_overlay.dart | 13 +++++++------ 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/lib/features/analysis/analysis_screen.dart b/lib/features/analysis/analysis_screen.dart index 7b87824b..590b80f7 100644 --- a/lib/features/analysis/analysis_screen.dart +++ b/lib/features/analysis/analysis_screen.dart @@ -199,7 +199,16 @@ class _AnalysisScreenContentState extends State<_AnalysisScreenContent> { ), if (_isCalibrating) TextButton( - onPressed: () => setState(() => _isCalibrating = false), + onPressed: () { + // On fige la calibration courante dans le provider AVANT de + // basculer en Plotting, pour que l'instance Plotting parte + // d'un état figé et indépendant des rebuilds de calibration. + _calibrationKey.currentState?.commitCalibration(); + setState(() { + _isCalibrating = false; + _isSelectingReferences = false; + }); + }, child: const Text( 'TERMINER', style: TextStyle( diff --git a/lib/features/analysis/widgets/target_calibration.dart b/lib/features/analysis/widgets/target_calibration.dart index 44f912a5..e3fe3e0d 100644 --- a/lib/features/analysis/widgets/target_calibration.dart +++ b/lib/features/analysis/widgets/target_calibration.dart @@ -83,6 +83,16 @@ class TargetCalibrationState extends State { _initRingRadii(); } + /// Fige et propage la calibration courante vers le provider. + /// + /// Appelée par l'écran d'analyse (via GlobalKey) juste avant de basculer + /// dans l'instance de Plotting, pour garantir que l'état affiché en Plotting + /// correspond exactement au dernier réglage validé, sans dépendre d'un + /// éventuel rebuild intermédiaire. + void commitCalibration() { + _notifyChange(); + } + void _initRingRadii({bool forceRecalculate = false}) { // CORRECTION : Si on ne recalcule pas activement l'espacement linéaire, on préserve en priorité la structure d'origine if (!forceRecalculate && _originalRingRadii != null && _originalRingRadii!.length == _ringCount) { diff --git a/lib/features/analysis/widgets/target_overlay.dart b/lib/features/analysis/widgets/target_overlay.dart index 6ab23613..252cac48 100644 --- a/lib/features/analysis/widgets/target_overlay.dart +++ b/lib/features/analysis/widgets/target_overlay.dart @@ -211,8 +211,8 @@ class _TargetOverlayPainter extends CustomPainter { final prevMultiplier = i == 0 ? 0.0 : (ringRadii != null && ringRadii!.length == ringCount) - ? ringRadii![i - 1] - : i / ringCount; + ? ringRadii![i - 1] + : i / ringCount; final zoneRadius = maxRadius * (currentMultiplier + prevMultiplier) / 2; final score = 10 - i; @@ -292,16 +292,17 @@ class _TargetOverlayPainter extends CustomPainter { final strokeWidth = 3 / zoomScale; final fontSize = 10 / zoomScale; - // Draw outer circle (white outline for visibility) + // Draw outer circle (white outline for visibility) — gardé OPAQUE pour + // bien repérer le centre même quand le remplissage est transparent. final outlinePaint = Paint() ..color = AppTheme.impactOutlineColor ..style = PaintingStyle.stroke ..strokeWidth = strokeWidth; canvas.drawCircle(Offset(x, y), outerRadius, outlinePaint); - // Draw impact marker + // Draw impact marker — TRANSPARENCE 50% pour voir l'impact réel derrière final impactPaint = Paint() - ..color = AppTheme.impactColor + ..color = AppTheme.impactColor.withValues(alpha: 0.5) ..style = PaintingStyle.fill; canvas.drawCircle(Offset(x, y), innerRadius, impactPaint); @@ -381,4 +382,4 @@ class _TargetOverlayPainter extends CustomPainter { zoomScale != oldDelegate.zoomScale || showRings != oldDelegate.showRings; } -} +} \ No newline at end of file