Primer acercamiento a la página de metadatos

parent 4e64f4c9
...@@ -20,67 +20,86 @@ class Formato{ ...@@ -20,67 +20,86 @@ class Formato{
} }
enum ClaseFormato{ enum ClaseFormato{
PNG('.png', PNG('png',
'Portable Network Graphics', 'Portable Network Graphics',
TipoMultimedia.IMAGEN, TipoMultimedia.IMAGEN,
'Calidad', 'Calidad',
'Nombre, Autor...', [],
'Formato gráfico basado en un algoritmo de compresión sin pérdida para bitmaps no sujeto a patentes. Fue desarrollado en buena parte para solventar las deficiencias del formato GIF y permite almacenar imágenes con una mayor profundidad de contraste y otros datos importantes.' 'Formato gráfico basado en un algoritmo de compresión sin pérdida para bitmaps no sujeto a patentes. Fue desarrollado en buena parte para solventar las deficiencias del formato GIF y permite almacenar imágenes con una mayor profundidad de contraste y otros datos importantes.'
), ),
JPG('.jpg', JPG('jpg',
'Joint Photographic Experts Group', 'Joint Photographic Experts Group',
TipoMultimedia.IMAGEN, TipoMultimedia.IMAGEN,
'Ligero', 'Ligero',
'Nombre, Autor...', [],
'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'
), ),
TIF('.tif', TIF('tif',
'Tagged Image File Format', 'Tagged Image File Format',
TipoMultimedia.IMAGEN, TipoMultimedia.IMAGEN,
'Calidad', 'Calidad',
'Nombre, Autor...', [],
'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.'
), ),
MP3('.mp3', MP3('mp3',
'MPEG-1 Layer III', 'MPEG-1 Layer III',
TipoMultimedia.AUDIO, TipoMultimedia.AUDIO,
'Calidad', 'Calidad',
'Nombre, Autor...', [ Metadato('Título', 'title'),
Metadato('Artista', 'artist'),
Metadato('Álbum', 'album'),
Metadato('Género', 'genre'),
Metadato('Compositor', 'composer'),
Metadato('Número de pista', 'track', true),
Metadato('Idioma', 'language')],
'Un formato de compresión de audio digital que usa un algoritmo con pérdida para conseguir un menor tamaño de archivo. Es un formato de audio común utilizado para música tanto en computadoras como en reproductores de audio portátil.' 'Un formato de compresión de audio digital que usa un algoritmo con pérdida para conseguir un menor tamaño de archivo. Es un formato de audio común utilizado para música tanto en computadoras como en reproductores de audio portátil.'
), ),
OGG('.ogg', OGG('ogg',
'Xiph.org Ogg', 'Xiph.org Ogg',
TipoMultimedia.AUDIO, TipoMultimedia.AUDIO,
'Versátil', 'Versátil',
'Nombre, Autor...', [],
'Un formato contenedor libre y abierto, desarrollado y mantenido por la Fundación Xiph.Org que no está restringido por las patentes de software, y está diseñado para proporcionar una difusión de flujo eficiente y manipulación de multimedios digitales de alta calidad.' 'Un formato contenedor libre y abierto, desarrollado y mantenido por la Fundación Xiph.Org que no está restringido por las patentes de software, y está diseñado para proporcionar una difusión de flujo eficiente y manipulación de multimedios digitales de alta calidad.'
), ),
WAV('.wav', WAV('wav',
'Waveform Audio File Format', 'Waveform Audio File Format',
TipoMultimedia.AUDIO, TipoMultimedia.AUDIO,
'Calidad', 'Calidad',
'Nombre, Autor...', [],
'Un formato de audio digital con o sin compresión de datos desarrollado por Microsoft e IBM que se utiliza para almacenar flujos digitales de audio en el PC, mono y estéreo a diversas resoluciones y velocidades de muestreo.' 'Un formato de audio digital con o sin compresión de datos desarrollado por Microsoft e IBM que se utiliza para almacenar flujos digitales de audio en el PC, mono y estéreo a diversas resoluciones y velocidades de muestreo.'
), ),
MP4('.mp4', MP4('mp4',
'MPEG-4 Parte 14', 'MPEG-4 Parte 14',
TipoMultimedia.VIDEO, TipoMultimedia.VIDEO,
'Calidad', 'Calidad',
'Nombre, Autor...', [ Metadato('Título', 'title'),
Metadato('Autor', 'author'),
Metadato('Álbum', 'album'),
Metadato('Año', 'year', true),
Metadato('Género', 'genre'),
Metadato('Compositor', 'composer'),
Metadato('Número de pista', 'track', true),
Metadato('Descripción', 'description'),
Metadato('Comentario', 'comment')],
'Un formato contenedor especificado como parte del estándar internacional MPEG-4 de ISO/IEC. Es utilizado para almacenar los formatos audiovisuales especificados por ISO/IEC y el grupo MPEG (Moving Picture Experts Group) al igual que otros formatos audiovisuales disponibles.' 'Un formato contenedor especificado como parte del estándar internacional MPEG-4 de ISO/IEC. Es utilizado para almacenar los formatos audiovisuales especificados por ISO/IEC y el grupo MPEG (Moving Picture Experts Group) al igual que otros formatos audiovisuales disponibles.'
), ),
MKV('.mkv', MKV('mkv',
'Matroshka', 'Matroshka',
TipoMultimedia.VIDEO, TipoMultimedia.VIDEO,
'Calidad', 'Calidad',
'Nombre, Autor...', [ Metadato('Título', 'title'),
Metadato('Descripción', 'description'),
Metadato('Idioma', 'language')],
'Un formato contenedor abierto que puede almacenar una cantidad muy grande de vídeo, audio, imagen o pistas de subtítulos dentro de un solo archivo. Su finalidad es la de servir como formato universal para el almacenamiento de contenidos audiovisuales y multimedia, como películas o programas de televisión, imágenes y textos.' 'Un formato contenedor abierto que puede almacenar una cantidad muy grande de vídeo, audio, imagen o pistas de subtítulos dentro de un solo archivo. Su finalidad es la de servir como formato universal para el almacenamiento de contenidos audiovisuales y multimedia, como películas o programas de televisión, imágenes y textos.'
), ),
WMV('.wmv', WMV('wmv',
'Windows Media Video', 'Windows Media Video',
TipoMultimedia.VIDEO, TipoMultimedia.VIDEO,
'Calidad', 'Calidad',
'Nombre, Autor...', [ Metadato('Título', 'title'),
Metadato('Autor', 'author'),
Metadato('Valoración', 'rating'),
Metadato('Comentario', 'comment')],
'Un formato de vídeo desarrollado por Microsoft, que forma parte del framework Windows Media. No está contruida solo con tecnología interna de Microsoft. Desde la versión 7 (WMV1), Microsoft ha utilizado su propia versión no estandarizada de MPEG-4. El vídeo a menudo se combina con sonido en formato Windows Media Audio.' 'Un formato de vídeo desarrollado por Microsoft, que forma parte del framework Windows Media. No está contruida solo con tecnología interna de Microsoft. Desde la versión 7 (WMV1), Microsoft ha utilizado su propia versión no estandarizada de MPEG-4. El vídeo a menudo se combina con sonido en formato Windows Media Audio.'
); );
...@@ -89,12 +108,13 @@ enum ClaseFormato{ ...@@ -89,12 +108,13 @@ enum ClaseFormato{
final TipoMultimedia _tipoMultimedia; final TipoMultimedia _tipoMultimedia;
final String _descripcion; final String _descripcion;
final String _clasificacion; final String _clasificacion;
final String _metadatos; final List<Metadato> _metadatos;
String get extension => _extension; String get extension => _extension;
String get nombre => _nombre; String get nombre => _nombre;
String get descripcion => _descripcion; String get descripcion => _descripcion;
TipoMultimedia get tipoMultimedia => _tipoMultimedia; TipoMultimedia get tipoMultimedia => _tipoMultimedia;
List<Metadato> get metadatos => _metadatos;
const ClaseFormato(this._extension, this._nombre, this._tipoMultimedia, this._clasificacion, this._metadatos, this._descripcion); const ClaseFormato(this._extension, this._nombre, this._tipoMultimedia, this._clasificacion, this._metadatos, this._descripcion);
...@@ -123,4 +143,17 @@ enum Calidad{ ...@@ -123,4 +143,17 @@ enum Calidad{
Alta, Alta,
Muy_alta, Muy_alta,
ORIGINAL ORIGINAL
}
class Metadato{
final String _nombreMostrado;
final String _nombreInterno;
final bool _numerico;
String get nombreMostrado => _nombreMostrado;
String get nombreInterno => _nombreInterno;
bool get numerico => _numerico;
const Metadato(String nombreMostrado, String nombreInterno, [bool numerico = false]):
_nombreMostrado = nombreMostrado, _nombreInterno = nombreInterno, _numerico = numerico;
} }
\ No newline at end of file
...@@ -4,6 +4,7 @@ import 'package:prueba_multimedia/modelo/elemento_seleccionable.dart'; ...@@ -4,6 +4,7 @@ import 'package:prueba_multimedia/modelo/elemento_seleccionable.dart';
import 'package:prueba_multimedia/modelo/carpeta.dart'; import 'package:prueba_multimedia/modelo/carpeta.dart';
import 'package:prueba_multimedia/modelo/enlace.dart'; import 'package:prueba_multimedia/modelo/enlace.dart';
import 'package:prueba_multimedia/paginas/pagina_conversion.dart'; import 'package:prueba_multimedia/paginas/pagina_conversion.dart';
import 'package:prueba_multimedia/paginas/pagina_metadatos.dart';
class PaginaConfiguracion extends StatefulWidget { class PaginaConfiguracion extends StatefulWidget {
final ElementoSeleccionable _elementoAsociado; final ElementoSeleccionable _elementoAsociado;
...@@ -64,20 +65,21 @@ class _PaginaConfiguracionState extends State<PaginaConfiguracion> { ...@@ -64,20 +65,21 @@ class _PaginaConfiguracionState extends State<PaginaConfiguracion> {
sb.write(" "); sb.write(" ");
sb.write(widget._elementoAsociado.nombre); sb.write(widget._elementoAsociado.nombre);
if(widget._elementoAsociado is ArchivoIndividual){ if(widget._elementoAsociado is ArchivoIndividual){
sb.write('.');
sb.write((widget._elementoAsociado as ArchivoIndividual).formatoActual.claseFormato.extension); sb.write((widget._elementoAsociado as ArchivoIndividual).formatoActual.claseFormato.extension);
} }
return sb.toString(); return sb.toString();
} }
Widget _construirCuerpo() { Widget _construirCuerpo() {
if(widget._elementoAsociado is ArchivoIndividual){ if(widget._elementoAsociado is ArchivoIndividual){
final arch = widget._elementoAsociado as ArchivoIndividual;
if(_categoriaActiva == 0){ if(_categoriaActiva == 0){
return PaginaConversion(formatoOriginal: (widget._elementoAsociado as ArchivoIndividual).formatoActual); return PaginaConversion(formatoOriginal: arch.formatoActual);
} }
else{ else{
// Página de metadatos // Página de metadatos
return Placeholder(); return PaginaMetadatos(formato: arch.formatoActual.claseFormato);
} }
} }
// Páginas de carpetas y formato de archivo para carpeta // Páginas de carpetas y formato de archivo para carpeta
......
...@@ -60,7 +60,7 @@ class _PaginaConversionState extends State<PaginaConversion> ...@@ -60,7 +60,7 @@ class _PaginaConversionState extends State<PaginaConversion>
} }
Widget _createOriginalFormatBox(){ Widget _createOriginalFormatBox(){
final String nombreFormato = widget._formatoOriginal.claseFormato.extension.substring(1).toUpperCase(); final String nombreFormato = widget._formatoOriginal.claseFormato.name.toUpperCase();
return DecoratedBox( return DecoratedBox(
decoration: BoxDecoration( decoration: BoxDecoration(
...@@ -88,7 +88,7 @@ class _PaginaConversionState extends State<PaginaConversion> ...@@ -88,7 +88,7 @@ class _PaginaConversionState extends State<PaginaConversion>
nombreFormato = ' '; nombreFormato = ' ';
} }
else{ else{
nombreFormato = _formatoConvertido!.claseFormato.extension.substring(1).toUpperCase(); nombreFormato = _formatoConvertido!.claseFormato.name.toUpperCase();
} }
return DecoratedBox( return DecoratedBox(
......
import 'package:flutter/material.dart';
import '../modelo/formato.dart';
class PaginaMetadatos extends StatefulWidget {
final ClaseFormato _formato;
const PaginaMetadatos({super.key, required formato}): _formato = formato;
@override
State<PaginaMetadatos> createState() => _PaginaMetadatosState();
}
class _PaginaMetadatosState extends State<PaginaMetadatos> {
late final List<Metadato> _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());
_controladores[i].addListener( () {
setState(() { _valoresElegidos[i] = _controladores[i].text; });
}
);
}
}
@override
void dispose() {
while(_controladores.isNotEmpty){
_controladores.first.dispose();
_controladores.removeAt(0);
}
super.dispose();
}
@override
Widget build(BuildContext context) {
return SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(15.0),
child: Column(
children: _buildTextFields()
),
),
);
}
List<Widget> _buildTextFields(){
final toRet = <Widget>[];
for(int i = 0; i<_metadatos.length; i++){
toRet.add(Text(
_metadatos[i].nombreMostrado,
style: Theme.of(context).textTheme.titleMedium
));
toRet.add(InputDecorator(
decoration: const InputDecoration(
border: OutlineInputBorder()
),
child: TextField(
controller: _controladores[i],
decoration: InputDecoration(
hintText: '${_metadatos[i].nombreMostrado}...'
),
keyboardType:
(_metadatos[i].numerico)? const TextInputType.numberWithOptions(
signed: true,
decimal: false
): null,
),
));
if(i < _metadatos.length-1) toRet.add(const SizedBox(height: 16.0));
}
return toRet;
}
}
...@@ -32,7 +32,7 @@ class _PaginaPrincipalState extends State<PaginaPrincipal> { ...@@ -32,7 +32,7 @@ class _PaginaPrincipalState extends State<PaginaPrincipal> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return PaginaConfiguracion(elementoAsociado: ArchivoIndividual( return PaginaConfiguracion(elementoAsociado: ArchivoIndividual(
id: '1', nombre: 'miArchivo', localizacion: 'C:\\', id: '1', nombre: 'miArchivo', localizacion: 'C:\\',
conversion: Conversion(formatoOriginal: ClaseFormato.PNG) conversion: Conversion(formatoOriginal: ClaseFormato.MP4)
)); ));
/*return PaginaConfiguracion(elementoAsociado: Carpeta( /*return PaginaConfiguracion(elementoAsociado: Carpeta(
id: '2', nombre: 'miCarpeta', localizacion: 'C:\\' id: '2', nombre: 'miCarpeta', localizacion: 'C:\\'
......
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