Agregada la función de cerrar botones del FAB tras agregar un archivo o carpeta

parent 94520476
......@@ -4,20 +4,17 @@ import 'package:prueba_multimedia/modelo/conversor.dart';
import 'convertible.dart';
import 'formato.dart';
// TODO: QUE PASA SI NO RECONOCEMOS EL FORMATO?
// TODO: MIRAR DE CREAR UN MIXIN TIPO ELEMENTOLOCAL O ALGO ASÍ (Archivo y Carpeta)
class Archivo extends Convertible {
final File file;
late final Future<List<Metadato>> metadatos;
Archivo({required super.id, required this.file}):
super(
super(
nombre: file.path.split('/').last,
// TODO: POR AHORA USAMOS (!) PERO HAY QUE TENERLO EN CUENTA
formatoOriginal: Formato.fromExtension(file.path.split('.').last)!,
icon: Formato.fromExtension(file.path.split('.').last)!.tipoMultimedia.icono
)
{
metadatos = Conversor.getMetadatos(this);
}
}
\ No newline at end of file
}
import 'elemento_seleccionable.dart';
import 'formato.dart';
// TODO: QUE PASA SI NO RECONOCEMOS EL FORMATO?
class Convertible extends ElementoSeleccionable{
final Formato _formatoOriginal;
Formato? formatoDestino;
......
......@@ -4,6 +4,7 @@ import 'package:uuid/uuid.dart';
import 'carpeta.dart';
import 'elemento_seleccionable.dart';
import 'archivo.dart';
import 'formato.dart';
class ListaSeleccionables extends ChangeNotifier {
final _seleccionables = <ElementoSeleccionable>[];
......@@ -19,18 +20,23 @@ class ListaSeleccionables extends ChangeNotifier {
notifyListeners();
}
void addArchivo(File file) {
_seleccionables.add(Archivo(id: const Uuid().v1(),
file: file));
notifyListeners();
bool addArchivo(File file) {
if(Formato.fromExtension(file.path.split('.').last) != null){
_seleccionables.add(Archivo(id: const Uuid().v1(),
file: file));
notifyListeners();
return true;
}
return false;
}
void addCarpeta(Directory directory){
bool addCarpeta(Directory directory){
final newCarpeta = Carpeta(
id: const Uuid().v1(),
directory: directory
);
//if(newCarpeta.formatos.isNotEmpty){
if(newCarpeta.formatos.isNotEmpty){
_seleccionables.add(
Carpeta(
id: const Uuid().v1(),
......@@ -38,7 +44,10 @@ class ListaSeleccionables extends ChangeNotifier {
)
);
notifyListeners();
//}
return true;
}
return false;
}
void reinsertar(int index, ElementoSeleccionable element){
......
......@@ -25,31 +25,31 @@ class _PaginaConfiguracionState extends State<PaginaConfiguracion> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: RichText(
maxLines: 1,
overflow: TextOverflow.ellipsis,
text: TextSpan(
children: [
WidgetSpan(
child: widget._elementoAsociado.icono
),
TextSpan(
text: " ${widget._elementoAsociado.nombre}",
style: Theme.of(context).textTheme.titleLarge,
)
]
)
appBar: AppBar(
title: RichText(
maxLines: 1,
overflow: TextOverflow.ellipsis,
text: TextSpan(
children: [
WidgetSpan(
child: widget._elementoAsociado.icono
),
TextSpan(
text: " ${widget._elementoAsociado.nombre}",
style: Theme.of(context).textTheme.titleLarge,
)
]
)
),
),
),
body: _construirCuerpo(),
bottomNavigationBar: widget._elementoAsociado is Archivo
? BottomNavigationBar(
currentIndex: _categoriaActiva,
onTap: (int indice) => setState(() { _categoriaActiva = indice; }),
items: _construirElementosBarraNavegacion()
)
: null
body: _construirCuerpo(),
bottomNavigationBar: widget._elementoAsociado is Archivo
? BottomNavigationBar(
currentIndex: _categoriaActiva,
onTap: (int indice) => setState(() { _categoriaActiva = indice; }),
items: _construirElementosBarraNavegacion()
)
: null
);
}
......@@ -119,3 +119,4 @@ class _PaginaConfiguracionState extends State<PaginaConfiguracion> {
}
}
......@@ -8,8 +8,10 @@ class ActionButton extends StatelessWidget {
final ActionButtonTypes tipoBoton;
final ListaSeleccionables manager;
final BuildContext context;
final VoidCallback? onSuccess;
const ActionButton({super.key, required this.tipoBoton,
required this.manager, required this.context});
required this.manager, required this.context, this.onSuccess});
void Function() getCallback() {
return switch(tipoBoton) {
......@@ -41,14 +43,23 @@ class ActionButton extends StatelessWidget {
FilePickerResult? result = await FilePicker.platform.pickFiles();
if (result != null) {
File file = File(result.files.first.path!);
manager.addArchivo(file);
final res = manager.addArchivo(file);
if(res){
if(context.mounted && onSuccess != null){
onSuccess!();
}
}
else{
if (context.mounted) {
_mostrarSnackBar('El archivo seleccionado no es de un formato multimedia conocido');
}
}
} // Mensaje indicando que se seleccione un archivo
else {
// Comprobar que el widget no ha sido destruido por ser asíncrono
if (context.mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text("Selecciona una archivo"))
);
_mostrarSnackBar('No se ha seleccionado ningún archivo');
}
}
}
......@@ -76,14 +87,22 @@ class ActionButton extends StatelessWidget {
FilePicker.platform.getDirectoryPath().then( (path) {
if (path != null) {
var directory = Directory(path);
manager.addCarpeta(directory);
final res = manager.addCarpeta(directory);
if(res){
if(context.mounted && onSuccess != null){
onSuccess!();
}
}
else{
if (context.mounted) {
_mostrarSnackBar('La carpeta seleccionada no contiene archivos de formatos multimedia conoocidos');
}
}
} // Mensaje indicando que se seleccione una carpeta
else {
// Comprobar que el widget no ha sido destruido por ser asíncrono
if (context.mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text("Selecciona una carpeta"))
);
_mostrarSnackBar('No se ha seleccionado ninguna carpeta');
}
}
});
......@@ -143,6 +162,13 @@ class ActionButton extends StatelessWidget {
);
}
void _mostrarSnackBar(String text) {
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(
text
)
));
}
}
enum ActionButtonTypes {
......
......@@ -139,8 +139,17 @@ class _ConVertexFabBarState extends State<ConVertexFabBar> {
List<Widget> _loadAgregarActionButtons(BuildContext context,
ListaSeleccionables manager)
{
final VoidCallback closeButtons = () {
setState(() {
_convertirOpen = false;
_agregarOpen = false;
});
_convertirKey.currentState?.close();
_agregarKey.currentState?.close();
};
return agregarButtonTypes.map( (type) {
return ActionButton(tipoBoton: type, manager: manager, context: context,);
return ActionButton(tipoBoton: type, manager: manager, context: context, onSuccess: closeButtons,);
}).toList();
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment