diff --git a/fastlane/metadata/android/en-US/changelogs/49.txt b/fastlane/metadata/android/en-US/changelogs/49.txt new file mode 100644 index 0000000000000000000000000000000000000000..c20ed39173f1690cb6181457fe5d4c6cc0a061ab --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/49.txt @@ -0,0 +1 @@ +Use ActivityParameters widgets from flutter_custom_toolbox. diff --git a/fastlane/metadata/android/fr-FR/changelogs/49.txt b/fastlane/metadata/android/fr-FR/changelogs/49.txt new file mode 100644 index 0000000000000000000000000000000000000000..f732ebd3738d66fdff72e28b0cf0bb4b0684e030 --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/49.txt @@ -0,0 +1 @@ +Utilisation des widgets ActivityParameters de flutter_custom_toolbox. diff --git a/lib/common/config/activity_page.dart b/lib/common/config/activity_page.dart index d6a26b6cd22e1b530d1521809928f7dba272d21d..c88ccba2fe1b25800ab2ac9b0ba78093b7d0ed55 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:petitbac/common/ui/pages/game.dart'; -import 'package:petitbac/common/ui/pages/parameters.dart'; +import 'package:petitbac/config/application_config.dart'; +import 'package:petitbac/cubit/activity/activity_cubit.dart'; +import 'package:petitbac/models/activity/activity.dart'; +import 'package:petitbac/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, }; @@ -44,7 +53,19 @@ class ActivityPage { return items.keys.contains(pageIndex); } - static Widget getWidget(int pageIndex) { - return items[pageIndex]?.page ?? pageHome.page; + static Widget getWidget( + int pageIndex, + ) { + 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 76d163fab971552295bf9cd164bf722272f4fdb7..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:petitbac/common/cubit/nav/nav_cubit_pages.dart'; -import 'package:petitbac/common/ui/parameters/parameter_widget.dart'; - -import 'package:petitbac/config/default_activity_settings.dart'; -import 'package:petitbac/config/default_global_settings.dart'; -import 'package:petitbac/cubit/activity/activity_cubit.dart'; -import 'package:petitbac/cubit/settings/settings_activity_cubit.dart'; -import 'package:petitbac/cubit/settings/settings_global_cubit.dart'; -import 'package:petitbac/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 99785f160011131d4a86b87c5acea524542fc537..0000000000000000000000000000000000000000 --- a/lib/common/ui/parameters/parameter_painter.dart +++ /dev/null @@ -1,179 +0,0 @@ -import 'dart:math'; - -import 'package:flutter/material.dart'; -import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; - -import 'package:petitbac/config/default_activity_settings.dart'; -import 'package:petitbac/models/settings/settings_activity.dart'; -import 'package:petitbac/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.parameterCodeItemsCount: - paintItemsCountParameterItem(canvas, canvasSize); - break; - case DefaultActivitySettings.parameterCodeTimerValue: - paintTimerParameterItem(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 paintItemsCountParameterItem( - final Canvas canvas, - final double size, - ) { - const itemCountEmoji = '💬'; - - String text = - '$itemCountEmoji\n${DefaultActivitySettings.getItemsCountValueFromCode(value)}'; - - switch (value) { - case DefaultActivitySettings.itemsCountValueNoLimit: - text = '⭐'; - break; - case DefaultActivitySettings.itemsCountValueShort: - break; - case DefaultActivitySettings.itemsCountValueMedium: - break; - case DefaultActivitySettings.itemsCountValueLong: - break; - default: - printlog('Wrong value for itemsCount 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.6, - 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 paintTimerParameterItem( - final Canvas canvas, - final double size, - ) { - const timerEmoji = '⏲️'; - - String text = '$timerEmoji\n${DefaultActivitySettings.getTimerValueFromCode(value)}"'; - - switch (value) { - case DefaultActivitySettings.timerValueNoTimer: - text = '⭐'; - break; - case DefaultActivitySettings.timerValueLow: - break; - case DefaultActivitySettings.timerValueMedium: - break; - case DefaultActivitySettings.timerValueHigh: - break; - default: - printlog('Wrong value for itemsCount parameter value: $value'); - } - - final paint = Paint(); - paint.strokeJoin = StrokeJoin.round; - paint.strokeWidth = 3; - - // centered text value - final textSpan = TextSpan( - text: text, - style: TextStyle( - color: Colors.black, - fontSize: size / 2.6, - 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 529b41b83cac80d247a95594ef4d36bdc7bc9991..0000000000000000000000000000000000000000 --- a/lib/common/ui/parameters/parameter_widget.dart +++ /dev/null @@ -1,165 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; - -import 'package:petitbac/common/ui/parameters/parameter_painter.dart'; - -import 'package:petitbac/config/default_activity_settings.dart'; -import 'package:petitbac/config/default_global_settings.dart'; -import 'package:petitbac/models/settings/settings_activity.dart'; -import 'package:petitbac/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.parameterCodeItemsCount: - content = getItemsCountParameterItem(value); - break; - case DefaultActivitySettings.parameterCodeTimerValue: - content = getTimerValueParameterItem(value); - break; - case DefaultGlobalSettings.parameterCodeSkin: - content = getSkinParameterItem(value); - break; - default: - printlog('Unknown parameter: $code/$value'); - content = getUnknownParameterItem(value); - } - - 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(final String value) { - return StyledButton.text( - caption: '$code / $value', - color: Colors.grey, - onPressed: null, - ); - } - - Widget getItemsCountParameterItem(final String value) { - Color backgroundColor = Colors.grey; - - switch (value) { - case DefaultActivitySettings.itemsCountValueNoLimit: - backgroundColor = Colors.grey; - break; - case DefaultActivitySettings.itemsCountValueShort: - backgroundColor = Colors.green; - break; - case DefaultActivitySettings.itemsCountValueMedium: - backgroundColor = Colors.orange; - break; - case DefaultActivitySettings.itemsCountValueLong: - backgroundColor = Colors.red; - break; - default: - printlog('Wrong value for itemsCount 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 getTimerValueParameterItem(final String value) { - Color backgroundColor = Colors.grey; - - switch (value) { - case DefaultActivitySettings.timerValueNoTimer: - backgroundColor = Colors.grey; - break; - case DefaultActivitySettings.timerValueLow: - backgroundColor = Colors.green; - break; - case DefaultActivitySettings.timerValueMedium: - backgroundColor = Colors.orange; - break; - case DefaultActivitySettings.timerValueHigh: - backgroundColor = Colors.red; - break; - default: - printlog('Wrong value for itemsCount 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( - final String value, - ) { - return StyledButton( - color: Colors.green.shade800, - onPressed: onPressed, - child: Image( - image: AssetImage('assets/ui/${DefaultGlobalSettings.parameterCodeSkin}_$value.png'), - fit: BoxFit.fill, - ), - ); - } -} diff --git a/lib/config/application_config.dart b/lib/config/application_config.dart index 68c47f90cba2a7c6f962d5912a16eb371dc61b77..165e43e868664ca16ffc5adc07b7512eee705f97 100644 --- a/lib/config/application_config.dart +++ b/lib/config/application_config.dart @@ -1,3 +1,111 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; + +import 'package:petitbac/common/cubit/nav/nav_cubit_pages.dart'; + +import 'package:petitbac/cubit/activity/activity_cubit.dart'; + class ApplicationConfig { - static const String appTitle = 'Petit Bac'; + static const String parameterCodeItemsCount = 'activity.itemsCount'; + static const String parameterCodeTimerValue = 'activity.timerValue'; + + static const String itemsCountValueNoLimit = 'nolimit'; + static const String itemsCountValueShort = 'short'; + static const String itemsCountValueMedium = 'medium'; + static const String itemsCountValueLong = 'long'; + + static const String timerValueNoTimer = 'nolimit'; + static const String timerValueLow = 'low'; + static const String timerValueMedium = 'medium'; + static const String timerValueHigh = 'high'; + + static final ApplicationConfigDefinition config = ApplicationConfigDefinition( + appTitle: 'Petit Bac', + activitySettings: [ + // items count + ApplicationSettingsParameter( + code: parameterCodeItemsCount, + values: [ + ApplicationSettingsParameterItemValue( + value: itemsCountValueNoLimit, + color: Colors.grey, + text: '⭐', + ), + ApplicationSettingsParameterItemValue( + value: itemsCountValueShort, + color: Colors.green, + text: '💬 5', + ), + ApplicationSettingsParameterItemValue( + value: itemsCountValueMedium, + color: Colors.orange, + text: '💬 10', + isDefault: true, + ), + ApplicationSettingsParameterItemValue( + value: itemsCountValueLong, + color: Colors.red, + text: '💬 20', + ), + ], + intValueGetter: (value) { + const Map<String, int> intValues = { + ApplicationConfig.itemsCountValueNoLimit: 0, + ApplicationConfig.itemsCountValueShort: 5, + ApplicationConfig.itemsCountValueMedium: 10, + ApplicationConfig.itemsCountValueLong: 20, + }; + return intValues[parameterCodeItemsCount] ?? 0; + }, + ), + + // timer value + ApplicationSettingsParameter( + code: parameterCodeTimerValue, + values: [ + ApplicationSettingsParameterItemValue( + value: timerValueNoTimer, + color: Colors.grey, + text: '⭐', + ), + ApplicationSettingsParameterItemValue( + value: timerValueLow, + color: Colors.green, + text: '⏲️ 5', + ), + ApplicationSettingsParameterItemValue( + value: timerValueMedium, + color: Colors.orange, + text: '⏲️ 30', + isDefault: true, + ), + ApplicationSettingsParameterItemValue( + value: timerValueHigh, + color: Colors.red, + text: '⏲️ 90', + ), + ], + intValueGetter: (value) { + const Map<String, int> intValues = { + timerValueNoTimer: 0, + timerValueLow: 5, + timerValueMedium: 30, + timerValueHigh: 90, + }; + return intValues[parameterCodeTimerValue] ?? 0; + }, + ), + ], + 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 5a7cd16c0cde54795fb44bf2bfd0f643cd2345c6..0000000000000000000000000000000000000000 --- a/lib/config/default_activity_settings.dart +++ /dev/null @@ -1,74 +0,0 @@ -import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; - -class DefaultActivitySettings { - // available game parameters codes - static const String parameterCodeItemsCount = 'itemsCount'; - static const String parameterCodeTimerValue = 'timerValue'; - static const List<String> availableParameters = [ - parameterCodeItemsCount, - parameterCodeTimerValue, - ]; - - // items count: available values - static const String itemsCountValueNoLimit = 'nolimit'; - static const String itemsCountValueShort = 'short'; - static const String itemsCountValueMedium = 'medium'; - static const String itemsCountValueLong = 'long'; - static const List<String> allowedItemsCountValues = [ - itemsCountValueNoLimit, - itemsCountValueShort, - itemsCountValueMedium, - itemsCountValueLong, - ]; - // items count: default value - static const String defaultItemsCountValue = itemsCountValueMedium; - - // timer value: available values - static const String timerValueNoTimer = 'nolimit'; - static const String timerValueLow = 'low'; - static const String timerValueMedium = 'medium'; - static const String timerValueHigh = 'high'; - static const List<String> allowedTimerValues = [ - timerValueNoTimer, - timerValueLow, - timerValueMedium, - timerValueHigh, - ]; - // timer value: default value - static const String defaultTimerValue = timerValueMedium; - - // available values from parameter code - static List<String> getAvailableValues(String parameterCode) { - switch (parameterCode) { - case parameterCodeItemsCount: - return DefaultActivitySettings.allowedItemsCountValues; - case parameterCodeTimerValue: - return DefaultActivitySettings.allowedTimerValues; - } - - printlog('Did not find any available value for game parameter "$parameterCode".'); - return []; - } - - static int getItemsCountValueFromCode(String itemsCountParameterValue) { - const Map<String, int> values = { - DefaultActivitySettings.itemsCountValueNoLimit: 0, - DefaultActivitySettings.itemsCountValueShort: 5, - DefaultActivitySettings.itemsCountValueMedium: 10, - DefaultActivitySettings.itemsCountValueLong: 20, - }; - return values[itemsCountParameterValue] ?? - getItemsCountValueFromCode(DefaultActivitySettings.defaultItemsCountValue); - } - - static int getTimerValueFromCode(String timerValueParameterValue) { - const Map<String, int> values = { - timerValueNoTimer: 0, - timerValueLow: 5, - timerValueMedium: 30, - timerValueHigh: 90, - }; - return values[timerValueParameterValue] ?? - getTimerValueFromCode(DefaultActivitySettings.defaultTimerValue); - } -} 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 c118db10d9dd2d260407b084d44565235279dbd9..10aba50286e4cb11279f23d05d2b2bd12d4d8e4a 100644 --- a/lib/cubit/activity/activity_cubit.dart +++ b/lib/cubit/activity/activity_cubit.dart @@ -4,11 +4,10 @@ import 'dart:math'; import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; +import 'package:petitbac/config/application_config.dart'; import 'package:petitbac/data/fetch_data_helper.dart'; import 'package:petitbac/models/activity/activity.dart'; import 'package:petitbac/models/activity/game_item.dart'; -import 'package:petitbac/models/settings/settings_activity.dart'; -import 'package:petitbac/models/settings/settings_global.dart'; part 'activity_state.dart'; @@ -28,7 +27,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, @@ -45,14 +43,13 @@ 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 Activity newActivity = Activity.createNew( // Settings - activitySettings: activitySettings, - globalSettings: globalSettings, + activitySettings: activitySettingsCubit.state.settings, ); newActivity.dump(); @@ -61,6 +58,10 @@ class ActivityCubit extends HydratedCubit<ActivityState> { startTimer(); } + bool canBeResumed() { + return state.currentActivity.canBeResumed; + } + void quitActivity() { state.currentActivity.isRunning = false; refresh(); @@ -79,7 +80,9 @@ class ActivityCubit extends HydratedCubit<ActivityState> { void next() { if (state.currentActivity.position < - (state.currentActivity.activitySettings.itemsCountValue - 1)) { + (state.currentActivity.activitySettings + .getAsInt(ApplicationConfig.parameterCodeItemsCount) - + 1)) { state.currentActivity.position++; startTimer(); } else { @@ -89,7 +92,8 @@ class ActivityCubit extends HydratedCubit<ActivityState> { } void startTimer() { - int timerValue = state.currentActivity.activitySettings.timerCountValue; + int timerValue = state.currentActivity.activitySettings + .getAsInt(ApplicationConfig.parameterCodeTimerValue); if (timerValue != 0) { state.currentActivity.countdown = timerValue; @@ -106,7 +110,9 @@ class ActivityCubit extends HydratedCubit<ActivityState> { if (state.currentActivity.countdown == 0) { timer.cancel(); if (state.currentActivity.position == - (state.currentActivity.activitySettings.itemsCountValue - 1)) { + (state.currentActivity.activitySettings + .getAsInt(ApplicationConfig.parameterCodeItemsCount) - + 1)) { state.currentActivity.isFinished = true; } } @@ -116,7 +122,9 @@ class ActivityCubit extends HydratedCubit<ActivityState> { ); } else { if (state.currentActivity.position == - (state.currentActivity.activitySettings.itemsCountValue - 1)) { + (state.currentActivity.activitySettings + .getAsInt(ApplicationConfig.parameterCodeItemsCount) - + 1)) { state.currentActivity.isFinished = true; } } diff --git a/lib/cubit/settings/settings_activity_cubit.dart b/lib/cubit/settings/settings_activity_cubit.dart deleted file mode 100644 index d3660b475819b1de6dcf3cee96561bdc58ef655f..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:petitbac/config/default_activity_settings.dart'; -import 'package:petitbac/models/settings/settings_activity.dart'; - -part 'settings_activity_state.dart'; - -class ActivitySettingsCubit extends HydratedCubit<ActivitySettingsState> { - ActivitySettingsCubit() - : super(ActivitySettingsState(settings: ActivitySettings.createDefault())); - - void setValues({ - String? itemsCount, - String? timerValue, - }) { - emit( - ActivitySettingsState( - settings: ActivitySettings( - itemsCount: itemsCount ?? state.settings.itemsCount, - timerValue: timerValue ?? state.settings.timerValue, - ), - ), - ); - } - - String getParameterValue(String code) { - switch (code) { - case DefaultActivitySettings.parameterCodeItemsCount: - return ActivitySettings.getItemsCountValueFromUnsafe(state.settings.itemsCount); - case DefaultActivitySettings.parameterCodeTimerValue: - return ActivitySettings.getTimerValueFromUnsafe(state.settings.timerValue); - } - - return ''; - } - - void setParameterValue(String code, String value) { - final String itemsCount = code == DefaultActivitySettings.parameterCodeItemsCount - ? value - : getParameterValue(DefaultActivitySettings.parameterCodeItemsCount); - final String timerValue = code == DefaultActivitySettings.parameterCodeTimerValue - ? value - : getParameterValue(DefaultActivitySettings.parameterCodeTimerValue); - - setValues( - itemsCount: itemsCount, - timerValue: timerValue, - ); - } - - @override - ActivitySettingsState? fromJson(Map<String, dynamic> json) { - final String itemsCount = json[DefaultActivitySettings.parameterCodeItemsCount] as String; - final String timerValue = json[DefaultActivitySettings.parameterCodeTimerValue] as String; - - return ActivitySettingsState( - settings: ActivitySettings( - itemsCount: itemsCount, - timerValue: timerValue, - ), - ); - } - - @override - Map<String, dynamic>? toJson(ActivitySettingsState state) { - return <String, dynamic>{ - DefaultActivitySettings.parameterCodeItemsCount: state.settings.itemsCount, - DefaultActivitySettings.parameterCodeTimerValue: state.settings.timerValue, - }; - } -} 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 a1a59d808d34027ca79c4a3dcbbfcacda488373a..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:petitbac/config/default_global_settings.dart'; -import 'package:petitbac/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/main.dart b/lib/main.dart index 9e24ed1384a7d31cabe14585d2db08027a2c5199..4a11476bff513413e4f601b27b2213e5cd0b4b1b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -9,8 +9,6 @@ import 'package:petitbac/common/cubit/nav/nav_cubit_screens.dart'; import 'package:petitbac/config/application_config.dart'; import 'package:petitbac/cubit/activity/activity_cubit.dart'; -import 'package:petitbac/cubit/settings/settings_activity_cubit.dart'; -import 'package:petitbac/cubit/settings/settings_global_cubit.dart'; import 'package:petitbac/ui/skeleton.dart'; void main() async { @@ -61,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 diff --git a/lib/models/activity/activity.dart b/lib/models/activity/activity.dart index f94eff2fb8458eb3d580aed8c2eda4333e4ff749..a168680d7a2789be78830d1ea6ff80ab84c0e4b5 100644 --- a/lib/models/activity/activity.dart +++ b/lib/models/activity/activity.dart @@ -1,17 +1,15 @@ import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; +import 'package:petitbac/config/application_config.dart'; import 'package:petitbac/data/fetch_data_helper.dart'; import 'package:petitbac/models/data/category.dart'; import 'package:petitbac/models/data/letter.dart'; import 'package:petitbac/models/activity/game_item.dart'; -import 'package:petitbac/models/settings/settings_activity.dart'; -import 'package:petitbac/models/settings/settings_global.dart'; class Activity { Activity({ // Settings required this.activitySettings, - required this.globalSettings, // State this.isRunning = false, @@ -29,7 +27,6 @@ class Activity { // Settings final ActivitySettings activitySettings; - final GlobalSettings globalSettings; // State bool isRunning; @@ -46,27 +43,25 @@ class Activity { factory Activity.createEmpty() { return Activity( - activitySettings: ActivitySettings.createDefault(), - globalSettings: GlobalSettings.createDefault(), + // Settings + activitySettings: ActivitySettings.createDefault(appConfig: ApplicationConfig.config), + // Base data items: [], ); } factory Activity.createNew({ ActivitySettings? activitySettings, - GlobalSettings? globalSettings, }) { - final ActivitySettings newActivitySettings = - activitySettings ?? ActivitySettings.createDefault(); - final GlobalSettings newGlobalSettings = globalSettings ?? GlobalSettings.createDefault(); + final ActivitySettings newActivitySettings = activitySettings ?? + ActivitySettings.createDefault(appConfig: ApplicationConfig.config); - final List<GameItem> items = - FetchDataHelper().getRandomItems(newActivitySettings.itemsCountValue); + final List<GameItem> items = FetchDataHelper().getRandomItems( + newActivitySettings.getAsInt(ApplicationConfig.parameterCodeItemsCount)); return Activity( // Settings activitySettings: newActivitySettings, - globalSettings: newGlobalSettings, // State isRunning: true, isStarted: true, @@ -88,7 +83,6 @@ class Activity { printlog('$Activity:'); printlog(' Settings'); activitySettings.dump(); - globalSettings.dump(); printlog(' State'); printlog(' isRunning: $isRunning'); printlog(' isStarted: $isStarted'); @@ -111,7 +105,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 3686402b68ff4fdc51cfd9dec1e246cf5a988220..0000000000000000000000000000000000000000 --- a/lib/models/settings/settings_activity.dart +++ /dev/null @@ -1,58 +0,0 @@ -import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; - -import 'package:petitbac/config/default_activity_settings.dart'; - -class ActivitySettings { - final String itemsCount; - final String timerValue; - - ActivitySettings({ - required this.itemsCount, - required this.timerValue, - }); - - int get itemsCountValue => DefaultActivitySettings.getItemsCountValueFromCode(itemsCount); - int get timerCountValue => DefaultActivitySettings.getTimerValueFromCode(timerValue); - - static String getItemsCountValueFromUnsafe(String itemsCount) { - if (DefaultActivitySettings.allowedItemsCountValues.contains(itemsCount)) { - return itemsCount; - } - - return DefaultActivitySettings.defaultItemsCountValue; - } - - static String getTimerValueFromUnsafe(String timerValue) { - if (DefaultActivitySettings.allowedTimerValues.contains(timerValue)) { - return timerValue; - } - - return DefaultActivitySettings.defaultTimerValue; - } - - factory ActivitySettings.createDefault() { - return ActivitySettings( - itemsCount: DefaultActivitySettings.defaultItemsCountValue, - timerValue: DefaultActivitySettings.defaultTimerValue, - ); - } - - void dump() { - printlog('$ActivitySettings:'); - printlog(' ${DefaultActivitySettings.parameterCodeItemsCount}: $itemsCount'); - printlog(' ${DefaultActivitySettings.parameterCodeTimerValue}: $timerValue'); - printlog(''); - } - - @override - String toString() { - return '$ActivitySettings(${toJson()})'; - } - - Map<String, dynamic>? toJson() { - return <String, dynamic>{ - DefaultActivitySettings.parameterCodeItemsCount: itemsCount, - DefaultActivitySettings.parameterCodeTimerValue: timerValue, - }; - } -} diff --git a/lib/models/settings/settings_global.dart b/lib/models/settings/settings_global.dart deleted file mode 100644 index e0a5a46596a88ae117ab3ad68fb32e313b0536f9..0000000000000000000000000000000000000000 --- a/lib/models/settings/settings_global.dart +++ /dev/null @@ -1,42 +0,0 @@ -import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; - -import 'package:petitbac/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/ui/game/game_top.dart b/lib/ui/game/game_top.dart index a9b4ae279f2ee8e9b35f0d04d0920f8ce5c528c2..00a5b96813e6c54e8d5b61a4301f46ac20de648a 100644 --- a/lib/ui/game/game_top.dart +++ b/lib/ui/game/game_top.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; +import 'package:petitbac/config/application_config.dart'; import 'package:petitbac/cubit/activity/activity_cubit.dart'; import 'package:petitbac/models/activity/activity.dart'; @@ -14,7 +15,9 @@ class GameTopWidget extends StatelessWidget { builder: (BuildContext context, ActivityState activityState) { final Activity currentActivity = activityState.currentActivity; - return currentActivity.activitySettings.itemsCountValue != 0 + return currentActivity.activitySettings + .getAsInt(ApplicationConfig.parameterCodeItemsCount) != + 0 ? const GamePositionIndicator() : const SizedBox.shrink(); }, 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/widgets/game/game_countdown.dart b/lib/ui/widgets/game/game_countdown.dart index 4150f26abdb56ad93500eaa69ca6dd63c1331a9a..a9957da918409157a2ff956c55eb169e52d1924b 100644 --- a/lib/ui/widgets/game/game_countdown.dart +++ b/lib/ui/widgets/game/game_countdown.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; +import 'package:petitbac/config/application_config.dart'; import 'package:petitbac/cubit/activity/activity_cubit.dart'; -import 'package:petitbac/cubit/settings/settings_activity_cubit.dart'; import 'package:petitbac/models/activity/activity.dart'; class GameButtonNextWithCountdown extends StatelessWidget { @@ -48,7 +48,9 @@ class GameButtonNextWithCountdown extends StatelessWidget { if (currentActivity.isFinished) { activityCubit.quitActivity(); } else { - if (currentActivity.activitySettings.itemsCountValue == 0) { + if (currentActivity.activitySettings + .getAsInt(ApplicationConfig.parameterCodeItemsCount) == + 0) { activityCubit.pickNewItem(); activityCubit.startTimer(); } else { diff --git a/lib/ui/widgets/game/game_position_indicator.dart b/lib/ui/widgets/game/game_position_indicator.dart index db668bad050eb60ef86ecc8ba59a4f4b52a45ec0..30c6539960d94753e3922c38930496f90232f64f 100644 --- a/lib/ui/widgets/game/game_position_indicator.dart +++ b/lib/ui/widgets/game/game_position_indicator.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; +import 'package:petitbac/config/application_config.dart'; import 'package:petitbac/cubit/activity/activity_cubit.dart'; import 'package:petitbac/models/activity/activity.dart'; @@ -14,7 +15,8 @@ class GamePositionIndicator extends StatelessWidget { final Activity currentActivity = activityState.currentActivity; final int currentPosition = currentActivity.position + 1; - final int maxPosition = currentActivity.activitySettings.itemsCountValue; + final int maxPosition = currentActivity.activitySettings + .getAsInt(ApplicationConfig.parameterCodeItemsCount); // Normalized [0..1] value final double barValue = currentPosition / maxPosition; diff --git a/pubspec.lock b/pubspec.lock index 1896dfc3582bc30a9743cfeb6b5a0e3e3b46fcd3..0d7744cbc920c4c2cb00c639e11ef7197325b30e 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -122,11 +122,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 b89b787369070cdc68a00013c3f7b441314124e2..831c79bd37ccd2f0ccd24a093339b5e0bdb103d6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: A PetitBac game application. publish_to: "none" -version: 1.6.2+48 +version: 1.7.0+49 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 # (none)