Refactor: Ajustement des valeurs limites de taille (0.5 à 1.1) pour synchroniser le slider et le geste tactile

This commit is contained in:
qguillaume
2026-05-25 13:14:51 +02:00
parent fe6d52902b
commit 3088c5ee91

View File

@@ -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<TargetCalibration> {
// 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<TargetCalibration> {
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<TargetCalibration> {
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<TargetCalibration> {
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<TargetCalibration> {
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<TargetCalibration> {
_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<TargetCalibration> {
_notifyChange();
}
void _onPanEnd() {
void _onScaleEnd() {
setState(() {
_isDraggingCenter = false;
_isDraggingRadius = false;