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

import 'package:reversi/common/cubit/nav/nav_cubit_pages.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';

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;
  }
}