Skip to content
Snippets Groups Projects
Commit a9103e41 authored by Benoît Harrault's avatar Benoît Harrault
Browse files

Merge branch '27-normalize-activity-application-architecture' into 'master'

Resolve "Normalize Activity application architecture"

Closes #27

See merge request !26
parents 9a00a297 fea53d84
No related branches found
No related tags found
1 merge request!26Resolve "Normalize Activity application architecture"
Pipeline #6787 passed
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
import 'package:reversi/models/game/game_board.dart'; import 'package:reversi/models/activity/game_board.dart';
/// A model representing the state of a game of reversi. It's a board and the /// A model representing the state of a game of reversi. It's a board and the
/// player who's next to go, essentially. /// player who's next to go, essentially.
......
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:reversi/config/default_game_settings.dart'; import 'package:reversi/config/default_activity_settings.dart';
class GameSettings { class ActivitySettings {
final String itemsCount; final String itemsCount;
final String timerValue; final String timerValue;
GameSettings({ ActivitySettings({
required this.itemsCount, required this.itemsCount,
required this.timerValue, required this.timerValue,
}); });
...@@ -16,44 +16,44 @@ class GameSettings { ...@@ -16,44 +16,44 @@ class GameSettings {
int get timerCountValue => int.parse(timerValue); int get timerCountValue => int.parse(timerValue);
static String getItemsCountValueFromUnsafe(String itemsCount) { static String getItemsCountValueFromUnsafe(String itemsCount) {
if (DefaultGameSettings.allowedGameModeValues.contains(itemsCount)) { if (DefaultActivitySettings.allowedGameModeValues.contains(itemsCount)) {
return itemsCount; return itemsCount;
} }
return DefaultGameSettings.defaultGameModeValue; return DefaultActivitySettings.defaultGameModeValue;
} }
static String getTimerValueFromUnsafe(String timerValue) { static String getTimerValueFromUnsafe(String timerValue) {
if (DefaultGameSettings.allowedDifficultyLevelValues.contains(timerValue)) { if (DefaultActivitySettings.allowedDifficultyLevelValues.contains(timerValue)) {
return timerValue; return timerValue;
} }
return DefaultGameSettings.difficultyLevelValue; return DefaultActivitySettings.difficultyLevelValue;
} }
factory GameSettings.createDefault() { factory ActivitySettings.createDefault() {
return GameSettings( return ActivitySettings(
itemsCount: DefaultGameSettings.defaultGameModeValue, itemsCount: DefaultActivitySettings.defaultGameModeValue,
timerValue: DefaultGameSettings.difficultyLevelValue, timerValue: DefaultActivitySettings.difficultyLevelValue,
); );
} }
void dump() { void dump() {
printlog('$GameSettings:'); printlog('$ActivitySettings:');
printlog(' ${DefaultGameSettings.parameterCodeGameMode}: $itemsCount'); printlog(' ${DefaultActivitySettings.parameterCodeGameMode}: $itemsCount');
printlog(' ${DefaultGameSettings.parameterCodeDifficultyLevel}: $timerValue'); printlog(' ${DefaultActivitySettings.parameterCodeDifficultyLevel}: $timerValue');
printlog(''); printlog('');
} }
@override @override
String toString() { String toString() {
return '$GameSettings(${toJson()})'; return '$ActivitySettings(${toJson()})';
} }
Map<String, dynamic>? toJson() { Map<String, dynamic>? toJson() {
return <String, dynamic>{ return <String, dynamic>{
DefaultGameSettings.parameterCodeGameMode: itemsCount, DefaultActivitySettings.parameterCodeGameMode: itemsCount,
DefaultGameSettings.parameterCodeDifficultyLevel: timerValue, DefaultActivitySettings.parameterCodeDifficultyLevel: timerValue,
}; };
} }
} }
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:reversi/cubit/game_cubit.dart';
import 'package:reversi/models/game/game.dart';
import 'package:reversi/ui/layouts/parameters_layout.dart';
import 'package:reversi/ui/layouts/game_layout.dart';
class PageGame extends StatelessWidget {
const PageGame({super.key});
@override
Widget build(BuildContext context) {
return BlocBuilder<GameCubit, GameState>(
builder: (BuildContext context, GameState gameState) {
final Game currentGame = gameState.currentGame;
return currentGame.isRunning
? const GameLayout()
: ParametersLayout(canResume: currentGame.canBeResumed);
},
);
}
}
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:reversi/config/menu.dart'; import 'package:reversi/common/config/activity_page.dart';
import 'package:reversi/cubit/nav_cubit.dart'; import 'package:reversi/common/config/screen.dart';
import 'package:reversi/ui/widgets/global_app_bar.dart'; import 'package:reversi/common/cubit/nav/nav_cubit_screens.dart';
import 'package:reversi/common/ui/nav/global_app_bar.dart';
import 'package:reversi/common/ui/nav/bottom_nav_bar.dart';
class SkeletonScreen extends StatelessWidget { class SkeletonScreen extends StatelessWidget {
const SkeletonScreen({super.key}); const SkeletonScreen({super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BlocBuilder<NavCubitScreen, int>(
builder: (BuildContext context, int screenIndex) {
return Scaffold( return Scaffold(
appBar: const GlobalAppBar(), appBar: const GlobalAppBar(),
extendBodyBehindAppBar: false, extendBodyBehindAppBar: false,
body: Material( body: Material(
color: Theme.of(context).colorScheme.surface, color: Theme.of(context).colorScheme.surface,
child: BlocBuilder<NavCubit, int>( child: Padding(
builder: (BuildContext context, int pageIndex) {
return Padding(
padding: const EdgeInsets.only( padding: const EdgeInsets.only(
top: 8, top: 8,
left: 2, left: 2,
right: 2, right: 2,
), ),
child: Menu.getPageWidget(pageIndex), child: Screen.getWidget(screenIndex),
);
},
), ),
), ),
backgroundColor: Theme.of(context).colorScheme.surface, backgroundColor: Theme.of(context).colorScheme.surface,
bottomNavigationBar: ActivityPage.displayBottomNavBar ? const BottomNavBar() : null,
);
},
); );
} }
} }
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:reversi/cubit/game_cubit.dart'; import 'package:reversi/cubit/activity/activity_cubit.dart';
class DeleteSavedGameButton extends StatelessWidget { class DeleteSavedGameButton extends StatelessWidget {
const DeleteSavedGameButton({super.key}); const DeleteSavedGameButton({super.key});
...@@ -11,7 +11,7 @@ class DeleteSavedGameButton extends StatelessWidget { ...@@ -11,7 +11,7 @@ class DeleteSavedGameButton extends StatelessWidget {
return StyledButton( return StyledButton(
color: Colors.grey, color: Colors.grey,
onPressed: () { onPressed: () {
BlocProvider.of<GameCubit>(context).deleteSavedGame(); BlocProvider.of<ActivityCubit>(context).deleteSavedActivity();
}, },
child: const Image( child: const Image(
image: AssetImage('assets/ui/button_delete_saved_game.png'), image: AssetImage('assets/ui/button_delete_saved_game.png'),
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:reversi/cubit/game_cubit.dart'; import 'package:reversi/common/cubit/nav/nav_cubit_pages.dart';
import 'package:reversi/cubit/activity/activity_cubit.dart';
class QuitGameButton extends StatelessWidget { class QuitGameButton extends StatelessWidget {
const QuitGameButton({super.key}); const QuitGameButton({super.key});
...@@ -11,7 +13,8 @@ class QuitGameButton extends StatelessWidget { ...@@ -11,7 +13,8 @@ class QuitGameButton extends StatelessWidget {
return StyledButton( return StyledButton(
color: Colors.red, color: Colors.red,
onPressed: () { onPressed: () {
BlocProvider.of<GameCubit>(context).quitGame(); BlocProvider.of<ActivityCubit>(context).quitActivity();
BlocProvider.of<NavCubitPage>(context).goToPageHome();
}, },
child: const Image( child: const Image(
image: AssetImage('assets/ui/button_back.png'), image: AssetImage('assets/ui/button_back.png'),
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:reversi/cubit/game_cubit.dart'; import 'package:reversi/common/cubit/nav/nav_cubit_pages.dart';
import 'package:reversi/cubit/settings_game_cubit.dart';
import 'package:reversi/cubit/settings_global_cubit.dart'; import 'package:reversi/cubit/activity/activity_cubit.dart';
import 'package:reversi/cubit/settings/settings_activity_cubit.dart';
import 'package:reversi/cubit/settings/settings_global_cubit.dart';
class StartNewGameButton extends StatelessWidget { class StartNewGameButton extends StatelessWidget {
const StartNewGameButton({super.key}); const StartNewGameButton({super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BlocBuilder<GameSettingsCubit, GameSettingsState>( return BlocBuilder<ActivitySettingsCubit, ActivitySettingsState>(
builder: (BuildContext context, GameSettingsState gameSettingsState) { builder: (BuildContext context, ActivitySettingsState activitySettingsState) {
return BlocBuilder<GlobalSettingsCubit, GlobalSettingsState>( return BlocBuilder<GlobalSettingsCubit, GlobalSettingsState>(
builder: (BuildContext context, GlobalSettingsState globalSettingsState) { builder: (BuildContext context, GlobalSettingsState globalSettingsState) {
return StyledButton( return StyledButton(
color: Colors.blue, color: Colors.blue,
onPressed: () { onPressed: () {
BlocProvider.of<GameCubit>(context).startNewGame( BlocProvider.of<ActivityCubit>(context).startNewActivity(
gameSettings: gameSettingsState.settings, activitySettings: activitySettingsState.settings,
globalSettings: globalSettingsState.settings, globalSettings: globalSettingsState.settings,
); );
BlocProvider.of<NavCubitPage>(context).goToPageGame();
}, },
child: const Image( child: const Image(
image: AssetImage('assets/ui/button_start.png'), image: AssetImage('assets/ui/button_start.png'),
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:reversi/cubit/game_cubit.dart'; import 'package:reversi/common/cubit/nav/nav_cubit_pages.dart';
import 'package:reversi/cubit/activity/activity_cubit.dart';
class ResumeSavedGameButton extends StatelessWidget { class ResumeSavedGameButton extends StatelessWidget {
const ResumeSavedGameButton({super.key}); const ResumeSavedGameButton({super.key});
...@@ -11,7 +13,8 @@ class ResumeSavedGameButton extends StatelessWidget { ...@@ -11,7 +13,8 @@ class ResumeSavedGameButton extends StatelessWidget {
return StyledButton( return StyledButton(
color: Colors.blue, color: Colors.blue,
onPressed: () { onPressed: () {
BlocProvider.of<GameCubit>(context).resumeSavedGame(); BlocProvider.of<ActivityCubit>(context).resumeSavedActivity();
BlocProvider.of<NavCubitPage>(context).goToPageGame();
}, },
child: const Image( child: const Image(
image: AssetImage('assets/ui/button_resume_game.png'), image: AssetImage('assets/ui/button_resume_game.png'),
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:reversi/cubit/game_cubit.dart';
import 'package:reversi/game/game_engine.dart'; import 'package:reversi/game/game_engine.dart';
import 'package:reversi/models/game/game.dart';
class GameBoardWidget extends StatelessWidget { class GameBoardWidget extends StatelessWidget {
const GameBoardWidget({super.key}); const GameBoardWidget({super.key});
...@@ -11,14 +8,7 @@ class GameBoardWidget extends StatelessWidget { ...@@ -11,14 +8,7 @@ class GameBoardWidget extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Center( return Center(
child: BlocBuilder<GameCubit, GameState>( child: const GameEngine(),
builder: (BuildContext context, GameState gameState) {
final Game currentGame = gameState.currentGame;
printlog(currentGame.toString());
return const GameEngine();
},
),
); );
} }
} }
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:reversi/models/game/game_board.dart'; import 'package:reversi/models/activity/game_board.dart';
import 'package:reversi/models/game/game_model.dart'; import 'package:reversi/models/activity/game_model.dart';
import 'package:reversi/config/styling.dart'; import 'package:reversi/config/styling.dart';
class GameBoardDisplay extends StatelessWidget { class GameBoardDisplay extends StatelessWidget {
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:reversi/models/game/game_board.dart'; import 'package:reversi/models/activity/game_board.dart';
import 'package:reversi/models/game/game_model.dart'; import 'package:reversi/models/activity/game_model.dart';
import 'package:reversi/config/styling.dart'; import 'package:reversi/config/styling.dart';
class ScoreBox extends StatelessWidget { class ScoreBox extends StatelessWidget {
......
...@@ -245,10 +245,10 @@ packages: ...@@ -245,10 +245,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: path_provider name: path_provider
sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378 sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.4" version: "2.1.5"
path_provider_android: path_provider_android:
dependency: transitive dependency: transitive
description: description:
...@@ -442,10 +442,10 @@ packages: ...@@ -442,10 +442,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: win32 name: win32
sha256: "2735daae5150e8b1dfeb3eb0544b4d3af0061e9e82cef063adcd583bdae4306a" sha256: "10169d3934549017f0ae278ccb07f828f9d6ea21573bab0fb77b0e1ef0fce454"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.7.0" version: "5.7.2"
xdg_directories: xdg_directories:
dependency: transitive dependency: transitive
description: description:
......
...@@ -3,7 +3,7 @@ description: A reversi game application. ...@@ -3,7 +3,7 @@ description: A reversi game application.
publish_to: "none" publish_to: "none"
version: 0.2.1+22 version: 0.3.0+23
environment: environment:
sdk: "^3.0.0" sdk: "^3.0.0"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment