En proceso de refactorizar

parent 54232159
...@@ -5,6 +5,7 @@ import 'convertible.dart'; ...@@ -5,6 +5,7 @@ import 'convertible.dart';
import 'formato.dart'; import 'formato.dart';
// TODO: QUE PASA SI NO RECONOCEMOS EL FORMATO? // 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 { class Archivo extends Convertible {
final File file; final File file;
late final Future<List<Metadato>> metadatos; late final Future<List<Metadato>> metadatos;
......
import 'dart:io'; import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';
import 'archivo.dart';
import 'convertible.dart'; import 'convertible.dart';
import 'elemento_seleccionable.dart'; import 'elemento_seleccionable.dart';
import 'formato.dart'; import 'formato.dart';
class Carpeta extends ElementoSeleccionable{ class Carpeta extends ElementoSeleccionable {
final Directory _directory; final Directory _directory;
bool _incluirSubcarpetas = false; bool _incluirSubcarpetas = false;
bool _open = false; // bool _open = false;
late final List<InfoFormato> _formatos; final List<InfoFormato> _formatos = <InfoFormato>[];
final _elementos = <FileSystemEntity>[];
Directory get directory => _directory; Directory get directory => _directory;
List<InfoFormato> get formatos => List.unmodifiable(_formatos); List<InfoFormato> get formatos => List.unmodifiable(_formatos);
bool get isOpen => _open; List<FileSystemEntity> get elementos => List.unmodifiable(_elementos);
// bool get isOpen => _open;
bool get incluyeSubcarpetas => _incluirSubcarpetas; bool get incluyeSubcarpetas => _incluirSubcarpetas;
Carpeta({required super.id, required Directory directory}): Carpeta({required super.id, required Directory directory}):
_directory = directory, _directory = directory,
super(nombre: directory.path.split('/').last, icon: const Icon(Icons.folder_outlined)) super(nombre: directory.path.split('/').last, icon: const Icon(Icons.folder_outlined))
{ {
_formatos = []; final elementos = directory.listSync(recursive: _incluirSubcarpetas, followLinks: false);
final archivos = directory.listSync(recursive: true, followLinks: false); // Ahora mismo no funciona por tema permisos pero Diego está trabajando en ello
for(var a in archivos) { for(var fse in elementos) {
Formato? f = Formato.fromExtension(a.path.split(".").last); Formato? f = Formato.fromExtension(fse.path.split(".").last);
if(f != null){ if (f != null) {
_formatos.add(InfoFormato( /*
Creo que podríamos usar mejor _elementos que _formatos
para la construcción de las CarpetaWidget, pero no voy a
quitar _formatos para que la pagina de configuración de la
carpeta siga funcionando
*/
_formatos.add(
InfoFormato (
formato: f, formato: f,
nombreCarpeta: directory.path.split('/').last, nombreCarpeta: directory.path.split('/').last,
subCarpeta: false)); subCarpeta: false
)
);
_elementos.add(fse);
} }
} }
} }
/*
Carpeta.fromList({required super.id, required Directory directory, required List<InfoFormato> formatos}): Carpeta.fromList({required super.id, required Directory directory, required List<InfoFormato> formatos}):
_directory = directory, _formatos = formatos, _directory = directory, _formatos = formatos,
super(nombre: directory.path.split('/').last, icon: const Icon(Icons.folder_outlined)); super(nombre: directory.path.split('/').last, icon: const Icon(Icons.folder_outlined));
*/
InfoFormato? getInfoFormato({required Formato formato}){ InfoFormato? getInfoFormato({required Formato formato}){
for(InfoFormato i in _formatos){ for(InfoFormato i in _formatos){
...@@ -56,9 +69,16 @@ class Carpeta extends ElementoSeleccionable{ ...@@ -56,9 +69,16 @@ class Carpeta extends ElementoSeleccionable{
} }
} }
/*
Esto estaba siendo llamado para guardar que una carpeta había sido abierta
en la página principal para mostrar los archivos y subcarpetas y etc...
Aunque esto lo podriamos tener guerdado solo en el widget correspondiente
void pressOpenClose(){ void pressOpenClose(){
_open = !_open; _open = !_open;
} }
*/
void pressIncluirSubcarpetas(){ void pressIncluirSubcarpetas(){
_incluirSubcarpetas = !_incluirSubcarpetas; _incluirSubcarpetas = !_incluirSubcarpetas;
...@@ -69,6 +89,11 @@ class Carpeta extends ElementoSeleccionable{ ...@@ -69,6 +89,11 @@ class Carpeta extends ElementoSeleccionable{
} }
} }
/**
* Creo que es una clase que ha creado para poder manejar las entidades
* que pueden haber dentro de una carpeta (podría ser Seleccionable)
*/
class InfoFormato { class InfoFormato {
final bool _subcarpeta; final bool _subcarpeta;
bool seleccionado; bool seleccionado;
...@@ -97,7 +122,7 @@ class InfoFormato { ...@@ -97,7 +122,7 @@ class InfoFormato {
@override @override
bool operator ==(Object other) { bool operator ==(Object other) {
if(other is InfoFormato) return this.formatoOriginal == other.formatoOriginal; if(other is InfoFormato) return formatoOriginal == other.formatoOriginal;
return super == other; return super == other;
} }
} }
\ No newline at end of file
...@@ -57,7 +57,7 @@ abstract class Conversor { ...@@ -57,7 +57,7 @@ abstract class Conversor {
valor: campos[1] valor: campos[1]
)); ));
} catch (e) { } catch (e) {
print("No se ha podido añadir un metadato " + campos[0]); print("No se ha podido añadir un metadato ${campos[0]}");
} }
} }
......
...@@ -4,7 +4,6 @@ import 'package:uuid/uuid.dart'; ...@@ -4,7 +4,6 @@ import 'package:uuid/uuid.dart';
import 'carpeta.dart'; import 'carpeta.dart';
import 'elemento_seleccionable.dart'; import 'elemento_seleccionable.dart';
import 'archivo.dart'; import 'archivo.dart';
import 'formato.dart';
class ListaSeleccionables extends ChangeNotifier { class ListaSeleccionables extends ChangeNotifier {
final _seleccionables = <ElementoSeleccionable>[]; final _seleccionables = <ElementoSeleccionable>[];
...@@ -31,13 +30,15 @@ class ListaSeleccionables extends ChangeNotifier { ...@@ -31,13 +30,15 @@ class ListaSeleccionables extends ChangeNotifier {
id: const Uuid().v1(), id: const Uuid().v1(),
directory: directory directory: directory
); );
if(newCarpeta.formatos.isNotEmpty){ //if(newCarpeta.formatos.isNotEmpty){
_seleccionables.add(Carpeta( _seleccionables.add(
Carpeta(
id: const Uuid().v1(), id: const Uuid().v1(),
directory: directory directory: directory
)); )
);
notifyListeners(); notifyListeners();
} //}
} }
void reinsertar(int index, ElementoSeleccionable element){ void reinsertar(int index, ElementoSeleccionable element){
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:prueba_multimedia/modelo/modelo.dart'; import 'package:prueba_multimedia/modelo/modelo.dart';
import 'package:prueba_multimedia/paginas/paginas.dart'; import 'package:prueba_multimedia/paginas/paginas.dart';
class PaginaConfiguracion extends StatefulWidget { class PaginaConfiguracion extends StatefulWidget {
final ListaSeleccionables _lista; final ListaSeleccionables _lista;
final int _indice; final int _indice;
final ElementoSeleccionable _elementoAsociado; final Convertible _elementoAsociado;
final Carpeta? _carpeta;
const PaginaConfiguracion({ const PaginaConfiguracion({
super.key, super.key,
required ListaSeleccionables lista, required ListaSeleccionables lista,
required int indice, required int indice,
required ElementoSeleccionable elemento, required Convertible elemento,
Carpeta? carpeta }): _lista = lista, _indice = indice, _elementoAsociado = elemento;
}): _lista = lista, _indice = indice, _elementoAsociado = elemento,
_carpeta = carpeta;
@override @override
State<PaginaConfiguracion> createState() => _PaginaConfiguracionState(); State<PaginaConfiguracion> createState() => _PaginaConfiguracionState();
...@@ -25,6 +20,7 @@ class PaginaConfiguracion extends StatefulWidget { ...@@ -25,6 +20,7 @@ class PaginaConfiguracion extends StatefulWidget {
class _PaginaConfiguracionState extends State<PaginaConfiguracion> { class _PaginaConfiguracionState extends State<PaginaConfiguracion> {
int _categoriaActiva = 0; int _categoriaActiva = 0;
final _paginas = <Widget>[];
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
...@@ -36,134 +32,88 @@ class _PaginaConfiguracionState extends State<PaginaConfiguracion> { ...@@ -36,134 +32,88 @@ class _PaginaConfiguracionState extends State<PaginaConfiguracion> {
text: TextSpan( text: TextSpan(
children: [ children: [
WidgetSpan( WidgetSpan(
child: _getIcon() child: widget._elementoAsociado.icono
), ),
TextSpan( TextSpan(
text: _getShownName(), text: " ${widget._elementoAsociado.nombre}",
style: Theme.of(context).textTheme.titleLarge, style: Theme.of(context).textTheme.titleLarge,
) )
] ]
) )
), ),
), ),
body: _construirCuerpo(widget._lista), body: _construirCuerpo(),
bottomNavigationBar: _construirBarraNavegacion() bottomNavigationBar: BottomNavigationBar(
currentIndex: _categoriaActiva,
onTap: (int indice) => setState(() { _categoriaActiva = indice; }),
items: _construirElementosBarraNavegacion()
)
); );
} }
Icon _getIcon(){ Widget _construirCuerpo() {
if(widget._elementoAsociado is Carpeta){ Formato formatoOriginal = widget._elementoAsociado.formatoOriginal;
return Icon(Icons.folder); bool esFormatoVideo = formatoOriginal.tipoMultimedia == TipoMultimedia.video;
} var archivo = widget._elementoAsociado as Archivo;
if(widget._elementoAsociado is Enlace){
return Icon(Icons.link);
}
if(widget._elementoAsociado is Convertible){
return (widget._elementoAsociado as Convertible).formatoOriginal.tipoMultimedia.icono;
}
return Icon(Icons.insert_drive_file);
}
String _getShownName() { _paginas.add(
final sb = StringBuffer(); PaginaConversion.convertible(
sb.write(" "); lista: widget._lista,
sb.write(widget._elementoAsociado.nombre);
return sb.toString();
}
Widget _construirCuerpo(ListaSeleccionables manager) {
if(widget._elementoAsociado is Archivo){
final arch = widget._elementoAsociado as Archivo;
if(_categoriaActiva == 0){
if(widget._carpeta != null){
return PaginaConversion.carpeta(
lista: manager,
indiceArchivo: widget._indice,
carpeta: widget._carpeta!,
infoFormato: widget._carpeta!.getInfoFormato(formato: arch.formatoOriginal)!,
formatoOriginal: arch.formatoOriginal
);
}
return PaginaConversion.convertible(
lista: manager,
indiceArchivo: widget._indice, indiceArchivo: widget._indice,
elemento: arch, elemento: widget._elementoAsociado,
formatoOriginal: arch.formatoOriginal formatoOriginal: widget._elementoAsociado.formatoOriginal
)
); );
if (widget._elementoAsociado is Archivo) {
if (esFormatoVideo) {
_paginas.add(PaginaFotograma());
} }
else if(_categoriaActiva == 2 || arch.formatoOriginal.tipoMultimedia != TipoMultimedia.video){ _paginas.add(
return FutureBuilder( FutureBuilder(
future: arch.metadatos, future: archivo.metadatos,
builder: (context, snapshot) { builder: (context, snapshot) {
return snapshot.hasData return snapshot.hasData
? PaginaMetadatos( ? PaginaMetadatos(
metadatos: snapshot.data!, metadatos: snapshot.data!,
formato: arch.formatoOriginal formato: archivo.formatoOriginal
) )
: CircularProgressIndicator(); : const CircularProgressIndicator();
}
);
}
else{
return PaginaFotograma();
} }
} ),
// Páginas de carpetas y formato de archivo para carpeta
// TODO: Carpeta de ejemplo, cargar carpetas de verdad
return PaginaConfiguracionCarpeta(
lista: manager,
carpeta: widget._elementoAsociado as Carpeta,
indice: widget._indice
); );
} }
BottomNavigationBar? _construirBarraNavegacion(){ return _paginas[_categoriaActiva];
if(widget._elementoAsociado is Archivo){
return BottomNavigationBar(
currentIndex: _categoriaActiva,
onTap: (int indice) {
setState(() {
_categoriaActiva = indice;
});
},
items: _construirElementosBarraNavegacion()
);
}
return null;
} }
List<BottomNavigationBarItem> _construirElementosBarraNavegacion(){ List<BottomNavigationBarItem> _construirElementosBarraNavegacion(){
final toRet = <BottomNavigationBarItem>[]; Formato formatoOriginal = widget._elementoAsociado.formatoOriginal;
bool isVideo = false; bool esFormatoVideo = formatoOriginal.tipoMultimedia == TipoMultimedia.video;
if(widget._elementoAsociado is Archivo){ final items = <BottomNavigationBarItem>[
final arch = widget._elementoAsociado as Archivo; const BottomNavigationBarItem(
if(arch.formatoOriginal.tipoMultimedia == TipoMultimedia.video){
isVideo = true;
}
}
// Página de selección de conversión
toRet.add(BottomNavigationBarItem(
icon: Icon(Icons.sync), icon: Icon(Icons.sync),
label: isVideo ? 'Conversión' : 'Formato de Conversión' label: 'Formato de Conversión'
)); ),
];
// Página de selección de fotograma if (widget._elementoAsociado is Archivo) {
if(isVideo){ if (esFormatoVideo) {
toRet.add(BottomNavigationBarItem( items.add(
const BottomNavigationBarItem(
icon: Icon(Icons.local_movies), icon: Icon(Icons.local_movies),
label: 'Fotograma' label: 'Fotograma'
)); )
);
} }
items.add(
// Página de edición de metadatos const BottomNavigationBarItem(
toRet.add(BottomNavigationBarItem(
icon: Icon(Icons.format_list_bulleted), icon: Icon(Icons.format_list_bulleted),
label: 'Metadatos' label: 'Metadatos'
)); ),
);
}
return toRet; return items;
} }
} }
...@@ -215,7 +215,6 @@ class _PaginaConfiguracionCarpetaState extends State<PaginaConfiguracionCarpeta> ...@@ -215,7 +215,6 @@ class _PaginaConfiguracionCarpetaState extends State<PaginaConfiguracionCarpeta>
indice: widget._indice, indice: widget._indice,
elemento: i.conversion, elemento: i.conversion,
lista: widget._lista, lista: widget._lista,
carpeta: widget._carpeta
); );
} }
)); ));
......
...@@ -43,7 +43,7 @@ class PaginaConversion extends StatefulWidget { ...@@ -43,7 +43,7 @@ class PaginaConversion extends StatefulWidget {
class _PaginaConversionState extends State<PaginaConversion> class _PaginaConversionState extends State<PaginaConversion>
with SingleTickerProviderStateMixin { with SingleTickerProviderStateMixin {
Formato? _formatoConvertido; Formato? _formatoConvertido;
Calidad? _calidadActual = null; Calidad? _calidadActual;
bool _showProfiles = true; bool _showProfiles = true;
late final TabController _tabController; late final TabController _tabController;
......
...@@ -27,7 +27,8 @@ class PaginaPrincipalLlena extends StatelessWidget { ...@@ -27,7 +27,8 @@ class PaginaPrincipalLlena extends StatelessWidget {
alignment: Alignment.centerLeft, alignment: Alignment.centerLeft,
child: Padding( child: Padding(
padding: const EdgeInsets.all(4.0), padding: const EdgeInsets.all(4.0),
child: Icon(Icons.delete, child: const Icon(
Icons.delete,
color: Colors.white, color: Colors.white,
size: 31.0 size: 31.0
), ),
...@@ -38,7 +39,8 @@ class PaginaPrincipalLlena extends StatelessWidget { ...@@ -38,7 +39,8 @@ class PaginaPrincipalLlena extends StatelessWidget {
alignment: Alignment.centerRight, alignment: Alignment.centerRight,
child: Padding( child: Padding(
padding: const EdgeInsets.all(4.0), padding: const EdgeInsets.all(4.0),
child: Icon(Icons.delete, child: const Icon(
Icons.delete,
color: Colors.white, color: Colors.white,
size: 31.0 size: 31.0
), ),
...@@ -58,9 +60,17 @@ class PaginaPrincipalLlena extends StatelessWidget { ...@@ -58,9 +60,17 @@ class PaginaPrincipalLlena extends StatelessWidget {
) )
); );
}, },
child: (seleccionables[index] is Carpeta)? child: (seleccionables[index] is Carpeta)
CarpetaWidget(indice: index, carpeta: seleccionables[index] as Carpeta, lista: listaSeleccionables) ? CarpetaWidget(
: SeleccionableWidget(indice: index, seleccionable: seleccionables[index], lista: listaSeleccionables) indice: index,
carpeta: seleccionables[index] as Carpeta,
lista: listaSeleccionables
)
: ConvertibleWidget(
indice: index,
convertible: seleccionables[index] as Convertible,
lista: listaSeleccionables
)
); );
}, },
), ),
......
import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:prueba_multimedia/paginas/paginas.dart'; import 'package:prueba_multimedia/paginas/paginas.dart';
import 'package:prueba_multimedia/modelo/modelo.dart'; import 'package:prueba_multimedia/modelo/modelo.dart';
import 'dart:math'; import 'dart:math';
import 'package:uuid/uuid.dart';
import 'package:uuid/v1.dart';
class CarpetaWidget extends StatefulWidget { class CarpetaWidget extends StatefulWidget {
final int indice; final int indice;
final Carpeta carpeta; final Carpeta carpeta;
final ListaSeleccionables lista; final ListaSeleccionables lista;
const CarpetaWidget({super.key, required this.indice, required this.carpeta, required this.lista}); const CarpetaWidget({super.key, required this.indice,
required this.carpeta, required this.lista});
@override @override
State<CarpetaWidget> createState() => _CarpetaWidgetState(); State<CarpetaWidget> createState() => _CarpetaWidgetState();
} }
class _CarpetaWidgetState extends State<CarpetaWidget> class _CarpetaWidgetState extends State<CarpetaWidget>
with SingleTickerProviderStateMixin{ with SingleTickerProviderStateMixin
static double MAX_HEIGHT = 50; {
static const double maxHeight = 50;
late final AnimationController _controller; late final AnimationController _controller;
List<InfoFormato> seleccionados = []; /// Archivos (o carpetas si es recursivo) que el usuario no ha eliminado
/// de la lista y que coinciden con los formatos elegidos
// TODO: REFECATORIZAR USANDO List<ElementoSeleccionable>
List<ElementoSeleccionable> seleccionados = [];
bool open = false; bool open = false;
double rotAngle = 0; double rotAngle = 0;
double height = 0; double height = 0;
...@@ -26,13 +36,13 @@ class _CarpetaWidgetState extends State<CarpetaWidget> ...@@ -26,13 +36,13 @@ class _CarpetaWidgetState extends State<CarpetaWidget>
@override @override
void initState() { void initState() {
_controller = AnimationController( _controller = AnimationController(
duration: Duration(milliseconds: 200), duration: const Duration(milliseconds: 200),
vsync: this vsync: this
); );
_controller.addListener(() { _controller.addListener(() {
setState(() { setState(() {
rotAngle = pi*_controller.value; rotAngle = pi*_controller.value;
height = MAX_HEIGHT*_controller.value; height = maxHeight*_controller.value;
}); });
}); });
super.initState(); super.initState();
...@@ -41,12 +51,27 @@ class _CarpetaWidgetState extends State<CarpetaWidget> ...@@ -41,12 +51,27 @@ class _CarpetaWidgetState extends State<CarpetaWidget>
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
seleccionados = []; seleccionados = [];
for(var i in widget.carpeta.formatos){ /*
* TODO: POR AHORA COMO ESTOY REFACTORIZANDO NO VOY A FILTRAR POR FORMATO
* El objetivo es que se muestren solo los archivos de los formatos indicados
* en la pagina de configuración de la carpeta. Como estoy refactorizando
* el InfoFormato y este widget ahora utiliza los ElementoSeleccionable
* POR AHORA no voy a filtrar por formatos, PERO LO PONDRÉ CUANDO ACABE
*/
for(var fse in widget.carpeta.elementos) {
/*
if(i.seleccionado && (widget.carpeta.incluyeSubcarpetas || !i.subcarpeta)){ if(i.seleccionado && (widget.carpeta.incluyeSubcarpetas || !i.subcarpeta)){
seleccionados.add(i); seleccionados.add(i);
} }
*/
// Luego aplicar filtros de formatos aqui
if (fse is Directory && widget.carpeta.incluyeSubcarpetas) {
seleccionados.add(Carpeta(id: const Uuid().v1(), directory: fse));
} else {
seleccionados.add(Archivo(id: const Uuid().v1(), file: fse as File));
} }
if(seleccionados.length <= 0){ }
if(seleccionados.isEmpty){
_controller.reset(); _controller.reset();
} }
return SizedBox( return SizedBox(
...@@ -65,8 +90,9 @@ class _CarpetaWidgetState extends State<CarpetaWidget> ...@@ -65,8 +90,9 @@ class _CarpetaWidgetState extends State<CarpetaWidget>
} }
Widget buildMainContainer(){ Widget buildMainContainer(){
String s = ""; Carpeta carpeta = widget.carpeta;
if(seleccionados.length > 1) s = "s"; // Para el plural indicando los formato(s) seleccionado(s)
String s = (seleccionados.length > 1) ? "s" : "";
return SizedBox( return SizedBox(
height: 60, height: 60,
...@@ -74,8 +100,8 @@ class _CarpetaWidgetState extends State<CarpetaWidget> ...@@ -74,8 +100,8 @@ class _CarpetaWidgetState extends State<CarpetaWidget>
child: Row( child: Row(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[ children: <Widget>[
Flexible(flex:1, child: widget.carpeta.icono), Flexible(flex:1, child: carpeta.icono),
Flexible(flex: 1, child: const SizedBox(width: 20)), const Flexible(flex: 1, child: SizedBox(width: 20)),
Flexible( Flexible(
flex: 15, flex: 15,
child: SizedBox.expand( child: SizedBox.expand(
...@@ -86,7 +112,7 @@ class _CarpetaWidgetState extends State<CarpetaWidget> ...@@ -86,7 +112,7 @@ class _CarpetaWidgetState extends State<CarpetaWidget>
Flexible( Flexible(
flex: 1, flex: 1,
child: Text( child: Text(
widget.carpeta.nombre, carpeta.nombre,
style: Theme.of(context).textTheme.bodyLarge?.copyWith( style: Theme.of(context).textTheme.bodyLarge?.copyWith(
fontWeight: FontWeight.bold fontWeight: FontWeight.bold
), ),
...@@ -96,11 +122,11 @@ class _CarpetaWidgetState extends State<CarpetaWidget> ...@@ -96,11 +122,11 @@ class _CarpetaWidgetState extends State<CarpetaWidget>
Flexible( Flexible(
flex: 1, flex: 1,
child: Text( child: Text(
(seleccionados.length > 0)? (seleccionados.isNotEmpty)
'${seleccionados.length} formato$s seleccionado$s' ? '${seleccionados.length} formato$s seleccionado$s'
: 'Ningún formato seleccionado', : 'Ningún formato seleccionado',
style: Theme.of(context).textTheme.bodyLarge?.copyWith( style: Theme.of(context).textTheme.bodyLarge?.copyWith(
color: (seleccionados.length > 0)? null : Colors.red color: (seleccionados.isNotEmpty)? null : Colors.red
) )
), ),
), ),
...@@ -116,15 +142,15 @@ class _CarpetaWidgetState extends State<CarpetaWidget> ...@@ -116,15 +142,15 @@ class _CarpetaWidgetState extends State<CarpetaWidget>
child: IconButton( child: IconButton(
icon: Icon( icon: Icon(
Icons.arrow_drop_down, Icons.arrow_drop_down,
color: (seleccionados.length > 0)? null : Theme.of(context).disabledColor, color: (seleccionados.isEmpty)
), ? Theme.of(context).disabledColor
onPressed: (seleccionados.length <= 0)? null : () { : null,
setState(() { ),
open = !open; onPressed: (seleccionados.isEmpty)
}); ? null
widget.carpeta.pressOpenClose(); : () {
setState(() { open = !open; });
_controller.toggle(); _controller.toggle();
widget.lista.actualizaSeleccionable(widget.indice, widget.carpeta);
} }
), ),
), ),
...@@ -134,14 +160,16 @@ class _CarpetaWidgetState extends State<CarpetaWidget> ...@@ -134,14 +160,16 @@ class _CarpetaWidgetState extends State<CarpetaWidget>
child: IconButton( child: IconButton(
icon: const Icon(Icons.edit), icon: const Icon(Icons.edit),
onPressed: () { onPressed: () {
Navigator.push(context, Navigator.push(
context,
MaterialPageRoute(builder: (context) { MaterialPageRoute(builder: (context) {
return PaginaConfiguracion( return PaginaConfiguracionCarpeta(
indice: widget.indice, indice: widget.indice,
elemento: widget.carpeta, carpeta: carpeta,
lista: widget.lista lista: widget.lista
); );
})); })
);
}, },
), ),
) )
...@@ -151,24 +179,31 @@ class _CarpetaWidgetState extends State<CarpetaWidget> ...@@ -151,24 +179,31 @@ class _CarpetaWidgetState extends State<CarpetaWidget>
} }
List<Widget> buildSecondaryContainers(){ List<Widget> buildSecondaryContainers(){
Carpeta carpeta = widget.carpeta;
int index = 0; int index = 0;
return seleccionados.map((elemento) { return seleccionados.map((elemento) {
index++; index++;
String texto = elemento.formatoOriginal.name.toUpperCase(); String? formatoOrigenYDestino;
if(elemento.formatoDestino != null) texto += " > ${elemento.formatoDestino!.name.toUpperCase()}"; if (elemento is Convertible) {
formatoOrigenYDestino = elemento.formatoOriginal.name.toUpperCase();
if(elemento.formatoDestino != null) {
formatoOrigenYDestino += " > ${elemento.formatoDestino!.name.toUpperCase()}";
}
}
return Positioned( return Positioned(
top: (height+10)*index, top: (height+10)*index,
child: ClipRect( child: ClipRect(
clipper: _MyRectClipper(_controller), clipper: _MyRectClipper(_controller),
child: Dismissible( child: Dismissible(
key: Key(elemento.conversion.id), key: Key(elemento.id),
background: Container( background: Container(
color: Colors.red, color: Colors.red,
alignment: Alignment.centerLeft, alignment: Alignment.centerLeft,
child: Padding( child: const Padding(
padding: const EdgeInsets.only(left: 4.0), padding: EdgeInsets.only(left: 4.0),
child: Icon(Icons.check_box_outline_blank, child: Icon(
Icons.check_box_outline_blank,
color: Colors.white, color: Colors.white,
size: 31.0 size: 31.0
), ),
...@@ -177,9 +212,10 @@ class _CarpetaWidgetState extends State<CarpetaWidget> ...@@ -177,9 +212,10 @@ class _CarpetaWidgetState extends State<CarpetaWidget>
secondaryBackground: Container( secondaryBackground: Container(
color: Colors.red, color: Colors.red,
alignment: Alignment.centerRight, alignment: Alignment.centerRight,
child: Padding( child: const Padding(
padding: const EdgeInsets.only(right: 14.0), padding: EdgeInsets.only(right: 14.0),
child: Icon(Icons.check_box_outline_blank, child: Icon(
Icons.check_box_outline_blank,
color: Colors.white, color: Colors.white,
size: 31.0 size: 31.0
), ),
...@@ -187,22 +223,22 @@ class _CarpetaWidgetState extends State<CarpetaWidget> ...@@ -187,22 +223,22 @@ class _CarpetaWidgetState extends State<CarpetaWidget>
), ),
onDismissed: (direction) { onDismissed: (direction) {
seleccionados.remove(elemento); seleccionados.remove(elemento);
widget.carpeta.pressAltSeleccionado(widget.carpeta.formatos.indexOf(elemento));
widget.lista.actualizaSeleccionable(widget.indice, widget.carpeta);
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
SnackBar( SnackBar(
content: Text('${elemento.formatoOriginal.name.toUpperCase()} excluido de ${widget.carpeta.nombre}'), content: Text(
'${elemento.nombre} '
'excluido de ${carpeta.nombre}'
),
action: SnackBarAction( action: SnackBarAction(
// TODO: HABRÍA QUE ACTUALIZAR EL ESTADO ?
label: 'Deshacer', label: 'Deshacer',
onPressed: () { onPressed: () { seleccionados.insert(index-1, elemento); }
seleccionados.add(elemento);
widget.carpeta.pressAltSeleccionado(widget.carpeta.formatos.indexOf(elemento));
widget.lista.actualizaSeleccionable(widget.indice, widget.carpeta);
}
), ),
) )
); );
}, },
// Esto es en esencia un convertible widget pero que es un poco más
// pequeño
child: SizedBox( child: SizedBox(
height: 50, height: 50,
width: MediaQuery.of(context).size.width-10, width: MediaQuery.of(context).size.width-10,
...@@ -212,7 +248,7 @@ class _CarpetaWidgetState extends State<CarpetaWidget> ...@@ -212,7 +248,7 @@ class _CarpetaWidgetState extends State<CarpetaWidget>
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[ children: <Widget>[
Flexible(flex: 1, child: Icon(Icons.find_in_page_outlined)), Flexible(flex: 1, child: Icon(Icons.find_in_page_outlined)),
Flexible(flex: 1, child: const SizedBox(width: 10)), const Flexible(flex: 1, child: SizedBox(width: 10)),
Flexible( Flexible(
flex: 13, flex: 13,
child: SizedBox.expand( child: SizedBox.expand(
...@@ -223,7 +259,7 @@ class _CarpetaWidgetState extends State<CarpetaWidget> ...@@ -223,7 +259,7 @@ class _CarpetaWidgetState extends State<CarpetaWidget>
Flexible( Flexible(
flex: 1, flex: 1,
child: Text( child: Text(
widget.carpeta.nombre, carpeta.nombre,
style: Theme.of(context).textTheme.bodyLarge?.copyWith( style: Theme.of(context).textTheme.bodyLarge?.copyWith(
fontWeight: FontWeight.bold fontWeight: FontWeight.bold
), ),
...@@ -233,7 +269,7 @@ class _CarpetaWidgetState extends State<CarpetaWidget> ...@@ -233,7 +269,7 @@ class _CarpetaWidgetState extends State<CarpetaWidget>
Flexible( Flexible(
flex: 1, flex: 1,
child: Text( child: Text(
texto, formatoOrigenYDestino ?? "Soy una carpeta!",
style: Theme.of(context).textTheme.bodyLarge?.copyWith( style: Theme.of(context).textTheme.bodyLarge?.copyWith(
fontWeight: FontWeight.bold fontWeight: FontWeight.bold
) )
...@@ -252,9 +288,8 @@ class _CarpetaWidgetState extends State<CarpetaWidget> ...@@ -252,9 +288,8 @@ class _CarpetaWidgetState extends State<CarpetaWidget>
MaterialPageRoute(builder: (context) { MaterialPageRoute(builder: (context) {
return PaginaConfiguracion( return PaginaConfiguracion(
indice: widget.indice, indice: widget.indice,
elemento: elemento.conversion, elemento: elemento as Convertible,
lista: widget.lista, lista: widget.lista,
carpeta: widget.carpeta
); );
} }
)); ));
...@@ -279,8 +314,8 @@ class _MyRectClipper extends CustomClipper<Rect> { ...@@ -279,8 +314,8 @@ class _MyRectClipper extends CustomClipper<Rect> {
@override @override
Rect getClip(Size size) { Rect getClip(Size size) {
double value = (1-_controller.value)*_CarpetaWidgetState.MAX_HEIGHT; double value = (1-_controller.value)*_CarpetaWidgetState.maxHeight;
return Rect.fromLTWH(0, value, 1000, _CarpetaWidgetState.MAX_HEIGHT); return Rect.fromLTWH(0, value, 1000, _CarpetaWidgetState.maxHeight);
} }
@override @override
......
import 'dart:io';
import 'package:ffmpeg_kit_flutter/return_code.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:file_picker/file_picker.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:prueba_multimedia/modelo/modelo.dart'; import 'package:prueba_multimedia/modelo/modelo.dart';
import 'package:prueba_multimedia/widgets/widgets.dart'; import 'package:prueba_multimedia/widgets/widgets.dart';
......
...@@ -2,33 +2,28 @@ import 'package:flutter/material.dart'; ...@@ -2,33 +2,28 @@ import 'package:flutter/material.dart';
import 'package:prueba_multimedia/paginas/paginas.dart'; import 'package:prueba_multimedia/paginas/paginas.dart';
import 'package:prueba_multimedia/modelo/modelo.dart'; import 'package:prueba_multimedia/modelo/modelo.dart';
class SeleccionableWidget extends StatelessWidget { class ConvertibleWidget extends StatelessWidget {
final int indice; final int indice;
final ElementoSeleccionable seleccionable; final Convertible convertible;
final ListaSeleccionables lista; final ListaSeleccionables lista;
const SeleccionableWidget({super.key, required this.indice, required this.seleccionable, required this.lista}); const ConvertibleWidget({super.key,
required this.indice, required this.convertible, required this.lista});
// TODO: ACTUALIZAR PARA MOSTRAR FORMATOS Y CAMBIOS // TODO: ACTUALIZAR PARA MOSTRAR FORMATOS Y CAMBIOS
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final String nombre = seleccionable.nombre; final String nombre = convertible.nombre;
int index = nombre.lastIndexOf('.'); int index = nombre.lastIndexOf('.');
final String visible; final String nombreConvertible = index > -1
if(index > -1){ ? nombre.substring(0, index)
visible = nombre.substring(0, index); : nombre;
}
else {
visible = nombre;
}
// Descripción debajo del nombre del convertible con los formatos
Widget? formatoOrig; String formatoOrigenYDestino = convertible.formatoOriginal.name.toUpperCase();
if(seleccionable is Convertible){ if(convertible.formatoDestino != null) {
Convertible arch = (seleccionable as Convertible); formatoOrigenYDestino +=
String texto = arch.formatoOriginal.name.toUpperCase(); " > ${convertible.formatoDestino!.name.toUpperCase()}";
if(arch.formatoDestino != null) texto += " > ${arch.formatoDestino!.name.toUpperCase()}";
formatoOrig = Flexible(flex:1, child: Text(texto));
} }
return SizedBox( return SizedBox(
...@@ -36,8 +31,8 @@ class SeleccionableWidget extends StatelessWidget { ...@@ -36,8 +31,8 @@ class SeleccionableWidget extends StatelessWidget {
width: MediaQuery.of(context).size.width, width: MediaQuery.of(context).size.width,
child: Row( child: Row(
children: <Widget>[ children: <Widget>[
Flexible(flex: 1, child: seleccionable.icono), Flexible(flex: 1, child: convertible.icono),
Flexible(flex: 1, child: const SizedBox(width: 15)), const Flexible(flex: 1, child: SizedBox(width: 15)),
Flexible( Flexible(
flex: 16, flex: 16,
child: SizedBox.expand( child: SizedBox.expand(
...@@ -47,13 +42,16 @@ class SeleccionableWidget extends StatelessWidget { ...@@ -47,13 +42,16 @@ class SeleccionableWidget extends StatelessWidget {
Flexible( Flexible(
flex: 1, flex: 1,
child: Text( child: Text(
visible, nombreConvertible,
style: Theme.of(context).textTheme.bodyLarge?.copyWith( style: Theme.of(context).textTheme.bodyLarge?.copyWith(
fontWeight: FontWeight.bold fontWeight: FontWeight.bold
) )
), ),
), ),
if(formatoOrig != null) formatoOrig Flexible(
flex: 1,
child: Text(formatoOrigenYDestino)
)
], ],
) )
), ),
...@@ -65,7 +63,11 @@ class SeleccionableWidget extends StatelessWidget { ...@@ -65,7 +63,11 @@ class SeleccionableWidget extends StatelessWidget {
onPressed: () { onPressed: () {
Navigator.push(context, Navigator.push(context,
MaterialPageRoute(builder: (context) { MaterialPageRoute(builder: (context) {
return PaginaConfiguracion(indice: indice, elemento: seleccionable, lista: lista); return PaginaConfiguracion(
indice: indice,
elemento: convertible,
lista: lista
);
})); }));
}, },
), ),
......
...@@ -2,4 +2,4 @@ export 'action_button.dart'; ...@@ -2,4 +2,4 @@ export 'action_button.dart';
export 'convertex_fab_bar.dart'; export 'convertex_fab_bar.dart';
export 'convertex_prototipo_app.dart'; export 'convertex_prototipo_app.dart';
export 'expandable_fab.dart'; export 'expandable_fab.dart';
export 'seleccionable_widget.dart'; export 'convertible_widget.dart';
\ No newline at end of file \ No newline at end of file
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