import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:snake/config/default_game_settings.dart'; import 'package:snake/config/default_global_settings.dart'; import 'package:snake/cubit/settings_game_cubit.dart'; import 'package:snake/cubit/settings_global_cubit.dart'; import 'package:snake/ui/parameters/parameter_widget.dart'; import 'package:snake/ui/widgets/actions/button_delete_saved_game.dart'; import 'package:snake/ui/widgets/actions/button_game_start_new.dart'; import 'package:snake/ui/widgets/actions/button_resume_saved_game.dart'; class ParametersLayout extends StatelessWidget { const ParametersLayout({super.key, required this.canResume}); final bool canResume; final double separatorHeight = 8.0; @override Widget build(BuildContext context) { final List<Widget> lines = []; // Game settings for (String code in DefaultGameSettings.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 (canResume == 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) : DefaultGameSettings.getAvailableValues(code); if (availableValues.length <= 1) { return []; } for (String value in availableValues) { final Widget parameterButton = BlocBuilder<GameSettingsCubit, GameSettingsState>( builder: (BuildContext context, GameSettingsState gameSettingsState) { return BlocBuilder<GlobalSettingsCubit, GlobalSettingsState>( builder: (BuildContext context, GlobalSettingsState globalSettingsState) { final GameSettingsCubit gameSettingsCubit = BlocProvider.of<GameSettingsCubit>(context); final GlobalSettingsCubit globalSettingsCubit = BlocProvider.of<GlobalSettingsCubit>(context); final String currentValue = isGlobal ? globalSettingsCubit.getParameterValue(code) : gameSettingsCubit.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, gameSettings: gameSettingsState.settings, globalSettings: globalSettingsState.settings, onPressed: () { isGlobal ? globalSettingsCubit.setParameterValue(code, value) : gameSettingsCubit.setParameterValue(code, value); }, ), ); }, ); }, ); parameterButtons.add(parameterButton); } return parameterButtons; } }