Commit 86fb3301 by Tecnicos

Carpeta widget finalizado, siguiente objetivo evitar los desbordamientos

parent af477fbf
import 'dart:io'; import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:uuid/uuid.dart';
import 'archivo.dart'; import 'archivo.dart';
import 'convertible.dart'; import 'convertible.dart';
import 'elemento_seleccionable.dart'; import 'elemento_seleccionable.dart';
...@@ -7,13 +8,14 @@ import 'formato.dart'; ...@@ -7,13 +8,14 @@ import 'formato.dart';
class Carpeta extends ElementoSeleccionable{ class Carpeta extends ElementoSeleccionable{
final Directory _directory; final Directory _directory;
final bool _incluirSubcarpetas = false; bool _incluirSubcarpetas = false;
bool _open = false; bool _open = false;
late 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);
bool get isOpen => _open; bool get isOpen => _open;
bool get incluyeSubcarpetas => _incluirSubcarpetas;
Carpeta({required super.id, required Directory directory, required Map<Formato, bool> formatos}): Carpeta({required super.id, required Directory directory, required Map<Formato, bool> formatos}):
_directory = directory, _directory = directory,
...@@ -54,6 +56,14 @@ class Carpeta extends ElementoSeleccionable{ ...@@ -54,6 +56,14 @@ class Carpeta extends ElementoSeleccionable{
_open = !_open; _open = !_open;
} }
void pressIncluirSubcarpetas(){
_incluirSubcarpetas = !_incluirSubcarpetas;
}
void pressAltSeleccionado(int index){
_formatos[index].seleccionado = !_formatos[index].seleccionado;
}
@override @override
void convertir() { void convertir() {
// TODO: <implement> // TODO: <implement>
...@@ -62,24 +72,22 @@ class Carpeta extends ElementoSeleccionable{ ...@@ -62,24 +72,22 @@ class Carpeta extends ElementoSeleccionable{
class InfoFormato { class InfoFormato {
final bool _subcarpeta; final bool _subcarpeta;
bool _seleccionado; bool seleccionado;
final Convertible _conversion; final Convertible _conversion;
bool get subcarpeta => _subcarpeta; bool get subcarpeta => _subcarpeta;
bool get seleccionado => _seleccionado;
Convertible get conversion => _conversion; Convertible get conversion => _conversion;
Formato get formatoOriginal => _conversion.formatoOriginal; Formato get formatoOriginal => _conversion.formatoOriginal;
Formato? get formatoDestino => _conversion.formatoDestino; Formato? get formatoDestino => _conversion.formatoDestino;
set seleccionado(bool value) => _seleccionado = value;
set formatoDestino(Formato? destino) => _conversion.formatoDestino = destino; set formatoDestino(Formato? destino) => _conversion.formatoDestino = destino;
InfoFormato({required Formato formato, InfoFormato({required Formato formato,
required String nombreCarpeta, required String nombreCarpeta,
required bool subCarpeta, required bool subCarpeta,
bool? seleccionado}): bool? seleccionado}):
_subcarpeta = subCarpeta, _seleccionado = seleccionado ?? !subCarpeta, _subcarpeta = subCarpeta, seleccionado = seleccionado ?? !subCarpeta,
_conversion = Convertible(id: "null", nombre: '$nombreCarpeta > ${formato.name}', _conversion = Convertible(id: const Uuid().v1(), nombre: '$nombreCarpeta > ${formato.name}',
icon: Icon(Icons.find_in_page_outlined), formatoOriginal: formato); icon: Icon(Icons.find_in_page_outlined), formatoOriginal: formato);
void convertir(){ void convertir(){
......
...@@ -21,7 +21,7 @@ class ListaSeleccionables extends ChangeNotifier { ...@@ -21,7 +21,7 @@ class ListaSeleccionables extends ChangeNotifier {
} }
void addArchivo(File file) { void addArchivo(File file) {
_seleccionables.add(Archivo(id: "Archivo", _seleccionables.add(Archivo(id: const Uuid().v1(),
file: file)); file: file));
notifyListeners(); notifyListeners();
} }
......
...@@ -32,7 +32,7 @@ class _PaginaConfiguracionCarpetaState extends State<PaginaConfiguracionCarpeta> ...@@ -32,7 +32,7 @@ class _PaginaConfiguracionCarpetaState extends State<PaginaConfiguracionCarpeta>
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_incluirSubcarpetas = false; _incluirSubcarpetas = widget._carpeta.incluyeSubcarpetas;
for(TipoMultimedia t in TipoMultimedia.values){ for(TipoMultimedia t in TipoMultimedia.values){
_formatos[t] = []; _formatos[t] = [];
...@@ -94,6 +94,7 @@ class _PaginaConfiguracionCarpetaState extends State<PaginaConfiguracionCarpeta> ...@@ -94,6 +94,7 @@ class _PaginaConfiguracionCarpetaState extends State<PaginaConfiguracionCarpeta>
onChanged: (bool? value) { onChanged: (bool? value) {
setState(() { setState(() {
_incluirSubcarpetas = value!; _incluirSubcarpetas = value!;
widget._carpeta.pressIncluirSubcarpetas();
widget._lista.actualizaSeleccionable(widget._indice, widget._carpeta); widget._lista.actualizaSeleccionable(widget._indice, widget._carpeta);
}); });
}) })
...@@ -148,8 +149,10 @@ class _PaginaConfiguracionCarpetaState extends State<PaginaConfiguracionCarpeta> ...@@ -148,8 +149,10 @@ class _PaginaConfiguracionCarpetaState extends State<PaginaConfiguracionCarpeta>
for(InfoFormato i in widget._formatosCarpeta){ for(InfoFormato i in widget._formatosCarpeta){
if(_formatos[t]!.contains(i.formatoOriginal) && !(!_incluirSubcarpetas && i.subcarpeta)){ if(_formatos[t]!.contains(i.formatoOriginal) && !(!_incluirSubcarpetas && i.subcarpeta)){
_seleccionados[i.formatoOriginal] = _allOfType[t]!; _seleccionados[i.formatoOriginal] = _allOfType[t]!;
widget._carpeta.pressAltSeleccionado(widget._carpeta.formatos.indexOf(i));
} }
} }
widget._lista.actualizaSeleccionable(widget._indice, widget._carpeta);
}); });
}) })
], ],
...@@ -198,6 +201,8 @@ class _PaginaConfiguracionCarpetaState extends State<PaginaConfiguracionCarpeta> ...@@ -198,6 +201,8 @@ class _PaginaConfiguracionCarpetaState extends State<PaginaConfiguracionCarpeta>
_seleccionados[i.formatoOriginal] = value!; _seleccionados[i.formatoOriginal] = value!;
_allOfType[i.formatoOriginal.tipoMultimedia] = _allOfType[i.formatoOriginal.tipoMultimedia] =
_actualizarCheckboxTipo(i.formatoOriginal.tipoMultimedia); _actualizarCheckboxTipo(i.formatoOriginal.tipoMultimedia);
widget._carpeta.pressAltSeleccionado(widget._carpeta.formatos.indexOf(i));
widget._lista.actualizaSeleccionable(widget._indice, widget._carpeta);
}); });
}), }),
IconButton( IconButton(
......
...@@ -16,11 +16,12 @@ class CarpetaWidget extends StatefulWidget { ...@@ -16,11 +16,12 @@ class CarpetaWidget extends StatefulWidget {
class _CarpetaWidgetState extends State<CarpetaWidget> class _CarpetaWidgetState extends State<CarpetaWidget>
with SingleTickerProviderStateMixin{ with SingleTickerProviderStateMixin{
static double MAX_HEIGHT = 50;
late final AnimationController _controller; late final AnimationController _controller;
late final numChild = widget.carpeta.formatos.length; List<InfoFormato> seleccionados = [];
bool open = false; bool open = false;
double rotAngle = 0; double rotAngle = 0;
double height = 20; double height = 0;
@override @override
void initState() { void initState() {
...@@ -31,7 +32,7 @@ class _CarpetaWidgetState extends State<CarpetaWidget> ...@@ -31,7 +32,7 @@ class _CarpetaWidgetState extends State<CarpetaWidget>
_controller.addListener(() { _controller.addListener(() {
setState(() { setState(() {
rotAngle = pi*_controller.value; rotAngle = pi*_controller.value;
height = 40*_controller.value; height = MAX_HEIGHT*_controller.value;
}); });
}); });
super.initState(); super.initState();
...@@ -39,8 +40,17 @@ class _CarpetaWidgetState extends State<CarpetaWidget> ...@@ -39,8 +40,17 @@ class _CarpetaWidgetState extends State<CarpetaWidget>
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
seleccionados = [];
for(var i in widget.carpeta.formatos){
if(i.seleccionado && (widget.carpeta.incluyeSubcarpetas || !i.subcarpeta)){
seleccionados.add(i);
}
}
if(seleccionados.length <= 0){
_controller.reset();
}
return SizedBox( return SizedBox(
height: 60 + (numChild*height), height: (height <= 0)? 60 : 60 + (seleccionados.length*(height+10)),
width: MediaQuery.of(context).size.width, width: MediaQuery.of(context).size.width,
child: Stack( child: Stack(
children: [ children: [
...@@ -55,6 +65,9 @@ class _CarpetaWidgetState extends State<CarpetaWidget> ...@@ -55,6 +65,9 @@ class _CarpetaWidgetState extends State<CarpetaWidget>
} }
Widget buildMainContainer(){ Widget buildMainContainer(){
String s = "";
if(seleccionados.length > 1) s = "s";
return SizedBox( return SizedBox(
height: 60, height: 60,
width: MediaQuery.of(context).size.width-10, width: MediaQuery.of(context).size.width-10,
...@@ -74,14 +87,25 @@ class _CarpetaWidgetState extends State<CarpetaWidget> ...@@ -74,14 +87,25 @@ class _CarpetaWidgetState extends State<CarpetaWidget>
fontWeight: FontWeight.bold fontWeight: FontWeight.bold
) )
), ),
Text(
(seleccionados.length > 0)?
'${seleccionados.length} formato$s seleccionado$s'
: 'Ningún formato seleccionado',
style: Theme.of(context).textTheme.bodyLarge?.copyWith(
color: (seleccionados.length > 0)? null : Colors.red
)
),
], ],
) )
), ),
Transform.rotate( Transform.rotate(
angle: rotAngle, angle: rotAngle,
child: IconButton( child: IconButton(
icon: Icon(Icons.arrow_drop_down), icon: Icon(
onPressed: () { Icons.arrow_drop_down,
color: (seleccionados.length > 0)? null : Theme.of(context).disabledColor,
),
onPressed: (seleccionados.length <= 0)? null : () {
setState(() { setState(() {
open = !open; open = !open;
}); });
...@@ -110,62 +134,110 @@ class _CarpetaWidgetState extends State<CarpetaWidget> ...@@ -110,62 +134,110 @@ class _CarpetaWidgetState extends State<CarpetaWidget>
} }
List<Widget> buildSecondaryContainers(){ List<Widget> buildSecondaryContainers(){
return widget.carpeta.formatos.map((elemento) { int index = 0;
return seleccionados.map((elemento) {
index++;
String texto = elemento.formatoOriginal.name.toUpperCase(); String texto = elemento.formatoOriginal.name.toUpperCase();
if(elemento.formatoDestino != null) texto += " > ${elemento.formatoDestino!.name.toUpperCase()}"; if(elemento.formatoDestino != null) texto += " > ${elemento.formatoDestino!.name.toUpperCase()}";
return ClipRect( return Positioned(
clipper: _MyRectClipper(_controller), top: (height+10)*index,
child: SizedBox( child: ClipRect(
height: 40, clipper: _MyRectClipper(_controller),
width: MediaQuery.of(context).size.width-10, child: Dismissible(
child: Padding( key: Key(elemento.conversion.id),
padding: const EdgeInsets.only(left: 24.0), background: Container(
child: Row( color: Colors.red,
crossAxisAlignment: CrossAxisAlignment.center, alignment: Alignment.centerLeft,
children: <Widget>[ child: Padding(
Icon(Icons.find_in_page_outlined), padding: const EdgeInsets.only(left: 4.0),
const SizedBox(width: 10), child: Icon(Icons.check_box_outline_blank,
Expanded( color: Colors.white,
child: Column( size: 31.0
crossAxisAlignment: CrossAxisAlignment.start, ),
mainAxisAlignment: MainAxisAlignment.center, ),
children: [ ),
Text( secondaryBackground: Container(
widget.carpeta.nombre, color: Colors.red,
style: Theme.of(context).textTheme.bodyLarge?.copyWith( alignment: Alignment.centerRight,
fontWeight: FontWeight.bold child: Padding(
) padding: const EdgeInsets.only(right: 14.0),
), child: Icon(Icons.check_box_outline_blank,
Text( color: Colors.white,
texto, size: 31.0
style: Theme.of(context).textTheme.bodyLarge?.copyWith( ),
fontWeight: FontWeight.bold ),
) ),
), onDismissed: (direction) {
], seleccionados.remove(elemento);
) widget.carpeta.pressAltSeleccionado(widget.carpeta.formatos.indexOf(elemento));
), widget.lista.actualizaSeleccionable(widget.indice, widget.carpeta);
IconButton( ScaffoldMessenger.of(context).showSnackBar(
icon: const Icon(Icons.edit), SnackBar(
onPressed: () { content: Text('${elemento.formatoOriginal.name.toUpperCase()} excluido de ${widget.carpeta}'),
Navigator.push(context, action: SnackBarAction(
MaterialPageRoute(builder: (context) { label: 'Deshacer',
return PaginaConfiguracion( onPressed: () {
indice: widget.indice, seleccionados.add(elemento);
elemento: elemento.conversion, widget.carpeta.pressAltSeleccionado(widget.carpeta.formatos.indexOf(elemento));
lista: widget.lista, widget.lista.actualizaSeleccionable(widget.indice, widget.carpeta);
carpeta: widget.carpeta }
); ),
}
));
},
) )
] );
},
child: SizedBox(
height: 50,
width: MediaQuery.of(context).size.width-10,
child: Padding(
padding: const EdgeInsets.only(left: 24.0),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Icon(Icons.find_in_page_outlined),
const SizedBox(width: 10),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
widget.carpeta.nombre,
style: Theme.of(context).textTheme.bodyLarge?.copyWith(
fontWeight: FontWeight.bold
)
),
Text(
texto,
style: Theme.of(context).textTheme.bodyLarge?.copyWith(
fontWeight: FontWeight.bold
)
),
],
)
),
IconButton(
icon: const Icon(Icons.edit),
onPressed: () {
Navigator.push(context,
MaterialPageRoute(builder: (context) {
return PaginaConfiguracion(
indice: widget.indice,
elemento: elemento.conversion,
lista: widget.lista,
carpeta: widget.carpeta
);
}
));
},
)
]
),
),
), ),
), ),
), ),
);; );
}).toList(); }).toList();
} }
} }
...@@ -177,8 +249,8 @@ class _MyRectClipper extends CustomClipper<Rect> { ...@@ -177,8 +249,8 @@ class _MyRectClipper extends CustomClipper<Rect> {
@override @override
Rect getClip(Size size) { Rect getClip(Size size) {
double value = (1-_controller.value)*40; double value = (1-_controller.value)*_CarpetaWidgetState.MAX_HEIGHT;
return Rect.fromLTWH(0, value, 1000, 40); return Rect.fromLTWH(0, value, 1000, _CarpetaWidgetState.MAX_HEIGHT);
} }
@override @override
......
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