diff --git a/lib/l10n/arb/app_de.arb b/lib/l10n/arb/app_de.arb index 5032baf..c5fae28 100644 --- a/lib/l10n/arb/app_de.arb +++ b/lib/l10n/arb/app_de.arb @@ -58,9 +58,9 @@ "no_name_message": "Jeder Spieler muss einen Namen haben.", "select_game_mode": "Spielmodus auswählen", - "no_mode_selected": "Kein Modus", - "no_default_mode": "Kein Standard-Modus", - "no_default_description": "Der Standard-Modus wird zurückgesetzt.", + "no_mode_selected": "Wähle einen Spielmodus", + "no_default_mode": "Kein Modus", + "no_default_description": "Entscheide bei jedem Spiel selber, welchen Modus du spielen möchtest.", "point_limit_description": "Es wird so lange gespielt, bis ein:e Spieler:in mehr als {pointLimit} Punkte erreicht", "@point_limit_description": { "placeholders": { diff --git a/lib/l10n/generated/app_localizations.dart b/lib/l10n/generated/app_localizations.dart index 40d8c65..d821b28 100644 --- a/lib/l10n/generated/app_localizations.dart +++ b/lib/l10n/generated/app_localizations.dart @@ -377,19 +377,19 @@ abstract class AppLocalizations { /// No description provided for @no_mode_selected. /// /// In de, this message translates to: - /// **'Kein Modus'** + /// **'Wähle einen Spielmodus'** String get no_mode_selected; /// No description provided for @no_default_mode. /// /// In de, this message translates to: - /// **'Kein Standard-Modus'** + /// **'Kein Modus'** String get no_default_mode; /// No description provided for @no_default_description. /// /// In de, this message translates to: - /// **'Der Standard-Modus wird zurückgesetzt.'** + /// **'Entscheide bei jedem Spiel selber, welchen Modus du spielen möchtest.'** String get no_default_description; /// No description provided for @point_limit_description. diff --git a/lib/l10n/generated/app_localizations_de.dart b/lib/l10n/generated/app_localizations_de.dart index b73ccba..13dcf2a 100644 --- a/lib/l10n/generated/app_localizations_de.dart +++ b/lib/l10n/generated/app_localizations_de.dart @@ -155,13 +155,14 @@ class AppLocalizationsDe extends AppLocalizations { String get select_game_mode => 'Spielmodus auswählen'; @override - String get no_mode_selected => 'Kein Modus'; + String get no_mode_selected => 'Wähle einen Spielmodus'; @override - String get no_default_mode => 'Kein Standard-Modus'; + String get no_default_mode => 'Kein Modus'; @override - String get no_default_description => 'Der Standard-Modus wird zurückgesetzt.'; + String get no_default_description => + 'Entscheide bei jedem Spiel selber, welchen Modus du spielen möchtest.'; @override String point_limit_description(int pointLimit) { diff --git a/lib/presentation/views/active_game_view.dart b/lib/presentation/views/active_game_view.dart index defe5fc..dece0a6 100644 --- a/lib/presentation/views/active_game_view.dart +++ b/lib/presentation/views/active_game_view.dart @@ -4,6 +4,7 @@ import 'package:cabo_counter/data/game_session.dart'; import 'package:cabo_counter/l10n/generated/app_localizations.dart'; import 'package:cabo_counter/presentation/views/create_game_view.dart'; import 'package:cabo_counter/presentation/views/graph_view.dart'; +import 'package:cabo_counter/presentation/views/mode_selection_view.dart'; import 'package:cabo_counter/presentation/views/points_view.dart'; import 'package:cabo_counter/presentation/views/round_view.dart'; import 'package:cabo_counter/services/local_storage_service.dart'; @@ -205,9 +206,11 @@ class _ActiveGameViewState extends State { CupertinoPageRoute( builder: (_) => CreateGameView( gameTitle: gameSession.gameTitle, - isPointsLimitEnabled: widget - .gameSession - .isPointsLimitEnabled, + gameMode: widget.gameSession + .isPointsLimitEnabled == + true + ? GameMode.pointLimit + : GameMode.unlimited, players: gameSession.players, ))); }, diff --git a/lib/presentation/views/create_game_view.dart b/lib/presentation/views/create_game_view.dart index 2634788..e0b4198 100644 --- a/lib/presentation/views/create_game_view.dart +++ b/lib/presentation/views/create_game_view.dart @@ -16,15 +16,15 @@ enum CreateStatus { } class CreateGameView extends StatefulWidget { + final GameMode gameMode; final String? gameTitle; - final bool? isPointsLimitEnabled; final List? players; const CreateGameView({ super.key, this.gameTitle, - this.isPointsLimitEnabled, this.players, + required this.gameMode, }); @override @@ -42,19 +42,14 @@ class _CreateGameViewState extends State { /// Maximum number of players allowed in the game. final int maxPlayers = 5; - /// Variable to store whether the points limit feature is enabled. - bool? _isPointsLimitEnabled; + /// Variable to hold the selected game mode. + late GameMode gameMode; @override void initState() { super.initState(); - if (widget.isPointsLimitEnabled == null) { - _isPointsLimitEnabled = - ConfigService.gameMode == -1 ? null : ConfigService.gameMode == 1; - } else { - _isPointsLimitEnabled = widget.isPointsLimitEnabled; - } + gameMode = widget.gameMode; _gameTitleTextController.text = widget.gameTitle ?? ''; @@ -106,10 +101,10 @@ class _CreateGameViewState extends State { suffix: Row( children: [ Text( - _isPointsLimitEnabled == null - ? AppLocalizations.of(context).select_mode - : (_isPointsLimitEnabled! - ? '${ConfigService.pointLimit} ${AppLocalizations.of(context).points}' + gameMode == GameMode.none + ? AppLocalizations.of(context).no_mode_selected + : (gameMode == GameMode.pointLimit + ? '${ConfigService.getPointLimit()} ${AppLocalizations.of(context).points}' : AppLocalizations.of(context).unlimited), ), const SizedBox(width: 3), @@ -121,29 +116,15 @@ class _CreateGameViewState extends State { context, CupertinoPageRoute( builder: (context) => ModeSelectionMenu( - pointLimit: ConfigService.pointLimit, + pointLimit: ConfigService.getPointLimit(), showDeselection: false, ), ), ); - switch (selectedMode) { - case GameMode.pointLimit: - setState(() { - _isPointsLimitEnabled = true; - }); - break; - case GameMode.unlimited: - setState(() { - _isPointsLimitEnabled = false; - }); - break; - case GameMode.none: - default: - setState(() { - _isPointsLimitEnabled = null; - }); - } + setState(() { + gameMode = selectedMode ?? gameMode; + }); }, ), ), @@ -249,7 +230,7 @@ class _CreateGameViewState extends State { showFeedbackDialog(CreateStatus.noGameTitle); return; } - if (_isPointsLimitEnabled == null) { + if (gameMode == GameMode.none) { showFeedbackDialog(CreateStatus.noModeSelected); return; } @@ -266,13 +247,16 @@ class _CreateGameViewState extends State { for (var controller in _playerNameTextControllers) { players.add(controller.text); } + + bool isPointsLimitEnabled = gameMode == GameMode.pointLimit; + GameSession gameSession = GameSession( createdAt: DateTime.now(), gameTitle: _gameTitleTextController.text, players: players, - pointLimit: ConfigService.pointLimit, - caboPenalty: ConfigService.caboPenalty, - isPointsLimitEnabled: _isPointsLimitEnabled!, + pointLimit: ConfigService.getPointLimit(), + caboPenalty: ConfigService.getCaboPenalty(), + isPointsLimitEnabled: isPointsLimitEnabled, ); final index = await gameManager.addGameSession(gameSession); final session = gameManager.gameList[index]; diff --git a/lib/presentation/views/main_menu_view.dart b/lib/presentation/views/main_menu_view.dart index a80664d..f8817a0 100644 --- a/lib/presentation/views/main_menu_view.dart +++ b/lib/presentation/views/main_menu_view.dart @@ -77,7 +77,8 @@ class _MainMenuViewState extends State { onPressed: () => Navigator.push( context, CupertinoPageRoute( - builder: (context) => const CreateGameView(), + builder: (context) => CreateGameView( + gameMode: ConfigService.getGameMode()), ), ), icon: const Icon(CupertinoIcons.add)), @@ -96,8 +97,8 @@ class _MainMenuViewState extends State { onTap: () => Navigator.push( context, CupertinoPageRoute( - builder: (context) => - const CreateGameView(), + builder: (context) => CreateGameView( + gameMode: ConfigService.getGameMode()), ), ), child: Icon( @@ -216,9 +217,9 @@ class _MainMenuViewState extends State { /// 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 '${ConfigService.pointLimit} ${AppLocalizations.of(context).points}'; + String _translateGameMode(bool isPointLimitEnabled) { + if (isPointLimitEnabled) { + return '${ConfigService.getPointLimit()} ${AppLocalizations.of(context).points}'; } return AppLocalizations.of(context).unlimited; } diff --git a/lib/presentation/views/settings_view.dart b/lib/presentation/views/settings_view.dart index 596866d..aa49872 100644 --- a/lib/presentation/views/settings_view.dart +++ b/lib/presentation/views/settings_view.dart @@ -21,7 +21,7 @@ class SettingsView extends StatefulWidget { class _SettingsViewState extends State { UniqueKey _stepperKey1 = UniqueKey(); UniqueKey _stepperKey2 = UniqueKey(); - int defaultMode = ConfigService.gameMode; + GameMode defaultMode = ConfigService.getGameMode(); @override void initState() { super.initState(); @@ -57,7 +57,7 @@ class _SettingsViewState extends State { prefixIcon: CupertinoIcons.bolt_fill, suffixWidget: CustomStepper( key: _stepperKey1, - initialValue: ConfigService.caboPenalty, + initialValue: ConfigService.getCaboPenalty(), minValue: 0, maxValue: 50, step: 1, @@ -73,7 +73,7 @@ class _SettingsViewState extends State { prefixIcon: FontAwesomeIcons.bullseye, suffixWidget: CustomStepper( key: _stepperKey2, - initialValue: ConfigService.pointLimit, + initialValue: ConfigService.getPointLimit(), minValue: 30, maxValue: 1000, step: 10, @@ -91,11 +91,10 @@ class _SettingsViewState extends State { mainAxisAlignment: MainAxisAlignment.end, children: [ Text( - defaultMode == -1 - ? AppLocalizations.of(context) - .no_mode_selected - : (defaultMode == 1 - ? '${ConfigService.pointLimit} ${AppLocalizations.of(context).points}' + defaultMode == GameMode.none + ? AppLocalizations.of(context).no_default_mode + : (defaultMode == GameMode.pointLimit + ? '${ConfigService.getPointLimit()} ${AppLocalizations.of(context).points}' : AppLocalizations.of(context).unlimited), ), const SizedBox(width: 5), @@ -107,29 +106,15 @@ class _SettingsViewState extends State { context, CupertinoPageRoute( builder: (context) => ModeSelectionMenu( - pointLimit: ConfigService.pointLimit, + pointLimit: ConfigService.getPointLimit(), showDeselection: true, ), ), ); - switch (selectedMode) { - case GameMode.pointLimit: - setState(() { - defaultMode = 1; - }); - break; - case GameMode.unlimited: - setState(() { - defaultMode = 0; - }); - break; - case GameMode.none: - default: - setState(() { - defaultMode = -1; - }); - } + setState(() { + defaultMode = selectedMode ?? GameMode.none; + }); ConfigService.setGameMode(defaultMode); }, ), @@ -142,7 +127,7 @@ class _SettingsViewState extends State { setState(() { _stepperKey1 = UniqueKey(); _stepperKey2 = UniqueKey(); - defaultMode = ConfigService.gameMode; + defaultMode = ConfigService.getGameMode(); }); }, ) diff --git a/lib/services/config_service.dart b/lib/services/config_service.dart index a360fe4..1b20ad5 100644 --- a/lib/services/config_service.dart +++ b/lib/services/config_service.dart @@ -1,3 +1,4 @@ +import 'package:cabo_counter/presentation/views/mode_selection_view.dart'; import 'package:shared_preferences/shared_preferences.dart'; /// This class handles the configuration settings for the app. @@ -8,9 +9,9 @@ class ConfigService { static const String _keyCaboPenalty = 'caboPenalty'; static const String _keyGameMode = 'gameMode'; // Actual values used in the app - static int pointLimit = 100; - static int caboPenalty = 5; - static int gameMode = -1; + static int _pointLimit = 100; + static int _caboPenalty = 5; + static int _gameMode = -1; // Default values static const int _defaultPointLimit = 100; static const int _defaultCaboPenalty = 5; @@ -21,43 +22,86 @@ class ConfigService { // Initialize pointLimit, caboPenalty, and gameMode from SharedPreferences // If they are not set, use the default values - pointLimit = prefs.getInt(_keyPointLimit) ?? _defaultPointLimit; - caboPenalty = prefs.getInt(_keyCaboPenalty) ?? _defaultCaboPenalty; - gameMode = prefs.getInt(_keyGameMode) ?? _defaultGameMode; + _pointLimit = prefs.getInt(_keyPointLimit) ?? _defaultPointLimit; + _caboPenalty = prefs.getInt(_keyCaboPenalty) ?? _defaultCaboPenalty; + _gameMode = prefs.getInt(_keyGameMode) ?? _defaultGameMode; // Save the initial values to SharedPreferences - prefs.setInt(_keyPointLimit, pointLimit); - prefs.setInt(_keyCaboPenalty, caboPenalty); - prefs.setInt(_keyGameMode, gameMode); + prefs.setInt(_keyPointLimit, _pointLimit); + prefs.setInt(_keyCaboPenalty, _caboPenalty); + prefs.setInt(_keyGameMode, _gameMode); } - static Future setGameMode(int newGameMode) async { - final prefs = await SharedPreferences.getInstance(); - await prefs.setInt(_keyGameMode, newGameMode); - gameMode = newGameMode; + /// Retrieves the current game mode. + /// + /// The game mode is determined based on the stored integer value: + /// - `0`: [GameMode.pointLimit] + /// - `1`: [GameMode.unlimited] + /// - Any other value: [GameMode.none] (-1 is used as a default for no mode) + /// + /// Returns the corresponding [GameMode] enum value. + static GameMode getGameMode() { + switch (_gameMode) { + case 0: + return GameMode.pointLimit; + case 1: + return GameMode.unlimited; + default: + return GameMode.none; + } } + /// Sets the game mode for the application. + /// + /// [newGameMode] is the new game mode to be set. It can be one of the following: + /// - `GameMode.pointLimit`: The game ends when a pleayer reaches the point limit. + /// - `GameMode.unlimited`: Every game goes for infinity until you end it. + /// - `GameMode.none`: No default mode set. + /// + /// This method updates the `_gameMode` field and persists the value in `SharedPreferences`. + static Future setGameMode(GameMode newGameMode) async { + int gameMode; + switch (newGameMode) { + case GameMode.pointLimit: + gameMode = 0; + break; + case GameMode.unlimited: + gameMode = 1; + break; + default: + gameMode = -1; + } + + final prefs = await SharedPreferences.getInstance(); + await prefs.setInt(_keyGameMode, gameMode); + _gameMode = gameMode; + } + + static int getPointLimit() => _pointLimit; + /// Setter for the point limit. /// [newPointLimit] is the new point limit to be set. static Future setPointLimit(int newPointLimit) async { final prefs = await SharedPreferences.getInstance(); await prefs.setInt(_keyPointLimit, newPointLimit); - pointLimit = newPointLimit; + _pointLimit = newPointLimit; } + static int getCaboPenalty() => _caboPenalty; + /// Setter for the cabo penalty. /// [newCaboPenalty] is the new cabo penalty to be set. static Future setCaboPenalty(int newCaboPenalty) async { final prefs = await SharedPreferences.getInstance(); await prefs.setInt(_keyCaboPenalty, newCaboPenalty); - caboPenalty = newCaboPenalty; + _caboPenalty = newCaboPenalty; } /// Resets the configuration to default values. static Future resetConfig() async { - ConfigService.pointLimit = _defaultPointLimit; - ConfigService.caboPenalty = _defaultCaboPenalty; - ConfigService.gameMode = _defaultGameMode; + ConfigService._pointLimit = _defaultPointLimit; + ConfigService._caboPenalty = _defaultCaboPenalty; + ConfigService._gameMode = _defaultGameMode; final prefs = await SharedPreferences.getInstance(); await prefs.setInt(_keyPointLimit, _defaultPointLimit); await prefs.setInt(_keyCaboPenalty, _defaultCaboPenalty); diff --git a/pubspec.yaml b/pubspec.yaml index 3861d64..e445bd6 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.5.0+542 +version: 0.5.0+544 environment: sdk: ^3.5.4