diff --git a/lib/common/config/activity_page.dart b/lib/common/config/activity_page.dart index a785a6a55f1088c73811de16eaae3a6b0593834b..53c732cd094666a9a0f658f403665edc7250a21e 100644 --- a/lib/common/config/activity_page.dart +++ b/lib/common/config/activity_page.dart @@ -1,18 +1,20 @@ import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; -import 'package:hangman/common/ui/pages/game.dart'; -import 'package:hangman/common/ui/pages/parameters.dart'; +import 'package:hangman/cubit/activity/activity_cubit.dart'; +import 'package:hangman/config/application_config.dart'; +import 'package:hangman/models/activity/activity.dart'; +import 'package:hangman/ui/pages/game.dart'; class ActivityPageItem { final String code; final Icon icon; - final Widget page; + final Widget Function({required Activity currentActivity})? builder; const ActivityPageItem({ required this.code, required this.icon, - required this.page, + required this.builder, }); } @@ -20,20 +22,27 @@ class ActivityPage { static const bool displayBottomNavBar = false; static const indexHome = 0; - static const pageHome = ActivityPageItem( + static final ActivityPageItem pageHome = ActivityPageItem( code: 'page_home', icon: Icon(UniconsLine.home), - page: PageParameters(), + builder: ({required Activity currentActivity}) { + return PageParameters( + config: ApplicationConfig.config, + canBeResumed: currentActivity.canBeResumed, + ); + }, ); static const indexGame = 1; - static const pageGame = ActivityPageItem( + static final pageGame = ActivityPageItem( code: 'page_game', icon: Icon(UniconsLine.star), - page: PageGame(), + builder: ({required Activity currentActivity}) { + return PageGame(); + }, ); - static const Map<int, ActivityPageItem> items = { + static final Map<int, ActivityPageItem> items = { indexHome: pageHome, indexGame: pageGame, }; @@ -45,6 +54,16 @@ class ActivityPage { } static Widget getWidget(int pageIndex) { - return items[pageIndex]?.page ?? pageHome.page; + return BlocBuilder<ActivityCubit, ActivityState>( + builder: (BuildContext context, ActivityState activityState) { + final Activity currentActivity = activityState.currentActivity; + + if (items.keys.contains(pageIndex)) { + return items[pageIndex]?.builder!(currentActivity: currentActivity) ?? Text('oups'); + } else { + return getWidget(defaultPageIndex); + } + }, + ); } } diff --git a/lib/common/ui/pages/parameters.dart b/lib/common/ui/pages/parameters.dart deleted file mode 100644 index eac309479175628f679448011470534a67bd4949..0000000000000000000000000000000000000000 --- a/lib/common/ui/pages/parameters.dart +++ /dev/null @@ -1,171 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; - -import 'package:hangman/common/cubit/nav/nav_cubit_pages.dart'; -import 'package:hangman/common/ui/parameters/parameter_widget.dart'; - -import 'package:hangman/config/default_activity_settings.dart'; -import 'package:hangman/config/default_global_settings.dart'; -import 'package:hangman/cubit/activity/activity_cubit.dart'; -import 'package:hangman/cubit/settings/settings_activity_cubit.dart'; -import 'package:hangman/cubit/settings/settings_global_cubit.dart'; -import 'package:hangman/models/activity/activity.dart'; - -class PageParameters extends StatelessWidget { - const PageParameters({super.key}); - - final double separatorHeight = 8.0; - - @override - Widget build(BuildContext context) { - return BlocBuilder<ActivitySettingsCubit, ActivitySettingsState>( - builder: (BuildContext context, ActivitySettingsState activitySettingsState) { - return BlocBuilder<GlobalSettingsCubit, GlobalSettingsState>( - builder: (BuildContext context, GlobalSettingsState globalSettingsState) { - return BlocBuilder<ActivityCubit, ActivityState>( - builder: (BuildContext context, ActivityState activityState) { - final Activity currentActivity = activityState.currentActivity; - - final List<Widget> lines = []; - - // Activity settings - for (String code in DefaultActivitySettings.availableParameters) { - lines.add(Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: buildParametersLine( - code: code, - isGlobal: false, - ), - )); - - lines.add(SizedBox(height: separatorHeight)); - } - - lines.add(Expanded( - child: SizedBox(height: separatorHeight), - )); - - if (currentActivity.canBeResumed == false) { - // Start new activity - lines.add( - AspectRatio( - aspectRatio: 3, - child: ActivityButtonStartNew( - onPressed: () { - BlocProvider.of<ActivityCubit>(context).startNewActivity( - activitySettings: activitySettingsState.settings, - globalSettings: globalSettingsState.settings, - ); - BlocProvider.of<NavCubitPage>(context).goToPageGame(); - }, - ), - ), - ); - } else { - // Resume activity - lines.add(AspectRatio( - aspectRatio: 3, - child: ActivityButtonResumeSaved( - onPressed: () { - BlocProvider.of<ActivityCubit>(context).resumeSavedActivity(); - BlocProvider.of<NavCubitPage>(context).goToPageGame(); - }, - ), - )); - // Delete saved activity - lines.add(SizedBox.square( - dimension: MediaQuery.of(context).size.width / 5, - child: ActivityButtonDeleteSaved( - onPressed: () { - BlocProvider.of<ActivityCubit>(context).deleteSavedActivity(); - }, - ), - )); - } - - lines.add(SizedBox(height: separatorHeight)); - - // Global settings - for (String code in DefaultGlobalSettings.availableParameters) { - lines.add(Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: buildParametersLine( - code: code, - isGlobal: true, - ), - )); - - lines.add(SizedBox(height: separatorHeight)); - } - - return Column( - children: lines, - ); - }, - ); - }, - ); - }, - ); - } - - List<Widget> buildParametersLine({ - required String code, - required bool isGlobal, - }) { - final List<Widget> parameterButtons = []; - - final List<String> availableValues = isGlobal - ? DefaultGlobalSettings.getAvailableValues(code) - : DefaultActivitySettings.getAvailableValues(code); - - if (availableValues.length <= 1) { - return []; - } - - for (String value in availableValues) { - final Widget parameterButton = BlocBuilder<ActivitySettingsCubit, ActivitySettingsState>( - builder: (BuildContext context, ActivitySettingsState activitySettingsState) { - return BlocBuilder<GlobalSettingsCubit, GlobalSettingsState>( - builder: (BuildContext context, GlobalSettingsState globalSettingsState) { - final ActivitySettingsCubit activitySettingsCubit = - BlocProvider.of<ActivitySettingsCubit>(context); - final GlobalSettingsCubit globalSettingsCubit = - BlocProvider.of<GlobalSettingsCubit>(context); - - final String currentValue = isGlobal - ? globalSettingsCubit.getParameterValue(code) - : activitySettingsCubit.getParameterValue(code); - - final bool isSelected = (value == currentValue); - - final double displayWidth = MediaQuery.of(context).size.width; - final double itemWidth = displayWidth / availableValues.length - 4; - - return SizedBox.square( - dimension: itemWidth, - child: ParameterWidget( - code: code, - value: value, - isSelected: isSelected, - size: itemWidth, - activitySettings: activitySettingsState.settings, - globalSettings: globalSettingsState.settings, - onPressed: () { - isGlobal - ? globalSettingsCubit.setParameterValue(code, value) - : activitySettingsCubit.setParameterValue(code, value); - }, - ), - ); - }, - ); - }, - ); - - parameterButtons.add(parameterButton); - } - - return parameterButtons; - } -} diff --git a/lib/common/ui/parameters/parameter_painter.dart b/lib/common/ui/parameters/parameter_painter.dart deleted file mode 100644 index e396c0406af17f2688f6625d713a5ae4017ca98f..0000000000000000000000000000000000000000 --- a/lib/common/ui/parameters/parameter_painter.dart +++ /dev/null @@ -1,168 +0,0 @@ -import 'dart:math'; - -import 'package:flutter/material.dart'; -import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; - -import 'package:hangman/config/default_activity_settings.dart'; -import 'package:hangman/models/settings/settings_activity.dart'; -import 'package:hangman/models/settings/settings_global.dart'; - -class ParameterPainter extends CustomPainter { - const ParameterPainter({ - required this.code, - required this.value, - required this.activitySettings, - required this.globalSettings, - }); - - final String code; - final String value; - final ActivitySettings activitySettings; - final GlobalSettings globalSettings; - - @override - void paint(Canvas canvas, Size size) { - // force square - final double canvasSize = min(size.width, size.height); - - // content - switch (code) { - case DefaultActivitySettings.parameterCodeGameMode: - paintGameModeParameterItem(canvas, canvasSize); - break; - case DefaultActivitySettings.parameterCodeGameLevel: - paintGameLevelParameterItem(canvas, canvasSize); - break; - default: - printlog('Unknown parameter: $code/$value'); - paintUnknownParameterItem(canvas, canvasSize); - } - } - - @override - bool shouldRepaint(CustomPainter oldDelegate) { - return false; - } - - // "unknown" parameter -> simple block with text - void paintUnknownParameterItem( - final Canvas canvas, - final double size, - ) { - final paint = Paint(); - paint.strokeJoin = StrokeJoin.round; - paint.strokeWidth = 3; - - final textSpan = TextSpan( - text: '$code\n$value', - style: const TextStyle( - color: Colors.black, - fontSize: 18, - fontWeight: FontWeight.bold, - ), - ); - final textPainter = TextPainter( - text: textSpan, - textDirection: TextDirection.ltr, - textAlign: TextAlign.center, - ); - textPainter.layout(); - textPainter.paint( - canvas, - Offset( - (size - textPainter.width) * 0.5, - (size - textPainter.height) * 0.5, - ), - ); - } - - void paintGameModeParameterItem( - final Canvas canvas, - final double size, - ) { - String text = ''; - - switch (value) { - case DefaultActivitySettings.gameModeValueOnline: - text = '🌐'; - break; - case DefaultActivitySettings.gameModeValueOffline: - text = '📱'; - break; - default: - printlog('Wrong value for gameMode parameter value: $value'); - } - - final paint = Paint(); - paint.strokeJoin = StrokeJoin.round; - paint.strokeWidth = 3 / 100 * size; - - // centered text value - final textSpan = TextSpan( - text: text, - style: TextStyle( - color: Colors.black, - fontSize: size / 2, - fontWeight: FontWeight.bold, - ), - ); - final textPainter = TextPainter( - text: textSpan, - textDirection: TextDirection.ltr, - textAlign: TextAlign.center, - ); - textPainter.layout(); - textPainter.paint( - canvas, - Offset( - (size - textPainter.width) * 0.5, - (size - textPainter.height) * 0.5, - ), - ); - } - - void paintGameLevelParameterItem( - final Canvas canvas, - final double size, - ) { - String text = ''; - - switch (value) { - case DefaultActivitySettings.gameLevelValueEasy: - text = '🧒'; - break; - case DefaultActivitySettings.gameLevelValueHard: - text = '🧑🎓'; - break; - default: - printlog('Wrong value for gameLevel parameter value: $value'); - } - - final paint = Paint(); - paint.strokeJoin = StrokeJoin.round; - paint.strokeWidth = 3 / 100 * size; - - // centered text value - final textSpan = TextSpan( - text: text, - style: TextStyle( - color: Colors.black, - fontSize: size / 2, - fontWeight: FontWeight.bold, - ), - ); - final textPainter = TextPainter( - text: textSpan, - textDirection: TextDirection.ltr, - textAlign: TextAlign.center, - ); - textPainter.layout(); - textPainter.paint( - canvas, - Offset( - (size - textPainter.width) * 0.5, - (size - textPainter.height) * 0.5, - ), - ); - } -} diff --git a/lib/common/ui/parameters/parameter_widget.dart b/lib/common/ui/parameters/parameter_widget.dart deleted file mode 100644 index f69c3df0376df33dd9daed9da05c0b5d9bf4d336..0000000000000000000000000000000000000000 --- a/lib/common/ui/parameters/parameter_widget.dart +++ /dev/null @@ -1,137 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; - -import 'package:hangman/common/ui/parameters/parameter_painter.dart'; - -import 'package:hangman/config/default_activity_settings.dart'; -import 'package:hangman/config/default_global_settings.dart'; -import 'package:hangman/models/settings/settings_activity.dart'; -import 'package:hangman/models/settings/settings_global.dart'; - -class ParameterWidget extends StatelessWidget { - const ParameterWidget({ - super.key, - required this.code, - required this.value, - required this.isSelected, - required this.size, - required this.activitySettings, - required this.globalSettings, - required this.onPressed, - }); - - final String code; - final String value; - final bool isSelected; - final double size; - final ActivitySettings activitySettings; - final GlobalSettings globalSettings; - final VoidCallback onPressed; - - static const Color buttonColorActive = Colors.blue; - static const Color buttonColorInactive = Colors.white; - static const double buttonBorderWidth = 4.0; - static const double buttonBorderRadius = 12.0; - - @override - Widget build(BuildContext context) { - Widget content = const SizedBox.shrink(); - - switch (code) { - case DefaultActivitySettings.parameterCodeGameMode: - content = getGameModeParameterItem(); - break; - case DefaultActivitySettings.parameterCodeGameLevel: - content = getGameLevelParameterItem(); - break; - case DefaultGlobalSettings.parameterCodeSkin: - content = getSkinParameterItem(); - break; - default: - printlog('Unknown parameter: $code/$value'); - content = getUnknownParameterItem(); - } - - final Color buttonColor = isSelected ? buttonColorActive : buttonColorInactive; - - return Container( - decoration: BoxDecoration( - color: buttonColor, - borderRadius: BorderRadius.circular(buttonBorderRadius), - border: Border.all( - color: buttonColor, - width: buttonBorderWidth, - ), - ), - child: content, - ); - } - - // "unknown" parameter -> simple block with text - Widget getUnknownParameterItem() { - return StyledButton.text( - caption: '$code / $value', - color: Colors.grey, - onPressed: null, - ); - } - - Widget getGameModeParameterItem() { - const Color backgroundColor = Colors.grey; - - return StyledButton( - color: backgroundColor, - onPressed: onPressed, - child: CustomPaint( - size: Size(size, size), - willChange: false, - painter: ParameterPainter( - code: code, - value: value, - activitySettings: activitySettings, - globalSettings: globalSettings, - ), - isComplex: true, - ), - ); - } - - Widget getGameLevelParameterItem() { - Color backgroundColor = Colors.grey; - - switch (value) { - case DefaultActivitySettings.gameLevelValueEasy: - backgroundColor = Colors.green; - break; - case DefaultActivitySettings.gameLevelValueHard: - backgroundColor = Colors.orange; - break; - default: - printlog('Wrong value for size parameter value: $value'); - } - - return StyledButton( - color: backgroundColor, - onPressed: onPressed, - child: CustomPaint( - size: Size(size, size), - willChange: false, - painter: ParameterPainter( - code: code, - value: value, - activitySettings: activitySettings, - globalSettings: globalSettings, - ), - isComplex: true, - ), - ); - } - - Widget getSkinParameterItem() { - return StyledButton.text( - color: Colors.green.shade800, - onPressed: onPressed, - caption: value, - ); - } -} diff --git a/lib/config/application_config.dart b/lib/config/application_config.dart index f6e97e95c613c412da3501c6a58e5a548e6d4779..26f0610a7e745149565ae5635e139ef8b16bd218 100644 --- a/lib/config/application_config.dart +++ b/lib/config/application_config.dart @@ -1,3 +1,81 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; + +import 'package:hangman/common/cubit/nav/nav_cubit_pages.dart'; + +import 'package:hangman/cubit/activity/activity_cubit.dart'; +import 'package:hangman/ui/parameters/parameter_painter_difficulty_level.dart'; + class ApplicationConfig { - static const String appTitle = 'Hangman'; + static const String parameterCodeGameMode = 'activity.gameMode'; + static const String parameterCodeGameLevel = 'activity.gameLevel'; + + static const String gameModeValueOnline = 'online'; + static const String gameModeValueOffline = 'offline'; + + static const String gameLevelValueEasy = 'easy'; + static const String gameLevelValueHard = 'hard'; + + static final ApplicationConfigDefinition config = ApplicationConfigDefinition( + appTitle: 'Hangman', + activitySettings: [ + // game mode + ApplicationSettingsParameter( + code: parameterCodeGameMode, + values: [ + ApplicationSettingsParameterItemValue( + value: gameModeValueOnline, + text: '🌐', + color: Colors.teal, + isDefault: true, + ), + ApplicationSettingsParameterItemValue( + value: gameModeValueOffline, + text: '📱', + color: Colors.purple, + ), + ], + builder: ({required context, required itemValue, required onPressed, required size}) { + return StyledButton.icon( + onPressed: onPressed, + icon: Icon(itemValue.value == gameModeValueOnline + ? UniconsLine.globe + : UniconsLine.clipboard), + color: itemValue.color ?? Colors.grey, + ); + }, + ), + + // game level + ApplicationSettingsParameter( + code: parameterCodeGameLevel, + values: [ + ApplicationSettingsParameterItemValue( + value: gameLevelValueEasy, + color: Colors.green, + isDefault: true, + ), + ApplicationSettingsParameterItemValue( + value: gameLevelValueHard, + color: Colors.orange, + ), + ], + customPainter: (context, value) => ParameterPainterDifficultyLevel( + context: context, + value: value, + ), + ), + ], + startNewActivity: (BuildContext context) { + BlocProvider.of<ActivityCubit>(context).startNewActivity(context); + BlocProvider.of<NavCubitPage>(context).goToPageGame(); + }, + deleteCurrentActivity: (BuildContext context) { + BlocProvider.of<ActivityCubit>(context).deleteSavedActivity(); + }, + resumeActivity: (BuildContext context) { + BlocProvider.of<ActivityCubit>(context).resumeSavedActivity(); + BlocProvider.of<NavCubitPage>(context).goToPageGame(); + }, + ); } diff --git a/lib/config/default_activity_settings.dart b/lib/config/default_activity_settings.dart deleted file mode 100644 index 1e08a0f9a1f1341d76b758ca661e862d1e7f12fe..0000000000000000000000000000000000000000 --- a/lib/config/default_activity_settings.dart +++ /dev/null @@ -1,44 +0,0 @@ -import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; - -class DefaultActivitySettings { - // available game parameters codes - static const String parameterCodeGameMode = 'gameMode'; - static const String parameterCodeGameLevel = 'gameLevel'; - static const List<String> availableParameters = [ - parameterCodeGameMode, - parameterCodeGameLevel, - ]; - - // game mode: available values - static const String gameModeValueOnline = 'online'; - static const String gameModeValueOffline = 'offline'; - static const List<String> allowedGameModeValues = [ - gameModeValueOnline, - gameModeValueOffline, - ]; - // game mode: default value - static const String defaultGameModeValue = gameModeValueOffline; - - // game level: available values - static const String gameLevelValueEasy = 'easy'; - static const String gameLevelValueHard = 'hard'; - static const List<String> allowedGameLevelValues = [ - gameLevelValueEasy, - gameLevelValueHard, - ]; - // game level: default value - static const String defaultGameLevelValue = gameLevelValueEasy; - - // available values from parameter code - static List<String> getAvailableValues(String parameterCode) { - switch (parameterCode) { - case parameterCodeGameMode: - return DefaultActivitySettings.allowedGameModeValues; - case parameterCodeGameLevel: - return DefaultActivitySettings.allowedGameLevelValues; - } - - printlog('Did not find any available value for game parameter "$parameterCode".'); - return []; - } -} diff --git a/lib/config/default_global_settings.dart b/lib/config/default_global_settings.dart deleted file mode 100644 index d92229c2e02064684ed4a2caeb272ff63325776a..0000000000000000000000000000000000000000 --- a/lib/config/default_global_settings.dart +++ /dev/null @@ -1,28 +0,0 @@ -import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; - -class DefaultGlobalSettings { - // available global parameters codes - static const String parameterCodeSkin = 'skin'; - static const List<String> availableParameters = [ - parameterCodeSkin, - ]; - - // skin: available values - static const String skinValueDefault = 'default'; - static const List<String> allowedSkinValues = [ - skinValueDefault, - ]; - // skin: default value - static const String defaultSkinValue = skinValueDefault; - - // available values from parameter code - static List<String> getAvailableValues(String parameterCode) { - switch (parameterCode) { - case parameterCodeSkin: - return DefaultGlobalSettings.allowedSkinValues; - } - - printlog('Did not find any available value for global parameter "$parameterCode".'); - return []; - } -} diff --git a/lib/cubit/activity/activity_cubit.dart b/lib/cubit/activity/activity_cubit.dart index 6a7bd236c9a86cf8723e5383b738117a48e127ab..e2e40d8124bfa55d77d2af1ac327608a211e88c8 100644 --- a/lib/cubit/activity/activity_cubit.dart +++ b/lib/cubit/activity/activity_cubit.dart @@ -4,8 +4,6 @@ import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:hangman/data/fetch_data_helper.dart'; import 'package:hangman/models/activity/activity.dart'; import 'package:hangman/models/activity/picked_word.dart'; -import 'package:hangman/models/settings/settings_activity.dart'; -import 'package:hangman/models/settings/settings_global.dart'; part 'activity_state.dart'; @@ -25,7 +23,6 @@ class ActivityCubit extends HydratedCubit<ActivityState> { final Activity activity = Activity( // Settings activitySettings: state.currentActivity.activitySettings, - globalSettings: state.currentActivity.globalSettings, // State isRunning: state.currentActivity.isRunning, isStarted: state.currentActivity.isStarted, @@ -46,14 +43,15 @@ class ActivityCubit extends HydratedCubit<ActivityState> { updateState(activity); } - void startNewActivity({ - required ActivitySettings activitySettings, - required GlobalSettings globalSettings, - }) { + void startNewActivity(BuildContext context) { + final ActivitySettingsCubit activitySettingsCubit = + BlocProvider.of<ActivitySettingsCubit>(context); + + final ActivitySettings activitySettings = activitySettingsCubit.state.settings; + final Activity newActivity = Activity.createNew( // Settings activitySettings: activitySettings, - globalSettings: globalSettings, ); updateState(newActivity); @@ -71,6 +69,10 @@ class ActivityCubit extends HydratedCubit<ActivityState> { }); } + bool canBeResumed() { + return state.currentActivity.canBeResumed; + } + void quitActivity() { state.currentActivity.isRunning = false; refresh(); diff --git a/lib/cubit/settings/settings_activity_cubit.dart b/lib/cubit/settings/settings_activity_cubit.dart deleted file mode 100644 index dc64619cbb6e39bfe7c36b2fb40852e7f2012093..0000000000000000000000000000000000000000 --- a/lib/cubit/settings/settings_activity_cubit.dart +++ /dev/null @@ -1,72 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; - -import 'package:hangman/config/default_activity_settings.dart'; -import 'package:hangman/models/settings/settings_activity.dart'; - -part 'settings_activity_state.dart'; - -class ActivitySettingsCubit extends HydratedCubit<ActivitySettingsState> { - ActivitySettingsCubit() - : super(ActivitySettingsState(settings: ActivitySettings.createDefault())); - - void setValues({ - String? gameMode, - String? gameLevel, - }) { - emit( - ActivitySettingsState( - settings: ActivitySettings( - gameMode: gameMode ?? state.settings.gameMode, - gameLevel: gameLevel ?? state.settings.gameLevel, - ), - ), - ); - } - - String getParameterValue(String code) { - switch (code) { - case DefaultActivitySettings.parameterCodeGameMode: - return ActivitySettings.getGameModeValueFromUnsafe(state.settings.gameMode); - case DefaultActivitySettings.parameterCodeGameLevel: - return ActivitySettings.getGameLevelValueFromUnsafe(state.settings.gameLevel); - } - - return ''; - } - - void setParameterValue(String code, String value) { - final String gameMode = code == DefaultActivitySettings.parameterCodeGameMode - ? value - : getParameterValue(DefaultActivitySettings.parameterCodeGameMode); - final String gameLevel = code == DefaultActivitySettings.parameterCodeGameLevel - ? value - : getParameterValue(DefaultActivitySettings.parameterCodeGameLevel); - - setValues( - gameMode: gameMode, - gameLevel: gameLevel, - ); - } - - @override - ActivitySettingsState? fromJson(Map<String, dynamic> json) { - final String gameMode = json[DefaultActivitySettings.parameterCodeGameMode] as String; - final String gameLevel = json[DefaultActivitySettings.parameterCodeGameLevel] as String; - - return ActivitySettingsState( - settings: ActivitySettings( - gameMode: gameMode, - gameLevel: gameLevel, - ), - ); - } - - @override - Map<String, dynamic>? toJson(ActivitySettingsState state) { - return <String, dynamic>{ - DefaultActivitySettings.parameterCodeGameMode: state.settings.gameMode, - DefaultActivitySettings.parameterCodeGameLevel: state.settings.gameLevel, - }; - } -} diff --git a/lib/cubit/settings/settings_activity_state.dart b/lib/cubit/settings/settings_activity_state.dart deleted file mode 100644 index 2b2de42011634e81ae9e6f8bcaa1577f239c778b..0000000000000000000000000000000000000000 --- a/lib/cubit/settings/settings_activity_state.dart +++ /dev/null @@ -1,15 +0,0 @@ -part of 'settings_activity_cubit.dart'; - -@immutable -class ActivitySettingsState extends Equatable { - const ActivitySettingsState({ - required this.settings, - }); - - final ActivitySettings settings; - - @override - List<dynamic> get props => <dynamic>[ - settings, - ]; -} diff --git a/lib/cubit/settings/settings_global_cubit.dart b/lib/cubit/settings/settings_global_cubit.dart deleted file mode 100644 index bfbac997eb07196e4415e9452ebd7fb5f35b91c3..0000000000000000000000000000000000000000 --- a/lib/cubit/settings/settings_global_cubit.dart +++ /dev/null @@ -1,59 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; - -import 'package:hangman/config/default_global_settings.dart'; -import 'package:hangman/models/settings/settings_global.dart'; - -part 'settings_global_state.dart'; - -class GlobalSettingsCubit extends HydratedCubit<GlobalSettingsState> { - GlobalSettingsCubit() : super(GlobalSettingsState(settings: GlobalSettings.createDefault())); - - void setValues({ - String? skin, - }) { - emit( - GlobalSettingsState( - settings: GlobalSettings( - skin: skin ?? state.settings.skin, - ), - ), - ); - } - - String getParameterValue(String code) { - switch (code) { - case DefaultGlobalSettings.parameterCodeSkin: - return GlobalSettings.getSkinValueFromUnsafe(state.settings.skin); - } - return ''; - } - - void setParameterValue(String code, String value) { - final String skin = (code == DefaultGlobalSettings.parameterCodeSkin) - ? value - : getParameterValue(DefaultGlobalSettings.parameterCodeSkin); - - setValues( - skin: skin, - ); - } - - @override - GlobalSettingsState? fromJson(Map<String, dynamic> json) { - final String skin = json[DefaultGlobalSettings.parameterCodeSkin] as String; - - return GlobalSettingsState( - settings: GlobalSettings( - skin: skin, - ), - ); - } - - @override - Map<String, dynamic>? toJson(GlobalSettingsState state) { - return <String, dynamic>{ - DefaultGlobalSettings.parameterCodeSkin: state.settings.skin, - }; - } -} diff --git a/lib/cubit/settings/settings_global_state.dart b/lib/cubit/settings/settings_global_state.dart deleted file mode 100644 index ebcddd700f252257223ca8e16c85202b04f3ff24..0000000000000000000000000000000000000000 --- a/lib/cubit/settings/settings_global_state.dart +++ /dev/null @@ -1,15 +0,0 @@ -part of 'settings_global_cubit.dart'; - -@immutable -class GlobalSettingsState extends Equatable { - const GlobalSettingsState({ - required this.settings, - }); - - final GlobalSettings settings; - - @override - List<dynamic> get props => <dynamic>[ - settings, - ]; -} diff --git a/lib/data/fetch_data_helper.dart b/lib/data/fetch_data_helper.dart index 5ced0b86553c27cb0826dbc840ca7a769b7eb888..3b8368db633d0b1112088278c6e6a8adea22fe43 100644 --- a/lib/data/fetch_data_helper.dart +++ b/lib/data/fetch_data_helper.dart @@ -3,24 +3,24 @@ import 'dart:convert'; import 'dart:math' show Random; import 'package:diacritic/diacritic.dart'; -import 'package:hangman/data/dictionary_french_easy.dart'; -import 'package:hangman/data/dictionary_french_hard.dart'; -import 'package:hangman/models/activity/picked_word.dart'; +import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:html/parser.dart'; import 'package:html/dom.dart'; import 'package:http/http.dart' as http; -import 'package:hangman/config/default_activity_settings.dart'; -import 'package:hangman/models/settings/settings_activity.dart'; +import 'package:hangman/config/application_config.dart'; +import 'package:hangman/data/dictionary_french_easy.dart'; +import 'package:hangman/data/dictionary_french_hard.dart'; +import 'package:hangman/models/activity/picked_word.dart'; class FetchDataHelper { FetchDataHelper(); Future<PickedWord> pickRandomWord(ActivitySettings activitySettings) async { - switch (activitySettings.gameMode) { - case DefaultActivitySettings.gameModeValueOffline: + switch (activitySettings.get(ApplicationConfig.parameterCodeGameMode)) { + case ApplicationConfig.gameModeValueOffline: return Future(() => pickRandomOfflineWord(activitySettings)); - case DefaultActivitySettings.gameModeValueOnline: + case ApplicationConfig.gameModeValueOnline: return await pickRandomOnlineWord(activitySettings); } @@ -28,10 +28,10 @@ class FetchDataHelper { } PickedWord pickRandomOfflineWord(ActivitySettings activitySettings) { - switch (activitySettings.gameLevel) { - case DefaultActivitySettings.gameLevelValueEasy: + switch (activitySettings.get(ApplicationConfig.parameterCodeGameLevel)) { + case ApplicationConfig.gameLevelValueEasy: return wordFromLocalEasyDictionary(); - case DefaultActivitySettings.gameLevelValueHard: + case ApplicationConfig.gameLevelValueHard: return wordFromLocalFullDictionary(); } @@ -40,10 +40,10 @@ class FetchDataHelper { Future<PickedWord> pickRandomOnlineWord(ActivitySettings activitySettings) { const baseUrl = 'https://www.palabrasaleatorias.com/mots-aleatoires.php'; - switch (activitySettings.gameLevel) { - case DefaultActivitySettings.gameLevelValueEasy: + switch (activitySettings.get(ApplicationConfig.parameterCodeGameLevel)) { + case ApplicationConfig.gameLevelValueEasy: return wordFromWeb('$baseUrl?fs=1&fs2=0&Submit=Nouveau+mot'); - case DefaultActivitySettings.gameLevelValueHard: + case ApplicationConfig.gameLevelValueHard: return wordFromWeb('$baseUrl?fs=1&fs2=1&Submit=Nouveau+mot'); } return Future(() => PickedWord.none); diff --git a/lib/main.dart b/lib/main.dart index 590c42cb9f79e94f89355831e36dca298e2d765d..034655b8d5f5c4d34d7a5592454210cb0dd2d02e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -8,10 +8,7 @@ import 'package:hangman/common/cubit/nav/nav_cubit_pages.dart'; import 'package:hangman/common/cubit/nav/nav_cubit_screens.dart'; import 'package:hangman/config/application_config.dart'; -import 'package:hangman/config/default_global_settings.dart'; import 'package:hangman/cubit/activity/activity_cubit.dart'; -import 'package:hangman/cubit/settings/settings_activity_cubit.dart'; -import 'package:hangman/cubit/settings/settings_global_cubit.dart'; import 'package:hangman/ui/skeleton.dart'; void main() async { @@ -62,17 +59,14 @@ class MyApp extends StatelessWidget { BlocProvider<ActivityCubit>( create: (context) => ActivityCubit(), ), - BlocProvider<GlobalSettingsCubit>( - create: (context) => GlobalSettingsCubit(), - ), BlocProvider<ActivitySettingsCubit>( - create: (context) => ActivitySettingsCubit(), + create: (context) => ActivitySettingsCubit(appConfig: ApplicationConfig.config), ), ], child: BlocBuilder<ApplicationThemeModeCubit, ApplicationThemeModeState>( builder: (BuildContext context, ApplicationThemeModeState state) { return MaterialApp( - title: ApplicationConfig.appTitle, + title: ApplicationConfig.config.appTitle, home: const SkeletonScreen(), // Theme stuff @@ -109,10 +103,8 @@ class MyApp extends StatelessWidget { skinImages.add('img$value'); } - for (String skin in DefaultGlobalSettings.allowedSkinValues) { - for (String image in skinImages) { - assets.add('assets/skins/${skin}_$image.png'); - } + for (String image in skinImages) { + assets.add('assets/skins/default_$image.png'); } return assets; diff --git a/lib/models/activity/activity.dart b/lib/models/activity/activity.dart index 7650b2ea9534e2dc8995b6f6374ffc24ecd941b9..e8da1041e040b89e4e21b722370f964a49af52da 100644 --- a/lib/models/activity/activity.dart +++ b/lib/models/activity/activity.dart @@ -1,7 +1,6 @@ import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; -import 'package:hangman/models/settings/settings_activity.dart'; -import 'package:hangman/models/settings/settings_global.dart'; +import 'package:hangman/config/application_config.dart'; typedef MovingTile = String; typedef Player = String; @@ -14,7 +13,6 @@ class Activity { Activity({ // Settings required this.activitySettings, - required this.globalSettings, // State this.isRunning = false, @@ -36,7 +34,6 @@ class Activity { // Settings final ActivitySettings activitySettings; - final GlobalSettings globalSettings; // State bool isRunning; @@ -58,8 +55,7 @@ class Activity { factory Activity.createNull() { return Activity( // Settings - activitySettings: ActivitySettings.createDefault(), - globalSettings: GlobalSettings.createDefault(), + activitySettings: ActivitySettings.createDefault(appConfig: ApplicationConfig.config), // Base data secretWord: '', clue: '', @@ -70,17 +66,14 @@ class Activity { } factory Activity.createNew({ - required ActivitySettings? activitySettings, - required GlobalSettings? globalSettings, + ActivitySettings? activitySettings, }) { - final ActivitySettings newActivitySettings = - activitySettings ?? ActivitySettings.createDefault(); - final GlobalSettings newGlobalSettings = globalSettings ?? GlobalSettings.createDefault(); + final ActivitySettings newActivitySettings = activitySettings ?? + ActivitySettings.createDefault(appConfig: ApplicationConfig.config); return Activity( // Settings activitySettings: newActivitySettings, - globalSettings: newGlobalSettings, // State isRunning: true, gettingSecretWord: true, @@ -105,7 +98,6 @@ class Activity { printlog('$Activity:'); printlog(' Settings'); activitySettings.dump(); - globalSettings.dump(); printlog(' State'); printlog(' isRunning: $isRunning'); printlog(' isStarted: $isStarted'); @@ -132,7 +124,6 @@ class Activity { return <String, dynamic>{ // Settings 'activitySettings': activitySettings.toJson(), - 'globalSettings': globalSettings.toJson(), // State 'isRunning': isRunning, 'isStarted': isStarted, diff --git a/lib/models/settings/settings_activity.dart b/lib/models/settings/settings_activity.dart deleted file mode 100644 index d2d8fc684f95f863a83392221b3892ca9a371491..0000000000000000000000000000000000000000 --- a/lib/models/settings/settings_activity.dart +++ /dev/null @@ -1,55 +0,0 @@ -import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; - -import 'package:hangman/config/default_activity_settings.dart'; - -class ActivitySettings { - final String gameMode; - final String gameLevel; - - ActivitySettings({ - required this.gameMode, - required this.gameLevel, - }); - - static String getGameModeValueFromUnsafe(String gameMode) { - if (DefaultActivitySettings.allowedGameModeValues.contains(gameMode)) { - return gameMode; - } - - return DefaultActivitySettings.defaultGameModeValue; - } - - static String getGameLevelValueFromUnsafe(String gameLevel) { - if (DefaultActivitySettings.allowedGameLevelValues.contains(gameLevel)) { - return gameLevel; - } - - return DefaultActivitySettings.defaultGameLevelValue; - } - - factory ActivitySettings.createDefault() { - return ActivitySettings( - gameMode: DefaultActivitySettings.defaultGameModeValue, - gameLevel: DefaultActivitySettings.defaultGameLevelValue, - ); - } - - void dump() { - printlog('$ActivitySettings:'); - printlog(' ${DefaultActivitySettings.parameterCodeGameMode}: $gameMode'); - printlog(' ${DefaultActivitySettings.parameterCodeGameLevel}: $gameLevel'); - printlog(''); - } - - @override - String toString() { - return '$ActivitySettings(${toJson()})'; - } - - Map<String, dynamic>? toJson() { - return <String, dynamic>{ - DefaultActivitySettings.parameterCodeGameMode: gameMode, - DefaultActivitySettings.parameterCodeGameLevel: gameLevel, - }; - } -} diff --git a/lib/models/settings/settings_global.dart b/lib/models/settings/settings_global.dart deleted file mode 100644 index 88d7c14b21bda9ad55d15c80952274ed0464e689..0000000000000000000000000000000000000000 --- a/lib/models/settings/settings_global.dart +++ /dev/null @@ -1,42 +0,0 @@ -import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; - -import 'package:hangman/config/default_global_settings.dart'; - -class GlobalSettings { - String skin; - - GlobalSettings({ - required this.skin, - }); - - static String getSkinValueFromUnsafe(String skin) { - if (DefaultGlobalSettings.allowedSkinValues.contains(skin)) { - return skin; - } - - return DefaultGlobalSettings.defaultSkinValue; - } - - factory GlobalSettings.createDefault() { - return GlobalSettings( - skin: DefaultGlobalSettings.defaultSkinValue, - ); - } - - void dump() { - printlog('$GlobalSettings:'); - printlog(' ${DefaultGlobalSettings.parameterCodeSkin}: $skin'); - printlog(''); - } - - @override - String toString() { - return '$GlobalSettings(${toJson()})'; - } - - Map<String, dynamic>? toJson() { - return <String, dynamic>{ - DefaultGlobalSettings.parameterCodeSkin: skin, - }; - } -} diff --git a/lib/common/ui/pages/game.dart b/lib/ui/pages/game.dart similarity index 100% rename from lib/common/ui/pages/game.dart rename to lib/ui/pages/game.dart diff --git a/lib/ui/parameters/parameter_painter_difficulty_level.dart b/lib/ui/parameters/parameter_painter_difficulty_level.dart new file mode 100644 index 0000000000000000000000000000000000000000..71a4a8f6dc92794ce02480718905905f0b2045db --- /dev/null +++ b/lib/ui/parameters/parameter_painter_difficulty_level.dart @@ -0,0 +1,72 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; +import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; + +import 'package:hangman/config/application_config.dart'; + +class ParameterPainterDifficultyLevel extends CustomPainter { + const ParameterPainterDifficultyLevel({ + required this.context, + required this.value, + }); + + final BuildContext context; + final String value; + + @override + void paint(Canvas canvas, Size size) { + // force square + final double canvasSize = min(size.width, size.height); + + final List<dynamic> stars = []; + + switch (value) { + case ApplicationConfig.gameLevelValueEasy: + stars.add([0.5, 0.5]); + break; + case ApplicationConfig.gameLevelValueHard: + stars.add([0.3, 0.3]); + stars.add([0.7, 0.3]); + stars.add([0.5, 0.7]); + break; + default: + printlog('Wrong value for level parameter value: $value'); + } + + final paint = Paint(); + paint.strokeJoin = StrokeJoin.round; + paint.strokeWidth = 3 / 100 * canvasSize; + + // Stars + final textSpan = TextSpan( + text: '⭐', + style: TextStyle( + color: Colors.black, + fontSize: canvasSize / 3, + fontWeight: FontWeight.bold, + ), + ); + final textPainter = TextPainter( + text: textSpan, + textDirection: TextDirection.ltr, + textAlign: TextAlign.center, + ); + textPainter.layout(); + + for (var center in stars) { + textPainter.paint( + canvas, + Offset( + canvasSize * center[0] - textPainter.width * 0.5, + canvasSize * center[1] - textPainter.height * 0.5, + ), + ); + } + } + + @override + bool shouldRepaint(CustomPainter oldDelegate) { + return false; + } +} diff --git a/pubspec.lock b/pubspec.lock index f0d46ff48ae7d8352d171ca0f84a3447d87a4a4c..64bb6fbc6bf22517662402b7f74350616536a8a5 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -138,11 +138,11 @@ packages: dependency: "direct main" description: path: "." - ref: "0.4.0" - resolved-ref: eb9c090bd00d73324eab8737f74b3339cc24c9e8 + ref: "0.5.0" + resolved-ref: b8164a50489ba981ea57d9f02e2334f09cb8c6a7 url: "https://git.harrault.fr/android/flutter-toolbox.git" source: git - version: "0.4.0" + version: "0.5.0" flutter_lints: dependency: "direct dev" description: diff --git a/pubspec.yaml b/pubspec.yaml index a5139afe423ed02b2ed9fdb11828c1c0e2d08f0a..bdc79c8778f2613a13c224ac494fb9e78f306287 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: Hangman game, have fun with words and letters! publish_to: "none" -version: 1.5.2+37 +version: 1.6.0+38 environment: sdk: "^3.0.0" @@ -16,7 +16,7 @@ dependencies: flutter_custom_toolbox: git: url: https://git.harrault.fr/android/flutter-toolbox.git - ref: 0.4.0 + ref: 0.5.0 # specific diacritic: ^0.1.4