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 './elemento_seleccionable.dart';
import 'formato.dart';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:prueba_multimedia/modelo/seleccionable.dart';
class Carpeta extends ElementoSeleccionable{
bool _incluirSubcarpetas = false;
final Map<Formato, bool> _formatosAConvertir;
final Map<Formato, Conversion> _conversiones;
class Carpeta extends Seleccionable {
final Directory directory;
final listaConvertibles = <Seleccionable>[];
final bool recursiva;
Carpeta({required super.id, required super.nombre, required super.localizacion}):
_formatosAConvertir = {}, _conversiones = {};
@override
void convertir() {
_conversiones.values.forEach((conv) => conv.convertir());
/**
* TODO: iterar sobre los archivos y carpetas teniendo en cuenta la
* recursividad
*/
Carpeta(this.directory, this.recursiva):
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:prueba_multimedia/widget/archivo_widget.dart';
import 'package:prueba_multimedia/modelo/seleccionable.dart';
import 'package:prueba_multimedia/widget/seleccionable_widget.dart';
class PaginaPrincipalLlena extends StatelessWidget {
const PaginaPrincipalLlena({super.key});
......@@ -18,7 +18,7 @@ class PaginaPrincipalLlena extends StatelessWidget {
return const SizedBox(height: 8.0);
},
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:flutter/material.dart';
......@@ -141,7 +143,14 @@ class _ConVertexFabBarState extends State<ConVertexFabBar> {
),
ActionButton(
tipoBoton: ActionButtonTypes.carpeta,
onPressed: () {}
onPressed: () async {
String? path = await FilePicker.platform.getDirectoryPath();
if (path != null) {
var directory = Directory(path);
} else {
}
}
),
ActionButton(
tipoBoton: ActionButtonTypes.archivo,
......
import 'package:flutter/material.dart';
import 'package:prueba_multimedia/modelo/seleccionable.dart';
class ArchivoWidget extends StatelessWidget {
final texto;
class SeleccionableWidget extends StatelessWidget {
final Seleccionable seleccionable;
const ArchivoWidget({super.key, this.texto});
SeleccionableWidget({super.key, required this.seleccionable});
@override
Widget build(BuildContext context) {
......@@ -19,18 +20,22 @@ class ArchivoWidget extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
texto,
seleccionable.nombre,
style: Theme.of(context).textTheme.bodyLarge
),
Text(
texto,
'CAMBIAME',
style: Theme.of(context).textTheme.bodySmall
),
],
)
),
/* Algo como esto para una carpeta
if (convertible is carpeta)
IconButton(onPressed: () {}, icon: Icon(Icons.edit)),
*/
IconButton(
icon: Icon(Icons.edit),
icon: seleccionable.icono,
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