import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; class PageParameters extends StatelessWidget { const PageParameters({ super.key, required this.appConfig, required this.canBeResumed, }); final ApplicationConfigDefinition appConfig; final bool canBeResumed; final double separatorHeight = 8.0; @override Widget build(BuildContext context) { final List<Widget> lines = []; // Activity settings (top) for (ApplicationSettingsParameter parameter in appConfig.activitySettings) { if (parameter.displayedOnTop) { for (var itemsLine in buildParametersLines( parameter: parameter, isEnabled: !canBeResumed, )) { lines.add(Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: itemsLine, )); } lines.add(SizedBox(height: separatorHeight)); } } lines.add(Expanded( child: SizedBox(height: separatorHeight), )); if (canBeResumed) { // Resume activity lines.add(AspectRatio( aspectRatio: 3, child: ActivityButtonResumeSaved( onPressed: () { appConfig.resumeActivity(context); }, ), )); // Delete saved activity lines.add(SizedBox.square( dimension: MediaQuery.of(context).size.width / 5, child: ActivityButtonDeleteSaved( onPressed: () { appConfig.deleteCurrentActivity(context); }, ), )); } else { // Start new activity lines.add( AspectRatio( aspectRatio: 3, child: ActivityButtonStartNew( onPressed: () { appConfig.startNewActivity(context); }, ), ), ); } lines.add(SizedBox(height: separatorHeight)); // Activity settings (bottom) for (ApplicationSettingsParameter parameter in appConfig.activitySettings) { if (!parameter.displayedOnTop) { for (var itemsLine in buildParametersLines( parameter: parameter, isEnabled: !canBeResumed, )) { lines.add(Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: itemsLine, )); } lines.add(SizedBox(height: separatorHeight)); } } return Column( children: lines, ); } List<List<Widget>> buildParametersLines({ required ApplicationSettingsParameter parameter, required bool isEnabled, }) { final List<ApplicationSettingsParameterItemValue> items = parameter.values; final List<Widget> parameterButtons = []; if (items.length <= 1) { return []; } final int itemsPerLine = parameter.itemsPerLine != 0 ? parameter.itemsPerLine : items.length; // Build linear list for (ApplicationSettingsParameterItemValue item in items) { final Widget parameterButton = BlocBuilder<ActivitySettingsCubit, ActivitySettingsState>( builder: (BuildContext context, ActivitySettingsState activitySettingsState) { final ActivitySettingsCubit activitySettingsCubit = BlocProvider.of<ActivitySettingsCubit>(context); final double displayWidth = MediaQuery.of(context).size.width; final double itemWidth = displayWidth / itemsPerLine - 4; return SizedBox.square( dimension: itemWidth, child: parameter.buildParameterItem( context: context, parameter: parameter, itemValue: item, size: itemWidth, onPressed: isEnabled ? () { activitySettingsCubit.set(parameter.code, item.value); } : null, ), ); }, ); parameterButtons.add(parameterButton); } // Split buttons in lines according to items count limit per line final List<List<Widget>> lines = []; List<Widget> line = []; for (var parameterButton in parameterButtons) { line.add(parameterButton); if (line.length == itemsPerLine) { lines.add(line); line = []; } } if (line.length != itemsPerLine) { lines.add(line); } return lines; } }