From 3f0adb4c05a5a5ca4bdc90a836125a2d8b501ffa Mon Sep 17 00:00:00 2001 From: Yannick <69087944+GelbEinhalb@users.noreply.github.com> Date: Fri, 14 Nov 2025 17:20:27 +0100 Subject: [PATCH 01/21] use GameTile to display game history --- .../views/main_menu/game_history_view.dart | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/lib/presentation/views/main_menu/game_history_view.dart b/lib/presentation/views/main_menu/game_history_view.dart index de75ae6..b840d70 100644 --- a/lib/presentation/views/main_menu/game_history_view.dart +++ b/lib/presentation/views/main_menu/game_history_view.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:game_tracker/core/custom_theme.dart'; +import 'package:game_tracker/presentation/widgets/game_tile.dart'; import 'package:game_tracker/presentation/widgets/top_centered_message.dart'; -import 'package:game_tracker/presentation/widgets/double_row_info_tile.dart'; class GameHistoryView extends StatefulWidget { const GameHistoryView({super.key}); @@ -182,16 +182,21 @@ Widget gameHistoryListView(allGameData, suggestedGameData) { } else if (suggestedGameData.isEmpty) { return TopCenteredMessage("Kein Spiel mit den Suchparametern gefunden."); } - return ListView.builder( + return ListView.separated( + padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0), itemCount: suggestedGameData.length, + separatorBuilder: (context, index) => const Padding( + padding: EdgeInsets.symmetric(vertical: 8.0), + child: Divider(), + ), itemBuilder: (context, index) { final currentGame = suggestedGameData[index]; - return doubleRowInfoTile( - currentGame['game'] + ": ", - currentGame['title'], - currentGame['players'].toString() + " Spieler", - currentGame['group'], - currentGame['date'], + return GameTile( + gameTitle: currentGame['title'], + gameType: currentGame['game'], + ruleset: currentGame['date'], + players: '${currentGame['players']} Spieler', + winner: currentGame['group'], ); }, ); From 69e13e877e2d08fedc5bd8ed8a4c2cdbed09cce6 Mon Sep 17 00:00:00 2001 From: Yannick <69087944+GelbEinhalb@users.noreply.github.com> Date: Wed, 19 Nov 2025 08:58:47 +0100 Subject: [PATCH 02/21] add game_history_tile --- .../views/main_menu/game_history_view.dart | 13 ++--- .../widgets/game_history_tile.dart | 49 +++++++++++++++++++ 2 files changed, 56 insertions(+), 6 deletions(-) create mode 100644 lib/presentation/widgets/game_history_tile.dart diff --git a/lib/presentation/views/main_menu/game_history_view.dart b/lib/presentation/views/main_menu/game_history_view.dart index b840d70..b14244b 100644 --- a/lib/presentation/views/main_menu/game_history_view.dart +++ b/lib/presentation/views/main_menu/game_history_view.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:game_tracker/core/custom_theme.dart'; -import 'package:game_tracker/presentation/widgets/game_tile.dart'; +import 'package:game_tracker/presentation/widgets/game_history_tile.dart'; import 'package:game_tracker/presentation/widgets/top_centered_message.dart'; class GameHistoryView extends StatefulWidget { @@ -178,10 +178,11 @@ class _GameHistoryViewState extends State { Widget gameHistoryListView(allGameData, suggestedGameData) { if (suggestedGameData.isEmpty && allGameData.isEmpty) { - return TopCenteredMessage("Keine Spiele erstellt"); + return const TopCenteredMessage(icon: Icons.error, title: 'Keine Spiele erstellt', message: '',); } else if (suggestedGameData.isEmpty) { - return TopCenteredMessage("Kein Spiel mit den Suchparametern gefunden."); + return const TopCenteredMessage(icon: Icons.error, title: 'Keine Spiele mit den Suchparametern gefunden', message: '',); } + return ListView.separated( padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0), itemCount: suggestedGameData.length, @@ -191,12 +192,12 @@ Widget gameHistoryListView(allGameData, suggestedGameData) { ), itemBuilder: (context, index) { final currentGame = suggestedGameData[index]; - return GameTile( + return GameHistoryTile( gameTitle: currentGame['title'], gameType: currentGame['game'], ruleset: currentGame['date'], - players: '${currentGame['players']} Spieler', - winner: currentGame['group'], + groupName: currentGame['group'], + winner: "ich", ); }, ); diff --git a/lib/presentation/widgets/game_history_tile.dart b/lib/presentation/widgets/game_history_tile.dart new file mode 100644 index 0000000..e461f04 --- /dev/null +++ b/lib/presentation/widgets/game_history_tile.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; +import 'package:game_tracker/core/custom_theme.dart'; +import 'package:skeletonizer/skeletonizer.dart'; + +class GameHistoryTile extends StatefulWidget { + final String gameTitle; + final String gameType; + final String ruleset; + final String groupName; + final String winner; + + const GameHistoryTile({ + super.key, + required this.gameTitle, + required this.gameType, + required this.ruleset, + required this.groupName, + required this.winner, + }); + + @override + State createState() => _GameHistoryTileState(); +} + +class _GameHistoryTileState extends State { + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Text( + widget.gameTitle, + style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + const SizedBox(width: 5), + Text( + widget.gameType, + style: const TextStyle(fontSize: 14, color: Colors.grey), + ), + ], + ), + ], + ); + } + +} From 95f0861a7967e1194f8ede4d7cbfa36a7642860e Mon Sep 17 00:00:00 2001 From: Yannick <69087944+GelbEinhalb@users.noreply.github.com> Date: Fri, 21 Nov 2025 15:44:27 +0100 Subject: [PATCH 03/21] add basic came history tile --- .../views/main_menu/game_history_view.dart | 10 ++-- .../widgets/game_history_tile.dart | 56 ++++++++++++++----- 2 files changed, 47 insertions(+), 19 deletions(-) diff --git a/lib/presentation/views/main_menu/game_history_view.dart b/lib/presentation/views/main_menu/game_history_view.dart index b14244b..a0ea4a9 100644 --- a/lib/presentation/views/main_menu/game_history_view.dart +++ b/lib/presentation/views/main_menu/game_history_view.dart @@ -134,16 +134,16 @@ class _GameHistoryViewState extends State { children: [ Column( children: [ - Container(margin: EdgeInsets.only(bottom: 75)), + Container(margin: const EdgeInsets.only(bottom: 75)), Expanded( child: gameHistoryListView(allGameData, suggestedGameData), ), ], ), Container( - margin: EdgeInsets.only(top: 10, bottom: 10, left: 10, right: 10), + margin: const EdgeInsets.only(top: 10, bottom: 10, left: 10, right: 10), child: SearchBar( - leading: Icon(Icons.search), + leading: const Icon(Icons.search), onChanged: (value) { if (value.isEmpty) { setState(() { @@ -195,9 +195,9 @@ Widget gameHistoryListView(allGameData, suggestedGameData) { return GameHistoryTile( gameTitle: currentGame['title'], gameType: currentGame['game'], - ruleset: currentGame['date'], + date: currentGame['date'], groupName: currentGame['group'], - winner: "ich", + winner: 'ich', ); }, ); diff --git a/lib/presentation/widgets/game_history_tile.dart b/lib/presentation/widgets/game_history_tile.dart index e461f04..c21b2c2 100644 --- a/lib/presentation/widgets/game_history_tile.dart +++ b/lib/presentation/widgets/game_history_tile.dart @@ -5,7 +5,7 @@ import 'package:skeletonizer/skeletonizer.dart'; class GameHistoryTile extends StatefulWidget { final String gameTitle; final String gameType; - final String ruleset; + final String date; final String groupName; final String winner; @@ -13,7 +13,7 @@ class GameHistoryTile extends StatefulWidget { super.key, required this.gameTitle, required this.gameType, - required this.ruleset, + required this.date, required this.groupName, required this.winner, }); @@ -29,18 +29,46 @@ class _GameHistoryTileState extends State { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Row( - children: [ - Text( - widget.gameTitle, - style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), - ), - const SizedBox(width: 5), - Text( - widget.gameType, - style: const TextStyle(fontSize: 14, color: Colors.grey), - ), - ], + Container( + margin: const EdgeInsets.symmetric(horizontal: 12, vertical: 10), + padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), + decoration: BoxDecoration( + color: CustomTheme.boxColor, + border: Border.all(color: CustomTheme.boxBorder), + borderRadius: BorderRadius.circular(12), + ), + child: Column( + children: [ + Row( + children: [ + Text( + widget.gameTitle, + style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + overflow: TextOverflow.ellipsis, + ), + ], + ), + Row( + children: [ + Text( + widget.date, + style: const TextStyle(fontSize: 14, color: Colors.grey), + textAlign: TextAlign.left, + ), + const SizedBox(width: 5), + const Text('·'), + const SizedBox(width: 5), + Text( + widget.gameType, + style: const TextStyle(fontSize: 14, color: Colors.grey), + textAlign: TextAlign.left, + ), + ], + ), + const SizedBox(height: 15), + + ] + ) ), ], ); From f21d0ba4e8210bf4501707fe2db00a074a63bfb8 Mon Sep 17 00:00:00 2001 From: Yannick <69087944+GelbEinhalb@users.noreply.github.com> Date: Sun, 23 Nov 2025 20:04:56 +0100 Subject: [PATCH 04/21] move game_history_tile.dart --- lib/presentation/views/main_menu/game_history_view.dart | 2 +- lib/presentation/widgets/{ => tiles}/game_history_tile.dart | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename lib/presentation/widgets/{ => tiles}/game_history_tile.dart (100%) diff --git a/lib/presentation/views/main_menu/game_history_view.dart b/lib/presentation/views/main_menu/game_history_view.dart index a0ea4a9..8cd7882 100644 --- a/lib/presentation/views/main_menu/game_history_view.dart +++ b/lib/presentation/views/main_menu/game_history_view.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:game_tracker/core/custom_theme.dart'; -import 'package:game_tracker/presentation/widgets/game_history_tile.dart'; +import 'package:game_tracker/presentation/widgets/tiles/game_history_tile.dart'; import 'package:game_tracker/presentation/widgets/top_centered_message.dart'; class GameHistoryView extends StatefulWidget { diff --git a/lib/presentation/widgets/game_history_tile.dart b/lib/presentation/widgets/tiles/game_history_tile.dart similarity index 100% rename from lib/presentation/widgets/game_history_tile.dart rename to lib/presentation/widgets/tiles/game_history_tile.dart From bbd200e24529923ecddb92a9fd721bb3f0ed9f36 Mon Sep 17 00:00:00 2001 From: Yannick <69087944+GelbEinhalb@users.noreply.github.com> Date: Sun, 23 Nov 2025 20:34:16 +0100 Subject: [PATCH 05/21] use Skeletonizer for Layout --- .../views/main_menu/game_history_view.dart | 264 ++++++------------ 1 file changed, 83 insertions(+), 181 deletions(-) diff --git a/lib/presentation/views/main_menu/game_history_view.dart b/lib/presentation/views/main_menu/game_history_view.dart index 8cd7882..e3b2aeb 100644 --- a/lib/presentation/views/main_menu/game_history_view.dart +++ b/lib/presentation/views/main_menu/game_history_view.dart @@ -1,7 +1,11 @@ import 'package:flutter/material.dart'; -import 'package:game_tracker/core/custom_theme.dart'; +import 'package:game_tracker/data/db/database.dart'; +import 'package:game_tracker/data/dto/game.dart'; +import 'package:game_tracker/data/dto/group.dart'; +import 'package:game_tracker/data/dto/player.dart'; import 'package:game_tracker/presentation/widgets/tiles/game_history_tile.dart'; -import 'package:game_tracker/presentation/widgets/top_centered_message.dart'; +import 'package:provider/provider.dart'; +import 'package:skeletonizer/skeletonizer.dart'; class GameHistoryView extends StatefulWidget { const GameHistoryView({super.key}); @@ -11,194 +15,92 @@ class GameHistoryView extends StatefulWidget { } class _GameHistoryViewState extends State { - final allGameData = [ - { - 'game': 'Schach', - 'title': 'Abendpartie', - 'players': 2, - 'group': 'Familie', - 'date': '01.06.2024', - }, - { - 'game': 'Monopoly', - 'title': 'Wochenendspaß mit Gras du Saas', - 'players': 4, - 'group': 'Freunde', - 'date': '28.05.2024', - }, - { - 'game': 'Catan', - 'title': 'Strategieabend', - 'players': 3, - 'group': 'Brettspieler', - 'date': '25.05.2024', - }, - { - 'game': 'Uno', - 'title': 'Schnelle Runde', - 'players': 5, - 'group': 'Kollegen', - 'date': '22.05.2024', - }, - { - 'game': 'Poker', - 'title': 'Freitagspoker', - 'players': 6, - 'group': 'Pokerclub', - 'date': '20.05.2024', - }, - { - 'game': 'Scrabble', - 'title': 'Wortschlacht', - 'players': 4, - 'group': 'Familie', - 'date': '18.05.2024', - }, - { - 'game': 'Risiko', - 'title': 'Weltherrschaft', - 'players': 5, - 'group': 'Strategiegruppe', - 'date': '15.05.2024', - }, - { - 'game': 'Zug um Zug', - 'title': 'Zug-Abenteuer', - 'players': 4, - 'group': 'Reisende', - 'date': '12.05.2024', - }, - { - 'game': 'Carcassonne', - 'title': 'Plättchenlegen', - 'players': 3, - 'group': 'Brettspieler', - 'date': '10.05.2024', - }, - { - 'game': 'Pandemie', - 'title': 'Welt retten', - 'players': 4, - 'group': 'Koop-Team', - 'date': '08.05.2024', - }, - { - 'game': 'Cluedo', - 'title': 'Krimiabend', - 'players': 6, - 'group': 'Detektive', - 'date': '05.05.2024', - }, - { - 'game': 'Dixit', - 'title': 'Fantasiespiel', - 'players': 5, - 'group': 'Künstler', - 'date': '02.05.2024', - }, - { - 'game': 'Azul', - 'title': 'Plättchenmeister', - 'players': 4, - 'group': 'Familie', - 'date': '30.04.2024', - }, - { - 'game': 'Splendor', - 'title': 'Edelsteinhändler', - 'players': 3, - 'group': 'Freunde', - 'date': '28.04.2024', - }, - { - 'game': '7 Wonders', - 'title': 'Antike Reiche', - 'players': 7, - 'group': 'Geschichtsfreunde', - 'date': '25.04.2024', - }, - ]; - late List> suggestedGameData; + late Future> _gameListFuture; + late final AppDatabase db; + + late final List skeletonData = List.filled( + 2, + Game( + name: 'Skeleton Game', + group: Group( + name: 'Skeleton Group', + members: [ + Player(name: 'Skeleton Player 1'), + Player(name: 'Skeleton Player 2'), + ], + ), + winner: Player(name: 'Skeleton Player 1'), + ), + ); @override void initState() { super.initState(); - suggestedGameData = List.from(allGameData); + db = Provider.of(context, listen: false); + _gameListFuture = Future.delayed( + const Duration(milliseconds: 250), + () => db.gameDao.getAllGames(), + ); } @override Widget build(BuildContext context) { - return Scaffold( - backgroundColor: CustomTheme.backgroundColor, - body: Stack( - children: [ - Column( - children: [ - Container(margin: const EdgeInsets.only(bottom: 75)), - Expanded( - child: gameHistoryListView(allGameData, suggestedGameData), - ), - ], - ), - Container( - margin: const EdgeInsets.only(top: 10, bottom: 10, left: 10, right: 10), - child: SearchBar( - leading: const Icon(Icons.search), - onChanged: (value) { - if (value.isEmpty) { - setState(() { - suggestedGameData.clear(); - suggestedGameData.addAll(allGameData); - }); - return; - } - final suggestions = allGameData.where((currentGame) { - return currentGame['game'].toString().toLowerCase().contains( - value.toLowerCase(), - ) || - currentGame['title'].toString().toLowerCase().contains( - value.toLowerCase(), - ) || - currentGame['group'].toString().toLowerCase().contains( - value.toLowerCase(), - ); - }); - setState(() { - suggestedGameData.clear(); - suggestedGameData.addAll(suggestions); - }); - }, + return FutureBuilder>( + future: _gameListFuture, + builder: (BuildContext context, AsyncSnapshot> snapshot) { + if (snapshot.hasError) { + return const Center( + heightFactor: 4, + child: Text( + 'Error while loading recent games.', ), + ); + } + if (snapshot.connectionState == ConnectionState.done && + (!snapshot.hasData || snapshot.data!.isEmpty)) { + return const Center( + heightFactor: 4, + child: Text('No recent games available.'), + ); + } + + final bool isLoading = snapshot.connectionState == ConnectionState.waiting; + final List games = (isLoading + ? skeletonData + : (snapshot.data ?? []) + ..sort((a, b) => b.createdAt.compareTo(a.createdAt))) + .take(2) + .toList(); + + return Skeletonizer( + effect: PulseEffect( + from: Colors.grey[800]!, + to: Colors.grey[600]!, + duration: const Duration(milliseconds: 800), ), - ], - ), + enabled: isLoading, + enableSwitchAnimation: true, + switchAnimationConfig: const SwitchAnimationConfig( + duration: Duration(milliseconds: 200), + switchInCurve: Curves.linear, + switchOutCurve: Curves.linear, + transitionBuilder: AnimatedSwitcher.defaultTransitionBuilder, + layoutBuilder: AnimatedSwitcher.defaultLayoutBuilder, + ), + child: ListView.builder( + padding: const EdgeInsets.only(bottom: 85), + itemCount: games.length + 1, + itemBuilder: (BuildContext context, int index) { + if (index == games.length) { + return SizedBox( + height: MediaQuery.paddingOf(context).bottom - 20, + ); + } + return GameHistoryTile(game: games[index]); + }, + ), + ); + }, ); } -} - -Widget gameHistoryListView(allGameData, suggestedGameData) { - if (suggestedGameData.isEmpty && allGameData.isEmpty) { - return const TopCenteredMessage(icon: Icons.error, title: 'Keine Spiele erstellt', message: '',); - } else if (suggestedGameData.isEmpty) { - return const TopCenteredMessage(icon: Icons.error, title: 'Keine Spiele mit den Suchparametern gefunden', message: '',); - } - - return ListView.separated( - padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0), - itemCount: suggestedGameData.length, - separatorBuilder: (context, index) => const Padding( - padding: EdgeInsets.symmetric(vertical: 8.0), - child: Divider(), - ), - itemBuilder: (context, index) { - final currentGame = suggestedGameData[index]; - return GameHistoryTile( - gameTitle: currentGame['title'], - gameType: currentGame['game'], - date: currentGame['date'], - groupName: currentGame['group'], - winner: 'ich', - ); - }, - ); -} +} \ No newline at end of file From 290948e50d001427af6f6528edfacd39ad33c995 Mon Sep 17 00:00:00 2001 From: Yannick <69087944+GelbEinhalb@users.noreply.github.com> Date: Sun, 23 Nov 2025 22:05:25 +0100 Subject: [PATCH 06/21] add intl for date formatting --- pubspec.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/pubspec.yaml b/pubspec.yaml index fa4c213..07e4df2 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -24,6 +24,7 @@ dependencies: json_schema: ^5.2.2 file_saver: ^0.3.1 clock: ^1.1.2 + intl: ^0.18.0 dev_dependencies: flutter_test: From 4341c2509ea5cd41ca22a527c8ce84ac9f987aae Mon Sep 17 00:00:00 2001 From: Yannick <69087944+GelbEinhalb@users.noreply.github.com> Date: Mon, 24 Nov 2025 11:07:40 +0100 Subject: [PATCH 07/21] fix bug where only last 2 games were shown --- .../views/main_menu/game_history_view.dart | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/lib/presentation/views/main_menu/game_history_view.dart b/lib/presentation/views/main_menu/game_history_view.dart index e3b2aeb..45a17b5 100644 --- a/lib/presentation/views/main_menu/game_history_view.dart +++ b/lib/presentation/views/main_menu/game_history_view.dart @@ -19,7 +19,7 @@ class _GameHistoryViewState extends State { late final AppDatabase db; late final List skeletonData = List.filled( - 2, + 10, Game( name: 'Skeleton Game', group: Group( @@ -30,6 +30,9 @@ class _GameHistoryViewState extends State { ], ), winner: Player(name: 'Skeleton Player 1'), + players: [ + Player(name: 'Skeleton Player 3') + ], ), ); @@ -37,10 +40,11 @@ class _GameHistoryViewState extends State { void initState() { super.initState(); db = Provider.of(context, listen: false); - _gameListFuture = Future.delayed( - const Duration(milliseconds: 250), - () => db.gameDao.getAllGames(), - ); + _gameListFuture = db.gameDao.getAllGames(); + + Future.wait([_gameListFuture]).then((result) async { + await Future.delayed(const Duration(milliseconds: 250)); + }); } @override @@ -69,7 +73,6 @@ class _GameHistoryViewState extends State { ? skeletonData : (snapshot.data ?? []) ..sort((a, b) => b.createdAt.compareTo(a.createdAt))) - .take(2) .toList(); return Skeletonizer( From 32c7d458090b13f29651bb3bec6336bc94756a34 Mon Sep 17 00:00:00 2001 From: Yannick <69087944+GelbEinhalb@users.noreply.github.com> Date: Mon, 24 Nov 2025 11:34:22 +0100 Subject: [PATCH 08/21] made game_history_tile prettier :) --- .../widgets/tiles/game_history_tile.dart | 208 +++++++++++++----- 1 file changed, 159 insertions(+), 49 deletions(-) diff --git a/lib/presentation/widgets/tiles/game_history_tile.dart b/lib/presentation/widgets/tiles/game_history_tile.dart index c21b2c2..fdc9584 100644 --- a/lib/presentation/widgets/tiles/game_history_tile.dart +++ b/lib/presentation/widgets/tiles/game_history_tile.dart @@ -1,21 +1,15 @@ import 'package:flutter/material.dart'; import 'package:game_tracker/core/custom_theme.dart'; -import 'package:skeletonizer/skeletonizer.dart'; +import 'package:game_tracker/data/dto/game.dart'; +import 'package:game_tracker/presentation/widgets/tiles/text_icon_tile.dart'; +import 'package:intl/intl.dart'; class GameHistoryTile extends StatefulWidget { - final String gameTitle; - final String gameType; - final String date; - final String groupName; - final String winner; + final Game game; const GameHistoryTile({ super.key, - required this.gameTitle, - required this.gameType, - required this.date, - required this.groupName, - required this.winner, + required this.game, }); @override @@ -23,55 +17,171 @@ class GameHistoryTile extends StatefulWidget { } class _GameHistoryTileState extends State { + String _formatDate(DateTime dateTime) { + final now = DateTime.now(); + final difference = now.difference(dateTime); + + if (difference.inDays == 0) { + return 'Today at ${DateFormat('HH:mm').format(dateTime)}'; + } else if (difference.inDays == 1) { + return 'Yesterday at ${DateFormat('HH:mm').format(dateTime)}'; + } else if (difference.inDays < 7) { + return '${difference.inDays} days ago'; + } else { + return DateFormat('MMM d, yyyy').format(dateTime); + } + } + + List _getAllPlayers() { + final allPlayers = []; + final playerIds = {}; + + // Add players from game.players + if (widget.game.players != null) { + for (var player in widget.game.players!) { + if (!playerIds.contains(player.id)) { + allPlayers.add(player); + playerIds.add(player.id); + } + } + } + + // Add players from game.group.players + if (widget.game.group?.members != null) { + for (var player in widget.game.group!.members) { + if (!playerIds.contains(player.id)) { + allPlayers.add(player); + playerIds.add(player.id); + } + } + } + + return allPlayers; + } @override Widget build(BuildContext context) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - margin: const EdgeInsets.symmetric(horizontal: 12, vertical: 10), - padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), - decoration: BoxDecoration( - color: CustomTheme.boxColor, - border: Border.all(color: CustomTheme.boxBorder), - borderRadius: BorderRadius.circular(12), - ), - child: Column( + final group = widget.game.group; + final winner = widget.game.winner; + final allPlayers = _getAllPlayers(); + + return Container( + margin: const EdgeInsets.symmetric(horizontal: 12, vertical: 6), + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: CustomTheme.boxColor, + border: Border.all(color: CustomTheme.boxBorder), + borderRadius: BorderRadius.circular(12), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Row( - children: [ - Text( - widget.gameTitle, - style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), - overflow: TextOverflow.ellipsis, + Expanded( + child: Text( + widget.game.name, + style: const TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + ), + overflow: TextOverflow.ellipsis, + ), + ), + Text( + _formatDate(widget.game.createdAt), + style: const TextStyle( + fontSize: 12, + color: Colors.grey, + ), + ), + ], + ), + + const SizedBox(height: 8), + + if (group != null) + Row( + children: [ + const Icon( + Icons.group, + size: 16, + color: Colors.grey, + ), + const SizedBox(width: 6), + Expanded( + child: Text( + group.name, + style: const TextStyle( + fontSize: 14, + color: Colors.grey, ), - ], + overflow: TextOverflow.ellipsis, + ), + ), + ], + ), + + if (group != null) const SizedBox(height: 12), + + if (winner != null) + Container( + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 12), + decoration: BoxDecoration( + color: Colors.green.withValues(alpha: 0.1), + borderRadius: BorderRadius.circular(8), + border: Border.all( + color: Colors.green.withValues(alpha: 0.3), + width: 1, + ), ), - Row( + child: Row( children: [ - Text( - widget.date, - style: const TextStyle(fontSize: 14, color: Colors.grey), - textAlign: TextAlign.left, + const Icon( + Icons.emoji_events, + size: 20, + color: Colors.amber, ), - const SizedBox(width: 5), - const Text('·'), - const SizedBox(width: 5), + const SizedBox(width: 8), Text( - widget.gameType, - style: const TextStyle(fontSize: 14, color: Colors.grey), - textAlign: TextAlign.left, + 'Winner: ${winner.name}', + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.w600, + color: Colors.white, + ), ), ], ), - const SizedBox(height: 15), - - ] - ) - ), - ], + ), + + if (winner != null) const SizedBox(height: 12), + + if (allPlayers.isNotEmpty) ...[ + const Text( + 'Players:', + style: TextStyle( + fontSize: 13, + color: Colors.grey, + fontWeight: FontWeight.w500, + ), + ), + const SizedBox(height: 6), + Wrap( + spacing: 6, + runSpacing: 6, + children: allPlayers.map((player) { + final isWinner = winner != null && player.id == winner.id; + return TextIconTile( + text: player.name, + iconEnabled: false, + ); + }).toList(), + ), + ], + ], + ), ); } - -} +} \ No newline at end of file From 4591a6857d212abaf9f00361c47e2b79f6b2c9fb Mon Sep 17 00:00:00 2001 From: Yannick <69087944+GelbEinhalb@users.noreply.github.com> Date: Mon, 24 Nov 2025 11:39:56 +0100 Subject: [PATCH 09/21] change skeleton names --- lib/presentation/views/main_menu/game_history_view.dart | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/presentation/views/main_menu/game_history_view.dart b/lib/presentation/views/main_menu/game_history_view.dart index 45a17b5..60dcd90 100644 --- a/lib/presentation/views/main_menu/game_history_view.dart +++ b/lib/presentation/views/main_menu/game_history_view.dart @@ -25,13 +25,16 @@ class _GameHistoryViewState extends State { group: Group( name: 'Skeleton Group', members: [ - Player(name: 'Skeleton Player 1'), - Player(name: 'Skeleton Player 2'), + Player(name: 'Player 1'), + Player(name: 'Player 2'), + Player(name: 'Player 3'), + Player(name: 'Long Name Player 4'), + Player(name: 'Player 5'), ], ), winner: Player(name: 'Skeleton Player 1'), players: [ - Player(name: 'Skeleton Player 3') + Player(name: 'Skeleton Player 6') ], ), ); From 099e587d458049ff4fe6c51ad92181eefffc8e79 Mon Sep 17 00:00:00 2001 From: gelbeinhalb Date: Thu, 27 Nov 2025 16:45:47 +0100 Subject: [PATCH 10/21] remove useless skeleton data --- lib/presentation/views/main_menu/game_history_view.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/presentation/views/main_menu/game_history_view.dart b/lib/presentation/views/main_menu/game_history_view.dart index 60dcd90..df4b7a0 100644 --- a/lib/presentation/views/main_menu/game_history_view.dart +++ b/lib/presentation/views/main_menu/game_history_view.dart @@ -19,7 +19,7 @@ class _GameHistoryViewState extends State { late final AppDatabase db; late final List skeletonData = List.filled( - 10, + 4, Game( name: 'Skeleton Game', group: Group( From b443230285f3f9844d02781aa798cbf621da70b3 Mon Sep 17 00:00:00 2001 From: gelbeinhalb Date: Thu, 27 Nov 2025 16:58:02 +0100 Subject: [PATCH 11/21] fixed loading too fast --- lib/presentation/views/main_menu/game_history_view.dart | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/presentation/views/main_menu/game_history_view.dart b/lib/presentation/views/main_menu/game_history_view.dart index df4b7a0..f6f47ef 100644 --- a/lib/presentation/views/main_menu/game_history_view.dart +++ b/lib/presentation/views/main_menu/game_history_view.dart @@ -17,6 +17,7 @@ class GameHistoryView extends StatefulWidget { class _GameHistoryViewState extends State { late Future> _gameListFuture; late final AppDatabase db; + late bool isLoading = true; late final List skeletonData = List.filled( 4, @@ -47,6 +48,9 @@ class _GameHistoryViewState extends State { Future.wait([_gameListFuture]).then((result) async { await Future.delayed(const Duration(milliseconds: 250)); + setState(() { + isLoading = false; + }); }); } @@ -71,7 +75,6 @@ class _GameHistoryViewState extends State { ); } - final bool isLoading = snapshot.connectionState == ConnectionState.waiting; final List games = (isLoading ? skeletonData : (snapshot.data ?? []) From ae348499d410c7e584cb06d971c94a8adb30b9cc Mon Sep 17 00:00:00 2001 From: gelbeinhalb Date: Thu, 27 Nov 2025 17:00:13 +0100 Subject: [PATCH 12/21] moved functionality methods to the bottom of the file --- .../widgets/tiles/game_history_tile.dart | 85 ++++++++++--------- 1 file changed, 43 insertions(+), 42 deletions(-) diff --git a/lib/presentation/widgets/tiles/game_history_tile.dart b/lib/presentation/widgets/tiles/game_history_tile.dart index fdc9584..83e0ba0 100644 --- a/lib/presentation/widgets/tiles/game_history_tile.dart +++ b/lib/presentation/widgets/tiles/game_history_tile.dart @@ -17,47 +17,6 @@ class GameHistoryTile extends StatefulWidget { } class _GameHistoryTileState extends State { - String _formatDate(DateTime dateTime) { - final now = DateTime.now(); - final difference = now.difference(dateTime); - - if (difference.inDays == 0) { - return 'Today at ${DateFormat('HH:mm').format(dateTime)}'; - } else if (difference.inDays == 1) { - return 'Yesterday at ${DateFormat('HH:mm').format(dateTime)}'; - } else if (difference.inDays < 7) { - return '${difference.inDays} days ago'; - } else { - return DateFormat('MMM d, yyyy').format(dateTime); - } - } - - List _getAllPlayers() { - final allPlayers = []; - final playerIds = {}; - - // Add players from game.players - if (widget.game.players != null) { - for (var player in widget.game.players!) { - if (!playerIds.contains(player.id)) { - allPlayers.add(player); - playerIds.add(player.id); - } - } - } - - // Add players from game.group.players - if (widget.game.group?.members != null) { - for (var player in widget.game.group!.members) { - if (!playerIds.contains(player.id)) { - allPlayers.add(player); - playerIds.add(player.id); - } - } - } - - return allPlayers; - } @override Widget build(BuildContext context) { @@ -172,7 +131,6 @@ class _GameHistoryTileState extends State { spacing: 6, runSpacing: 6, children: allPlayers.map((player) { - final isWinner = winner != null && player.id == winner.id; return TextIconTile( text: player.name, iconEnabled: false, @@ -184,4 +142,47 @@ class _GameHistoryTileState extends State { ), ); } + + String _formatDate(DateTime dateTime) { + final now = DateTime.now(); + final difference = now.difference(dateTime); + + if (difference.inDays == 0) { + return 'Today at ${DateFormat('HH:mm').format(dateTime)}'; + } else if (difference.inDays == 1) { + return 'Yesterday at ${DateFormat('HH:mm').format(dateTime)}'; + } else if (difference.inDays < 7) { + return '${difference.inDays} days ago'; + } else { + return DateFormat('MMM d, yyyy').format(dateTime); + } + } + + List _getAllPlayers() { + final allPlayers = []; + final playerIds = {}; + + // Add players from game.players + if (widget.game.players != null) { + for (var player in widget.game.players!) { + if (!playerIds.contains(player.id)) { + allPlayers.add(player); + playerIds.add(player.id); + } + } + } + + // Add players from game.group.players + if (widget.game.group?.members != null) { + for (var player in widget.game.group!.members) { + if (!playerIds.contains(player.id)) { + allPlayers.add(player); + playerIds.add(player.id); + } + } + } + + return allPlayers; + } + } \ No newline at end of file From cc50e497c9e671e669fdc9d519cfdfbde26834fd Mon Sep 17 00:00:00 2001 From: gelbeinhalb Date: Thu, 27 Nov 2025 17:04:08 +0100 Subject: [PATCH 13/21] merge duplicate if statements for group and winner sections --- .../widgets/tiles/game_history_tile.dart | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/presentation/widgets/tiles/game_history_tile.dart b/lib/presentation/widgets/tiles/game_history_tile.dart index 83e0ba0..066603e 100644 --- a/lib/presentation/widgets/tiles/game_history_tile.dart +++ b/lib/presentation/widgets/tiles/game_history_tile.dart @@ -60,7 +60,7 @@ class _GameHistoryTileState extends State { const SizedBox(height: 8), - if (group != null) + if (group != null) ...[ Row( children: [ const Icon( @@ -81,10 +81,10 @@ class _GameHistoryTileState extends State { ), ], ), + const SizedBox(height: 12), + ], - if (group != null) const SizedBox(height: 12), - - if (winner != null) + if (winner != null) ...[ Container( padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 12), decoration: BoxDecoration( @@ -114,8 +114,8 @@ class _GameHistoryTileState extends State { ], ), ), - - if (winner != null) const SizedBox(height: 12), + const SizedBox(height: 12), + ], if (allPlayers.isNotEmpty) ...[ const Text( From 8c005d6e5e074fcbe5aa23d632786f6bf30e2d12 Mon Sep 17 00:00:00 2001 From: gelbeinhalb Date: Thu, 27 Nov 2025 17:06:32 +0100 Subject: [PATCH 14/21] fix possible render overflow --- .../widgets/tiles/game_history_tile.dart | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/lib/presentation/widgets/tiles/game_history_tile.dart b/lib/presentation/widgets/tiles/game_history_tile.dart index 066603e..684ba48 100644 --- a/lib/presentation/widgets/tiles/game_history_tile.dart +++ b/lib/presentation/widgets/tiles/game_history_tile.dart @@ -103,12 +103,15 @@ class _GameHistoryTileState extends State { color: Colors.amber, ), const SizedBox(width: 8), - Text( - 'Winner: ${winner.name}', - style: const TextStyle( - fontSize: 14, - fontWeight: FontWeight.w600, - color: Colors.white, + Expanded( + child: Text( + 'Winner: ${winner.name}', + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.w600, + color: Colors.white, + ), + overflow: TextOverflow.ellipsis, ), ), ], From a29123c964cd9c95f22456e7ba987cce6987091f Mon Sep 17 00:00:00 2001 From: gelbeinhalb Date: Thu, 27 Nov 2025 17:25:58 +0100 Subject: [PATCH 15/21] fix error messages --- lib/presentation/views/main_menu/game_history_view.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/presentation/views/main_menu/game_history_view.dart b/lib/presentation/views/main_menu/game_history_view.dart index f6f47ef..b5813cf 100644 --- a/lib/presentation/views/main_menu/game_history_view.dart +++ b/lib/presentation/views/main_menu/game_history_view.dart @@ -63,7 +63,7 @@ class _GameHistoryViewState extends State { return const Center( heightFactor: 4, child: Text( - 'Error while loading recent games.', + 'Error while loading games.', ), ); } @@ -71,7 +71,7 @@ class _GameHistoryViewState extends State { (!snapshot.hasData || snapshot.data!.isEmpty)) { return const Center( heightFactor: 4, - child: Text('No recent games available.'), + child: Text('No games available.'), ); } From aa208bb2efabe86109b2202df069d3db7b6c42db Mon Sep 17 00:00:00 2001 From: gelbeinhalb Date: Thu, 27 Nov 2025 22:56:22 +0100 Subject: [PATCH 16/21] use standardized TopCenteredMessage --- .../views/main_menu/game_history_view.dart | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/lib/presentation/views/main_menu/game_history_view.dart b/lib/presentation/views/main_menu/game_history_view.dart index b5813cf..3acc186 100644 --- a/lib/presentation/views/main_menu/game_history_view.dart +++ b/lib/presentation/views/main_menu/game_history_view.dart @@ -4,6 +4,7 @@ import 'package:game_tracker/data/dto/game.dart'; import 'package:game_tracker/data/dto/group.dart'; import 'package:game_tracker/data/dto/player.dart'; import 'package:game_tracker/presentation/widgets/tiles/game_history_tile.dart'; +import 'package:game_tracker/presentation/widgets/top_centered_message.dart'; import 'package:provider/provider.dart'; import 'package:skeletonizer/skeletonizer.dart'; @@ -61,17 +62,21 @@ class _GameHistoryViewState extends State { builder: (BuildContext context, AsyncSnapshot> snapshot) { if (snapshot.hasError) { return const Center( - heightFactor: 4, - child: Text( - 'Error while loading games.', + child: TopCenteredMessage( + icon: Icons.report, + title: 'Error', + message: 'Game data could not be loaded', ), ); } if (snapshot.connectionState == ConnectionState.done && (!snapshot.hasData || snapshot.data!.isEmpty)) { return const Center( - heightFactor: 4, - child: Text('No games available.'), + child: TopCenteredMessage( + icon: Icons.report, + title: 'Error', + message: 'No Games Available', + ), ); } From 9ee9da2ac8015bb77b0c14debd34a453122265ab Mon Sep 17 00:00:00 2001 From: gelbeinhalb Date: Thu, 27 Nov 2025 22:59:09 +0100 Subject: [PATCH 17/21] Made space at the bottom of the list smaller --- lib/presentation/views/main_menu/game_history_view.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/presentation/views/main_menu/game_history_view.dart b/lib/presentation/views/main_menu/game_history_view.dart index 3acc186..7f7e943 100644 --- a/lib/presentation/views/main_menu/game_history_view.dart +++ b/lib/presentation/views/main_menu/game_history_view.dart @@ -107,7 +107,7 @@ class _GameHistoryViewState extends State { itemBuilder: (BuildContext context, int index) { if (index == games.length) { return SizedBox( - height: MediaQuery.paddingOf(context).bottom - 20, + height: MediaQuery.paddingOf(context).bottom - 80, ); } return GameHistoryTile(game: games[index]); From 516c2afd1ee3b56b9dc5c6eff6548dfdb1489b2e Mon Sep 17 00:00:00 2001 From: gelbeinhalb Date: Fri, 28 Nov 2025 12:14:22 +0100 Subject: [PATCH 18/21] remove colon behind players --- lib/presentation/widgets/tiles/game_history_tile.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/presentation/widgets/tiles/game_history_tile.dart b/lib/presentation/widgets/tiles/game_history_tile.dart index 684ba48..3cdd1ad 100644 --- a/lib/presentation/widgets/tiles/game_history_tile.dart +++ b/lib/presentation/widgets/tiles/game_history_tile.dart @@ -122,7 +122,7 @@ class _GameHistoryTileState extends State { if (allPlayers.isNotEmpty) ...[ const Text( - 'Players:', + 'Players', style: TextStyle( fontSize: 13, color: Colors.grey, From f713bd6fb78cd54e1f8fd0819932689cb33d92cf Mon Sep 17 00:00:00 2001 From: gelbeinhalb Date: Fri, 28 Nov 2025 14:35:20 +0100 Subject: [PATCH 19/21] use custom app skeleton --- .../views/main_menu/game_history_view.dart | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/lib/presentation/views/main_menu/game_history_view.dart b/lib/presentation/views/main_menu/game_history_view.dart index 7f7e943..b5d894d 100644 --- a/lib/presentation/views/main_menu/game_history_view.dart +++ b/lib/presentation/views/main_menu/game_history_view.dart @@ -5,8 +5,8 @@ import 'package:game_tracker/data/dto/group.dart'; import 'package:game_tracker/data/dto/player.dart'; import 'package:game_tracker/presentation/widgets/tiles/game_history_tile.dart'; import 'package:game_tracker/presentation/widgets/top_centered_message.dart'; +import 'package:game_tracker/presentation/widgets/app_skeleton.dart'; // Add this import import 'package:provider/provider.dart'; -import 'package:skeletonizer/skeletonizer.dart'; class GameHistoryView extends StatefulWidget { const GameHistoryView({super.key}); @@ -86,21 +86,8 @@ class _GameHistoryViewState extends State { ..sort((a, b) => b.createdAt.compareTo(a.createdAt))) .toList(); - return Skeletonizer( - effect: PulseEffect( - from: Colors.grey[800]!, - to: Colors.grey[600]!, - duration: const Duration(milliseconds: 800), - ), + return AppSkeleton( enabled: isLoading, - enableSwitchAnimation: true, - switchAnimationConfig: const SwitchAnimationConfig( - duration: Duration(milliseconds: 200), - switchInCurve: Curves.linear, - switchOutCurve: Curves.linear, - transitionBuilder: AnimatedSwitcher.defaultTransitionBuilder, - layoutBuilder: AnimatedSwitcher.defaultLayoutBuilder, - ), child: ListView.builder( padding: const EdgeInsets.only(bottom: 85), itemCount: games.length + 1, From fb28de5772ec1de22934a4dc8f28499999377e57 Mon Sep 17 00:00:00 2001 From: gelbeinhalb Date: Fri, 28 Nov 2025 14:44:24 +0100 Subject: [PATCH 20/21] add create game button --- .../views/main_menu/game_history_view.dart | 115 +++++++++++------- 1 file changed, 73 insertions(+), 42 deletions(-) diff --git a/lib/presentation/views/main_menu/game_history_view.dart b/lib/presentation/views/main_menu/game_history_view.dart index b5d894d..5689c7b 100644 --- a/lib/presentation/views/main_menu/game_history_view.dart +++ b/lib/presentation/views/main_menu/game_history_view.dart @@ -1,11 +1,14 @@ import 'package:flutter/material.dart'; +import 'package:game_tracker/core/custom_theme.dart'; import 'package:game_tracker/data/db/database.dart'; import 'package:game_tracker/data/dto/game.dart'; import 'package:game_tracker/data/dto/group.dart'; import 'package:game_tracker/data/dto/player.dart'; +import 'package:game_tracker/presentation/views/main_menu/create_group_view.dart'; import 'package:game_tracker/presentation/widgets/tiles/game_history_tile.dart'; import 'package:game_tracker/presentation/widgets/top_centered_message.dart'; -import 'package:game_tracker/presentation/widgets/app_skeleton.dart'; // Add this import +import 'package:game_tracker/presentation/widgets/app_skeleton.dart'; +import 'package:game_tracker/presentation/widgets/buttons/custom_width_button.dart'; import 'package:provider/provider.dart'; class GameHistoryView extends StatefulWidget { @@ -57,51 +60,79 @@ class _GameHistoryViewState extends State { @override Widget build(BuildContext context) { - return FutureBuilder>( - future: _gameListFuture, - builder: (BuildContext context, AsyncSnapshot> snapshot) { - if (snapshot.hasError) { - return const Center( - child: TopCenteredMessage( - icon: Icons.report, - title: 'Error', - message: 'Game data could not be loaded', - ), - ); - } - if (snapshot.connectionState == ConnectionState.done && - (!snapshot.hasData || snapshot.data!.isEmpty)) { - return const Center( - child: TopCenteredMessage( - icon: Icons.report, - title: 'Error', - message: 'No Games Available', - ), - ); - } - - final List games = (isLoading - ? skeletonData - : (snapshot.data ?? []) - ..sort((a, b) => b.createdAt.compareTo(a.createdAt))) - .toList(); - - return AppSkeleton( - enabled: isLoading, - child: ListView.builder( - padding: const EdgeInsets.only(bottom: 85), - itemCount: games.length + 1, - itemBuilder: (BuildContext context, int index) { - if (index == games.length) { - return SizedBox( - height: MediaQuery.paddingOf(context).bottom - 80, + return Scaffold( + backgroundColor: CustomTheme.backgroundColor, + body: Stack( + alignment: Alignment.center, + children: [ + FutureBuilder>( + future: _gameListFuture, + builder: (BuildContext context, AsyncSnapshot> snapshot) { + if (snapshot.hasError) { + return const Center( + child: TopCenteredMessage( + icon: Icons.report, + title: 'Error', + message: 'Game data could not be loaded', + ), ); } - return GameHistoryTile(game: games[index]); + if (snapshot.connectionState == ConnectionState.done && + (!snapshot.hasData || snapshot.data!.isEmpty)) { + return const Center( + child: TopCenteredMessage( + icon: Icons.report, + title: 'Error', + message: 'No Games Available', + ), + ); + } + + final List games = (isLoading + ? skeletonData + : (snapshot.data ?? []) + ..sort((a, b) => b.createdAt.compareTo(a.createdAt))) + .toList(); + + return AppSkeleton( + enabled: isLoading, + child: ListView.builder( + padding: const EdgeInsets.only(bottom: 85), + itemCount: games.length + 1, + itemBuilder: (BuildContext context, int index) { + if (index == games.length) { + return SizedBox( + height: MediaQuery.paddingOf(context).bottom - 80, + ); + } + return GameHistoryTile(game: games[index]); // Placeholder + }, + ), + ); }, ), - ); - }, + Positioned( + bottom: MediaQuery.paddingOf(context).bottom, + child: CustomWidthButton( + text: 'Create Game', + sizeRelativeToWidth: 0.90, + onPressed: () async { + await Navigator.push( + context, + MaterialPageRoute( + builder: (context) { + return const CreateGroupView(); + }, + ), + ); + setState(() { + _gameListFuture = db.gameDao.getAllGames(); + }); + }, + ), + ), + ], + ), ); } } \ No newline at end of file From 5ce4964c32b5a1231ab4c2784b938713eef7390a Mon Sep 17 00:00:00 2001 From: gelbeinhalb Date: Sat, 29 Nov 2025 20:04:49 +0100 Subject: [PATCH 21/21] deleted double_row_info_tile --- .../widgets/tiles/double_row_info_tile.dart | 71 ------------------- 1 file changed, 71 deletions(-) delete mode 100644 lib/presentation/widgets/tiles/double_row_info_tile.dart diff --git a/lib/presentation/widgets/tiles/double_row_info_tile.dart b/lib/presentation/widgets/tiles/double_row_info_tile.dart deleted file mode 100644 index 57404ff..0000000 --- a/lib/presentation/widgets/tiles/double_row_info_tile.dart +++ /dev/null @@ -1,71 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:game_tracker/core/custom_theme.dart'; - -Widget doubleRowInfoTile( - String titleOneUpperLeft, - String titleTwoUpperLeft, - String titleUpperRight, - String titleLowerLeft, - String titleLowerRight, -) { - return Container( - margin: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), - padding: const EdgeInsets.all(10), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: CustomTheme.secondaryColor, - ), - child: Column( - children: [ - Row( - children: [ - Expanded( - flex: 10, - child: Text( - '$titleOneUpperLeft $titleTwoUpperLeft', - style: const TextStyle(fontSize: 20), - overflow: TextOverflow.ellipsis, - maxLines: 1, - ), - ), - const Spacer(), - Expanded( - flex: 3, - child: Text( - titleUpperRight, - style: const TextStyle(fontSize: 20), - overflow: TextOverflow.ellipsis, - maxLines: 1, - textAlign: TextAlign.end, - ), - ), - ], - ), - Row( - children: [ - Expanded( - flex: 10, - child: Text( - titleLowerLeft, - style: const TextStyle(fontSize: 20), - overflow: TextOverflow.ellipsis, - maxLines: 1, - ), - ), - const Spacer(), - Expanded( - flex: 4, - child: Text( - titleLowerRight, - style: const TextStyle(fontSize: 20), - overflow: TextOverflow.ellipsis, - maxLines: 1, - textAlign: TextAlign.end, - ), - ), - ], - ), - ], - ), - ); -}