Cambiado la pagina de metadatos para poder incluir el observable

parent bc6f1f51
......@@ -6,21 +6,10 @@ import 'formato.dart';
// TODO: QUE PASA SI NO RECONOCEMOS EL FORMATO?
class Archivo extends Convertible {
final File _file;
late final List<Metadato> _metadatos;
bool _metadatosComplete = false;
final File file;
late final Future<List<Metadato>> metadatos;
File get file => _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,
Archivo({required super.id, required this.file}):
super(
nombre: file.path.split('/').last,
// TODO: POR AHORA USAMOS (!) PERO HAY QUE TENERLO EN CUENTA
......@@ -28,6 +17,6 @@ class Archivo extends Convertible {
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{
_directory = directory, _formatos = [],
super(nombre: directory.path.split('/').last, icon: const Icon(Icons.folder_outlined));
@override
void convertir() {
// TODO: <implement>
}
}
class InfoFormato {
......
......@@ -13,6 +13,4 @@ abstract class ElementoSeleccionable{
required String nombre,
required Icon icon}):
_id = id, _nombre = nombre, _icono = icon;
void convertir();
}
\ No newline at end of file
......@@ -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'
),
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, [],
'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 {
year("Año", true),
description("Descripción"),
comment("Comentario"),
rating("Valoración", true);
rating("Valoración", true),
encoder("Encoder", false);
final String _nombreMostrado;
final bool _esNumerico;
......
......@@ -2,59 +2,49 @@ import 'package:flutter/material.dart';
import 'package:prueba_multimedia/modelo/modelo.dart';
class PaginaMetadatos extends StatefulWidget {
final List<Metadato> _metadatos;
final Formato _formato;
const PaginaMetadatos({super.key, required formato}): _formato = formato;
const PaginaMetadatos({super.key, required metadatos, required formato}):
_metadatos = metadatos, _formato = formato;
@override
State<PaginaMetadatos> createState() => _PaginaMetadatosState();
}
class _PaginaMetadatosState extends State<PaginaMetadatos> {
late final List<MetadatoInfo> _metadatos;
final List<TextEditingController> _controladores = [];
final List<String> _valoresElegidos = [];
@override
void initState() {
super.initState();
_metadatos = widget._formato.metadatos;
for(int i = 0; i<_metadatos.length; i++){
_valoresElegidos.add('');
_controladores.add(TextEditingController());
if(_metadatos[i].numerico){
_controladores[i].addListener(() {
setState(() {
String texto = _controladores[i].value.text;
if(texto.isEmpty || RegExp(r'^[0-9]+$').hasMatch(texto)){
_valoresElegidos[i] = _controladores[i].text;
}
else{
_controladores[i].text = _valoresElegidos[i];
}
});
});
}
else{
_controladores[i].addListener(() {
setState(() { _valoresElegidos[i] = _controladores[i].text; });
});
}
var metadatos = widget._metadatos;
for (var metadato in metadatos) {
String valorElegido = metadato.valor;
_valoresElegidos.add(valorElegido);
var controller = TextEditingController(text: metadato.valor);
controller.addListener(
() => setState(() { valorElegido = controller.text; })
);
_controladores.add(controller);
}
}
@override
void dispose() {
while(_controladores.isNotEmpty){
_controladores.first.dispose();
_controladores.removeAt(0);
for (var controlador in _controladores) {
controlador.dispose();
}
super.dispose();
}
@override
Widget build(BuildContext context) {
if(_metadatos.isNotEmpty){
var metadatos = widget._metadatos;
if(metadatos.isNotEmpty){
return SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(15.0),
......@@ -64,19 +54,16 @@ class _PaginaMetadatosState extends State<PaginaMetadatos> {
),
);
}
else{
final sb = StringBuffer();
sb.write('El formato seleccionado (.');
sb.write(widget._formato.extension);
sb.write(') no admite metadatos.');
else {
String mensaje = 'El formato seleccionado '
'(.${widget._formato.extension}) no admite metadatos';
return Padding(
padding: const EdgeInsets.all(15.0),
child: SafeArea(
child: Align(
alignment: Alignment.center,
child: Text(
sb.toString(),
mensaje,
style: Theme.of(context).textTheme.titleLarge,
textAlign: TextAlign.center,
),
......@@ -87,24 +74,25 @@ class _PaginaMetadatosState extends State<PaginaMetadatos> {
}
List<Widget> _buildTextFields(){
var metadatos = widget._metadatos;
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(_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>[];
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(_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(
......@@ -125,20 +113,21 @@ class _PaginaMetadatosState extends State<PaginaMetadatos> {
Widget _buildTextFieldLabel(int index){
return Text(
_metadatos[index].nombreMostrado,
widget._metadatos[index].info.nombreMostrado,
style: Theme.of(context).textTheme.titleMedium
);
}
Widget _buildTextField(int index){
var metadatos = widget._metadatos;
return TextField(
controller: _controladores[index],
decoration: InputDecoration(
hintText: '${_metadatos[index].nombreMostrado}...',
hintText: '${metadatos[index].info.nombreMostrado}...',
border: OutlineInputBorder(),
),
keyboardType:
(_metadatos[index].numerico)? const TextInputType.numberWithOptions(
(metadatos[index].info.numerico)? const TextInputType.numberWithOptions(
signed: true,
decimal: false
): 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