From 37d156efa0c7f8072f7dcaf3db9a8f8dee3d40f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E6=A2=93=E5=BD=AD?= Date: Tue, 13 Oct 2026 14:45:51 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9B=9B=E4=BA=BA=E4=BA=A4=E4=BA=92=E7=BB=B3?= =?UTF-8?q?=E8=8A=B1=E6=A0=B7=E9=A1=B5=E9=9D=A2=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/modules/scoring/views/scoring_page.dart | 103 ++++++++++++++------ 1 file changed, 75 insertions(+), 28 deletions(-) diff --git a/lib/modules/scoring/views/scoring_page.dart b/lib/modules/scoring/views/scoring_page.dart index c2117ce..23c0d41 100644 --- a/lib/modules/scoring/views/scoring_page.dart +++ b/lib/modules/scoring/views/scoring_page.dart @@ -729,7 +729,12 @@ class _DifficultyPanel extends StatelessWidget { hero: _ScoreHero(label: controller.currentJudgeScoreLabel, score: score), child: Column( children: [ - const _TableHeader(labels: ['级别', '数量', '小计得分', '计数操作']), + _TableHeader( + labels: + controller.profile.competition == CompetitionKind.doubleDutch + ? const ['级别', '数量(- / 不变 / +)', '小计得分', '计数操作'] + : const ['级别', '数量', '小计得分', '计数操作'], + ), if (controller.requiredElementCounts.isNotEmpty) Container( width: double.infinity, @@ -774,39 +779,81 @@ class _DifficultyPanel extends StatelessWidget { Expanded( child: ListView( padding: EdgeInsets.zero, - children: controller.difficultyCounts.entries.map((entry) { - final subtotal = controller.difficultySubtotal( - entry.key, - entry.value, - ); - return _TableRow( - cells: [ - _LevelBadge(entry.key), - _NumberText(entry.value.toString()), - _NumberText(subtotal.toStringAsFixed(2)), - _ActionButton( - label: '数量', - onTap: controller.isReadOnly - ? null - : () async { - final value = await showQuantityPicker( - current: entry.value, - includeZero: true, - ); - if (value != null) { - controller.setDifficultyCount(entry.key, value); - } - }, - ), - ], - ); - }).toList(), + children: _difficultyLevelRows.map(_difficultyRow).toList(), ), ), ], ), ); } + + Iterable> get _difficultyLevelRows { + if (controller.profile.competition != CompetitionKind.doubleDutch) { + return controller.difficultyCounts.keys.map((level) => [level]); + } + return [ + if (controller.profile.roleCode == 'DJ') ['0'], + for (var level = 1; level <= 5; level++) ['$level-', '$level', '$level+'], + ]; + } + + Widget _difficultyRow(List levels) { + final subtotal = levels.fold( + 0, + (sum, level) => + sum + + controller.difficultySubtotal( + level, + controller.difficultyCounts[level] ?? 0, + ), + ); + final grouped = levels.length == 3; + final baseLevel = grouped + ? levels[1] + : levels.single == '0' + ? '0(间歇)' + : levels.single.replaceAll(RegExp(r'[+-]$'), ''); + return _TableRow( + cells: [ + _LevelBadge(baseLevel), + grouped + ? Row( + children: [ + for (final level in levels) + Expanded( + child: Center( + child: _NumberText( + '${controller.difficultyCounts[level] ?? 0}', + ), + ), + ), + ], + ) + : _NumberText('${controller.difficultyCounts[levels.single] ?? 0}'), + _NumberText(subtotal.toStringAsFixed(2)), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + for (final level in levels) + _ActionButton( + label: grouped ? '$level数量' : '数量', + onTap: controller.isReadOnly + ? null + : () async { + final value = await showQuantityPicker( + current: controller.difficultyCounts[level] ?? 0, + includeZero: true, + ); + if (value != null) { + controller.setDifficultyCount(level, value); + } + }, + ), + ], + ), + ], + ); + } } class _ShowDifficultyPanel extends StatelessWidget {