import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:puissance4/common/ui/parameters/parameter_widget.dart'; import 'package:puissance4/config/default_activity_settings.dart'; import 'package:puissance4/config/default_global_settings.dart'; import 'package:puissance4/cubit/activity/activity_cubit.dart'; import 'package:puissance4/cubit/settings/settings_activity_cubit.dart'; import 'package:puissance4/cubit/settings/settings_global_cubit.dart'; import 'package:puissance4/models/activity/activity.dart'; import 'package:puissance4/ui/widgets/actions/button_delete_saved_game.dart'; import 'package:puissance4/ui/widgets/actions/button_game_start_new.dart'; import 'package:puissance4/ui/widgets/actions/button_resume_saved_game.dart'; class PageParameters extends StatelessWidget { const PageParameters({super.key}); final double separatorHeight = 8.0; @override Widget build(BuildContext context) { return BlocBuilder<ActivityCubit, ActivityState>( builder: (BuildContext context, ActivityState activityState) { final Activity currentActivity = activityState.currentActivity; final List<Widget> lines = []; // Game 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 game lines.add( const AspectRatio( aspectRatio: 3, child: StartNewGameButton(), ), ); } else { // Resume game lines.add(const AspectRatio( aspectRatio: 3, child: ResumeSavedGameButton(), )); // Delete saved game lines.add(SizedBox.square( dimension: MediaQuery.of(context).size.width / 5, child: const DeleteSavedGameButton(), )); } 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; } }