import 'package:flutter/material.dart'; import '../modelos/preset_ecualizador.dart'; /// Widget de ecualizador con 5 sliders verticales. /// Basado en JaviHogar EcualizadorWidget, adaptado a Material You. class EcualizadorWidget extends StatefulWidget { final PresetEcualizador preset; final void Function(PresetEcualizador) onCambio; const EcualizadorWidget({super.key, required this.preset, required this.onCambio}); @override State createState() => _EcualizadorWidgetState(); } class _EcualizadorWidgetState extends State { late List _bandas; final List _etiquetas = ['60Hz', '250Hz', '1kHz', '4kHz', '16kHz']; @override void initState() { super.initState(); _bandas = List.from(widget.preset.bandas); } @override void didUpdateWidget(EcualizadorWidget old) { super.didUpdateWidget(old); if (old.preset.nombre != widget.preset.nombre) { setState(() => _bandas = List.from(widget.preset.bandas)); } } void _actualizarBanda(int index, double valor) { setState(() => _bandas[index] = valor); widget.onCambio(PresetEcualizador(nombre: 'Personalizado', bandas: List.from(_bandas))); } @override Widget build(BuildContext context) { final theme = Theme.of(context); return Card( child: Padding( padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Text('Ecualizador', style: theme.textTheme.titleMedium), const SizedBox(height: 16), Row( crossAxisAlignment: CrossAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ for (int i = 0; i < 5; i++) Expanded( child: Column( children: [ SizedBox( height: 160, child: RotatedBox( quarterTurns: 3, child: Slider( value: _bandas[i], min: -12.0, max: 12.0, divisions: 24, onChanged: (v) => _actualizarBanda(i, v), ), ), ), Text( '${_bandas[i].toStringAsFixed(1)}dB', style: theme.textTheme.labelSmall, textAlign: TextAlign.center, ), Text( _etiquetas[i], style: theme.textTheme.bodySmall?.copyWith( color: theme.colorScheme.onSurfaceVariant, ), textAlign: TextAlign.center, ), ], ), ), ], ), ], ), ), ); } } /// Chips de presets predefinidos. class PresetsEcualizadorWidget extends StatelessWidget { final PresetEcualizador presetActual; final void Function(PresetEcualizador) onSeleccionar; const PresetsEcualizadorWidget({ super.key, required this.presetActual, required this.onSeleccionar, }); @override Widget build(BuildContext context) { return Wrap( spacing: 8, runSpacing: 4, children: PresetEcualizador.presets.map((p) { return ChoiceChip( label: Text(p.nombre), selected: p.nombre == presetActual.nombre, onSelected: (_) => onSeleccionar(p), ); }).toList(), ); } }