Feat: Ajout d'un switch pour masquer ou afficher le slider d'espacement de la cible
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user