Trabajando en los elementos para manejar el estado de los archivos y el modelo de seleccionable

parent 95f78b62
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:prueba_multimedia/modelo/seleccionable.dart';
class Archivo extends Seleccionable {
final File file;
// Mostrar nombre de archivo y no path
Archivo(this.file): super(file.path, Icon(Icons.description_outlined));
}
\ No newline at end of file
import './conversion.dart';
import './elemento_seleccionable.dart';
class ArchivoIndividual extends ElementoSeleccionable{
final Conversion _conversion;
List<String> metadatos = [];
ArchivoIndividual({required super.id, required super.nombre, required super.localizacion,
required Conversion conversion}): _conversion = conversion;
@override
void convertir() {
_conversion.convertir();
}
}
\ No newline at end of file
import './conversion.dart'; import 'dart:io';
import './elemento_seleccionable.dart'; import 'package:flutter/material.dart';
import 'formato.dart'; import 'package:prueba_multimedia/modelo/seleccionable.dart';
class Carpeta extends ElementoSeleccionable{ class Carpeta extends Seleccionable {
bool _incluirSubcarpetas = false; final Directory directory;
final Map<Formato, bool> _formatosAConvertir; final listaConvertibles = <Seleccionable>[];
final Map<Formato, Conversion> _conversiones; final bool recursiva;
Carpeta({required super.id, required super.nombre, required super.localizacion}): /**
_formatosAConvertir = {}, _conversiones = {}; * TODO: iterar sobre los archivos y carpetas teniendo en cuenta la
* recursividad
@override */
void convertir() { Carpeta(this.directory, this.recursiva):
_conversiones.values.forEach((conv) => conv.convertir()); super(directory.path, const Icon(Icons.description_outlined)) {
var listaCarpeta = directory.list(recursive: recursiva);
} }
} }
\ No newline at end of file
import 'formato.dart';
class Conversion{
final Formato _formatoOriginal;
Formato? _formatoDestino;
Conversion({required Formato formatoOriginal, Formato? formatoDestino = null}):
_formatoOriginal = formatoOriginal, _formatoDestino = formatoDestino;
void convertir(){
// TODO: <implement>
}
}
\ No newline at end of file
abstract class ElementoSeleccionable{
final String _id;
final String _nombre;
final String _localizacion;
String get id => this._id;
String get nombre => this._nombre;
String get localizacion => this._localizacion;
ElementoSeleccionable({required String id,
required String nombre,
required String localizacion}):
_id = id, _nombre = nombre, _localizacion = localizacion;
void convertir();
}
\ No newline at end of file
import 'archivo_individual.dart';
class Enlace extends ArchivoIndividual{
final RedSocial _redSocial;
Enlace({required super.id, required super.nombre,
required super.localizacion, required super.conversion,
required redSocial}): _redSocial = redSocial;
@override
void convertir() {
// TODO: <implement> Descarga desde internet...
super.convertir();
}
}
enum RedSocial{
FACEBOOK,
TWITTER,
INSTAGRAM
}
\ No newline at end of file
class Formato{
final ClaseFormato _extension;
Calidad _calidad;
Formato({required ClaseFormato extension, Calidad calidad = Calidad.ORIGINAL}):
_extension = extension, _calidad = calidad;
}
enum ClaseFormato{
PNG(".png", "Portable Network Graphics", "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.");
final String _extension;
final String _nombre;
final String _descripcion;
final String _clasificacion;
final String _metadatos;
const ClaseFormato(this._extension, this._nombre, this._clasificacion, this._metadatos, this._descripcion);
}
enum Calidad{
BAJA,
MEDIA,
ALTA,
MUY_ALTA,
ORIGINAL
}
\ No newline at end of file
import 'formato.dart';
class Perfil{
final String _identificador;
final String _nombre;
final Formato _formatoCorrespondiente;
Perfil({required String identificador, required String nombre, required Formato formatoCorrespondiente}):
_identificador = identificador, _nombre = nombre, _formatoCorrespondiente = formatoCorrespondiente;
}
\ No newline at end of file
import 'package:flutter/material.dart';
import 'package:prueba_multimedia/widget/action_button.dart';
/// Representa un item que se puede añadir a la lista
/// de conversión.
class Seleccionable {
final String nombre;
final Icon icono;
Seleccionable(this.nombre, this.icono);
}
\ No newline at end of file
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:prueba_multimedia/modelo/seleccionable.dart';
import 'package:prueba_multimedia/widget/archivo_widget.dart'; import 'package:prueba_multimedia/widget/seleccionable_widget.dart';
class PaginaPrincipalLlena extends StatelessWidget { class PaginaPrincipalLlena extends StatelessWidget {
const PaginaPrincipalLlena({super.key}); const PaginaPrincipalLlena({super.key});
...@@ -18,7 +18,7 @@ class PaginaPrincipalLlena extends StatelessWidget { ...@@ -18,7 +18,7 @@ class PaginaPrincipalLlena extends StatelessWidget {
return const SizedBox(height: 8.0); return const SizedBox(height: 8.0);
}, },
itemBuilder: (context, index) { itemBuilder: (context, index) {
return ArchivoWidget(key: key, texto: ejemplo[index]); return SeleccionableWidget(key: key, seleccionable: null, );
}, },
), ),
); );
......
import 'dart:io';
import 'package:file_picker/file_picker.dart'; import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
...@@ -141,7 +143,14 @@ class _ConVertexFabBarState extends State<ConVertexFabBar> { ...@@ -141,7 +143,14 @@ class _ConVertexFabBarState extends State<ConVertexFabBar> {
), ),
ActionButton( ActionButton(
tipoBoton: ActionButtonTypes.carpeta, tipoBoton: ActionButtonTypes.carpeta,
onPressed: () {} onPressed: () async {
String? path = await FilePicker.platform.getDirectoryPath();
if (path != null) {
var directory = Directory(path);
} else {
}
}
), ),
ActionButton( ActionButton(
tipoBoton: ActionButtonTypes.archivo, tipoBoton: ActionButtonTypes.archivo,
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:prueba_multimedia/modelo/seleccionable.dart';
class ArchivoWidget extends StatelessWidget { class SeleccionableWidget extends StatelessWidget {
final texto; final Seleccionable seleccionable;
const ArchivoWidget({super.key, this.texto}); SeleccionableWidget({super.key, required this.seleccionable});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
...@@ -19,18 +20,22 @@ class ArchivoWidget extends StatelessWidget { ...@@ -19,18 +20,22 @@ class ArchivoWidget extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
texto, seleccionable.nombre,
style: Theme.of(context).textTheme.bodyLarge style: Theme.of(context).textTheme.bodyLarge
), ),
Text( Text(
texto, 'CAMBIAME',
style: Theme.of(context).textTheme.bodySmall style: Theme.of(context).textTheme.bodySmall
), ),
], ],
) )
), ),
/* Algo como esto para una carpeta
if (convertible is carpeta)
IconButton(onPressed: () {}, icon: Icon(Icons.edit)),
*/
IconButton( IconButton(
icon: Icon(Icons.edit), icon: seleccionable.icono,
onPressed: () {}, onPressed: () {},
) )
], ],
......
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