updated logic
This commit is contained in:
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user