Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
Rafa Castillo Passols
/
Prototipo-Multimedia
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
42e26cb7
authored
May 28, 2025
by
Diego Pérez Peña
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
Finalización de la documentación del código
parent
93c9a0c8
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
55 additions
and
28 deletions
lib/paginas/pagina_ajustes.dart
lib/paginas/pagina_configuracion.dart
lib/paginas/pagina_configuracion_carpeta.dart
lib/paginas/pagina_conversion.dart
lib/paginas/pagina_fotograma.dart
lib/paginas/pagina_metadatos.dart
lib/paginas/pagina_principal.dart
lib/paginas/pagina_principal_llena.dart
lib/paginas/pagina_principal_vacia.dart
lib/paginas/pagina_ajustes.dart
View file @
42e26cb7
...
...
@@ -31,7 +31,7 @@ class PaginaAjustes extends StatefulWidget {
}
class
_PaginaAjustesState
extends
State
<
PaginaAjustes
>
{
//
I
ndices de los valores seleccionados de cada opcion
//
/ Í
ndices de los valores seleccionados de cada opcion
int
modoConversion
=
0
;
int
incluirSubcarpeta
=
0
;
int
carpetaSalidaIndex
=
0
;
...
...
@@ -183,6 +183,7 @@ class _PaginaAjustesState extends State<PaginaAjustes> {
);
}
/// Muestra un diálogo con las opciones disponibles para un ajuste
Future
<
T
?>
mostrarDialogoOpciones
<
T
>({
required
List
<
String
>
opciones
,
required
List
<
VoidCallback
>
callbacks
,
...
...
@@ -215,6 +216,7 @@ class _PaginaAjustesState extends State<PaginaAjustes> {
);
}
/// Abre el diálogo para elegir una carpeta de salida
Future
<
void
>
_elegirCarpetaSalida
(
BuildContext
context
,
int
indice
,
int
indicePorDefecto
)
async
{
if
(
await
ActionButton
.
comprobacionPermisoArchivos
(
context
)){
FilePicker
.
platform
.
getDirectoryPath
().
then
((
path
)
{
...
...
@@ -245,28 +247,4 @@ class _PaginaAjustesState extends State<PaginaAjustes> {
Navigator
.
pop
(
context
);
}
Future
<
void
>
_mostrarNotificacion
(
String
text
,
bool
opcion
)
async
{
await
showDialog
(
context:
context
,
builder:
(
context
)
{
return
AlertDialog
(
content:
Text
(
text
),
actions:
[
if
(
opcion
)
TextButton
(
onPressed:
()
{
Navigator
.
of
(
context
).
pop
();
openAppSettings
();
},
child:
const
Text
(
'SÍ'
),
),
TextButton
(
onPressed:
()
=>
Navigator
.
of
(
context
).
pop
(),
child:
(
opcion
)?
const
Text
(
'NO'
)
:
const
Text
(
'OK'
),
)
]
);
}
);
}
}
lib/paginas/pagina_configuracion.dart
View file @
42e26cb7
...
...
@@ -2,10 +2,13 @@ import 'package:flutter/material.dart';
import
'package:prueba_multimedia/modelo/modelo.dart'
;
import
'package:prueba_multimedia/paginas/paginas.dart'
;
/// Página de configuración para archivos, enlaces y formatos
class
PaginaConfiguracion
extends
StatefulWidget
{
final
ListaSeleccionables
_lista
;
/// Índice del seleccionable en la lista
final
int
_indice
;
final
Convertible
_elementoAsociado
;
/// Carpeta a la que pertenece el formato en su caso
final
Carpeta
?
_carpeta
;
const
PaginaConfiguracion
({
...
...
@@ -56,6 +59,7 @@ class _PaginaConfiguracionState extends State<PaginaConfiguracion> {
);
}
/// Construye el cuerpo de la página
Widget
_construirCuerpo
()
{
if
(
widget
.
_carpeta
!=
null
)
{
InfoFormato
infoFormato
=
widget
.
_elementoAsociado
as
InfoFormato
;
...
...
@@ -108,6 +112,7 @@ class _PaginaConfiguracionState extends State<PaginaConfiguracion> {
return
_paginas
[
_categoriaActiva
];
}
/// Construye los elementos en la barra de navegación inferior
List
<
BottomNavigationBarItem
>
_construirElementosBarraNavegacion
(){
Formato
formatoOriginal
=
widget
.
_elementoAsociado
.
formatoOriginal
;
bool
esFormatoVideo
=
formatoOriginal
.
tipoMultimedia
==
TipoMultimedia
.
video
;
...
...
lib/paginas/pagina_configuracion_carpeta.dart
View file @
42e26cb7
...
...
@@ -2,9 +2,12 @@ import 'package:flutter/material.dart';
import
'package:prueba_multimedia/modelo/modelo.dart'
;
import
'package:prueba_multimedia/paginas/paginas.dart'
;
/// Página de configuración para carpetas
class
PaginaConfiguracionCarpeta
extends
StatefulWidget
{
final
ListaSeleccionables
_lista
;
/// Lista de formatos de la carpeta
final
List
<
InfoFormato
>
_formatosCarpeta
;
/// Índice de la carpeta en la lista
final
int
_indice
;
final
Carpeta
_carpeta
;
...
...
@@ -48,6 +51,7 @@ class _PaginaConfiguracionCarpetaState extends State<PaginaConfiguracionCarpeta>
}
}
/// Función para actualizar el estado de las Checkbox de los tipos de multimedia
bool
?
_actualizarCheckboxTipo
(
TipoMultimedia
t
){
if
(
_formatos
[
t
]!.
isEmpty
)
return
false
;
...
...
@@ -129,6 +133,7 @@ class _PaginaConfiguracionCarpetaState extends State<PaginaConfiguracionCarpeta>
);
}
/// Construye las checkbox para los tipos de multimedia
Widget
_buildCheckboxTodos
(
BuildContext
context
){
const
Map
<
TipoMultimedia
,
String
>
textos
=
{
TipoMultimedia
.
imagen
:
'Todas las imágenes'
,
...
...
@@ -187,6 +192,7 @@ class _PaginaConfiguracionCarpetaState extends State<PaginaConfiguracionCarpeta>
));
}
/// Construye las entradas para cada formato
Widget
_buildFilasFormato
(
BuildContext
context
){
List
<
Widget
>
listaCarpeta
=
<
Widget
>[];
List
<
Widget
>
listaSubcarpeta
=
<
Widget
>[];
...
...
lib/paginas/pagina_conversion.dart
View file @
42e26cb7
import
'package:flutter/material.dart'
;
import
'package:prueba_multimedia/modelo/modelo.dart'
;
/// Página para seleccionar el formato de salida de un archivo, enlace o formato
class
PaginaConversion
extends
StatefulWidget
{
final
ListaSeleccionables
_lista
;
final
int
_indiceArchivo
;
/// Carpeta a la que pertenece (si es un formato en carpeta)
final
Carpeta
?
_carpeta
;
final
InfoFormato
?
_infoFormato
;
final
Convertible
?
_archivo
;
final
Formato
_formatoOriginal
;
/// Constructor para archivos y enlaces
const
PaginaConversion
.
convertible
({
super
.
key
,
required
Formato
formatoOriginal
,
...
...
@@ -22,6 +25,7 @@ class PaginaConversion extends StatefulWidget {
_infoFormato
=
null
,
_lista
=
lista
;
/// Constructor para formatos en carpetas
const
PaginaConversion
.
carpeta
({
super
.
key
,
required
Formato
formatoOriginal
,
...
...
@@ -42,12 +46,16 @@ class PaginaConversion extends StatefulWidget {
class
_PaginaConversionState
extends
State
<
PaginaConversion
>
with
SingleTickerProviderStateMixin
{
/// Formato de destino
Formato
?
_formatoConvertido
;
Calidad
?
_calidadActual
;
/// Controla si mostrar o no los perfiles
bool
_showProfiles
=
true
;
/// Controla qué tab mostrar en la página para formatos de vídeo
late
final
TabController
_tabController
;
/// Inicializa el tab controller
@override
void
initState
()
{
super
.
initState
();
...
...
@@ -62,6 +70,13 @@ class _PaginaConversionState extends State<PaginaConversion>
}
}
/// Elimina el tab controller
@override
void
dispose
()
{
_tabController
.
dispose
();
super
.
dispose
();
}
@override
Widget
build
(
BuildContext
context
)
{
return
Material
(
...
...
@@ -93,6 +108,7 @@ class _PaginaConversionState extends State<PaginaConversion>
);
}
/// Construye la caja con el formato original o el seleccionado
Widget
_createFormatBox
(
bool
original
){
final
String
nombreFormato
;
final
Color
fondo
;
...
...
@@ -129,7 +145,6 @@ class _PaginaConversionState extends State<PaginaConversion>
);
}
/// Comportamiento temporal: Mostrar todas las calidades
Widget
_createCalidadSelectionPanel
()
{
final
listaChips
=
Calidad
.
values
.
map
((
elemento
)
{
return
ChoiceChip
(
...
...
@@ -157,6 +172,7 @@ class _PaginaConversionState extends State<PaginaConversion>
);
}
/// Construye el panel de selección de conversión
Widget
_createConversionSelectionPanel
(){
if
(
widget
.
_formatoOriginal
.
tipoMultimedia
==
TipoMultimedia
.
video
&&
!
_showProfiles
){
return
_createTabVideos
();
...
...
@@ -166,6 +182,7 @@ class _PaginaConversionState extends State<PaginaConversion>
}
}
/// Construye las tabs para los vídeos
Widget
_createTabVideos
(){
final
tabs
=
<
Widget
>[];
final
grids
=
<
Widget
>[];
...
...
@@ -231,6 +248,7 @@ class _PaginaConversionState extends State<PaginaConversion>
);
}
/// Crea el panel de selección de formato o perfil
Widget
_createDefaultConversionPanel
()
{
return
Material
(
clipBehavior:
Clip
.
antiAlias
,
...
...
@@ -273,6 +291,7 @@ class _PaginaConversionState extends State<PaginaConversion>
);
}
/// Construye los botones que permiten alternar entre perfiles o formatos
Widget
_createBotonesPerfilFormato
(){
return
Row
(
mainAxisAlignment:
MainAxisAlignment
.
center
,
...
...
@@ -322,6 +341,7 @@ class _PaginaConversionState extends State<PaginaConversion>
);
}
/// Construye la lista de perfiles
List
<
Widget
>
_createListPerfiles
(){
final
toRet
=
<
Widget
>[];
...
...
@@ -382,6 +402,7 @@ class _PaginaConversionState extends State<PaginaConversion>
return
toRet
;
}
/// Construye la rejilla de botones de conversión
List
<
Widget
>
_createGridBotonesConversion
({
TipoMultimedia
?
tipo
}){
tipo
??=
widget
.
_formatoOriginal
.
tipoMultimedia
;
final
listaFormatos
=
Formato
.
listadoFormatos
(
...
...
@@ -482,6 +503,7 @@ class _PaginaConversionState extends State<PaginaConversion>
}).
toList
();
}
/// Actualiza el formato seleccionado
void
_cambiarFormatoCalidad
(
Formato
?
destino
,
Calidad
?
calidad
){
setState
((){
_formatoConvertido
=
destino
;
...
...
lib/paginas/pagina_fotograma.dart
View file @
42e26cb7
...
...
@@ -5,6 +5,8 @@ import 'package:path_provider/path_provider.dart';
import
'../modelo/modelo.dart'
;
/// Página para seleccionar fotogramas dentro de un vídeo que se convierte a
/// imagen
class
PaginaFotograma
extends
StatefulWidget
{
final
ListaSeleccionables
_lista
;
final
Archivo
_archivo
;
...
...
@@ -155,6 +157,7 @@ class _PaginaFotogramaState extends State<PaginaFotograma> {
);
}
/// Construye los botones para moverse entre fotogramas
Widget
_construirBotonesFotograma
(
BuildContext
context
)
{
final
buttons
=
<
Widget
>[];
for
(
var
button
in
_buttons
){
...
...
@@ -209,6 +212,7 @@ class _PaginaFotogramaState extends State<PaginaFotograma> {
);
}
/// Carga el número de fotogramas y la duración del vídeo
Future
<
void
>
loadNumberFotogramas
()
async
{
// Obtener número de fotogramas
int
?
numFotogramas
=
await
Conversor
.
getNumFotogramas
(
widget
.
_archivo
);
...
...
@@ -226,6 +230,7 @@ class _PaginaFotogramaState extends State<PaginaFotograma> {
}
}
/// Carga la imagen del fotograma seleccionado
Future
<
File
>
loadFotograma
(
int
fotograma
)
async
{
final
directory
=
await
getApplicationSupportDirectory
();
String
pathSalida
=
'
${directory.absolute.path}${Platform.pathSeparator}
fotograma.
${widget._archivo.formatoDestino?.extension}
'
;
...
...
@@ -233,6 +238,7 @@ class _PaginaFotogramaState extends State<PaginaFotograma> {
return
File
(
pathSalida
).
create
();
}
/// Limpia la carpeta de archivos temporales
Future
<
void
>
clearTemp
()
async
{
final
directory
=
await
getApplicationSupportDirectory
();
final
list
=
directory
.
listSync
();
...
...
@@ -242,6 +248,7 @@ class _PaginaFotogramaState extends State<PaginaFotograma> {
}
}
/// Enumerado de los botones para desplazarse entre fotogramas
enum
_IconButtons
{
DOBLE_ATRAS
(
Icon
(
Icons
.
keyboard_double_arrow_left
),
-
60
),
ATRAS
(
Icon
(
Icons
.
chevron_left
),
-
1
),
...
...
lib/paginas/pagina_metadatos.dart
View file @
42e26cb7
import
'package:flutter/material.dart'
;
import
'package:prueba_multimedia/modelo/modelo.dart'
;
/// Página para leer y modificar los metadatos de un archivo o enlace
class
PaginaMetadatos
extends
StatefulWidget
{
final
ListaSeleccionables
_lista
;
final
int
_indice
;
...
...
@@ -19,7 +20,7 @@ class _PaginaMetadatosState extends State<PaginaMetadatos> {
final
List
<
TextEditingController
>
_controladores
=
[];
final
List
<
String
>
_valoresElegidos
=
[];
/// Inicializa los controladores
@override
void
initState
()
{
super
.
initState
();
...
...
@@ -39,6 +40,7 @@ class _PaginaMetadatosState extends State<PaginaMetadatos> {
}
}
/// Libera los recursos de los controladores
@override
void
dispose
()
{
for
(
var
controlador
in
_controladores
)
{
...
...
@@ -116,6 +118,7 @@ class _PaginaMetadatosState extends State<PaginaMetadatos> {
return
toRet
;
}
/// Construye la etiqueta con el título de cada metadato
Widget
_buildTextFieldLabel
(
int
index
){
return
Text
(
widget
.
_metadatos
[
index
].
info
.
nombreMostrado
,
...
...
@@ -123,6 +126,7 @@ class _PaginaMetadatosState extends State<PaginaMetadatos> {
);
}
/// Construye el campo de texto para modificar cada metadato
Widget
_buildTextField
(
int
index
){
var
metadatos
=
widget
.
_metadatos
;
return
TextField
(
...
...
lib/paginas/pagina_principal.dart
View file @
42e26cb7
...
...
@@ -6,12 +6,13 @@ import 'package:prueba_multimedia/widgets/widgets.dart';
import
'package:prueba_multimedia/modelo/modelo.dart'
;
import
'package:prueba_multimedia/paginas/paginas.dart'
;
/// Página principal de la aplicación
class
PaginaPrincipal
extends
StatelessWidget
{
const
PaginaPrincipal
({
super
.
key
});
@override
Widget
build
(
BuildContext
context
)
{
// Función para mostrar la Snackbar después de convertir
void
mostrarSnackBarConvertir
(){
ScaffoldMessenger
.
of
(
context
).
showSnackBar
(
SnackBar
(
content:
Text
(
...
...
@@ -59,6 +60,7 @@ class PaginaPrincipal extends StatelessWidget {
);
}
/// Construye el cuerpo (lleno o vacío) de la página
Widget
_construirCuerpo
(
BuildContext
context
)
{
return
Consumer2
<
ListaSeleccionables
,
ProviderAjustes
>(
builder:
(
context
,
lista
,
ajustes
,
child
)
{
...
...
@@ -71,6 +73,7 @@ class PaginaPrincipal extends StatelessWidget {
);
}
/// Construye los elementos en la parte inferior de la página (FAB o progress bar)
Widget
_construitFAB
(
BuildContext
context
,
VoidCallback
function
){
return
Consumer2
<
ListaSeleccionables
,
ProviderAjustes
>(
builder:
(
context
,
lista
,
ajustes
,
child
)
{
...
...
lib/paginas/pagina_principal_llena.dart
View file @
42e26cb7
...
...
@@ -3,6 +3,7 @@ import 'package:prueba_multimedia/modelo/modelo.dart';
import
'package:prueba_multimedia/widgets/carpeta_widget.dart'
;
import
'package:prueba_multimedia/widgets/widgets.dart'
;
/// Página principal con la lista de elementos seleccionados para la conversión
class
PaginaPrincipalLlena
extends
StatelessWidget
{
final
ListaSeleccionables
listaSeleccionables
;
...
...
lib/paginas/pagina_principal_vacia.dart
View file @
42e26cb7
import
'package:flutter/material.dart'
;
/// Página principal sin elementos seleccionables
class
PaginaPrincipalVacia
extends
StatelessWidget
{
const
PaginaPrincipalVacia
({
super
.
key
});
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment