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

parent 93c9a0c8
...@@ -31,7 +31,7 @@ class PaginaAjustes extends StatefulWidget { ...@@ -31,7 +31,7 @@ class PaginaAjustes extends StatefulWidget {
} }
class _PaginaAjustesState extends State<PaginaAjustes> { 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 modoConversion = 0;
int incluirSubcarpeta = 0; int incluirSubcarpeta = 0;
int carpetaSalidaIndex = 0; int carpetaSalidaIndex = 0;
...@@ -183,6 +183,7 @@ class _PaginaAjustesState extends State<PaginaAjustes> { ...@@ -183,6 +183,7 @@ class _PaginaAjustesState extends State<PaginaAjustes> {
); );
} }
/// Muestra un diálogo con las opciones disponibles para un ajuste
Future<T?> mostrarDialogoOpciones<T>({ Future<T?> mostrarDialogoOpciones<T>({
required List<String> opciones, required List<String> opciones,
required List<VoidCallback> callbacks, required List<VoidCallback> callbacks,
...@@ -215,6 +216,7 @@ class _PaginaAjustesState extends State<PaginaAjustes> { ...@@ -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 { Future<void> _elegirCarpetaSalida(BuildContext context, int indice, int indicePorDefecto) async {
if(await ActionButton.comprobacionPermisoArchivos(context)){ if(await ActionButton.comprobacionPermisoArchivos(context)){
FilePicker.platform.getDirectoryPath().then((path) { FilePicker.platform.getDirectoryPath().then((path) {
...@@ -245,28 +247,4 @@ class _PaginaAjustesState extends State<PaginaAjustes> { ...@@ -245,28 +247,4 @@ class _PaginaAjustesState extends State<PaginaAjustes> {
Navigator.pop(context); 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'; ...@@ -2,10 +2,13 @@ import 'package:flutter/material.dart';
import 'package:prueba_multimedia/modelo/modelo.dart'; import 'package:prueba_multimedia/modelo/modelo.dart';
import 'package:prueba_multimedia/paginas/paginas.dart'; import 'package:prueba_multimedia/paginas/paginas.dart';
/// Página de configuración para archivos, enlaces y formatos
class PaginaConfiguracion extends StatefulWidget { class PaginaConfiguracion extends StatefulWidget {
final ListaSeleccionables _lista; final ListaSeleccionables _lista;
/// Índice del seleccionable en la lista
final int _indice; final int _indice;
final Convertible _elementoAsociado; final Convertible _elementoAsociado;
/// Carpeta a la que pertenece el formato en su caso
final Carpeta? _carpeta; final Carpeta? _carpeta;
const PaginaConfiguracion({ const PaginaConfiguracion({
...@@ -56,6 +59,7 @@ class _PaginaConfiguracionState extends State<PaginaConfiguracion> { ...@@ -56,6 +59,7 @@ class _PaginaConfiguracionState extends State<PaginaConfiguracion> {
); );
} }
/// Construye el cuerpo de la página
Widget _construirCuerpo() { Widget _construirCuerpo() {
if (widget._carpeta != null) { if (widget._carpeta != null) {
InfoFormato infoFormato = widget._elementoAsociado as InfoFormato; InfoFormato infoFormato = widget._elementoAsociado as InfoFormato;
...@@ -108,6 +112,7 @@ class _PaginaConfiguracionState extends State<PaginaConfiguracion> { ...@@ -108,6 +112,7 @@ class _PaginaConfiguracionState extends State<PaginaConfiguracion> {
return _paginas[_categoriaActiva]; return _paginas[_categoriaActiva];
} }
/// Construye los elementos en la barra de navegación inferior
List<BottomNavigationBarItem> _construirElementosBarraNavegacion(){ List<BottomNavigationBarItem> _construirElementosBarraNavegacion(){
Formato formatoOriginal = widget._elementoAsociado.formatoOriginal; Formato formatoOriginal = widget._elementoAsociado.formatoOriginal;
bool esFormatoVideo = formatoOriginal.tipoMultimedia == TipoMultimedia.video; bool esFormatoVideo = formatoOriginal.tipoMultimedia == TipoMultimedia.video;
......
...@@ -2,9 +2,12 @@ import 'package:flutter/material.dart'; ...@@ -2,9 +2,12 @@ import 'package:flutter/material.dart';
import 'package:prueba_multimedia/modelo/modelo.dart'; import 'package:prueba_multimedia/modelo/modelo.dart';
import 'package:prueba_multimedia/paginas/paginas.dart'; import 'package:prueba_multimedia/paginas/paginas.dart';
/// Página de configuración para carpetas
class PaginaConfiguracionCarpeta extends StatefulWidget { class PaginaConfiguracionCarpeta extends StatefulWidget {
final ListaSeleccionables _lista; final ListaSeleccionables _lista;
/// Lista de formatos de la carpeta
final List<InfoFormato> _formatosCarpeta; final List<InfoFormato> _formatosCarpeta;
/// Índice de la carpeta en la lista
final int _indice; final int _indice;
final Carpeta _carpeta; final Carpeta _carpeta;
...@@ -48,6 +51,7 @@ class _PaginaConfiguracionCarpetaState extends State<PaginaConfiguracionCarpeta> ...@@ -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){ bool? _actualizarCheckboxTipo(TipoMultimedia t){
if(_formatos[t]!.isEmpty) return false; if(_formatos[t]!.isEmpty) return false;
...@@ -129,6 +133,7 @@ class _PaginaConfiguracionCarpetaState extends State<PaginaConfiguracionCarpeta> ...@@ -129,6 +133,7 @@ class _PaginaConfiguracionCarpetaState extends State<PaginaConfiguracionCarpeta>
); );
} }
/// Construye las checkbox para los tipos de multimedia
Widget _buildCheckboxTodos(BuildContext context){ Widget _buildCheckboxTodos(BuildContext context){
const Map<TipoMultimedia, String> textos = { const Map<TipoMultimedia, String> textos = {
TipoMultimedia.imagen : 'Todas las imágenes', TipoMultimedia.imagen : 'Todas las imágenes',
...@@ -187,6 +192,7 @@ class _PaginaConfiguracionCarpetaState extends State<PaginaConfiguracionCarpeta> ...@@ -187,6 +192,7 @@ class _PaginaConfiguracionCarpetaState extends State<PaginaConfiguracionCarpeta>
)); ));
} }
/// Construye las entradas para cada formato
Widget _buildFilasFormato(BuildContext context){ Widget _buildFilasFormato(BuildContext context){
List<Widget> listaCarpeta = <Widget>[]; List<Widget> listaCarpeta = <Widget>[];
List<Widget> listaSubcarpeta = <Widget>[]; List<Widget> listaSubcarpeta = <Widget>[];
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:prueba_multimedia/modelo/modelo.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 { class PaginaConversion extends StatefulWidget {
final ListaSeleccionables _lista; final ListaSeleccionables _lista;
final int _indiceArchivo; final int _indiceArchivo;
/// Carpeta a la que pertenece (si es un formato en carpeta)
final Carpeta? _carpeta; final Carpeta? _carpeta;
final InfoFormato? _infoFormato; final InfoFormato? _infoFormato;
final Convertible? _archivo; final Convertible? _archivo;
final Formato _formatoOriginal; final Formato _formatoOriginal;
/// Constructor para archivos y enlaces
const PaginaConversion.convertible({ const PaginaConversion.convertible({
super.key, super.key,
required Formato formatoOriginal, required Formato formatoOriginal,
...@@ -22,6 +25,7 @@ class PaginaConversion extends StatefulWidget { ...@@ -22,6 +25,7 @@ class PaginaConversion extends StatefulWidget {
_infoFormato = null, _infoFormato = null,
_lista = lista; _lista = lista;
/// Constructor para formatos en carpetas
const PaginaConversion.carpeta({ const PaginaConversion.carpeta({
super.key, super.key,
required Formato formatoOriginal, required Formato formatoOriginal,
...@@ -42,12 +46,16 @@ class PaginaConversion extends StatefulWidget { ...@@ -42,12 +46,16 @@ class PaginaConversion extends StatefulWidget {
class _PaginaConversionState extends State<PaginaConversion> class _PaginaConversionState extends State<PaginaConversion>
with SingleTickerProviderStateMixin { with SingleTickerProviderStateMixin {
/// Formato de destino
Formato? _formatoConvertido; Formato? _formatoConvertido;
Calidad? _calidadActual; Calidad? _calidadActual;
/// Controla si mostrar o no los perfiles
bool _showProfiles = true; bool _showProfiles = true;
/// Controla qué tab mostrar en la página para formatos de vídeo
late final TabController _tabController; late final TabController _tabController;
/// Inicializa el tab controller
@override @override
void initState() { void initState() {
super.initState(); super.initState();
...@@ -62,6 +70,13 @@ class _PaginaConversionState extends State<PaginaConversion> ...@@ -62,6 +70,13 @@ class _PaginaConversionState extends State<PaginaConversion>
} }
} }
/// Elimina el tab controller
@override
void dispose() {
_tabController.dispose();
super.dispose();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Material( return Material(
...@@ -93,6 +108,7 @@ class _PaginaConversionState extends State<PaginaConversion> ...@@ -93,6 +108,7 @@ class _PaginaConversionState extends State<PaginaConversion>
); );
} }
/// Construye la caja con el formato original o el seleccionado
Widget _createFormatBox(bool original){ Widget _createFormatBox(bool original){
final String nombreFormato; final String nombreFormato;
final Color fondo; final Color fondo;
...@@ -129,7 +145,6 @@ class _PaginaConversionState extends State<PaginaConversion> ...@@ -129,7 +145,6 @@ class _PaginaConversionState extends State<PaginaConversion>
); );
} }
/// Comportamiento temporal: Mostrar todas las calidades
Widget _createCalidadSelectionPanel() { Widget _createCalidadSelectionPanel() {
final listaChips = Calidad.values.map((elemento) { final listaChips = Calidad.values.map((elemento) {
return ChoiceChip( return ChoiceChip(
...@@ -157,6 +172,7 @@ class _PaginaConversionState extends State<PaginaConversion> ...@@ -157,6 +172,7 @@ class _PaginaConversionState extends State<PaginaConversion>
); );
} }
/// Construye el panel de selección de conversión
Widget _createConversionSelectionPanel(){ Widget _createConversionSelectionPanel(){
if(widget._formatoOriginal.tipoMultimedia == TipoMultimedia.video && !_showProfiles){ if(widget._formatoOriginal.tipoMultimedia == TipoMultimedia.video && !_showProfiles){
return _createTabVideos(); return _createTabVideos();
...@@ -166,6 +182,7 @@ class _PaginaConversionState extends State<PaginaConversion> ...@@ -166,6 +182,7 @@ class _PaginaConversionState extends State<PaginaConversion>
} }
} }
/// Construye las tabs para los vídeos
Widget _createTabVideos(){ Widget _createTabVideos(){
final tabs = <Widget>[]; final tabs = <Widget>[];
final grids = <Widget>[]; final grids = <Widget>[];
...@@ -231,6 +248,7 @@ class _PaginaConversionState extends State<PaginaConversion> ...@@ -231,6 +248,7 @@ class _PaginaConversionState extends State<PaginaConversion>
); );
} }
/// Crea el panel de selección de formato o perfil
Widget _createDefaultConversionPanel() { Widget _createDefaultConversionPanel() {
return Material( return Material(
clipBehavior: Clip.antiAlias, clipBehavior: Clip.antiAlias,
...@@ -273,6 +291,7 @@ class _PaginaConversionState extends State<PaginaConversion> ...@@ -273,6 +291,7 @@ class _PaginaConversionState extends State<PaginaConversion>
); );
} }
/// Construye los botones que permiten alternar entre perfiles o formatos
Widget _createBotonesPerfilFormato(){ Widget _createBotonesPerfilFormato(){
return Row( return Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
...@@ -322,6 +341,7 @@ class _PaginaConversionState extends State<PaginaConversion> ...@@ -322,6 +341,7 @@ class _PaginaConversionState extends State<PaginaConversion>
); );
} }
/// Construye la lista de perfiles
List<Widget> _createListPerfiles(){ List<Widget> _createListPerfiles(){
final toRet = <Widget>[]; final toRet = <Widget>[];
...@@ -382,6 +402,7 @@ class _PaginaConversionState extends State<PaginaConversion> ...@@ -382,6 +402,7 @@ class _PaginaConversionState extends State<PaginaConversion>
return toRet; return toRet;
} }
/// Construye la rejilla de botones de conversión
List<Widget> _createGridBotonesConversion({TipoMultimedia? tipo}){ List<Widget> _createGridBotonesConversion({TipoMultimedia? tipo}){
tipo ??= widget._formatoOriginal.tipoMultimedia; tipo ??= widget._formatoOriginal.tipoMultimedia;
final listaFormatos = Formato.listadoFormatos( final listaFormatos = Formato.listadoFormatos(
...@@ -482,6 +503,7 @@ class _PaginaConversionState extends State<PaginaConversion> ...@@ -482,6 +503,7 @@ class _PaginaConversionState extends State<PaginaConversion>
}).toList(); }).toList();
} }
/// Actualiza el formato seleccionado
void _cambiarFormatoCalidad(Formato? destino, Calidad? calidad){ void _cambiarFormatoCalidad(Formato? destino, Calidad? calidad){
setState((){ setState((){
_formatoConvertido = destino; _formatoConvertido = destino;
......
...@@ -5,6 +5,8 @@ import 'package:path_provider/path_provider.dart'; ...@@ -5,6 +5,8 @@ import 'package:path_provider/path_provider.dart';
import '../modelo/modelo.dart'; import '../modelo/modelo.dart';
/// Página para seleccionar fotogramas dentro de un vídeo que se convierte a
/// imagen
class PaginaFotograma extends StatefulWidget { class PaginaFotograma extends StatefulWidget {
final ListaSeleccionables _lista; final ListaSeleccionables _lista;
final Archivo _archivo; final Archivo _archivo;
...@@ -155,6 +157,7 @@ class _PaginaFotogramaState extends State<PaginaFotograma> { ...@@ -155,6 +157,7 @@ class _PaginaFotogramaState extends State<PaginaFotograma> {
); );
} }
/// Construye los botones para moverse entre fotogramas
Widget _construirBotonesFotograma(BuildContext context) { Widget _construirBotonesFotograma(BuildContext context) {
final buttons = <Widget>[]; final buttons = <Widget>[];
for(var button in _buttons){ for(var button in _buttons){
...@@ -209,6 +212,7 @@ class _PaginaFotogramaState extends State<PaginaFotograma> { ...@@ -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 { Future<void> loadNumberFotogramas() async {
// Obtener número de fotogramas // Obtener número de fotogramas
int? numFotogramas = await Conversor.getNumFotogramas(widget._archivo); int? numFotogramas = await Conversor.getNumFotogramas(widget._archivo);
...@@ -226,6 +230,7 @@ class _PaginaFotogramaState extends State<PaginaFotograma> { ...@@ -226,6 +230,7 @@ class _PaginaFotogramaState extends State<PaginaFotograma> {
} }
} }
/// Carga la imagen del fotograma seleccionado
Future<File> loadFotograma(int fotograma) async { Future<File> loadFotograma(int fotograma) async {
final directory = await getApplicationSupportDirectory(); final directory = await getApplicationSupportDirectory();
String pathSalida = '${directory.absolute.path}${Platform.pathSeparator}fotograma.${widget._archivo.formatoDestino?.extension}'; String pathSalida = '${directory.absolute.path}${Platform.pathSeparator}fotograma.${widget._archivo.formatoDestino?.extension}';
...@@ -233,6 +238,7 @@ class _PaginaFotogramaState extends State<PaginaFotograma> { ...@@ -233,6 +238,7 @@ class _PaginaFotogramaState extends State<PaginaFotograma> {
return File(pathSalida).create(); return File(pathSalida).create();
} }
/// Limpia la carpeta de archivos temporales
Future<void> clearTemp() async { Future<void> clearTemp() async {
final directory = await getApplicationSupportDirectory(); final directory = await getApplicationSupportDirectory();
final list = directory.listSync(); final list = directory.listSync();
...@@ -242,6 +248,7 @@ class _PaginaFotogramaState extends State<PaginaFotograma> { ...@@ -242,6 +248,7 @@ class _PaginaFotogramaState extends State<PaginaFotograma> {
} }
} }
/// Enumerado de los botones para desplazarse entre fotogramas
enum _IconButtons{ enum _IconButtons{
DOBLE_ATRAS(Icon(Icons.keyboard_double_arrow_left), -60), DOBLE_ATRAS(Icon(Icons.keyboard_double_arrow_left), -60),
ATRAS(Icon(Icons.chevron_left), -1), ATRAS(Icon(Icons.chevron_left), -1),
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:prueba_multimedia/modelo/modelo.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 { class PaginaMetadatos extends StatefulWidget {
final ListaSeleccionables _lista; final ListaSeleccionables _lista;
final int _indice; final int _indice;
...@@ -19,7 +20,7 @@ class _PaginaMetadatosState extends State<PaginaMetadatos> { ...@@ -19,7 +20,7 @@ class _PaginaMetadatosState extends State<PaginaMetadatos> {
final List<TextEditingController> _controladores = []; final List<TextEditingController> _controladores = [];
final List<String> _valoresElegidos = []; final List<String> _valoresElegidos = [];
/// Inicializa los controladores
@override @override
void initState() { void initState() {
super.initState(); super.initState();
...@@ -39,6 +40,7 @@ class _PaginaMetadatosState extends State<PaginaMetadatos> { ...@@ -39,6 +40,7 @@ class _PaginaMetadatosState extends State<PaginaMetadatos> {
} }
} }
/// Libera los recursos de los controladores
@override @override
void dispose() { void dispose() {
for (var controlador in _controladores) { for (var controlador in _controladores) {
...@@ -116,6 +118,7 @@ class _PaginaMetadatosState extends State<PaginaMetadatos> { ...@@ -116,6 +118,7 @@ class _PaginaMetadatosState extends State<PaginaMetadatos> {
return toRet; return toRet;
} }
/// Construye la etiqueta con el título de cada metadato
Widget _buildTextFieldLabel(int index){ Widget _buildTextFieldLabel(int index){
return Text( return Text(
widget._metadatos[index].info.nombreMostrado, widget._metadatos[index].info.nombreMostrado,
...@@ -123,6 +126,7 @@ class _PaginaMetadatosState extends State<PaginaMetadatos> { ...@@ -123,6 +126,7 @@ class _PaginaMetadatosState extends State<PaginaMetadatos> {
); );
} }
/// Construye el campo de texto para modificar cada metadato
Widget _buildTextField(int index){ Widget _buildTextField(int index){
var metadatos = widget._metadatos; var metadatos = widget._metadatos;
return TextField( return TextField(
......
...@@ -6,12 +6,13 @@ import 'package:prueba_multimedia/widgets/widgets.dart'; ...@@ -6,12 +6,13 @@ import 'package:prueba_multimedia/widgets/widgets.dart';
import 'package:prueba_multimedia/modelo/modelo.dart'; import 'package:prueba_multimedia/modelo/modelo.dart';
import 'package:prueba_multimedia/paginas/paginas.dart'; import 'package:prueba_multimedia/paginas/paginas.dart';
/// Página principal de la aplicación
class PaginaPrincipal extends StatelessWidget { class PaginaPrincipal extends StatelessWidget {
const PaginaPrincipal({super.key}); const PaginaPrincipal({super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
// Función para mostrar la Snackbar después de convertir
void mostrarSnackBarConvertir(){ void mostrarSnackBarConvertir(){
ScaffoldMessenger.of(context).showSnackBar(SnackBar( ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text( content: Text(
...@@ -59,6 +60,7 @@ class PaginaPrincipal extends StatelessWidget { ...@@ -59,6 +60,7 @@ class PaginaPrincipal extends StatelessWidget {
); );
} }
/// Construye el cuerpo (lleno o vacío) de la página
Widget _construirCuerpo(BuildContext context) { Widget _construirCuerpo(BuildContext context) {
return Consumer2<ListaSeleccionables, ProviderAjustes>( return Consumer2<ListaSeleccionables, ProviderAjustes>(
builder: (context, lista, ajustes, child) { builder: (context, lista, ajustes, child) {
...@@ -71,6 +73,7 @@ class PaginaPrincipal extends StatelessWidget { ...@@ -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){ Widget _construitFAB(BuildContext context, VoidCallback function){
return Consumer2<ListaSeleccionables, ProviderAjustes>( return Consumer2<ListaSeleccionables, ProviderAjustes>(
builder: (context, lista, ajustes, child) { builder: (context, lista, ajustes, child) {
......
...@@ -3,6 +3,7 @@ import 'package:prueba_multimedia/modelo/modelo.dart'; ...@@ -3,6 +3,7 @@ import 'package:prueba_multimedia/modelo/modelo.dart';
import 'package:prueba_multimedia/widgets/carpeta_widget.dart'; import 'package:prueba_multimedia/widgets/carpeta_widget.dart';
import 'package:prueba_multimedia/widgets/widgets.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 { class PaginaPrincipalLlena extends StatelessWidget {
final ListaSeleccionables listaSeleccionables; final ListaSeleccionables listaSeleccionables;
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
/// Página principal sin elementos seleccionables
class PaginaPrincipalVacia extends StatelessWidget { class PaginaPrincipalVacia extends StatelessWidget {
const PaginaPrincipalVacia({super.key}); 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