Primeros pasos en la actualización de listas

parent 9d1ad18c
...@@ -8,15 +8,38 @@ import 'formato.dart'; ...@@ -8,15 +8,38 @@ import 'formato.dart';
class Carpeta extends ElementoSeleccionable{ class Carpeta extends ElementoSeleccionable{
final Directory _directory; final Directory _directory;
final bool _incluirSubcarpetas = false; final bool _incluirSubcarpetas = false;
final List<InfoFormato> _formatos; late final List<InfoFormato> _formatos;
Directory get directory => _directory; Directory get directory => _directory;
List<InfoFormato> get formatos => List.unmodifiable(_formatos); List<InfoFormato> get formatos => List.unmodifiable(_formatos);
Carpeta({required super.id, required Directory directory}): Carpeta({required super.id, required Directory directory, required Map<Formato, bool> formatos}):
_directory = directory, _formatos = [], _directory = directory,
super(nombre: directory.path.split('/').last, icon: const Icon(Icons.folder_outlined)){
_formatos = [];
for(var f in formatos.entries) {
_formatos.add(InfoFormato(
formato: f.key,
nombreCarpeta: directory.path.split('/').last,
subCarpeta: f.value,
archivos: []));
}
}
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)); super(nombre: directory.path.split('/').last, icon: const Icon(Icons.folder_outlined));
Carpeta setFormatoDestino(Formato original, Formato destino){
final formatosAlt = formatos.toList();
for(InfoFormato i in formatosAlt){
if(i.formatoOriginal == original){
i.formatoDestino = destino;
}
}
return Carpeta.fromList(id: id, directory: directory, formatos: formatosAlt);
}
@override @override
void convertir() { void convertir() {
// TODO: <implement> // TODO: <implement>
...@@ -37,7 +60,7 @@ class InfoFormato { ...@@ -37,7 +60,7 @@ class InfoFormato {
List<Archivo> get archivos => List.unmodifiable(_archivos); List<Archivo> get archivos => List.unmodifiable(_archivos);
set seleccionado(bool value) => _seleccionado = value; set seleccionado(bool value) => _seleccionado = value;
set formato(Formato? destino) => _conversion.formatoDestino = destino; set formatoDestino(Formato? destino) => _conversion.formatoDestino = destino;
InfoFormato({required Formato formato, InfoFormato({required Formato formato,
required String nombreCarpeta, required String nombreCarpeta,
......
...@@ -14,6 +14,11 @@ class ListaSeleccionables extends ChangeNotifier { ...@@ -14,6 +14,11 @@ class ListaSeleccionables extends ChangeNotifier {
notifyListeners(); notifyListeners();
} }
void actualizaSeleccionable(int indice, ElementoSeleccionable elemento){
_seleccionables[indice] = elemento;
notifyListeners();
}
void addArchivo(File file) { void addArchivo(File file) {
_seleccionables.add(Archivo(id: "Archivo", _seleccionables.add(Archivo(id: "Archivo",
file: file)); file: file));
......
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';
...@@ -36,7 +37,11 @@ class _PaginaConfiguracionState extends State<PaginaConfiguracion> { ...@@ -36,7 +37,11 @@ class _PaginaConfiguracionState extends State<PaginaConfiguracion> {
) )
), ),
), ),
body: _construirCuerpo(), body: Consumer<ListaSeleccionables>(
builder: (context, manager, child){
return _construirCuerpo(manager);
},
),
bottomNavigationBar: _construirBarraNavegacion() bottomNavigationBar: _construirBarraNavegacion()
); );
} }
...@@ -58,11 +63,11 @@ class _PaginaConfiguracionState extends State<PaginaConfiguracion> { ...@@ -58,11 +63,11 @@ class _PaginaConfiguracionState extends State<PaginaConfiguracion> {
return sb.toString(); return sb.toString();
} }
Widget _construirCuerpo() { Widget _construirCuerpo(ListaSeleccionables manager) {
if(widget._elementoAsociado is Convertible){ if(widget._elementoAsociado is Convertible){
final arch = widget._elementoAsociado as Convertible; final arch = widget._elementoAsociado as Convertible;
if(_categoriaActiva == 0){ if(_categoriaActiva == 0){
return PaginaConversion(formatoOriginal: arch.formatoOriginal); return PaginaConversion(lista: manager, formatoOriginal: arch.formatoOriginal);
} }
else if(_categoriaActiva == 2){ else if(_categoriaActiva == 2){
return PaginaMetadatos(formato: arch.formatoOriginal); return PaginaMetadatos(formato: arch.formatoOriginal);
......
...@@ -2,12 +2,21 @@ import 'package:flutter/material.dart'; ...@@ -2,12 +2,21 @@ import 'package:flutter/material.dart';
import 'package:prueba_multimedia/modelo/modelo.dart'; import 'package:prueba_multimedia/modelo/modelo.dart';
class PaginaConversion extends StatefulWidget { class PaginaConversion extends StatefulWidget {
final ListaSeleccionables _lista;
final int _indiceArchivo;
final ElementoSeleccionable _seleccionable;
final Formato _formatoOriginal; final Formato _formatoOriginal;
const PaginaConversion({ const PaginaConversion({
super.key, super.key,
required formatoOriginal required Formato formatoOriginal,
}): _formatoOriginal = formatoOriginal; required int indiceArchivo,
required Convertible seleccionable,
required ListaSeleccionables lista
}): _formatoOriginal = formatoOriginal,
_indiceArchivo = indiceArchivo,
_seleccionable = seleccionable,
_lista = lista;
@override @override
State<PaginaConversion> createState() => _PaginaConversionState(); State<PaginaConversion> createState() => _PaginaConversionState();
...@@ -18,7 +27,7 @@ class _PaginaConversionState extends State<PaginaConversion> ...@@ -18,7 +27,7 @@ class _PaginaConversionState extends State<PaginaConversion>
// Podríamos hacer que en vez de poder haber nulos sea el mismo formato // Podríamos hacer que en vez de poder haber nulos sea el mismo formato
// que el de origen de manera predeterminada ? // que el de origen de manera predeterminada ?
Formato? _formatoConvertido; Formato? _formatoConvertido;
Calidad calidadActual = Calidad.media; Calidad? _calidadActual = null;
bool _showProfiles = true; bool _showProfiles = true;
late final TabController _tabController; late final TabController _tabController;
...@@ -96,7 +105,7 @@ class _PaginaConversionState extends State<PaginaConversion> ...@@ -96,7 +105,7 @@ class _PaginaConversionState extends State<PaginaConversion>
color: Colors.black, color: Colors.black,
), ),
borderRadius: BorderRadius.circular(15), borderRadius: BorderRadius.circular(15),
color: _formatoConvertido == null ? Colors.white : Colors.black12 color: _formatoConvertido == null ? Colors.white : Theme.of(context).colorScheme.inversePrimary
), ),
child: Padding( child: Padding(
padding: const EdgeInsets.all(13.0), padding: const EdgeInsets.all(13.0),
...@@ -109,22 +118,16 @@ class _PaginaConversionState extends State<PaginaConversion> ...@@ -109,22 +118,16 @@ class _PaginaConversionState extends State<PaginaConversion>
); );
} }
// TODO: A QUÉ SE REFIERE LA CALIDAD ?
/*
Un formato puede tener una calidad predeterminada?
De que sirve cambiar la calidad de un formato?
Hay formatos lossless para los que no hay ajustes de calidad/compresión
*/
// TODO: IMPLEMENTAR SISTEMA CALIDAD FORMATOS
/// Comportamiento temporal: Mostrar todas las calidades /// Comportamiento temporal: Mostrar todas las calidades
Widget _createCalidadSelectionPanel() { Widget _createCalidadSelectionPanel() {
final listaChips = Calidad.values.map((elemento) { final listaChips = Calidad.values.map((elemento) {
return ChoiceChip( return ChoiceChip(
selected: elemento == calidadActual, selected: elemento == _calidadActual,
shape: StadiumBorder(), shape: StadiumBorder(),
label: Text(elemento.texto), label: Text(elemento.texto),
// TODO: CAMBIAR CALIDAD FORMATO // TODO: CAMBIAR CALIDAD FORMATO
onSelected: (selected) { setState((){calidadActual = elemento;}); }, onSelected: (_formatoConvertido == null)? null:
(selected) { setState((){_calidadActual = elemento;}); },
); );
}).toList(); }).toList();
...@@ -269,7 +272,7 @@ class _PaginaConversionState extends State<PaginaConversion> ...@@ -269,7 +272,7 @@ class _PaginaConversionState extends State<PaginaConversion>
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(20.0), borderRadius: BorderRadius.circular(20.0),
), ),
color: (_showProfiles)? Theme.of(context).disabledColor : Theme.of(context).cardColor, color: (_showProfiles)? Theme.of(context).colorScheme.inversePrimary : Theme.of(context).cardColor,
child: InkWell( child: InkWell(
onTap: () { onTap: () {
setState(() { setState(() {
...@@ -290,7 +293,7 @@ class _PaginaConversionState extends State<PaginaConversion> ...@@ -290,7 +293,7 @@ class _PaginaConversionState extends State<PaginaConversion>
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(20.0), borderRadius: BorderRadius.circular(20.0),
), ),
color: (!_showProfiles)? Theme.of(context).disabledColor : Theme.of(context).cardColor, color: (!_showProfiles)? Theme.of(context).colorScheme.inversePrimary : Theme.of(context).cardColor,
child: InkWell( child: InkWell(
onTap: () { onTap: () {
setState(() { setState(() {
...@@ -310,7 +313,6 @@ class _PaginaConversionState extends State<PaginaConversion> ...@@ -310,7 +313,6 @@ class _PaginaConversionState extends State<PaginaConversion>
); );
} }
// TODO: HABLAR SOBRE CÓMO HACER LOS PERFILES
List<Widget> _createListPerfiles(){ List<Widget> _createListPerfiles(){
final toRet = <Widget>[]; final toRet = <Widget>[];
...@@ -323,42 +325,33 @@ class _PaginaConversionState extends State<PaginaConversion> ...@@ -323,42 +325,33 @@ class _PaginaConversionState extends State<PaginaConversion>
if(widget._formatoOriginal.tipoMultimedia == TipoMultimedia.audio){ if(widget._formatoOriginal.tipoMultimedia == TipoMultimedia.audio){
formatoPerfil = perfil.extensionMusica; formatoPerfil = perfil.extensionMusica;
} }
//
if(formatoPerfil != null && formatoPerfil != widget._formatoOriginal){ if(formatoPerfil != null){
/** Color color = Theme.of(context).cardColor;
* Entiendo que si el archivo ya se encuentra en un formato que if(formatoPerfil == widget._formatoOriginal){
* es el mismo que se usa para un cierto perfil entonces ese perfil color = Theme.of(context).disabledColor;
* esté desabilitado, pero podría llegar a ser confuso ya que no }
* se especifica por ningún sitio al usuario el por qué esa opción if(formatoPerfil == _formatoConvertido && perfil.calidad == _calidadActual){
* no está disponible. color = Theme.of(context).colorScheme.inversePrimary;
* }
* Además, no se como compaginar esto con que cada formato pueda
* tener un nivel de calidad diferente, porque podríamos tener
* hipotéticamente un formato como jpg (que es de baja calidad) pero con
* un valor de calidad alto
*
* En aplicaciones como gimp por ejemplo se puede especificar el nivel
* de compresión (inverso a la calidad) de formatos como jpg
bool desabilitado = (_formatoConvertido == formatoPerfil) &&
(_formatoConvertido?.calidad == perfil.calidad);
**/
toRet.add(Material( toRet.add(Material(
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(20.0), borderRadius: BorderRadius.circular(20.0),
), ),
// TODO: ANALIZAR SI DESABILITAR PERFILES O NO color: color,
// color: desabilitado ? Theme.of(context).disabledColor : Theme.of(context).cardColor,
color: Theme.of(context).cardColor,
child: InkWell( child: InkWell(
onTap: () { onTap: (formatoPerfil == widget._formatoOriginal)? () {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('El archivo ya coincide con este perfil'),
),
);
} : () {
if (_formatoConvertido != formatoPerfil) { if (_formatoConvertido != formatoPerfil) {
setState(() { setState(() {
// TODO: IMPLEMENTAR SISTEMA CALIDAD FORMATOS
// _formatoConvertido = Formato(formato: formatoPerfil!, calidad: perfil.calidad);
_formatoConvertido = formatoPerfil; _formatoConvertido = formatoPerfil;
_calidadActual = perfil.calidad;
}); });
} }
}, },
...@@ -396,16 +389,33 @@ class _PaginaConversionState extends State<PaginaConversion> ...@@ -396,16 +389,33 @@ class _PaginaConversionState extends State<PaginaConversion>
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(20.0), borderRadius: BorderRadius.circular(20.0),
), ),
color: _formatoConvertido == elemento ? Theme.of(context).disabledColor color: _formatoConvertido == elemento ? Theme.of(context).colorScheme.inversePrimary
: Theme.of(context).cardColor, : Theme.of(context).cardColor,
child: InkWell( child: InkWell(
/* borderRadius: BorderRadius.circular(20.0),
TODO: COMPORTAMIENTO DE LOS BOTONES
onTap: _formatoConvertido == elemento ? () { onTap: _formatoConvertido == elemento ? () {
setState(() { _formatoConvertido = null; }); setState(() {
} : _formatoConvertido = null;
*/ _calidadActual = null;
onTap: () { setState((){_formatoConvertido = elemento;}); }, });
} : () { setState((){
_formatoConvertido = elemento;
// TODO: Cambiar calidad del archivo
ElementoSeleccionable resultado;
if(widget._seleccionable is Carpeta){
final formatos = (widget._seleccionable as Carpeta).formatos;
for(InfoFormato f in formatos){
if(f.formatoOriginal == widget._formatoOriginal){
}
}
}
else{
}
widget._lista.actualizaSeleccionable(widget._indiceArchivo, resultado);
}); },
onLongPress: () { onLongPress: () {
showDialog<void>( showDialog<void>(
context: context, context: context,
......
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