add color enum

This commit is contained in:
gelbeinhalb
2026-02-01 18:13:03 +01:00
parent ccfea71a35
commit dbef735a82
14 changed files with 45 additions and 34 deletions

View File

@@ -37,6 +37,17 @@ enum ExportResult { success, canceled, unknownException }
/// - [Ruleset.multipleWinners]: Multiple players can be winners. /// - [Ruleset.multipleWinners]: Multiple players can be winners.
enum Ruleset { highestScore, lowestScore, singleWinner, singleLoser, multipleWinners } enum Ruleset { highestScore, lowestScore, singleWinner, singleLoser, multipleWinners }
/// Different colors available for games
/// - [GameColor.red]: Red color
/// - [GameColor.blue]: Blue color
/// - [GameColor.green]: Green color
/// - [GameColor.yellow]: Yellow color
/// - [GameColor.purple]: Purple color
/// - [GameColor.orange]: Orange color
/// - [GameColor.pink]: Pink color
/// - [GameColor.teal]: Teal color
enum GameColor { red, blue, green, yellow, purple, orange, pink, teal }
/// Translates a [Ruleset] enum value to its corresponding localized string. /// Translates a [Ruleset] enum value to its corresponding localized string.
String translateRulesetToString(Ruleset ruleset, BuildContext context) { String translateRulesetToString(Ruleset ruleset, BuildContext context) {
final loc = AppLocalizations.of(context); final loc = AppLocalizations.of(context);

View File

@@ -21,7 +21,7 @@ class GameDao extends DatabaseAccessor<AppDatabase> with _$GameDaoMixin {
name: row.name, name: row.name,
ruleset: Ruleset.values.firstWhere((e) => e.name == row.ruleset), ruleset: Ruleset.values.firstWhere((e) => e.name == row.ruleset),
description: row.description, description: row.description,
color: row.color, color: GameColor.values.firstWhere((e) => e.name == row.color),
icon: row.icon, icon: row.icon,
createdAt: row.createdAt, createdAt: row.createdAt,
), ),
@@ -38,7 +38,7 @@ class GameDao extends DatabaseAccessor<AppDatabase> with _$GameDaoMixin {
name: result.name, name: result.name,
ruleset: Ruleset.values.firstWhere((e) => e.name == result.ruleset), ruleset: Ruleset.values.firstWhere((e) => e.name == result.ruleset),
description: result.description, description: result.description,
color: result.color, color: GameColor.values.firstWhere((e) => e.name == result.color),
icon: result.icon, icon: result.icon,
createdAt: result.createdAt, createdAt: result.createdAt,
); );
@@ -55,7 +55,7 @@ class GameDao extends DatabaseAccessor<AppDatabase> with _$GameDaoMixin {
name: game.name, name: game.name,
ruleset: game.ruleset.name, ruleset: game.ruleset.name,
description: game.description, description: game.description,
color: game.color, color: game.color.name,
icon: game.icon, icon: game.icon,
createdAt: game.createdAt, createdAt: game.createdAt,
), ),
@@ -81,7 +81,7 @@ class GameDao extends DatabaseAccessor<AppDatabase> with _$GameDaoMixin {
name: game.name, name: game.name,
ruleset: game.ruleset.name, ruleset: game.ruleset.name,
description: game.description, description: game.description,
color: game.color, color: game.color.name,
icon: game.icon, icon: game.icon,
createdAt: game.createdAt, createdAt: game.createdAt,
), ),
@@ -135,10 +135,10 @@ class GameDao extends DatabaseAccessor<AppDatabase> with _$GameDaoMixin {
} }
/// Updates the color of the game with the given [gameId]. /// Updates the color of the game with the given [gameId].
Future<void> updateGameColor({required String gameId, required String newColor}) async { Future<void> updateGameColor({required String gameId, required GameColor newColor}) async {
await (update( await (update(
gameTable, gameTable,
)..where((g) => g.id.equals(gameId))).write(GameTableCompanion(color: Value(newColor))); )..where((g) => g.id.equals(gameId))).write(GameTableCompanion(color: Value(newColor.name)));
} }
/// Updates the icon of the game with the given [gameId]. /// Updates the icon of the game with the given [gameId].

View File

@@ -126,7 +126,7 @@ class MatchDao extends DatabaseAccessor<AppDatabase> with _$MatchDaoMixin {
name: game.name, name: game.name,
ruleset: game.ruleset.name, ruleset: game.ruleset.name,
description: game.description, description: game.description,
color: game.color, color: game.color.name,
icon: game.icon, icon: game.icon,
createdAt: game.createdAt, createdAt: game.createdAt,
), ),

