En proceso de refactorizar

parent 54232159
......@@ -5,6 +5,7 @@ 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;
......
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:uuid/uuid.dart';
import 'archivo.dart';
import 'convertible.dart';
import 'elemento_seleccionable.dart';
import 'formato.dart';
class Carpeta extends ElementoSeleccionable{
class Carpeta extends ElementoSeleccionable {
final Directory _directory;
bool _incluirSubcarpetas = false;
bool _open = false;
late final List<InfoFormato> _formatos;
// bool _open = false;
final List<InfoFormato> _formatos = <InfoFormato>[];
final _elementos = <FileSystemEntity>[];
Directory get directory => _directory;
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;
Carpeta({required super.id, required Directory directory}):
_directory = directory,
super(nombre: directory.path.split('/').last, icon: const Icon(Icons.folder_outlined))
{
_formatos = [];
final archivos = directory.listSync(recursive: true, followLinks: false);
for(var a in archivos) {
Formato? f = Formato.fromExtension(a.path.split(".").last);
if(f != null){
_formatos.add(InfoFormato(
final elementos = directory.listSync(recursive: _incluirSubcarpetas, followLinks: false);
// Ahora mismo no funciona por tema permisos pero Diego está trabajando en ello
for(var fse in elementos) {
Formato? f = Formato.fromExtension(fse.path.split(".").last);
if (f != null) {
/*
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,
nombreCarpeta: directory.path.split('/').last,
subCarpeta: false));
}
subCarpeta: false
)
);
_elementos.add(fse);
}
}
}
/*
Carpeta.fromList({required super.id, required Directory directory, required List<InfoFormato> formatos}):
_directory = directory, _formatos = formatos,
super(nombre: directory.path.split('/').last, icon: const Icon(Icons.folder_outlined));
*/
InfoFormato? getInfoFormato({required Formato formato}){
for(InfoFormato i in _formatos){
......@@ -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(){
_open = !_open;
}
*/
void pressIncluirSubcarpetas(){
_incluirSubcarpetas = !_incluirSubcarpetas;
......@@ -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 {
final bool _subcarpeta;
bool seleccionado;
......@@ -97,7 +122,7 @@ class InfoFormato {
@override
bool operator ==(Object other) {
if(other is InfoFormato) return this.formatoOriginal == other.formatoOriginal;
if(other is InfoFormato) return formatoOriginal == other.formatoOriginal;
return super == other;
}
}
\ No newline at end of file
......@@ -57,7 +57,7 @@ abstract class Conversor {
valor: campos[1]
));
} 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';
import 'carpeta.dart';
import 'elemento_seleccionable.dart';
import 'archivo.dart';
import 'formato.dart';
class ListaSeleccionables extends ChangeNotifier {
final _seleccionables = <ElementoSeleccionable>[];
......@@ -31,13 +30,15 @@ class ListaSeleccionables extends ChangeNotifier {
id: const Uuid().v1(),
directory: directory
);
if(newCarpeta.formatos.isNotEmpty){
_seleccionables.add(Carpeta(
id: const Uuid().v1(),
directory: directory
));
//if(newCarpeta.formatos.isNotEmpty){
_seleccionables.add(
Carpeta(
id: const Uuid().v1(),
directory: directory
)
);
notifyListeners();
}
//}
}
void reinsertar(int index, ElementoSeleccionable element){
......
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:prueba_multimedia/modelo/modelo.dart';
import 'package:prueba_multimedia/paginas/paginas.dart';
class PaginaConfiguracion extends StatefulWidget {
final ListaSeleccionables _lista;
final int _indice;
final ElementoSeleccionable _elementoAsociado;
final Carpeta? _carpeta;
final Convertible _elementoAsociado;
const PaginaConfiguracion({
super.key,
required ListaSeleccionables lista,
required int indice,
required ElementoSeleccionable elemento,
Carpeta? carpeta
}): _lista = lista, _indice = indice, _elementoAsociado = elemento,
_carpeta = carpeta;
required Convertible elemento,
}): _lista = lista, _indice = indice, _elementoAsociado = elemento;
@override
State<PaginaConfiguracion> createState() => _PaginaConfiguracionState();
......@@ -25,6 +20,7 @@ class PaginaConfiguracion extends StatefulWidget {
class _PaginaConfiguracionState extends State<PaginaConfiguracion> {
int _categoriaActiva = 0;
final _paginas = <Widget>[];
@override
Widget build(BuildContext context) {
......@@ -36,134 +32,88 @@ class _PaginaConfiguracionState extends State<PaginaConfiguracion> {
text: TextSpan(
children: [
WidgetSpan(
child: _getIcon()
child: widget._elementoAsociado.icono
),
TextSpan(
text: _getShownName(),
text: " ${widget._elementoAsociado.nombre}",
style: Theme.of(context).textTheme.titleLarge,
)
]
)
),
),
body: _construirCuerpo(widget._lista),
bottomNavigationBar: _construirBarraNavegacion()
body: _construirCuerpo(),
bottomNavigationBar: BottomNavigationBar(
currentIndex: _categoriaActiva,
onTap: (int indice) => setState(() { _categoriaActiva = indice; }),
items: _construirElementosBarraNavegacion()
)
);
}
Icon _getIcon(){
if(widget._elementoAsociado is Carpeta){
return Icon(Icons.folder);
}
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() {
final sb = StringBuffer();
sb.write(" ");
sb.write(widget._elementoAsociado.nombre);
return sb.toString();
}
Widget _construirCuerpo() {
Formato formatoOriginal = widget._elementoAsociado.formatoOriginal;
bool esFormatoVideo = formatoOriginal.tipoMultimedia == TipoMultimedia.video;
var archivo = widget._elementoAsociado as Archivo;
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,
_paginas.add(
PaginaConversion.convertible(
lista: widget._lista,
indiceArchivo: widget._indice,
elemento: arch,
formatoOriginal: arch.formatoOriginal
);
elemento: widget._elementoAsociado,
formatoOriginal: widget._elementoAsociado.formatoOriginal
)
);
if (widget._elementoAsociado is Archivo) {
if (esFormatoVideo) {
_paginas.add(PaginaFotograma());
}
else if(_categoriaActiva == 2 || arch.formatoOriginal.tipoMultimedia != TipoMultimedia.video){
return FutureBuilder(
future: arch.metadatos,
_paginas.add(
FutureBuilder(
future: archivo.metadatos,
builder: (context, snapshot) {
return snapshot.hasData
? PaginaMetadatos(
metadatos: snapshot.data!,
formato: arch.formatoOriginal
)
: CircularProgressIndicator();
metadatos: snapshot.data!,
formato: archivo.formatoOriginal
)
: 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(){
if(widget._elementoAsociado is Archivo){
return BottomNavigationBar(
currentIndex: _categoriaActiva,
onTap: (int indice) {
setState(() {
_categoriaActiva = indice;
});
},
items: _construirElementosBarraNavegacion()
),
);
}
return null;
return _paginas[_categoriaActiva];
}
List<BottomNavigationBarItem> _construirElementosBarraNavegacion(){
final toRet = <BottomNavigationBarItem>[];
bool isVideo = false;
if(widget._elementoAsociado is Archivo){
final arch = widget._elementoAsociado as Archivo;
if(arch.formatoOriginal.tipoMultimedia == TipoMultimedia.video){
isVideo = true;
Formato formatoOriginal = widget._elementoAsociado.formatoOriginal;
bool esFormatoVideo = formatoOriginal.tipoMultimedia == TipoMultimedia.video;
final items = <BottomNavigationBarItem>[
const BottomNavigationBarItem(
icon: Icon(Icons.sync),
label: 'Formato de Conversión'
),
];
if (widget._elementoAsociado is Archivo) {
if (esFormatoVideo) {
items.add(
const BottomNavigationBarItem(
icon: Icon(Icons.local_movies),
label: 'Fotograma'
)
);
}
items.add(
const BottomNavigationBarItem(
icon: Icon(Icons.format_list_bulleted),
label: 'Metadatos'
),
);
}
// Página de selección de conversión
toRet.add(BottomNavigationBarItem(
icon: Icon(Icons.sync),
label: isVideo ? 'Conversión' : 'Formato de Conversión'
));
// Página de selección de fotograma
if(isVideo){
toRet.add(BottomNavigationBarItem(
icon: Icon(Icons.local_movies),
label: 'Fotograma'
));
}
// Página de edición de metadatos
toRet.add(BottomNavigationBarItem(
icon: Icon(Icons.format_list_bulleted),
label: 'Metadatos'
));
return toRet;
return items;
}
}
......@@ -215,7 +215,6 @@ class _PaginaConfiguracionCarpetaState extends State<PaginaConfiguracionCarpeta>
indice: widget._indice,
elemento: i.conversion,
lista: widget._lista,
carpeta: widget._carpeta
);
}
));
......
......@@ -43,7 +43,7 @@ class PaginaConversion extends StatefulWidget {
class _PaginaConversionState extends State<PaginaConversion>
with SingleTickerProviderStateMixin {
Formato? _formatoConvertido;
Calidad? _calidadActual = null;
Calidad? _calidadActual;
bool _showProfiles = true;
late final TabController _tabController;
......
......@@ -27,7 +27,8 @@ class PaginaPrincipalLlena extends StatelessWidget {
alignment: Alignment.centerLeft,
child: Padding(
padding: const EdgeInsets.all(4.0),
child: Icon(Icons.delete,
child: const Icon(
Icons.delete,
color: Colors.white,
size: 31.0
),
......@@ -38,9 +39,10 @@ class PaginaPrincipalLlena extends StatelessWidget {
alignment: Alignment.centerRight,
child: Padding(
padding: const EdgeInsets.all(4.0),
child: Icon(Icons.delete,
color: Colors.white,
size: 31.0
child: const Icon(
Icons.delete,
color: Colors.white,
size: 31.0
),
),
),
......@@ -58,9 +60,17 @@ class PaginaPrincipalLlena extends StatelessWidget {
)
);
},
child: (seleccionables[index] is Carpeta)?
CarpetaWidget(indice: index, carpeta: seleccionables[index] as Carpeta, lista: listaSeleccionables)
: SeleccionableWidget(indice: index, seleccionable: seleccionables[index], lista: listaSeleccionables)
child: (seleccionables[index] is Carpeta)
? CarpetaWidget(
indice: index,
carpeta: seleccionables[index] as Carpeta,
lista: listaSeleccionables
)
: ConvertibleWidget(
indice: index,
convertible: seleccionables[index] as Convertible,
lista: listaSeleccionables
)
);
},
),
......
import 'dart:io';
import 'package:ffmpeg_kit_flutter/return_code.dart';
import 'package:flutter/material.dart';
import 'package:file_picker/file_picker.dart';
import 'package:provider/provider.dart';
import 'package:prueba_multimedia/modelo/modelo.dart';
import 'package:prueba_multimedia/widgets/widgets.dart';
......
......@@ -2,42 +2,37 @@ import 'package:flutter/material.dart';
import 'package:prueba_multimedia/paginas/paginas.dart';
import 'package:prueba_multimedia/modelo/modelo.dart';
class SeleccionableWidget extends StatelessWidget {
class ConvertibleWidget extends StatelessWidget {
final int indice;
final ElementoSeleccionable seleccionable;
final Convertible convertible;
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
@override
Widget build(BuildContext context) {
final String nombre = seleccionable.nombre;
final String nombre = convertible.nombre;
int index = nombre.lastIndexOf('.');
final String visible;
if(index > -1){
visible = nombre.substring(0, index);
final String nombreConvertible = index > -1
? nombre.substring(0, index)
: nombre;
// Descripción debajo del nombre del convertible con los formatos
String formatoOrigenYDestino = convertible.formatoOriginal.name.toUpperCase();
if(convertible.formatoDestino != null) {
formatoOrigenYDestino +=
" > ${convertible.formatoDestino!.name.toUpperCase()}";
}
else {
visible = nombre;
}
Widget? formatoOrig;
if(seleccionable is Convertible){
Convertible arch = (seleccionable as Convertible);
String texto = arch.formatoOriginal.name.toUpperCase();
if(arch.formatoDestino != null) texto += " > ${arch.formatoDestino!.name.toUpperCase()}";
formatoOrig = Flexible(flex:1, child: Text(texto));
}
return SizedBox(
height: 60,
width: MediaQuery.of(context).size.width,
child: Row(
children: <Widget>[
Flexible(flex: 1, child: seleccionable.icono),
Flexible(flex: 1, child: const SizedBox(width: 15)),
Flexible(flex: 1, child: convertible.icono),
const Flexible(flex: 1, child: SizedBox(width: 15)),
Flexible(
flex: 16,
child: SizedBox.expand(
......@@ -47,13 +42,16 @@ class SeleccionableWidget extends StatelessWidget {
Flexible(
flex: 1,
child: Text(
visible,
nombreConvertible,
style: Theme.of(context).textTheme.bodyLarge?.copyWith(
fontWeight: FontWeight.bold
)
),
),
if(formatoOrig != null) formatoOrig
Flexible(
flex: 1,
child: Text(formatoOrigenYDestino)
)
],
)
),
......@@ -65,7 +63,11 @@ class SeleccionableWidget extends StatelessWidget {
onPressed: () {
Navigator.push(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';
export 'convertex_fab_bar.dart';
export 'convertex_prototipo_app.dart';
export 'expandable_fab.dart';
export 'seleccionable_widget.dart';
\ No newline at end of file
export 'convertible_widget.dart';
\ 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