Feat: Ajout d'un switch pour masquer ou afficher le slider d'espacement de la cible

This commit is contained in:
qguillaume
2026-05-25 03:12:37 +02:00
parent a9ff826246
commit 48b8313be8

View File

@@ -4,7 +4,6 @@
/// 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';
@@ -55,6 +54,9 @@ class TargetCalibrationState extends State<TargetCalibration> {
bool _isDraggingRadius = false;
bool _isDraggingInnerRadius = false;
// Contrôle de l'affichage du scroll d'espacement (désactivé par défaut)
bool _showEspacement = false;
@override
void initState() {
super.initState();
@@ -138,13 +140,13 @@ class TargetCalibrationState extends State<TargetCalibration> {
ringRadii: _ringRadii,
targetType: widget.targetType,
isDraggingCenter: _isDraggingCenter,
isDraggingRadius: false, // Plus de drag direct du rayon
isDraggingRadius: false,
isDraggingInnerRadius: false,
),
),
),
// Slider pour le rayon (agrandissement)
// Panneau de configuration des Sliders en haut
Positioned(
top: 10,
left: 40,
@@ -152,6 +154,38 @@ class TargetCalibrationState extends State<TargetCalibration> {
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
// Ligne d'activation pour afficher ou masquer l'espacement
Container(
margin: const EdgeInsets.only(bottom: 8), // CORRECTION de la syntaxe de marge
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 2),
decoration: BoxDecoration(
color: Colors.black54,
borderRadius: BorderRadius.circular(20),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Text(
'Options d\'espacement avancées',
style: TextStyle(color: Colors.white70, fontSize: 11, fontWeight: FontWeight.w500),
),
SizedBox(
height: 28,
child: Switch(
value: _showEspacement,
activeThumbColor: const Color(0xFF00FF00), // CORRECTION du paramètre déprécié
onChanged: (bool value) {
setState(() {
_showEspacement = value;
});
},
),
),
],
),
),
// Slider pour la taille (toujours visible)
Container(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 4),
decoration: BoxDecoration(
@@ -171,7 +205,6 @@ class TargetCalibrationState extends State<TargetCalibration> {
onChanged: (value) {
setState(() {
_radius = value;
// On force le recalcul car on change la taille
_initRingRadii(forceRecalculate: true);
});
_notifyChange();
@@ -182,6 +215,9 @@ class TargetCalibrationState extends State<TargetCalibration> {
],
),
),
// Affichage conditionnel du slider d'espacement orange
if (_showEspacement) ...[
const SizedBox(height: 8),
Container(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 4),
@@ -201,7 +237,6 @@ class TargetCalibrationState extends State<TargetCalibration> {
activeColor: Colors.orange,
onChanged: (value) {
setState(() {
// On ajuste l'innerRadius comme un ratio du radius global
_innerRadius = _radius * value;
_initRingRadii(forceRecalculate: true);
});
@@ -214,6 +249,7 @@ class TargetCalibrationState extends State<TargetCalibration> {
),
),
],
],
),
),
@@ -312,11 +348,9 @@ class TargetCalibrationState extends State<TargetCalibration> {
void _onPanUpdate(DragUpdateDetails details, Size size) {
final deltaX = details.delta.dx / size.width;
final deltaY = details.delta.dy / size.height;
final minDim = math.min(size.width, size.height);
setState(() {
if (_isDraggingCenter) {
// Move center
_centerX = _centerX + deltaX;
_centerY = _centerY + deltaY;
}
@@ -370,7 +404,6 @@ class _CalibrationPainter extends CustomPainter {
final centerPx = Offset(centerX * size.width, centerY * size.height);
final minDim = size.width < size.height ? size.width : size.height;
final baseRadiusPx = radius * minDim;
final innerRadiusPx = innerRadius * minDim;
if (targetType == TargetType.concentric) {
_drawConcentricZones(canvas, size, centerPx, baseRadiusPx);
@@ -378,7 +411,6 @@ class _CalibrationPainter extends CustomPainter {
_drawSilhouetteZones(canvas, size, centerPx, baseRadiusPx);
}
// Fullscreen crosshairs when dragging center
if (isDraggingCenter) {
final crosshairLinePaint = Paint()
..color = Colors.red.withValues(alpha: 0.5)
@@ -395,10 +427,7 @@ class _CalibrationPainter extends CustomPainter {
);
}
// Draw center handle
_drawCenterHandle(canvas, centerPx);
// Draw instructions
_drawInstructions(canvas, size);
}
@@ -408,7 +437,6 @@ class _CalibrationPainter extends CustomPainter {
Offset center,
double baseRadius,
) {
// Generate colors for zones
List<Color> zoneColors = [];
for (int i = 0; i < ringCount; i++) {
final ratio = i / ringCount;
@@ -431,7 +459,6 @@ class _CalibrationPainter extends CustomPainter {
..strokeWidth = 1
..color = Colors.red.withValues(alpha: 0.8);
// Draw from outside to inside
for (int i = ringCount - 1; i >= 0; i--) {
final ringRadius = ringRadii.length > i
? ringRadii[i]
@@ -443,7 +470,6 @@ class _CalibrationPainter extends CustomPainter {
canvas.drawCircle(center, zoneRadius, strokePaint);
}
// Draw zone labels (only if within visible area)
final textPainter = TextPainter(textDirection: TextDirection.ltr);
for (int i = 0; i < ringCount; i++) {
@@ -455,10 +481,7 @@ class _CalibrationPainter extends CustomPainter {
: 0.0;
final zoneRadius = baseRadius * (ringRadius + prevRingRadius) / 2;
// Score: center = 10, decrement by 1 for each ring
final score = 10 - i;
// Only draw label if it's within the visible area
final labelX = center.dx + zoneRadius;
if (labelX < 0 || labelX > size.width) continue;
@@ -473,7 +496,6 @@ class _CalibrationPainter extends CustomPainter {
);
textPainter.layout();
// Draw label on the right side of each zone
final labelY = center.dy - textPainter.height / 2;
if (labelY >= 0 && labelY <= size.height) {
textPainter.paint(
@@ -490,12 +512,10 @@ class _CalibrationPainter extends CustomPainter {
Offset center,
double radius,
) {
// Simplified silhouette zones
final paint = Paint()
..style = PaintingStyle.stroke
..strokeWidth = 2;
// Draw silhouette outline (simplified as rectangle for now)
final silhouetteWidth = radius * 0.8;
final silhouetteHeight = radius * 2;
@@ -511,43 +531,24 @@ class _CalibrationPainter extends CustomPainter {
}
void _drawCenterHandle(Canvas canvas, Offset center) {
// Outer circle
final outerPaint = Paint()
..color = isDraggingCenter ? Colors.redAccent : Colors.red
..style = PaintingStyle.stroke
..strokeWidth = 3;
canvas.drawCircle(center, 15, outerPaint);
// Inner dot
final innerPaint = Paint()
..color = isDraggingCenter ? Colors.redAccent : Colors.red
..style = PaintingStyle.fill;
canvas.drawCircle(center, 5, innerPaint);
// Crosshair
final crossPaint = Paint()
..color = isDraggingCenter ? Colors.redAccent : Colors.red
..strokeWidth = 2;
canvas.drawLine(
Offset(center.dx - 20, center.dy),
Offset(center.dx - 8, center.dy),
crossPaint,
);
canvas.drawLine(
Offset(center.dx + 8, center.dy),
Offset(center.dx + 20, center.dy),
crossPaint,
);
canvas.drawLine(
Offset(center.dx, center.dy - 20),
Offset(center.dx, center.dy - 8),
crossPaint,
);
canvas.drawLine(
Offset(center.dx, center.dy + 8),
Offset(center.dx, center.dy + 20),
crossPaint,
);
canvas.drawLine(Offset(center.dx - 20, center.dy), Offset(center.dx - 8, center.dy), crossPaint);
canvas.drawLine(Offset(center.dx + 8, center.dy), Offset(center.dx + 20, center.dy), crossPaint);
canvas.drawLine(Offset(center.dx, center.dy - 20), Offset(center.dx, center.dy - 8), crossPaint);
canvas.drawLine(Offset(center.dx, center.dy + 8), Offset(center.dx, center.dy + 20), crossPaint);
}
void _drawInstructions(Canvas canvas, Size size) {