View File

@@ -8,7 +8,7 @@ class Game {
final String name; final String name;
final Ruleset ruleset; final Ruleset ruleset;
final String description; final String description;
final String color; final GameColor color;
final String icon; final String icon;
Game({ Game({
@@ -34,7 +34,7 @@ class Game {
name = json['name'], name = json['name'],
ruleset = Ruleset.values.firstWhere((e) => e.name == json['ruleset']), ruleset = Ruleset.values.firstWhere((e) => e.name == json['ruleset']),
description = json['description'], description = json['description'],
color = json['color'], color = GameColor.values.firstWhere((e) => e.name == json['color']),
icon = json['icon']; icon = json['icon'];
/// Converts the Game instance to a JSON object. /// Converts the Game instance to a JSON object.
@@ -44,7 +44,7 @@ class Game {
'name': name, 'name': name,
'ruleset': ruleset.name, 'ruleset': ruleset.name,
'description': description, 'description': description,
'color': color, 'color': color.name,
'icon': icon, 'icon': icon,
}; };
} }

View File

@@ -41,7 +41,7 @@ class Match {
createdAt = DateTime.parse(json['createdAt']), createdAt = DateTime.parse(json['createdAt']),
endedAt = json['endedAt'] != null ? DateTime.parse(json['endedAt']) : null, endedAt = json['endedAt'] != null ? DateTime.parse(json['endedAt']) : null,
name = json['name'], name = json['name'],
game = Game(name: '', ruleset: Ruleset.singleWinner, description: '', color: '', icon: ''), // Populated during import via DataTransferService game = Game(name: '', ruleset: Ruleset.singleWinner, description: '', color: GameColor.blue, icon: ''), // Populated during import via DataTransferService
group = null, // Populated during import via DataTransferService group = null, // Populated during import via DataTransferService
players = [], // Populated during import via DataTransferService players = [], // Populated during import via DataTransferService
notes = json['notes'] ?? ''; notes = json['notes'] ?? '';

View File

@@ -42,7 +42,7 @@ class _HomeViewState extends State<HomeView> {
2, 2,
Match( Match(
name: 'Skeleton Match', name: 'Skeleton Match',
game: Game(name: '', ruleset: Ruleset.singleWinner, description: '', color: '', icon: ''), game: Game(name: '', ruleset: Ruleset.singleWinner, description: '', color: GameColor.blue, icon: ''),
group: Group( group: Group(
name: 'Skeleton Group', name: 'Skeleton Group',
description: '', description: '',

View File

@@ -202,7 +202,7 @@ class _CreateMatchViewState extends State<CreateMatchView> {
name: selectedGame.$1, name: selectedGame.$1,
description: selectedGame.$2, description: selectedGame.$2,
ruleset: selectedGame.$3, ruleset: selectedGame.$3,
color: '0xFF000000', color: GameColor.blue,
icon: '', icon: '',
); );
} else { } else {
@@ -212,7 +212,7 @@ class _CreateMatchViewState extends State<CreateMatchView> {
name: selectedGame.$1, name: selectedGame.$1,
description: selectedGame.$2, description: selectedGame.$2,
ruleset: selectedGame.$3, ruleset: selectedGame.$3,
color: '0xFF000000', color: GameColor.blue,
icon: '', icon: '',
); );
} }

View File

@@ -38,7 +38,7 @@ class _MatchViewState extends State<MatchView> {
4, 4,
Match( Match(
name: 'Skeleton match name', name: 'Skeleton match name',
game: Game(name: '', ruleset: Ruleset.singleWinner, description: '', color: '', icon: ''), game: Game(name: '', ruleset: Ruleset.singleWinner, description: '', color: GameColor.blue, icon: ''),
group: Group( group: Group(
name: 'Group name', name: 'Group name',
description: '', description: '',

View File

@@ -208,7 +208,7 @@ class DataTransferService {
return Match( return Match(
id: map['id'] as String, id: map['id'] as String,
name: map['name'] as String, name: map['name'] as String,
game: game ?? Game(name: 'Unknown', ruleset: Ruleset.singleWinner, description: '', color: '', icon: ''), game: game ?? Game(name: 'Unknown', ruleset: Ruleset.singleWinner, description: '', color: GameColor.blue, icon: ''),
group: group, group: group,
players: players.isNotEmpty ? players : null, players: players.isNotEmpty ? players : null,
createdAt: DateTime.parse(map['createdAt'] as String), createdAt: DateTime.parse(map['createdAt'] as String),

View File

@@ -27,7 +27,7 @@ void main() {
name: 'Chess', name: 'Chess',
ruleset: Ruleset.singleWinner, ruleset: Ruleset.singleWinner,
description: 'A classic strategy game', description: 'A classic strategy game',
color: '0xFF0000FF', color: GameColor.blue,
icon: 'chess_icon', icon: 'chess_icon',
); );
testGame2 = Game( testGame2 = Game(
@@ -35,7 +35,7 @@ void main() {
name: 'Poker', name: 'Poker',
ruleset: Ruleset.multipleWinners, ruleset: Ruleset.multipleWinners,
description: 'Card game with multiple winners', description: 'Card game with multiple winners',
color: '0xFFFF0000', color: GameColor.red,
icon: 'poker_icon', icon: 'poker_icon',
); );
testGame3 = Game( testGame3 = Game(
@@ -43,7 +43,7 @@ void main() {
name: 'Monopoly', name: 'Monopoly',
ruleset: Ruleset.highestScore, ruleset: Ruleset.highestScore,
description: 'A board game about real estate', description: 'A board game about real estate',
color: '0xFF000000', color: GameColor.orange,
icon: '', icon: '',
); );
}); });
@@ -134,7 +134,7 @@ void main() {
// Verifies that a game with null optional fields can be added and retrieved. // Verifies that a game with null optional fields can be added and retrieved.
test('addGame handles game with null optional fields', () async { test('addGame handles game with null optional fields', () async {
final gameWithNulls = Game(name: 'Simple Game', ruleset: Ruleset.lowestScore, description: 'A simple game', color: '0xFF000000', icon: ''); final gameWithNulls = Game(name: 'Simple Game', ruleset: Ruleset.lowestScore, description: 'A simple game', color: GameColor.green, icon: '');
final result = await database.gameDao.addGame(game: gameWithNulls); final result = await database.gameDao.addGame(game: gameWithNulls);
expect(result, true); expect(result, true);
@@ -143,7 +143,7 @@ void main() {
); );
expect(fetchedGame.name, 'Simple Game'); expect(fetchedGame.name, 'Simple Game');
expect(fetchedGame.description, 'A simple game'); expect(fetchedGame.description, 'A simple game');
expect(fetchedGame.color, '0xFF000000'); expect(fetchedGame.color, GameColor.green);
expect(fetchedGame.icon, isNull); expect(fetchedGame.icon, isNull);
}); });
@@ -340,20 +340,20 @@ void main() {
await database.gameDao.updateGameColor( await database.gameDao.updateGameColor(
gameId: testGame1.id, gameId: testGame1.id,
newColor: '0xFF00FF00', newColor: GameColor.green,
); );
final updatedGame = await database.gameDao.getGameById( final updatedGame = await database.gameDao.getGameById(
gameId: testGame1.id, gameId: testGame1.id,
); );
expect(updatedGame.color, '0xFF00FF00'); expect(updatedGame.color, GameColor.green);
}); });
// Verifies that updateGameColor does nothing when game doesn't exist. // Verifies that updateGameColor does nothing when game doesn't exist.
test('updateGameColor does nothing for non-existent game', () async { test('updateGameColor does nothing for non-existent game', () async {
await database.gameDao.updateGameColor( await database.gameDao.updateGameColor(
gameId: 'non-existent-id', gameId: 'non-existent-id',
newColor: '0xFF00FF00', newColor: GameColor.green,
); );
final allGames = await database.gameDao.getAllGames(); final allGames = await database.gameDao.getAllGames();
@@ -460,7 +460,7 @@ void main() {
name: 'Game\'s & "Special" <Name>', name: 'Game\'s & "Special" <Name>',
ruleset: Ruleset.multipleWinners, ruleset: Ruleset.multipleWinners,
description: 'Description with émojis 🎮🎲', description: 'Description with émojis 🎮🎲',
color: '0xFF000000', color: GameColor.purple,
icon: '', icon: '',
); );
await database.gameDao.addGame(game: specialGame); await database.gameDao.addGame(game: specialGame);
@@ -479,7 +479,7 @@ void main() {
ruleset: Ruleset.singleWinner, ruleset: Ruleset.singleWinner,
description: '', description: '',
icon: '', icon: '',
color: '0xFF000000', color: GameColor.red,
); );
await database.gameDao.addGame(game: emptyGame); await database.gameDao.addGame(game: emptyGame);
@@ -499,7 +499,7 @@ void main() {
name: longString, name: longString,
description: longString, description: longString,
ruleset: Ruleset.multipleWinners, ruleset: Ruleset.multipleWinners,
color: '0xFF000000', color: GameColor.yellow,
icon: '', icon: '',
); );
await database.gameDao.addGame(game: longGame); await database.gameDao.addGame(game: longGame);
@@ -522,7 +522,7 @@ void main() {
); );
await database.gameDao.updateGameColor( await database.gameDao.updateGameColor(
gameId: testGame1.id, gameId: testGame1.id,
newColor: '0xFF123456', newColor: GameColor.teal,
); );
await database.gameDao.updateGameDescription( await database.gameDao.updateGameDescription(
gameId: testGame1.id, gameId: testGame1.id,
@@ -533,7 +533,7 @@ void main() {
gameId: testGame1.id, gameId: testGame1.id,
); );
expect(updatedGame.name, 'Updated Name'); expect(updatedGame.name, 'Updated Name');
expect(updatedGame.color, '0xFF123456'); expect(updatedGame.color, GameColor.teal);
expect(updatedGame.description, 'Updated Description'); expect(updatedGame.description, 'Updated Description');
expect(updatedGame.ruleset, testGame1.ruleset); expect(updatedGame.ruleset, testGame1.ruleset);
expect(updatedGame.icon, testGame1.icon); expect(updatedGame.icon, testGame1.icon);

View File

@@ -51,7 +51,7 @@ void main() {
description: '', description: '',
members: [testPlayer4, testPlayer5], members: [testPlayer4, testPlayer5],
); );
testGame = Game(name: 'Test Game', ruleset: Ruleset.singleWinner, description: 'A test game', color: '0xFF000000', icon: ''); testGame = Game(name: 'Test Game', ruleset: Ruleset.singleWinner, description: 'A test game', color: GameColor.blue, icon: '');
testMatch1 = Match( testMatch1 = Match(
name: 'First Test Match', name: 'First Test Match',
game: testGame, game: testGame,

View File

@@ -48,7 +48,7 @@ void main() {
description: '', description: '',
members: [testPlayer1, testPlayer2, testPlayer3], members: [testPlayer1, testPlayer2, testPlayer3],
); );
testGame = Game(name: 'Test Game', ruleset: Ruleset.singleWinner, description: 'A test game', color: '0xFF000000', icon: ''); testGame = Game(name: 'Test Game', ruleset: Ruleset.singleWinner, description: 'A test game', color: GameColor.blue, icon: '');
testMatchOnlyGroup = Match( testMatchOnlyGroup = Match(
name: 'Test Match with Group', name: 'Test Match with Group',
game: testGame, game: testGame,

View File

@@ -32,7 +32,7 @@ void main() {
testPlayer1 = Player(name: 'Alice', description: ''); testPlayer1 = Player(name: 'Alice', description: '');
testPlayer2 = Player(name: 'Bob', description: ''); testPlayer2 = Player(name: 'Bob', description: '');
testPlayer3 = Player(name: 'Charlie', description: ''); testPlayer3 = Player(name: 'Charlie', description: '');
testGame = Game(name: 'Test Game', ruleset: Ruleset.singleWinner, description: 'A test game', color: '0xFF000000', icon: ''); testGame = Game(name: 'Test Game', ruleset: Ruleset.singleWinner, description: 'A test game', color: GameColor.blue, icon: '');
testMatch1 = Match( testMatch1 = Match(
name: 'Test Match 1', name: 'Test Match 1',
game: testGame, game: testGame,

View File

@@ -49,8 +49,8 @@ void main() {
name: 'Team Gamma', name: 'Team Gamma',
members: [testPlayer1, testPlayer3], members: [testPlayer1, testPlayer3],
); );
testGame1 = Game(name: 'Game 1', ruleset: Ruleset.singleWinner, description: 'Test game 1', color: '0xFF000000', icon: ''); testGame1 = Game(name: 'Game 1', ruleset: Ruleset.singleWinner, description: 'Test game 1', color: GameColor.blue, icon: '');
testGame2 = Game(name: 'Game 2', ruleset: Ruleset.highestScore, description: 'Test game 2', color: '0xFF000000', icon: ''); testGame2 = Game(name: 'Game 2', ruleset: Ruleset.highestScore, description: 'Test game 2', color: GameColor.red, icon: '');
}); });
await database.playerDao.addPlayersAsList( await database.playerDao.addPlayersAsList(