Erdnaxela3/bioptim_gui

View on GitHub
gui/lib/widgets/acrobatics/acrobatic_bio_model_chooser.dart

Summary

Maintainability
Test Coverage
import 'dart:io';
import 'package:bioptim_gui/models/ocp_data.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

class AcrobaticBioModelChooser extends StatefulWidget {
  const AcrobaticBioModelChooser({
    super.key,
    this.width,
    this.defaultValue = '',
  });

  final double? width;
  final String defaultValue;

  @override
  AcrobaticBioModelChooserState createState() =>
      AcrobaticBioModelChooserState();
}

class AcrobaticBioModelChooserState extends State<AcrobaticBioModelChooser> {
  String modelPath = '';

  @override
  void initState() {
    modelPath = widget.defaultValue;
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Consumer<OCPData>(builder: (context, data, child) {
      return SizedBox(
        width: widget.width,
        child: TextField(
          decoration: InputDecoration(
            labelText: "Model path *",
            enabledBorder: const OutlineInputBorder(
              borderSide: BorderSide(color: Colors.red),
            ),
            focusedBorder: const OutlineInputBorder(
              borderSide: BorderSide(color: Colors.red),
            ),
            suffixIcon: IconButton(
              icon: const Icon(Icons.file_upload_outlined),
              onPressed: () async {
                final results = await FilePicker.platform.pickFiles(
                  type: FileType.custom,
                  allowedExtensions: ["bioMod"],
                );
                if (results == null) return;

                data.updateBioModel(
                    results.paths.map((path) => File(path!)).toList());

                setState(() {
                  modelPath = results.files.single.path!;
                });
              },
            ),
          ),
          autofocus: true,
          controller: TextEditingController(
            text: modelPath.isEmpty
                ? 'Select the model file'
                : File(modelPath).uri.pathSegments.last,
          ),
          readOnly: true,
          style: const TextStyle(
            color: Colors.black,
          ),
        ),
      );
    });
  }
}