Finalización de la documentación del código

parent 93c9a0c8
......@@ -31,7 +31,7 @@ class PaginaAjustes extends StatefulWidget {
}
class _PaginaAjustesState extends State<PaginaAjustes> {
// Indices 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'),
)
]
);
}
);
}
}
......@@ -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;
......
......@@ -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>[];
......
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;
......
......@@ -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),
......
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(
......
......@@ -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) {
......
......@@ -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;
......
import 'package:flutter/material.dart';
/// Página principal sin elementos seleccionables
class PaginaPrincipalVacia extends StatelessWidget {
const PaginaPrincipalVacia({super.key});
......
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