import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:sortgame/config/default_game_settings.dart'; import 'package:sortgame/config/default_global_settings.dart'; import 'package:sortgame/cubit/settings_game_cubit.dart'; import 'package:sortgame/cubit/settings_global_cubit.dart'; import 'package:sortgame/ui/parameters/parameter_image.dart'; import 'package:sortgame/ui/parameters/parameter_painter.dart'; import 'package:sortgame/ui/widgets/actions/button_delete_saved_game.dart'; import 'package:sortgame/ui/widgets/actions/button_game_start_new.dart'; import 'package:sortgame/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(SizedBox(height: separatorHeight)); if (!canResume) { // Start new game lines.add(const Expanded( child: StartNewGameButton(), )); } else { // Resume game lines.add(const Expanded( child: ResumeSavedGameButton(), )); // Delete saved game lines.add(SizedBox.square( dimension: MediaQuery.of(context).size.width / 4, 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 isActive = (value == currentValue); final double displayWidth = MediaQuery.of(context).size.width; final double itemWidth = displayWidth / availableValues.length - 26; final bool displayedWithAssets = DefaultGlobalSettings.displayedWithAssets.contains(code) || DefaultGameSettings.displayedWithAssets.contains(code); return TextButton( child: Container( child: displayedWithAssets ? SizedBox.square( dimension: itemWidth, child: ParameterImage( code: code, value: value, isSelected: isActive, ), ) : CustomPaint( size: Size(itemWidth, itemWidth), willChange: false, painter: ParameterPainter( code: code, value: value, isSelected: isActive, gameSettings: gameSettingsState.settings, globalSettings: globalSettingsState.settings, ), isComplex: true, ), ), onPressed: () => isGlobal ? globalSettingsCubit.setParameterValue(code, value) : gameSettingsCubit.setParameterValue(code, value), ); }, ); }, ); parameterButtons.add(parameterButton); } return parameterButtons; } }