Erdnaxela3/bioptim_gui

View on GitHub
gui/lib/screens/generate_code_page/generic/generate_phases.dart

Summary

Maintainability
Test Coverage
import 'package:bioptim_gui/models/decision_variables_type.dart';
import 'package:bioptim_gui/models/ocp_data.dart';
import 'package:bioptim_gui/models/penalty.dart';
import 'package:bioptim_gui/widgets/generic_ocp/bio_model_chooser.dart';
import 'package:bioptim_gui/widgets/generic_ocp/generic_dynamics_chooser.dart';
import 'package:bioptim_gui/widgets/generic_ocp/phase_information.dart';
import 'package:bioptim_gui/widgets/penalties/penalty_expander.dart';
import 'package:bioptim_gui/widgets/utils/animated_expanding_widget.dart';
import 'package:bioptim_gui/widgets/variables/decision_variable_expander.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

class PhaseGenerationMenu extends StatelessWidget {
  const PhaseGenerationMenu({
    super.key,
    required this.width,
  });

  final double width;

  @override
  Widget build(BuildContext context) {
    return Consumer<OCPData>(builder: (context, data, child) {
      return Row(
        crossAxisAlignment: CrossAxisAlignment.start,
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          for (int i = 0; i < data.nbPhases; i++)
            Padding(
              padding: const EdgeInsets.symmetric(horizontal: 36),
              child: SizedBox(width: width, child: _buildPhase(phaseIndex: i)),
            ),
        ],
      );
    });
  }

  Widget _buildPhase({required int phaseIndex}) {
    return Consumer<OCPData>(builder: (context, data, child) {
      return AnimatedExpandingWidget(
        header: Center(
          child: Text(
            data.nbPhases > 1
                ? 'Information on phase ${phaseIndex + 1}'
                : 'Information on the phase',
            style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
          ),
        ),
        initialExpandedState: true,
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            const SizedBox(height: 24),
            BioModelChooser(phaseIndex: phaseIndex),
            const SizedBox(height: 12),
            PhaseInformation(phaseIndex: phaseIndex, width: width),
            const SizedBox(height: 12),
            GenericDynamicsChooser(
              phaseIndex: phaseIndex,
              width: width,
            ),
            const SizedBox(height: 12),
            const Divider(),
            DecisionVariableExpander(
                decisionVariableType: DecisionVariableType.state,
                phaseIndex: phaseIndex,
                width: width,
                endpointPrefix: 'generic_ocp/phases_info'),
            const SizedBox(height: 12),
            const Divider(),
            DecisionVariableExpander(
              decisionVariableType: DecisionVariableType.control,
              phaseIndex: phaseIndex,
              width: width,
              endpointPrefix: 'generic_ocp/phases_info',
            ),
            const SizedBox(height: 12),
            const Divider(),
            PenaltyExpander(
              penaltyType: Objective,
              phaseIndex: phaseIndex,
              width: width,
              endpointPrefix: '/generic_ocp/phases_info',
            ),
            const Divider(),
            PenaltyExpander(
              penaltyType: Constraint,
              phaseIndex: phaseIndex,
              width: width,
              endpointPrefix: '/generic_ocp/phases_info',
            ),
          ],
        ),
      );
    });
  }
}