updated logic
All checks were successful
Pull Request Pipeline / test (pull_request) Successful in 47s
Pull Request Pipeline / lint (pull_request) Successful in 50s

This commit is contained in:
2026-05-10 19:07:20 +02:00
parent e503db1c1b
commit 60a92dafe1

View File

@@ -49,8 +49,8 @@ class _MatchResultViewState extends State<MatchResultView> {
/// Currently selected winner player (single winner) /// Currently selected winner player (single winner)
Player? _selectedPlayer; Player? _selectedPlayer;
/// Currently selected winners (multiple winners) /// Currently selected players (multiple winners)
final Set<Player> _selectedWinners = {}; final Set<Player> _selectedPlayers = {};
@override @override
void initState() { void initState() {
@@ -68,28 +68,30 @@ class _MatchResultViewState extends State<MatchResultView> {
// Prefill fields // Prefill fields
if (widget.match.mvp.isNotEmpty) { if (widget.match.mvp.isNotEmpty) {
if (rulesetSupportsWinnerSelection()) { if (rulesetSupportsPlayerSelection()) {
_selectedPlayer = allPlayers.firstWhere( if (ruleset == Ruleset.multipleWinners) {
(p) => p.id == widget.match.mvp.first.id, for (int i = 0; i < allPlayers.length; i++) {
); if (widget.match.scores[allPlayers[i].id]?.score == 1) {
_selectedPlayers.add(allPlayers[i]);
}
}
} else {
_selectedPlayer = allPlayers.firstWhere(
(p) => p.id == widget.match.mvp.first.id,
);
}
} else if (rulesetSupportsScoreEntry()) { } else if (rulesetSupportsScoreEntry()) {
for (int i = 0; i < allPlayers.length; i++) { for (int i = 0; i < allPlayers.length; i++) {
final scoreList = widget.match.scores[allPlayers[i].id]; final scoreList = widget.match.scores[allPlayers[i].id];
final score = scoreList?.score ?? 0; final score = scoreList?.score ?? 0;
controller[i].text = score.toString(); controller[i].text = score.toString();
} }
} else if (rulesetSupportsPlacement()) { } else if (rulesetSupportsDragBehaviour()) {
allPlayers.sort((a, b) { allPlayers.sort((a, b) {
final scoreA = widget.match.scores[a.id]?.score ?? 0; final scoreA = widget.match.scores[a.id]?.score ?? 0;
final scoreB = widget.match.scores[b.id]?.score ?? 0; final scoreB = widget.match.scores[b.id]?.score ?? 0;
return scoreB.compareTo(scoreA); return scoreB.compareTo(scoreA);
}); });
} else if (rulesetSupportsMultipleWinners()) {
for (int i = 0; i < allPlayers.length; i++) {
if (widget.match.scores[allPlayers[i].id]?.score == 1) {
_selectedWinners.add(allPlayers[i]);
}
}
} }
super.initState(); super.initState();
} }
@@ -168,38 +170,68 @@ class _MatchResultViewState extends State<MatchResultView> {
const SizedBox(height: 10), const SizedBox(height: 10),
// Show player selection // Show player selection
if (rulesetSupportsWinnerSelection()) if (rulesetSupportsPlayerSelection())
Expanded( Expanded(
child: RadioGroup<Player>( child: ruleset == Ruleset.multipleWinners
groupValue: _selectedPlayer, // Multiple winners
onChanged: (Player? value) async { ? ListView.builder(
setState(() { physics:
_selectedPlayer = value; const NeverScrollableScrollPhysics(),
}); itemCount: allPlayers.length,
}, itemBuilder: (context, index) {
child: ListView.builder( return CustomCheckboxListTile(
physics: const NeverScrollableScrollPhysics(), text: allPlayers[index].name,
itemCount: allPlayers.length, value: _selectedPlayers.contains(
itemBuilder: (context, index) { allPlayers[index],
return CustomRadioListTile( ),
text: allPlayers[index].name, onChanged: (bool value) {
value: allPlayers[index], setState(() {
onContainerTap: (value) async { if (value) {
_selectedPlayers.add(
allPlayers[index],
);
} else {
_selectedPlayers.remove(
allPlayers[index],
);
}
});
},
);
},
)
// Single winner / looser
: RadioGroup<Player>(
groupValue: _selectedPlayer,
onChanged: (Player? value) async {
setState(() { setState(() {
// Check if the already selected player is the same as the newly tapped player. _selectedPlayer = value;
if (_selectedPlayer == value) {
// If yes deselected the player by setting it to null.
_selectedPlayer = null;
} else {
// If no assign the newly tapped player to the selected player.
(_selectedPlayer = value);
}
}); });
}, },
); child: ListView.builder(
}, physics:
), const NeverScrollableScrollPhysics(),
), itemCount: allPlayers.length,
itemBuilder: (context, index) {
return CustomRadioListTile(
text: allPlayers[index].name,
value: allPlayers[index],
onContainerTap: (value) async {
setState(() {
// Check if the already selected player is the same as the newly tapped player.
if (_selectedPlayer == value) {
// If yes deselected the player by setting it to null.
_selectedPlayer = null;
} else {
// If no assign the newly tapped player to the selected player.
(_selectedPlayer = value);
}
});
},
);
},
),
),
), ),
// Show score entry // Show score entry
@@ -226,7 +258,7 @@ class _MatchResultViewState extends State<MatchResultView> {
), ),
// Show draggable placement list // Show draggable placement list
if (rulesetSupportsPlacement()) if (rulesetSupportsDragBehaviour())
Expanded( Expanded(
child: Row( child: Row(
children: [ children: [
@@ -329,36 +361,6 @@ class _MatchResultViewState extends State<MatchResultView> {
], ],
), ),
), ),
// Show multiple winner selection
if (rulesetSupportsMultipleWinners())
Expanded(
child: ListView.builder(
physics: const NeverScrollableScrollPhysics(),
itemCount: allPlayers.length,
itemBuilder: (context, index) {
return CustomCheckboxListTile(
text: allPlayers[index].name,
value: _selectedWinners.contains(
allPlayers[index],
),
onChanged: (bool value) {
setState(() {
if (value) {
_selectedWinners.add(
allPlayers[index],
);
} else {
_selectedWinners.remove(
allPlayers[index],
);
}
});
},
);
},
),
),
], ],
), ),
), ),
@@ -443,12 +445,12 @@ class _MatchResultViewState extends State<MatchResultView> {
/// Handles saving the (multiple) winners to the database. /// Handles saving the (multiple) winners to the database.
Future<bool> _handleWinners() async { Future<bool> _handleWinners() async {
if (_selectedWinners.isEmpty) { if (_selectedPlayers.isEmpty) {
return await db.scoreEntryDao.removeWinner(matchId: widget.match.id); return await db.scoreEntryDao.removeWinner(matchId: widget.match.id);
} else { } else {
return await db.scoreEntryDao.setWinners( return await db.scoreEntryDao.setWinners(
matchId: widget.match.id, matchId: widget.match.id,
winners: allPlayers.where((p) => _selectedWinners.contains(p)).toList(), winners: allPlayers.where((p) => _selectedPlayers.contains(p)).toList(),
); );
} }
} }
@@ -504,19 +506,17 @@ class _MatchResultViewState extends State<MatchResultView> {
} }
} }
bool rulesetSupportsWinnerSelection() { bool rulesetSupportsPlayerSelection() {
return ruleset == Ruleset.singleWinner || ruleset == Ruleset.singleLoser; return ruleset == Ruleset.singleWinner ||
ruleset == Ruleset.singleLoser ||
ruleset == Ruleset.multipleWinners;
} }
bool rulesetSupportsScoreEntry() { bool rulesetSupportsScoreEntry() {
return ruleset == Ruleset.lowestScore || ruleset == Ruleset.highestScore; return ruleset == Ruleset.lowestScore || ruleset == Ruleset.highestScore;
} }
bool rulesetSupportsPlacement() { bool rulesetSupportsDragBehaviour() {
return ruleset == Ruleset.placement; return ruleset == Ruleset.placement;
} }
bool rulesetSupportsMultipleWinners() {
return ruleset == Ruleset.multipleWinners;
}
} }