Cambiado la pagina de metadatos para poder incluir el observable

parent bc6f1f51
...@@ -6,21 +6,10 @@ import 'formato.dart'; ...@@ -6,21 +6,10 @@ import 'formato.dart';
// TODO: QUE PASA SI NO RECONOCEMOS EL FORMATO? // TODO: QUE PASA SI NO RECONOCEMOS EL FORMATO?
class Archivo extends Convertible { class Archivo extends Convertible {
final File _file; final File file;
late final List<Metadato> _metadatos; late final Future<List<Metadato>> metadatos;
bool _metadatosComplete = false;
File get file => _file; Archivo({required super.id, required this.file}):
List<Metadato>? get metadatos => _metadatosComplete ? _metadatos : null;
void getMetadatos() async {
var futureMetadatos = Conversor.getMetadatos(this);
futureMetadatos.whenComplete( () {_metadatosComplete = true; } );
_metadatos = await futureMetadatos;
}
Archivo({required super.id, required File file}):
_file = file,
super( super(
nombre: file.path.split('/').last, nombre: file.path.split('/').last,
// TODO: POR AHORA USAMOS (!) PERO HAY QUE TENERLO EN CUENTA // TODO: POR AHORA USAMOS (!) PERO HAY QUE TENERLO EN CUENTA
...@@ -28,6 +17,6 @@ class Archivo extends Convertible { ...@@ -28,6 +17,6 @@ class Archivo extends Convertible {
icon: Formato.fromExtension(file.path.split('.').last)!.tipoMultimedia.icono icon: Formato.fromExtension(file.path.split('.').last)!.tipoMultimedia.icono
) )
{ {
getMetadatos(); metadatos = Conversor.getMetadatos(this);
} }
} }
\ No newline at end of file
...@@ -17,10 +17,6 @@ class Carpeta extends ElementoSeleccionable{ ...@@ -17,10 +17,6 @@ class Carpeta extends ElementoSeleccionable{
_directory = directory, _formatos = [], _directory = directory, _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));
@override
void convertir() {
// TODO: <implement>
}
} }
class InfoFormato { class InfoFormato {
......
...@@ -13,6 +13,4 @@ abstract class ElementoSeleccionable{ ...@@ -13,6 +13,4 @@ abstract class ElementoSeleccionable{
required String nombre, required String nombre,
required Icon icon}): required Icon icon}):
_id = id, _nombre = nombre, _icono = icon; _id = id, _nombre = nombre, _icono = icon;
void convertir();
} }
\ No newline at end of file
...@@ -10,6 +10,10 @@ enum Formato { ...@@ -10,6 +10,10 @@ enum Formato {
'A pesar de ser un método de compresión, es a menudo considerado como un formato de archivo. Es el formato de imagen más común, utilizado por las cámaras fotográficas digitales y otros dispositivos de captura de imagen' 'A pesar de ser un método de compresión, es a menudo considerado como un formato de archivo. Es el formato de imagen más común, utilizado por las cámaras fotográficas digitales y otros dispositivos de captura de imagen'
), ),
jpeg('Joint Photographic Experts Group', TipoMultimedia.imagen, Clasificacion.ligero, [],
'A pesar de ser un método de compresión, es a menudo considerado como un formato de archivo. Es el formato de imagen más común, utilizado por las cámaras fotográficas digitales y otros dispositivos de captura de imagen'
),
tif('Tagged Image File Format', TipoMultimedia.imagen, Clasificacion.calidad, [], tif('Tagged Image File Format', TipoMultimedia.imagen, Clasificacion.calidad, [],
'Un formato de archivo informático para almacenar imágenes de mapa de bits. Es prevalente en la industria gráfica y en la fotografía profesional por su versatilidad y compresión no destructiva.' 'Un formato de archivo informático para almacenar imágenes de mapa de bits. Es prevalente en la industria gráfica y en la fotografía profesional por su versatilidad y compresión no destructiva.'
), ),
...@@ -118,7 +122,8 @@ enum MetadatoInfo { ...@@ -118,7 +122,8 @@ enum MetadatoInfo {
year("Año", true), year("Año", true),
description("Descripción"), description("Descripción"),
comment("Comentario"), comment("Comentario"),
rating("Valoración", true); rating("Valoración", true),
encoder("Encoder", false);
final String _nombreMostrado; final String _nombreMostrado;
final bool _esNumerico; final bool _esNumerico;
......
...@@ -2,59 +2,49 @@ import 'package:flutter/material.dart'; ...@@ -2,59 +2,49 @@ import 'package:flutter/material.dart';
import 'package:prueba_multimedia/modelo/modelo.dart'; import 'package:prueba_multimedia/modelo/modelo.dart';
class PaginaMetadatos extends StatefulWidget { class PaginaMetadatos extends StatefulWidget {
final List<Metadato> _metadatos;
final Formato _formato; final Formato _formato;
const PaginaMetadatos({super.key, required formato}): _formato = formato; const PaginaMetadatos({super.key, required metadatos, required formato}):
_metadatos = metadatos, _formato = formato;
@override @override
State<PaginaMetadatos> createState() => _PaginaMetadatosState(); State<PaginaMetadatos> createState() => _PaginaMetadatosState();
} }
class _PaginaMetadatosState extends State<PaginaMetadatos> { class _PaginaMetadatosState extends State<PaginaMetadatos> {
late final List<MetadatoInfo> _metadatos;
final List<TextEditingController> _controladores = []; final List<TextEditingController> _controladores = [];
final List<String> _valoresElegidos = []; final List<String> _valoresElegidos = [];
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_metadatos = widget._formato.metadatos; var metadatos = widget._metadatos;
for(int i = 0; i<_metadatos.length; i++){ for (var metadato in metadatos) {
_valoresElegidos.add(''); String valorElegido = metadato.valor;
_controladores.add(TextEditingController()); _valoresElegidos.add(valorElegido);
if(_metadatos[i].numerico){
_controladores[i].addListener(() { var controller = TextEditingController(text: metadato.valor);
setState(() { controller.addListener(
String texto = _controladores[i].value.text; () => setState(() { valorElegido = controller.text; })
if(texto.isEmpty || RegExp(r'^[0-9]+$').hasMatch(texto)){ );
_valoresElegidos[i] = _controladores[i].text; _controladores.add(controller);
}
else{
_controladores[i].text = _valoresElegidos[i];
}
});
});
}
else{
_controladores[i].addListener(() {
setState(() { _valoresElegidos[i] = _controladores[i].text; });
});
}
} }
} }
@override @override
void dispose() { void dispose() {
while(_controladores.isNotEmpty){ for (var controlador in _controladores) {
_controladores.first.dispose(); controlador.dispose();
_controladores.removeAt(0);
} }
super.dispose(); super.dispose();
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if(_metadatos.isNotEmpty){ var metadatos = widget._metadatos;
if(metadatos.isNotEmpty){
return SingleChildScrollView( return SingleChildScrollView(
child: Padding( child: Padding(
padding: const EdgeInsets.all(15.0), padding: const EdgeInsets.all(15.0),
...@@ -64,19 +54,16 @@ class _PaginaMetadatosState extends State<PaginaMetadatos> { ...@@ -64,19 +54,16 @@ class _PaginaMetadatosState extends State<PaginaMetadatos> {
), ),
); );
} }
else{ else {
final sb = StringBuffer(); String mensaje = 'El formato seleccionado '
sb.write('El formato seleccionado (.'); '(.${widget._formato.extension}) no admite metadatos';
sb.write(widget._formato.extension);
sb.write(') no admite metadatos.');
return Padding( return Padding(
padding: const EdgeInsets.all(15.0), padding: const EdgeInsets.all(15.0),
child: SafeArea( child: SafeArea(
child: Align( child: Align(
alignment: Alignment.center, alignment: Alignment.center,
child: Text( child: Text(
sb.toString(), mensaje,
style: Theme.of(context).textTheme.titleLarge, style: Theme.of(context).textTheme.titleLarge,
textAlign: TextAlign.center, textAlign: TextAlign.center,
), ),
...@@ -87,24 +74,25 @@ class _PaginaMetadatosState extends State<PaginaMetadatos> { ...@@ -87,24 +74,25 @@ class _PaginaMetadatosState extends State<PaginaMetadatos> {
} }
List<Widget> _buildTextFields(){ List<Widget> _buildTextFields(){
var metadatos = widget._metadatos;
final toRet = <Widget>[]; final toRet = <Widget>[];
for(int i = 0; i<_metadatos.length && i<4; i++){ for(int i = 0; i<metadatos.length && i<4; i++){
toRet.add(_buildTextFieldLabel(i)); toRet.add(_buildTextFieldLabel(i));
toRet.add(_buildTextField(i)); toRet.add(_buildTextField(i));
if(i < _metadatos.length-1) toRet.add(const SizedBox(height: 16.0)); if(i < metadatos.length-1) toRet.add(const SizedBox(height: 16.0));
} }
if(_metadatos.length > 4){ if(metadatos.length > 4){
final sublist = <Widget>[]; final sublist = <Widget>[];
sublist.add(const SizedBox(height: 16.0)); sublist.add(const SizedBox(height: 16.0));
for(int i = 4; i<_metadatos.length; i++){ for(int i = 4; i<metadatos.length; i++){
sublist.add(_buildTextFieldLabel(i)); sublist.add(_buildTextFieldLabel(i));
sublist.add(_buildTextField(i)); sublist.add(_buildTextField(i));
if(i < _metadatos.length-1) sublist.add(const SizedBox(height: 16.0)); if(i < metadatos.length-1) sublist.add(const SizedBox(height: 16.0));
} }
toRet.add(ExpansionTile( toRet.add(ExpansionTile(
...@@ -125,20 +113,21 @@ class _PaginaMetadatosState extends State<PaginaMetadatos> { ...@@ -125,20 +113,21 @@ class _PaginaMetadatosState extends State<PaginaMetadatos> {
Widget _buildTextFieldLabel(int index){ Widget _buildTextFieldLabel(int index){
return Text( return Text(
_metadatos[index].nombreMostrado, widget._metadatos[index].info.nombreMostrado,
style: Theme.of(context).textTheme.titleMedium style: Theme.of(context).textTheme.titleMedium
); );
} }
Widget _buildTextField(int index){ Widget _buildTextField(int index){
var metadatos = widget._metadatos;
return TextField( return TextField(
controller: _controladores[index], controller: _controladores[index],
decoration: InputDecoration( decoration: InputDecoration(
hintText: '${_metadatos[index].nombreMostrado}...', hintText: '${metadatos[index].info.nombreMostrado}...',
border: OutlineInputBorder(), border: OutlineInputBorder(),
), ),
keyboardType: keyboardType:
(_metadatos[index].numerico)? const TextInputType.numberWithOptions( (metadatos[index].info.numerico)? const TextInputType.numberWithOptions(
signed: true, signed: true,
decimal: false decimal: false
): null, ): null,
......
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