diff --git a/.gitignore b/.gitignore index 50aec09..09b5d34 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,3 @@ -increment_build_number.sh - # Do not remove or rename entries in this file, only add new ones # See https://github.com/flutter/flutter/issues/128635 for more context. diff --git a/increment_build_number.sh b/increment_build_number.sh new file mode 100644 index 0000000..7d209bc --- /dev/null +++ b/increment_build_number.sh @@ -0,0 +1,2 @@ +build_number=$(awk -F'+' '/version:/ {print $2}' pubspec.yaml); build_number=${build_number:-0}; +sed -i '' -E "s/(version: [0-9]+\.[0-9]+\.[0-9]\+)[0-9]*/\1$((build_number + 1))/" pubspec.yaml \ No newline at end of file diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 138b281..804f441 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -215,7 +215,7 @@ isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = YES; - LastUpgradeCheck = 1620; + LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; TargetAttributes = { 331C8080294A63A400263BE5 = { diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 51c28c5..fa4cdb6 100644 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ deleteAllGames() async { + try { + Globals.gameList.clear(); + await saveGameSessions(); + logger.i('Alle Runden wurden erfolgreich gelöscht.'); + return true; + } catch (e) { + logger.e('Fehler beim Löschen aller Runden: $e', + error: 'Löschen fehlgeschlagen'); + return false; + } + } } diff --git a/lib/views/create_game_view.dart b/lib/views/create_game_view.dart index 9150a22..7bbeefa 100644 --- a/lib/views/create_game_view.dart +++ b/lib/views/create_game_view.dart @@ -289,7 +289,9 @@ class _CreateGameState extends State { caboPenalty: Globals.caboPenalty, isPointsLimitEnabled: selectedMode!, ); - Globals.addGameSession(gameSession); + setState(() { + Globals.addGameSession(gameSession); + }); LocalStorageService.saveGameSessions(); if (context.mounted) { Navigator.pushReplacement( diff --git a/lib/views/main_menu_view.dart b/lib/views/main_menu_view.dart index e5a1039..fabd02d 100644 --- a/lib/views/main_menu_view.dart +++ b/lib/views/main_menu_view.dart @@ -45,20 +45,17 @@ class _MainMenuViewState extends State { ), ); }, - icon: const Icon( - CupertinoIcons.settings, - size: 30, - )), + icon: const Icon(CupertinoIcons.settings, size: 30)), middle: const Text('Cabo Counter'), trailing: IconButton( - onPressed: () { - Navigator.push( - context, - CupertinoPageRoute( - builder: (context) => const CreateGame(), - ), - ); - }, + onPressed: () => { + Navigator.push( + context, + CupertinoPageRoute( + builder: (context) => const CreateGame(), + ), + ) + }, icon: const Icon(CupertinoIcons.add)), ), child: CupertinoPageScaffold( @@ -95,7 +92,30 @@ class _MainMenuViewState extends State { itemCount: Globals.gameList.length, itemBuilder: (context, index) { final session = Globals.gameList[index]; - return Padding( + return Dismissible( + key: Key(session.gameTitle), + background: Container( + color: CupertinoColors.destructiveRed, + alignment: Alignment.centerLeft, + padding: const EdgeInsets.only(left: 20.0), + child: const Icon( + CupertinoIcons.delete, + color: CupertinoColors.white, + ), + ), + direction: DismissDirection.startToEnd, + confirmDismiss: (direction) async { + final String gameTitle = + Globals.gameList[index].gameTitle; + return await _showDeleteGamePopup(gameTitle); + }, + onDismissed: (direction) { + _deleteSpecificGame(index); + }, + dismissThresholds: const { + DismissDirection.startToEnd: 0.6 + }, + child: Padding( padding: const EdgeInsets.symmetric(vertical: 10.0), child: CupertinoListTile( title: Text(session.gameTitle), @@ -131,15 +151,60 @@ class _MainMenuViewState extends State { ); setState(() {}); }, - )); - }), + ), + ), + ); + }, + ), ), ), ); } + /// Translates the game mode boolean into the corresponding String. + /// If [pointLimit] is true, it returns '101 Punkte', otherwise it returns 'Unbegrenzt'. String _translateGameMode(bool pointLimit) { if (pointLimit) return '101 Punkte'; return 'Unbegrenzt'; } + + /// Shows a confirmation dialog to delete all game sessions. + /// Returns true if the user confirms the deletion, false otherwise. + /// + Future _showDeleteGamePopup(String gameTitle) async { + bool? shouldDelete = await showCupertinoDialog( + context: context, + builder: (context) { + return CupertinoAlertDialog( + title: const Text('Spiel löschen?'), + content: Text( + 'Bist du sicher, dass du die Runde "$gameTitle" löschen möchtest? Diese Aktion kann nicht rückgängig gemacht werden.'), + actions: [ + CupertinoDialogAction( + onPressed: () { + Navigator.pop(context, false); + }, + child: const Text('Abbrechen'), + ), + CupertinoDialogAction( + onPressed: () { + Navigator.pop(context, true); + }, + child: const Text('Löschen'), + ), + ], + ); + }, + ) ?? + false; + return shouldDelete; + } + + /// Deletes a specific game session by its index. + /// This function takes an [index] as parameter and removes the game session at + /// that index from the global game list, + void _deleteSpecificGame(int index) { + Globals.gameList.removeAt(index); + LocalStorageService.saveGameSessions(); + } } diff --git a/pubspec.yaml b/pubspec.yaml index 1a829fa..9661bec 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,7 +2,7 @@ name: cabo_counter description: "Mobile app for the card game Cabo" publish_to: 'none' -version: 0.1.6-alpha+145 +version: 0.1.6+145 environment: sdk: ^3.5.4