feat: score de session en plotting + guidage pour placer le premier impact
This commit is contained in:
@@ -17,12 +17,22 @@ class ScoreCard extends StatelessWidget {
|
||||
final ScoreResult? scoreResult;
|
||||
final TargetType targetType;
|
||||
|
||||
/// Score cumulé de la session (cibles déjà validées + cible en cours).
|
||||
///
|
||||
/// null hors session : le bandeau de session n'est alors pas affiché.
|
||||
final int? sessionTotalScore;
|
||||
|
||||
/// Nombre de cibles comptabilisées dans [sessionTotalScore].
|
||||
final int sessionTargetCount;
|
||||
|
||||
const ScoreCard({
|
||||
super.key,
|
||||
required this.totalScore,
|
||||
required this.shotCount,
|
||||
this.scoreResult,
|
||||
required this.targetType,
|
||||
this.sessionTotalScore,
|
||||
this.sessionTargetCount = 0,
|
||||
});
|
||||
|
||||
@override
|
||||
@@ -46,13 +56,23 @@ class ScoreCard extends StatelessWidget {
|
||||
),
|
||||
),
|
||||
const Spacer(),
|
||||
if (sessionTotalScore != null) ...[
|
||||
Flexible(child: _buildSessionBadge(context)),
|
||||
const SizedBox(width: 4),
|
||||
],
|
||||
MetricInfoButton(
|
||||
title: 'Score',
|
||||
explanations: [
|
||||
MetricExplanation(
|
||||
'Total',
|
||||
'Somme des points de tous vos impacts, sur le maximum '
|
||||
'possible (nombre d\'impacts × $maxScore points).',
|
||||
'Somme des points de tous vos impacts sur CETTE cible, '
|
||||
'sur le maximum possible (nombre d\'impacts × '
|
||||
'$maxScore points).',
|
||||
),
|
||||
const MetricExplanation(
|
||||
'Session',
|
||||
'Score cumulé de toutes les cibles de la session en '
|
||||
'cours, cible affichée comprise.',
|
||||
),
|
||||
const MetricExplanation(
|
||||
'Impacts',
|
||||
@@ -122,6 +142,30 @@ class ScoreCard extends StatelessWidget {
|
||||
);
|
||||
}
|
||||
|
||||
/// Bandeau compact rappelant le score total de la session en cours.
|
||||
Widget _buildSessionBadge(BuildContext context) {
|
||||
// Le nombre de cibles n'est rappelé qu'à partir de la deuxième : sur la
|
||||
// première il n'apporte rien et allonge le bandeau pour rien.
|
||||
final cibles = sessionTargetCount > 1 ? ' ($sessionTargetCount cibles)' : '';
|
||||
|
||||
return Container(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 4),
|
||||
decoration: BoxDecoration(
|
||||
color: AppTheme.primaryColor.withValues(alpha: 0.15),
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
),
|
||||
child: Text(
|
||||
'Session : $sessionTotalScore pts$cibles',
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: Theme.of(context).textTheme.bodySmall?.copyWith(
|
||||
fontWeight: FontWeight.bold,
|
||||
color: AppTheme.primaryColor,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildScoreStat(
|
||||
BuildContext context,
|
||||
String label,
|
||||
|
||||
Reference in New Issue
Block a user