feat(v0.4.0): PantallaReproductor + PantallaAjustes + MiniReproductor tappable

- PantallaReproductor: artwork grande con sombra animada al reproducir,
  info chips (país/idioma), codec/bitrate, controles play/pause/stop,
  indicador en vivo, botón favorito toggle, widget timer inline,
  animaciones entrada (scale + fadeIn + slideY), transición slide-up.
- PantallaAjustes: estado sistema (filtro, background), conteo favoritos,
  preview de features futuras (Export/Import, radio custom, EQ).
- MiniReproductor: GestureDetector → abre PantallaReproductor al tap.
- app.dart: 4 tabs (Inicio/Buscar/Favoritos/Ajustes), AppBar condicional.
This commit is contained in:
Kira (Agent)
2026-04-04 18:24:09 +02:00
parent 81db383a47
commit ac5ab2316f
5 changed files with 677 additions and 95 deletions

View File

@@ -0,0 +1,84 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../estado/estado_radio.dart';
/// Pantalla de ajustes — por ahora muestra info de la app.
/// En Fase 3 se añadirá Export/Import config y gestión PRO.
class PantallaAjustes extends StatelessWidget {
const PantallaAjustes({super.key});
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
final estado = context.read<EstadoRadio>();
return Scaffold(
appBar: AppBar(title: const Text('Ajustes')),
body: ListView(
children: [
// Info app
ListTile(
leading: const Icon(Icons.info_outline),
title: const Text('PluriWave'),
subtitle: const Text('v0.3.0 — Radio mundial'),
),
const Divider(),
// Favoritos
FutureBuilder<int>(
future: estado.favoritos.obtenerTodos().then((l) => l.length),
builder: (ctx, snap) => ListTile(
leading: const Icon(Icons.favorite_outline),
title: const Text('Favoritos guardados'),
trailing: Text(
snap.data?.toString() ?? '',
style: theme.textTheme.bodyLarge,
),
),
),
const Divider(),
// Filtro emisoras
ListTile(
leading: const Icon(Icons.verified_outlined),
title: const Text('Filtro de emisoras'),
subtitle: const Text('Solo emisoras verificadas como activas'),
trailing: const Icon(Icons.check_circle, color: Colors.green),
),
ListTile(
leading: const Icon(Icons.music_off_outlined),
title: const Text('Audio en background'),
subtitle: const Text('Activo — continúa al apagar pantalla'),
trailing: const Icon(Icons.check_circle, color: Colors.green),
),
const Divider(),
// Próximamente
const Padding(
padding: EdgeInsets.fromLTRB(16, 12, 16, 4),
child: Text('PRÓXIMAMENTE', style: TextStyle(fontSize: 12, letterSpacing: 1.2)),
),
ListTile(
leading: const Icon(Icons.upload_outlined),
title: const Text('Exportar configuración'),
subtitle: const Text('Favoritos, radios custom, presets EQ'),
enabled: false,
),
ListTile(
leading: const Icon(Icons.download_outlined),
title: const Text('Importar configuración'),
enabled: false,
),
ListTile(
leading: const Icon(Icons.add_circle_outline),
title: const Text('Añadir radio personalizada'),
enabled: false,
),
ListTile(
leading: const Icon(Icons.equalizer_outlined),
title: const Text('Ecualizador'),
subtitle: const Text('5 bandas, presets por emisora'),
enabled: false,
),
],
),
);
}
}