showDetailsTime static method
- BuildContext context,
- Future<
void> deleteTime(), - TimeTraining timeTraining
Método para mostrar los detalles de un tiempo seleccionado.
Este método permite visualizar y gestionar un tiempo registrado, mostrando su información y permitiendo aplicar penalizaciones, eliminar el tiempo o copiar el scramble asociado.
Parametros:
context
: El contexto de la aplicación para poder mostrar el diálogo.
deleteTime
: Función que se ejecutará si el usuario confirma la eliminación del tiempo.
timeTraining
: Objeto que contiene los detalles del tiempo.
Implementation
static showDetailsTime(BuildContext context,
Future<void> Function() deleteTime, TimeTraining timeTraining) async {
// ATRIBUTO PARA SABER SI ESTA PRESIONADO EL SCRAMBLE O LOS COMMENTS
var isTextPressed = true;
final currentTime = Provider.of<CurrentTime>(context, listen: false);
currentTime.setResetTimeTraining();
currentTime.setTimeTraining(timeTraining); // SE ACTUALIZA EL ESTADO GLOBAL
// REESTABLECER VALORES DE PENALIZACION
currentTime.isPlusTwoChoose = false;
currentTime.isDnfChoose = false;
int idTime = await timeTrainingDaoSb.getIdByTime(
currentTime.timeTraining!.scramble,
currentTime.timeTraining!.idSession);
if (idTime == -1) {
AlertUtil.showSnackBarError(context, "time_saved_error");
return;
} // VALIDAR QUE EL IDTIME NO DE ERROR
// SE GUARA EL TIEMPO ORIGINAL DEPENDIENDO DE SI TENIA UN +2 O NO DE PENALIZACION
final timeInSecondsOld = currentTime.timeTraining!.penalty == "+2"
? timeTraining.timeInSeconds - 2
: timeTraining.timeInSeconds;
// SE MUESTRA EL DIALOG
return showDialog(
context: context,
builder: (context) {
return StatefulBuilder(
builder: (context, setState) {
setState(() {
// SEGUN LA PENALIZACION DEL TIEMPO, SE PONE UN ICONO
if (currentTime.timeTraining!.penalty == "+2") {
iconPenalty = Icons.timer;
currentTime.isDnfChoose = false;
currentTime.isPlusTwoChoose = true;
} else if (currentTime.timeTraining!.penalty == "DNF") {
iconPenalty = Icons.close;
currentTime.isDnfChoose = true;
currentTime.isPlusTwoChoose = false;
} else if (currentTime.timeTraining!.penalty == "none") {
iconPenalty = Icons.block;
} // INICIALIZAR EL ICONO
});
return AlertDialog(
// SE REDUCE EL PADDING DEL TITULO Y DEL CONTENIDO
titlePadding:
const EdgeInsets.symmetric(horizontal: 15, vertical: 10),
contentPadding:
const EdgeInsets.symmetric(horizontal: 15, vertical: 10),
backgroundColor: AppColors.lightVioletColor,
// TITULO DE LA ALERTA
title: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
DropdownButtonHideUnderline(
child: DropdownButton2(
// BOTON PARA EL DROPDOWN
customButton: IconClass.iconMaker(
context, iconPenalty, "add_penalty"),
// ITEMS DEL DROPDOWN
items: [
...MenuItems.items.map(
(item) => DropdownMenuItem<MenuItem>(
value: item,
// CONSTRUYE CADA ITEM DEL MENU
child: MenuItems.buildItem(item),
),
),
],
// CUANDO SE SELECCIONA UNA OPCION, SE ACTUALIZA EL ICONO Y LA PENALIZACION
onChanged: (value) async {
setState(() {
iconPenalty = value!.icon;
// ASIGNAR LA PENALIZACION SEGUN EL ICONO SELECCIONADO
if (iconPenalty == Icons.close) {
// PENALIZACION DNF (NO FINALIZADO)
currentTime.setPenalty("DNF", !currentTime.isDnfChoose);
currentTime.isDnfChoose = !currentTime.isDnfChoose;
currentTime.isPlusTwoChoose = false;
} else if (iconPenalty == Icons.timer) {
// PENALIZACION +2 SEGUNDOS
currentTime.setPenalty("+2", !currentTime.isPlusTwoChoose);
currentTime.isDnfChoose = false;
currentTime.isPlusTwoChoose = !currentTime.isPlusTwoChoose;
} else if (iconPenalty == Icons.block) {
// SIN PENALIZACION, RESTA LOS 2 SEGUNDOS SI ESTABA EN +2
if (currentTime.timeTraining!.penalty == "+2") {
currentTime.timeTraining!.timeInSeconds = timeInSecondsOld;
}
currentTime.setPenalty("none", true);
}
});
// ACTUALIZAR EL ESTADO GLOBAL
currentTime.updateCurrentTime(context);
// GUARDAR CAMBIOS EN LA BASE DE DATOS
if (await timeTrainingDaoSb.updateTime(
idTime, currentTime.timeTraining) == false) {
// MOSTRAR ERROR SI FALLA LA ACTUALIZACION
AlertUtil.showSnackBarError(
context, "time_saved_error");
return;
}
},
dropdownStyleData: DropdownStyleData(
width: 160, // ANCHO DEL MENU DESPLEGABLE
padding: const EdgeInsets.symmetric(vertical: 6),
decoration: BoxDecoration(
// BORDES REDONDEADOS
borderRadius: BorderRadius.circular(4),
color: AppColors.imagenBg, // COLOR DE FONDO
),
offset: const Offset(0, 8), // DESPLAZAMIENTO DEL MENU
),
menuItemStyleData: MenuItemStyleData(
customHeights: [
// ALTURA DE CADA ITEM
...List<double>.filled(MenuItems.items.length, 48),
],
// ESPACIADO INTERNO
padding: const EdgeInsets.only(left: 16, right: 16),
),
),
),
Text(
// SI LA PENALIZACION ES 'DNF' SE MUESTRA EN VEZ DEL TIEMPO
currentTime.timeTraining!.penalty == "DNF"
? currentTime.timeTraining!.penalty.toString()
: currentTime.timeTraining!.timeInSeconds.toString(),
style: AppStyles.darkPurpleAndBold(30),
),
IconClass.iconButton(context, () async {
await deleteTime();
}, "delete_time", Icons.delete)
],
),
content: Column(
mainAxisSize: MainAxisSize.min, // QUE OCUPE EL MINIMO
children: [
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
IconClass.iconButton(
context, () {}, "date", Icons.calendar_month),
Text(
DateFormat('dd/MM/yyyy').format(DateTime.now()),
style: AppStyles.darkPurple(16),
)
],
),
// LINEA DIVISORIA ENTRE LA FECHA Y EL CONTENIDO EN SI
const Divider(
height: 10,
thickness: 1.3,
indent: 10,
endIndent: 10,
color: AppColors.darkPurpleColor,
),
const SizedBox(height: 5),
Row(
children: [
Card(
// SEGUN SI ESTA PRESIONADO O NO, SE TORNA DE UN COLOR U OTRO
color: isTextPressed
? AppColors.downLinearColor
: AppColors.purpleButton,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(5),
), // RADIO DEL CARD
child: TextButton(
onPressed: () {
setState(() {
// SI EL SCRAMBLE ES SELECCIONADO, SE PONE A TRUE
isTextPressed = true;
});
},
child: Text(
"Scramble",
style: AppStyles.darkPurpleAndBold(13),
),
),
),
Card(
// SI EL SCRAMBLE ESTA PRESIONADO SE CAMBIA DE COLOR EL CARD
color: isTextPressed
? AppColors.purpleButton
: AppColors.downLinearColor,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(5),
), // RADIO DEL CARD
child: TextButton(
onPressed: () {
setState(() {
// CUANDO PRESIONE LOS COMENTAIOS, SE PONE A FALSE
isTextPressed = false;
});
},
child: Text(
Internationalization.internationalization.getLocalizations(context, "comments"),
style: AppStyles.darkPurpleAndBold(13),
),
),
),
],
),
Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Expanded(
child: Text(
// SI EL SCRAMBLE ESTA PRESIONADO SE MUESTRA EL SCRAMBLE
// Y SI NO LOS COMENTARIOS
isTextPressed
? timeTraining.scramble
: (timeTraining.comments ?? Internationalization.internationalization.getLocalizations(context, "no_comments")),
style: const TextStyle(fontSize: 14),
// HACE UN SALTO DE LINEA SI ES LARGO
softWrap: true,
// SI TIENE MUCHO OVERFLOW, TRUNCA EL SCRAMBLE Y PONE PUNTOS SUSPENSIVOS
overflow: TextOverflow.fade,
),
),
IconClass.iconButton(context, () async {
await Clipboard.setData(
ClipboardData(text: timeTraining.scramble));
// MUESTRA MENSAJE DE QUE SE COPIO CORRECTAMENTE
showSnackBarInformation(
context, "copied_successfully");
}, "copy_scramble", Icons.copy)
],
)
],
),
);
},
);
});
}