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
f1d29c6d
authored
Mar 21, 2025
by
Diego Pérez Peña
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
Primeros pasos en la actualización de listas
parent
9d1ad18c
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
99 additions
and
56 deletions
lib/modelo/carpeta.dart
lib/modelo/lista_seleccionables.dart
lib/paginas/pagina_configuracion.dart
lib/paginas/pagina_conversion.dart
lib/modelo/carpeta.dart
View file @
f1d29c6d
...
@@ -8,15 +8,38 @@ import 'formato.dart';
...
@@ -8,15 +8,38 @@ import 'formato.dart';
class
Carpeta
extends
ElementoSeleccionable
{
class
Carpeta
extends
ElementoSeleccionable
{
final
Directory
_directory
;
final
Directory
_directory
;
final
bool
_incluirSubcarpetas
=
false
;
final
bool
_incluirSubcarpetas
=
false
;
final
List
<
InfoFormato
>
_formatos
;
late
final
List
<
InfoFormato
>
_formatos
;
Directory
get
directory
=>
_directory
;
Directory
get
directory
=>
_directory
;
List
<
InfoFormato
>
get
formatos
=>
List
.
unmodifiable
(
_formatos
);
List
<
InfoFormato
>
get
formatos
=>
List
.
unmodifiable
(
_formatos
);
Carpeta
({
required
super
.
id
,
required
Directory
directory
}):
Carpeta
({
required
super
.
id
,
required
Directory
directory
,
required
Map
<
Formato
,
bool
>
formatos
}):
_directory
=
directory
,
_formatos
=
[],
_directory
=
directory
,
super
(
nombre:
directory
.
path
.
split
(
'/'
).
last
,
icon:
const
Icon
(
Icons
.
folder_outlined
)){
_formatos
=
[];
for
(
var
f
in
formatos
.
entries
)
{
_formatos
.
add
(
InfoFormato
(
formato:
f
.
key
,
nombreCarpeta:
directory
.
path
.
split
(
'/'
).
last
,
subCarpeta:
f
.
value
,
archivos:
[]));
}
}
Carpeta
.
fromList
({
required
super
.
id
,
required
Directory
directory
,
required
List
<
InfoFormato
>
formatos
}):
_directory
=
directory
,
_formatos
=
formatos
,
super
(
nombre:
directory
.
path
.
split
(
'/'
).
last
,
icon:
const
Icon
(
Icons
.
folder_outlined
));
super
(
nombre:
directory
.
path
.
split
(
'/'
).
last
,
icon:
const
Icon
(
Icons
.
folder_outlined
));
Carpeta
setFormatoDestino
(
Formato
original
,
Formato
destino
){
final
formatosAlt
=
formatos
.
toList
();
for
(
InfoFormato
i
in
formatosAlt
){
if
(
i
.
formatoOriginal
==
original
){
i
.
formatoDestino
=
destino
;
}
}
return
Carpeta
.
fromList
(
id:
id
,
directory:
directory
,
formatos:
formatosAlt
);
}
@override
@override
void
convertir
()
{
void
convertir
()
{
// TODO: <implement>
// TODO: <implement>
...
@@ -37,7 +60,7 @@ class InfoFormato {
...
@@ -37,7 +60,7 @@ class InfoFormato {
List
<
Archivo
>
get
archivos
=>
List
.
unmodifiable
(
_archivos
);
List
<
Archivo
>
get
archivos
=>
List
.
unmodifiable
(
_archivos
);
set
seleccionado
(
bool
value
)
=>
_seleccionado
=
value
;
set
seleccionado
(
bool
value
)
=>
_seleccionado
=
value
;
set
formato
(
Formato
?
destino
)
=>
_conversion
.
formatoDestino
=
destino
;
set
formato
Destino
(
Formato
?
destino
)
=>
_conversion
.
formatoDestino
=
destino
;
InfoFormato
({
required
Formato
formato
,
InfoFormato
({
required
Formato
formato
,
required
String
nombreCarpeta
,
required
String
nombreCarpeta
,
...
...
lib/modelo/lista_seleccionables.dart
View file @
f1d29c6d
...
@@ -14,6 +14,11 @@ class ListaSeleccionables extends ChangeNotifier {
...
@@ -14,6 +14,11 @@ class ListaSeleccionables extends ChangeNotifier {
notifyListeners
();
notifyListeners
();
}
}
void
actualizaSeleccionable
(
int
indice
,
ElementoSeleccionable
elemento
){
_seleccionables
[
indice
]
=
elemento
;
notifyListeners
();
}
void
addArchivo
(
File
file
)
{
void
addArchivo
(
File
file
)
{
_seleccionables
.
add
(
Archivo
(
id:
"Archivo"
,
_seleccionables
.
add
(
Archivo
(
id:
"Archivo"
,
file:
file
));
file:
file
));
...
...
lib/paginas/pagina_configuracion.dart
View file @
f1d29c6d
import
'package:flutter/material.dart'
;
import
'package:flutter/material.dart'
;
import
'package:provider/provider.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'
;
...
@@ -36,7 +37,11 @@ class _PaginaConfiguracionState extends State<PaginaConfiguracion> {
...
@@ -36,7 +37,11 @@ class _PaginaConfiguracionState extends State<PaginaConfiguracion> {
)
)
),
),
),
),
body:
_construirCuerpo
(),
body:
Consumer
<
ListaSeleccionables
>(
builder:
(
context
,
manager
,
child
){
return
_construirCuerpo
(
manager
);
},
),
bottomNavigationBar:
_construirBarraNavegacion
()
bottomNavigationBar:
_construirBarraNavegacion
()
);
);
}
}
...
@@ -58,11 +63,11 @@ class _PaginaConfiguracionState extends State<PaginaConfiguracion> {
...
@@ -58,11 +63,11 @@ class _PaginaConfiguracionState extends State<PaginaConfiguracion> {
return
sb
.
toString
();
return
sb
.
toString
();
}
}
Widget
_construirCuerpo
()
{
Widget
_construirCuerpo
(
ListaSeleccionables
manager
)
{
if
(
widget
.
_elementoAsociado
is
Convertible
){
if
(
widget
.
_elementoAsociado
is
Convertible
){
final
arch
=
widget
.
_elementoAsociado
as
Convertible
;
final
arch
=
widget
.
_elementoAsociado
as
Convertible
;
if
(
_categoriaActiva
==
0
){
if
(
_categoriaActiva
==
0
){
return
PaginaConversion
(
formatoOriginal:
arch
.
formatoOriginal
);
return
PaginaConversion
(
lista:
manager
,
formatoOriginal:
arch
.
formatoOriginal
);
}
}
else
if
(
_categoriaActiva
==
2
){
else
if
(
_categoriaActiva
==
2
){
return
PaginaMetadatos
(
formato:
arch
.
formatoOriginal
);
return
PaginaMetadatos
(
formato:
arch
.
formatoOriginal
);
...
...
lib/paginas/pagina_conversion.dart
View file @
f1d29c6d
...
@@ -2,12 +2,21 @@ import 'package:flutter/material.dart';
...
@@ -2,12 +2,21 @@ import 'package:flutter/material.dart';
import
'package:prueba_multimedia/modelo/modelo.dart'
;
import
'package:prueba_multimedia/modelo/modelo.dart'
;
class
PaginaConversion
extends
StatefulWidget
{
class
PaginaConversion
extends
StatefulWidget
{
final
ListaSeleccionables
_lista
;
final
int
_indiceArchivo
;
final
ElementoSeleccionable
_seleccionable
;
final
Formato
_formatoOriginal
;
final
Formato
_formatoOriginal
;
const
PaginaConversion
({
const
PaginaConversion
({
super
.
key
,
super
.
key
,
required
formatoOriginal
required
Formato
formatoOriginal
,
}):
_formatoOriginal
=
formatoOriginal
;
required
int
indiceArchivo
,
required
Convertible
seleccionable
,
required
ListaSeleccionables
lista
}):
_formatoOriginal
=
formatoOriginal
,
_indiceArchivo
=
indiceArchivo
,
_seleccionable
=
seleccionable
,
_lista
=
lista
;
@override
@override
State
<
PaginaConversion
>
createState
()
=>
_PaginaConversionState
();
State
<
PaginaConversion
>
createState
()
=>
_PaginaConversionState
();
...
@@ -18,7 +27,7 @@ class _PaginaConversionState extends State<PaginaConversion>
...
@@ -18,7 +27,7 @@ class _PaginaConversionState extends State<PaginaConversion>
// Podríamos hacer que en vez de poder haber nulos sea el mismo formato
// Podríamos hacer que en vez de poder haber nulos sea el mismo formato
// que el de origen de manera predeterminada ?
// que el de origen de manera predeterminada ?
Formato
?
_formatoConvertido
;
Formato
?
_formatoConvertido
;
Calidad
calidadActual
=
Calidad
.
media
;
Calidad
?
_calidadActual
=
null
;
bool
_showProfiles
=
true
;
bool
_showProfiles
=
true
;
late
final
TabController
_tabController
;
late
final
TabController
_tabController
;
...
@@ -96,7 +105,7 @@ class _PaginaConversionState extends State<PaginaConversion>
...
@@ -96,7 +105,7 @@ class _PaginaConversionState extends State<PaginaConversion>
color:
Colors
.
black
,
color:
Colors
.
black
,
),
),
borderRadius:
BorderRadius
.
circular
(
15
),
borderRadius:
BorderRadius
.
circular
(
15
),
color:
_formatoConvertido
==
null
?
Colors
.
white
:
Colors
.
black12
color:
_formatoConvertido
==
null
?
Colors
.
white
:
Theme
.
of
(
context
).
colorScheme
.
inversePrimary
),
),
child:
Padding
(
child:
Padding
(
padding:
const
EdgeInsets
.
all
(
13.0
),
padding:
const
EdgeInsets
.
all
(
13.0
),
...
@@ -109,22 +118,16 @@ class _PaginaConversionState extends State<PaginaConversion>
...
@@ -109,22 +118,16 @@ class _PaginaConversionState extends State<PaginaConversion>
);
);
}
}
// TODO: A QUÉ SE REFIERE LA CALIDAD ?
/*
Un formato puede tener una calidad predeterminada?
De que sirve cambiar la calidad de un formato?
Hay formatos lossless para los que no hay ajustes de calidad/compresión
*/
// TODO: IMPLEMENTAR SISTEMA CALIDAD FORMATOS
/// Comportamiento temporal: Mostrar todas las calidades
/// 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
(
selected:
elemento
==
calidadActual
,
selected:
elemento
==
_
calidadActual
,
shape:
StadiumBorder
(),
shape:
StadiumBorder
(),
label:
Text
(
elemento
.
texto
),
label:
Text
(
elemento
.
texto
),
// TODO: CAMBIAR CALIDAD FORMATO
// TODO: CAMBIAR CALIDAD FORMATO
onSelected:
(
selected
)
{
setState
((){
calidadActual
=
elemento
;});
},
onSelected:
(
_formatoConvertido
==
null
)?
null
:
(
selected
)
{
setState
((){
_calidadActual
=
elemento
;});
},
);
);
}).
toList
();
}).
toList
();
...
@@ -269,7 +272,7 @@ class _PaginaConversionState extends State<PaginaConversion>
...
@@ -269,7 +272,7 @@ class _PaginaConversionState extends State<PaginaConversion>
shape:
RoundedRectangleBorder
(
shape:
RoundedRectangleBorder
(
borderRadius:
BorderRadius
.
circular
(
20.0
),
borderRadius:
BorderRadius
.
circular
(
20.0
),
),
),
color:
(
_showProfiles
)?
Theme
.
of
(
context
).
disabledColor
:
Theme
.
of
(
context
).
cardColor
,
color:
(
_showProfiles
)?
Theme
.
of
(
context
).
colorScheme
.
inversePrimary
:
Theme
.
of
(
context
).
cardColor
,
child:
InkWell
(
child:
InkWell
(
onTap:
()
{
onTap:
()
{
setState
(()
{
setState
(()
{
...
@@ -290,7 +293,7 @@ class _PaginaConversionState extends State<PaginaConversion>
...
@@ -290,7 +293,7 @@ class _PaginaConversionState extends State<PaginaConversion>
shape:
RoundedRectangleBorder
(
shape:
RoundedRectangleBorder
(
borderRadius:
BorderRadius
.
circular
(
20.0
),
borderRadius:
BorderRadius
.
circular
(
20.0
),
),
),
color:
(!
_showProfiles
)?
Theme
.
of
(
context
).
disabledColor
:
Theme
.
of
(
context
).
cardColor
,
color:
(!
_showProfiles
)?
Theme
.
of
(
context
).
colorScheme
.
inversePrimary
:
Theme
.
of
(
context
).
cardColor
,
child:
InkWell
(
child:
InkWell
(
onTap:
()
{
onTap:
()
{
setState
(()
{
setState
(()
{
...
@@ -310,7 +313,6 @@ class _PaginaConversionState extends State<PaginaConversion>
...
@@ -310,7 +313,6 @@ class _PaginaConversionState extends State<PaginaConversion>
);
);
}
}
// TODO: HABLAR SOBRE CÓMO HACER LOS PERFILES
List
<
Widget
>
_createListPerfiles
(){
List
<
Widget
>
_createListPerfiles
(){
final
toRet
=
<
Widget
>[];
final
toRet
=
<
Widget
>[];
...
@@ -323,42 +325,33 @@ class _PaginaConversionState extends State<PaginaConversion>
...
@@ -323,42 +325,33 @@ class _PaginaConversionState extends State<PaginaConversion>
if
(
widget
.
_formatoOriginal
.
tipoMultimedia
==
TipoMultimedia
.
audio
){
if
(
widget
.
_formatoOriginal
.
tipoMultimedia
==
TipoMultimedia
.
audio
){
formatoPerfil
=
perfil
.
extensionMusica
;
formatoPerfil
=
perfil
.
extensionMusica
;
}
}
//
if
(
formatoPerfil
!=
null
&&
formatoPerfil
!=
widget
.
_formatoOriginal
){
if
(
formatoPerfil
!=
null
){
/**
Color
color
=
Theme
.
of
(
context
).
cardColor
;
* Entiendo que si el archivo ya se encuentra en un formato que
if
(
formatoPerfil
==
widget
.
_formatoOriginal
){
* es el mismo que se usa para un cierto perfil entonces ese perfil
color
=
Theme
.
of
(
context
).
disabledColor
;
* esté desabilitado, pero podría llegar a ser confuso ya que no
}
* se especifica por ningún sitio al usuario el por qué esa opción
if
(
formatoPerfil
==
_formatoConvertido
&&
perfil
.
calidad
==
_calidadActual
){
* no está disponible.
color
=
Theme
.
of
(
context
).
colorScheme
.
inversePrimary
;
*
}
* Además, no se como compaginar esto con que cada formato pueda
* tener un nivel de calidad diferente, porque podríamos tener
* hipotéticamente un formato como jpg (que es de baja calidad) pero con
* un valor de calidad alto
*
* En aplicaciones como gimp por ejemplo se puede especificar el nivel
* de compresión (inverso a la calidad) de formatos como jpg
bool desabilitado = (_formatoConvertido == formatoPerfil) &&
(_formatoConvertido?.calidad == perfil.calidad);
**/
toRet
.
add
(
Material
(
toRet
.
add
(
Material
(
shape:
RoundedRectangleBorder
(
shape:
RoundedRectangleBorder
(
borderRadius:
BorderRadius
.
circular
(
20.0
),
borderRadius:
BorderRadius
.
circular
(
20.0
),
),
),
// TODO: ANALIZAR SI DESABILITAR PERFILES O NO
color:
color
,
// color: desabilitado ? Theme.of(context).disabledColor : Theme.of(context).cardColor,
color:
Theme
.
of
(
context
).
cardColor
,
child:
InkWell
(
child:
InkWell
(
onTap:
()
{
onTap:
(
formatoPerfil
==
widget
.
_formatoOriginal
)?
()
{
ScaffoldMessenger
.
of
(
context
).
showSnackBar
(
SnackBar
(
content:
Text
(
'El archivo ya coincide con este perfil'
),
),
);
}
:
()
{
if
(
_formatoConvertido
!=
formatoPerfil
)
{
if
(
_formatoConvertido
!=
formatoPerfil
)
{
setState
(()
{
setState
(()
{
// TODO: IMPLEMENTAR SISTEMA CALIDAD FORMATOS
// _formatoConvertido = Formato(formato: formatoPerfil!, calidad: perfil.calidad);
_formatoConvertido
=
formatoPerfil
;
_formatoConvertido
=
formatoPerfil
;
_calidadActual
=
perfil
.
calidad
;
});
});
}
}
},
},
...
@@ -396,16 +389,33 @@ class _PaginaConversionState extends State<PaginaConversion>
...
@@ -396,16 +389,33 @@ class _PaginaConversionState extends State<PaginaConversion>
shape:
RoundedRectangleBorder
(
shape:
RoundedRectangleBorder
(
borderRadius:
BorderRadius
.
circular
(
20.0
),
borderRadius:
BorderRadius
.
circular
(
20.0
),
),
),
color:
_formatoConvertido
==
elemento
?
Theme
.
of
(
context
).
disabledColor
color:
_formatoConvertido
==
elemento
?
Theme
.
of
(
context
).
colorScheme
.
inversePrimary
:
Theme
.
of
(
context
).
cardColor
,
:
Theme
.
of
(
context
).
cardColor
,
child:
InkWell
(
child:
InkWell
(
/*
borderRadius:
BorderRadius
.
circular
(
20.0
),
TODO: COMPORTAMIENTO DE LOS BOTONES
onTap:
_formatoConvertido
==
elemento
?
()
{
onTap:
_formatoConvertido
==
elemento
?
()
{
setState(() { _formatoConvertido = null; });
setState
(()
{
} :
_formatoConvertido
=
null
;
*/
_calidadActual
=
null
;
onTap:
()
{
setState
((){
_formatoConvertido
=
elemento
;});
},
});
}
:
()
{
setState
((){
_formatoConvertido
=
elemento
;
// TODO: Cambiar calidad del archivo
ElementoSeleccionable
resultado
;
if
(
widget
.
_seleccionable
is
Carpeta
){
final
formatos
=
(
widget
.
_seleccionable
as
Carpeta
).
formatos
;
for
(
InfoFormato
f
in
formatos
){
if
(
f
.
formatoOriginal
==
widget
.
_formatoOriginal
){
}
}
}
else
{
}
widget
.
_lista
.
actualizaSeleccionable
(
widget
.
_indiceArchivo
,
resultado
);
});
},
onLongPress:
()
{
onLongPress:
()
{
showDialog
<
void
>(
showDialog
<
void
>(
context:
context
,
context:
context
,
...
...
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