Skip to content
Snippets Groups Projects
parameters.dart 4.91 KiB
Newer Older
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';

import 'package:reversi/common/ui/parameters/parameter_widget.dart';

import 'package:reversi/config/default_activity_settings.dart';
import 'package:reversi/config/default_global_settings.dart';
import 'package:reversi/cubit/activity/activity_cubit.dart';
import 'package:reversi/cubit/settings/settings_activity_cubit.dart';
import 'package:reversi/cubit/settings/settings_global_cubit.dart';
import 'package:reversi/models/activity/activity.dart';
import 'package:reversi/ui/widgets/actions/button_delete_saved_game.dart';
import 'package:reversi/ui/widgets/actions/button_game_start_new.dart';
import 'package:reversi/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;
  }
}