tetraq/lib/widgets/custom_settings_button.dart

183 lines
5.4 KiB
Dart
Raw Normal View History

2026-02-27 23:35:54 +01:00
import 'package:flutter/material.dart';
import '../theme/app_colors.dart';
// Widget per i pulsanti di selezione della forma dell'arena
class NeonShapeButton extends StatelessWidget {
final IconData icon;
final String label;
final bool isSelected;
final VoidCallback onTap;
final ShapeBorder shape; // La forma geometrica del pulsante
const NeonShapeButton({
super.key,
required this.icon,
required this.label,
required this.isSelected,
required this.onTap,
this.shape = const RoundedRectangleBorder( // Forma di default
borderRadius: BorderRadius.all(Radius.circular(12.0))),
});
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: onTap,
child: AnimatedContainer(
duration: const Duration(milliseconds: 300),
curve: Curves.easeInOut,
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
decoration: ShapeDecoration(
shape: shape,
color: isSelected
? AppColors.neonGreen.withOpacity(0.2) // Sfondo luminoso se selezionato
: AppColors.surface.withOpacity(0.5), // Sfondo più scuro se non selezionato
shadows: isSelected
? [ // Bagliore intenso se selezionato
BoxShadow(
color: AppColors.neonGreen.withOpacity(0.6),
blurRadius: 12.0,
spreadRadius: 2.0,
),
]
: [],
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Icon(
icon,
color: isSelected ? AppColors.neonGreen : AppColors.textSecondary,
size: 28,
),
const SizedBox(height: 4),
Text(
label,
style: TextStyle(
color: isSelected ? AppColors.textPrimary : AppColors.textSecondary,
fontSize: 12,
fontWeight: isSelected ? FontWeight.bold : FontWeight.normal,
),
),
],
),
),
);
}
}
// Widget per i pulsanti di selezione della taglia dell'arena
class NeonSizeButton extends StatelessWidget {
final String label;
final bool isSelected;
final VoidCallback onTap;
const NeonSizeButton({
super.key,
required this.label,
required this.isSelected,
required this.onTap,
});
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: onTap,
child: AnimatedContainer(
duration: const Duration(milliseconds: 300),
curve: Curves.easeInOut,
width: 50,
height: 50,
decoration: BoxDecoration(
shape: BoxShape.circle, // Forma circolare
color: isSelected
? AppColors.neonBlue.withOpacity(0.2)
: AppColors.surface.withOpacity(0.5),
border: Border.all(
color: isSelected ? AppColors.neonBlue : AppColors.surfaceLight,
width: 2.0,
),
shadows: isSelected
? [
BoxShadow(
color: AppColors.neonBlue.withOpacity(0.6),
blurRadius: 10.0,
spreadRadius: 1.5,
),
]
: [],
),
child: Center(
child: Text(
label,
style: TextStyle(
color: isSelected ? AppColors.textPrimary : AppColors.textSecondary,
fontSize: 16,
fontWeight: isSelected ? FontWeight.bold : FontWeight.normal,
),
),
),
),
);
}
}
// Widget per l'interruttore della modalità tempo (Clessidra)
class NeonTimeSwitch extends StatelessWidget {
final bool isTimeMode;
final VoidCallback onTap;
const NeonTimeSwitch({
super.key,
required this.isTimeMode,
required this.onTap,
});
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: onTap,
child: AnimatedContainer(
duration: const Duration(milliseconds: 300),
curve: Curves.easeInOut,
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 12),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(30.0), // Forma arrotondata per lo switch
color: isTimeMode
? AppColors.neonGreen.withOpacity(0.2)
: AppColors.surface.withOpacity(0.5),
border: Border.all(
color: isTimeMode ? AppColors.neonGreen : AppColors.surfaceLight,
width: 2.0,
),
shadows: isTimeMode
? [
BoxShadow(
color: AppColors.neonGreen.withOpacity(0.6),
blurRadius: 12.0,
spreadRadius: 2.0,
),
]
: [],
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Icon(
Icons.hourglass_empty, // Icona clessidra
color: isTimeMode ? AppColors.neonGreen : AppColors.textSecondary,
),
const SizedBox(width: 8),
Text(
isTimeMode ? 'A TEMPO' : 'SENZA TEMPO',
style: TextStyle(
color: isTimeMode ? AppColors.textPrimary : AppColors.textSecondary,
fontWeight: isTimeMode ? FontWeight.bold : FontWeight.normal,
),
),
],
),
),
);
}
}