fix(eq): split the equalizer body into 4 cards, add Restablecer a plano

Audit 11.10/11.8 (t4 lines 570-602): the prototype draws the explainer
banner, the band sliders, "Salida activa + Guardar como preset +
Restablecer a plano" and "Emisoras con ajuste propio" as 4 separate
cards. The build nested everything in one outer PluriGlassSurface, so
it read as a single merged block, and had no reset-to-flat action at
all.

Removes the outer wrapper from _CuerpoEcualizador. EcualizadorWidget
already draws its own card (design ADR-5, unchanged); the explainer
banner already has its own tinted background (unchanged); "Emisoras
con ajuste propio" now wraps itself in its own PluriGlassSurface; a
new _TarjetaSalidaYAcciones groups Salida activa with two tappable
rows — "Guardar como preset" (relocated from a floating end-aligned
button) and the new "Restablecer a plano", which applies
PresetEcualizador.flat via the existing EstadoEcualizador.cambiarPreset
— the same call the "Plano" preset chip already makes, not a new
capability.

The 5-slider band count, servicio_ecualizador.dart and
preset_ecualizador.dart are untouched.
This commit is contained in:
2026-07-30 00:57:29 +02:00
parent e5d461af53
commit 653848899f
29 changed files with 373 additions and 96 deletions
+1
View File
@@ -711,6 +711,7 @@
"equalizerActiveOutputLabel": "المخرج النشط",
"equalizerBaseExplainer": "هذا هو المعادل الأساسي: يُطبَّق على كل محطة لا تملك إعدادًا خاصًا بها. يُحدَّد معادل محطة معينة من شاشة تشغيلها الخاصة، وله الأولوية على هذا المعادل.",
"equalizerSaveAsPresetAction": "حفظ كإعداد مسبق",
"equalizerResetToFlatAction": "إعادة الضبط إلى مسطح",
"equalizerSavePresetConfirm": "حفظ",
"equalizerSavePresetDialogTitle": "حفظ كإعداد مسبق",
"equalizerSavePresetEmptyNameError": "أدخل اسمًا للإعداد المسبق.",
+1
View File
@@ -711,6 +711,7 @@
"equalizerActiveOutputLabel": "সক্রিয় আউটপুট",
"equalizerBaseExplainer": "এটি বেস ইকুয়ালাইজার: এটি নিজস্ব সেটিং নেই এমন সব স্টেশনে প্রযোজ্য। কোনো নির্দিষ্ট স্টেশনের নিজস্ব EQ তার প্লেব্যাক স্ক্রিন থেকে ঠিক করা হয় এবং এটির চেয়ে অগ্রাধিকার পায়।",
"equalizerSaveAsPresetAction": "প্রিসেট হিসেবে সংরক্ষণ করুন",
"equalizerResetToFlatAction": "সমতলে পুনরায় সেট করুন",
"equalizerSavePresetConfirm": "সংরক্ষণ করুন",
"equalizerSavePresetDialogTitle": "প্রিসেট হিসেবে সংরক্ষণ করুন",
"equalizerSavePresetEmptyNameError": "প্রিসেটের জন্য একটি নাম লিখুন।",
+1
View File
@@ -711,6 +711,7 @@
"equalizerActiveOutputLabel": "Aktiver Ausgang",
"equalizerBaseExplainer": "Dies ist der Basis-Equalizer: Er gilt für alle Sender ohne eigene Einstellung. Der eigene EQ eines Senders wird auf dessen eigenem Wiedergabebildschirm festgelegt und hat Vorrang vor diesem hier.",
"equalizerSaveAsPresetAction": "Als Preset speichern",
"equalizerResetToFlatAction": "Auf neutral zurücksetzen",
"equalizerSavePresetConfirm": "Speichern",
"equalizerSavePresetDialogTitle": "Als Preset speichern",
"equalizerSavePresetEmptyNameError": "Gib einen Namen für das Preset ein.",
+1
View File
@@ -102,6 +102,7 @@
"equalizerStationsWithOwnEqSubtitle": "Ignore this base equalizer",
"equalizerStationsWithOwnEqEmpty": "No stations have their own EQ yet.",
"equalizerSaveAsPresetAction": "Save as preset",
"equalizerResetToFlatAction": "Reset to flat",
"equalizerSavePresetDialogTitle": "Save as preset",
"equalizerSavePresetNameLabel": "Preset name",
"equalizerSavePresetEmptyNameError": "Enter a name for the preset.",
+1
View File
@@ -102,6 +102,7 @@
"equalizerStationsWithOwnEqSubtitle": "Ignoran este ecualizador base",
"equalizerStationsWithOwnEqEmpty": "Ninguna emisora tiene ajuste propio todavía.",
"equalizerSaveAsPresetAction": "Guardar como preset",
"equalizerResetToFlatAction": "Restablecer a plano",
"equalizerSavePresetDialogTitle": "Guardar como preset",
"equalizerSavePresetNameLabel": "Nombre del preset",
"equalizerSavePresetEmptyNameError": "Ingresá un nombre para el preset.",
+1
View File
@@ -711,6 +711,7 @@
"equalizerActiveOutputLabel": "Sortie active",
"equalizerBaseExplainer": "Voici l'égaliseur de base : il s'applique à toutes les stations sans réglage propre. L'EQ propre à une station est défini depuis son propre écran de lecture et prime sur celui-ci.",
"equalizerSaveAsPresetAction": "Enregistrer comme Preset",
"equalizerResetToFlatAction": "Réinitialiser à plat",
"equalizerSavePresetConfirm": "Enregistrer",
"equalizerSavePresetDialogTitle": "Enregistrer comme Preset",
"equalizerSavePresetEmptyNameError": "Saisissez un nom pour le Preset.",
+1
View File
@@ -711,6 +711,7 @@
"equalizerActiveOutputLabel": "सक्रिय आउटपुट",
"equalizerBaseExplainer": "यह बेस इक्वलाइज़र है: यह उन सभी स्टेशन पर लागू होता है जिनकी अपनी सेटिंग नहीं है। किसी खास स्टेशन का अपना EQ उसकी प्लेबैक स्क्रीन से तय होता है और इस पर प्राथमिकता रखता है।",
"equalizerSaveAsPresetAction": "प्रीसेट के रूप में सहेजें",
"equalizerResetToFlatAction": "समतल पर रीसेट करें",
"equalizerSavePresetConfirm": "सहेजें",
"equalizerSavePresetDialogTitle": "प्रीसेट के रूप में सहेजें",
"equalizerSavePresetEmptyNameError": "प्रीसेट के लिए एक नाम डालें।",
+1
View File
@@ -711,6 +711,7 @@
"equalizerActiveOutputLabel": "Output aktif",
"equalizerBaseExplainer": "Ini adalah equalizer dasar: berlaku untuk semua stasiun yang belum punya pengaturan sendiri. EQ khusus suatu stasiun diatur dari layar pemutarannya sendiri dan mengesampingkan yang ini.",
"equalizerSaveAsPresetAction": "Simpan sebagai Preset",
"equalizerResetToFlatAction": "Setel ulang ke datar",
"equalizerSavePresetConfirm": "Simpan",
"equalizerSavePresetDialogTitle": "Simpan sebagai Preset",
"equalizerSavePresetEmptyNameError": "Masukkan nama untuk Preset.",
+1
View File
@@ -711,6 +711,7 @@
"equalizerActiveOutputLabel": "Uscita attiva",
"equalizerBaseExplainer": "Questo è l'equalizzatore di base: si applica a tutte le emittenti senza un'impostazione propria. L'EQ di un'emittente specifica si imposta dalla sua schermata di riproduzione e ha la precedenza su questo.",
"equalizerSaveAsPresetAction": "Salva come Preset",
"equalizerResetToFlatAction": "Ripristina piatto",
"equalizerSavePresetConfirm": "Salva",
"equalizerSavePresetDialogTitle": "Salva come Preset",
"equalizerSavePresetEmptyNameError": "Inserisci un nome per il Preset.",
+1
View File
@@ -711,6 +711,7 @@
"equalizerActiveOutputLabel": "アクティブな出力",
"equalizerBaseExplainer": "これはベースイコライザーです。専用設定を持たないすべての局に適用されます。特定の局専用のEQはその局の再生画面から設定でき、こちらより優先されます。",
"equalizerSaveAsPresetAction": "プリセットとして保存",
"equalizerResetToFlatAction": "フラットにリセット",
"equalizerSavePresetConfirm": "保存",
"equalizerSavePresetDialogTitle": "プリセットとして保存",
"equalizerSavePresetEmptyNameError": "プリセットの名前を入力してください。",
+1
View File
@@ -711,6 +711,7 @@
"equalizerActiveOutputLabel": "Saída ativa",
"equalizerBaseExplainer": "Este é o equalizador base: aplica-se a todas as estações sem ajuste próprio. O EQ próprio de uma estação é definido na sua própria tela de reprodução e tem prioridade sobre este.",
"equalizerSaveAsPresetAction": "Salvar como Preset",
"equalizerResetToFlatAction": "Repor para plano",
"equalizerSavePresetConfirm": "Salvar",
"equalizerSavePresetDialogTitle": "Salvar como Preset",
"equalizerSavePresetEmptyNameError": "Digite um nome para o Preset.",
+1
View File
@@ -711,6 +711,7 @@
"equalizerActiveOutputLabel": "Активный выход",
"equalizerBaseExplainer": "Это базовый эквалайзер: он применяется ко всем станциям без собственной настройки. Свой EQ конкретной станции задаётся на экране её воспроизведения и имеет приоритет над этим.",
"equalizerSaveAsPresetAction": "Сохранить как пресет",
"equalizerResetToFlatAction": "Сбросить на плоский",
"equalizerSavePresetConfirm": "Сохранить",
"equalizerSavePresetDialogTitle": "Сохранить как пресет",
"equalizerSavePresetEmptyNameError": "Введите название пресета.",
+1
View File
@@ -711,6 +711,7 @@
"equalizerActiveOutputLabel": "当前输出",
"equalizerBaseExplainer": "这是基础均衡器:适用于所有没有专属设置的电台。某个电台的专属EQ可在其自己的播放界面中设置,并优先于此设置生效。",
"equalizerSaveAsPresetAction": "保存为预设",
"equalizerResetToFlatAction": "重置为平坦",
"equalizerSavePresetConfirm": "保存",
"equalizerSavePresetDialogTitle": "保存为预设",
"equalizerSavePresetEmptyNameError": "请输入预设名称。",
+6
View File
@@ -538,6 +538,12 @@ abstract class AppLocalizations {
/// **'Guardar como preset'**
String get equalizerSaveAsPresetAction;
/// No description provided for @equalizerResetToFlatAction.
///
/// In es, this message translates to:
/// **'Restablecer a plano'**
String get equalizerResetToFlatAction;
/// No description provided for @equalizerSavePresetDialogTitle.
///
/// In es, this message translates to:
+3
View File
@@ -246,6 +246,9 @@ class AppLocalizationsAr extends AppLocalizations {
@override
String get equalizerSaveAsPresetAction => 'حفظ كإعداد مسبق';
@override
String get equalizerResetToFlatAction => 'إعادة الضبط إلى مسطح';
@override
String get equalizerSavePresetDialogTitle => 'حفظ كإعداد مسبق';
+3
View File
@@ -250,6 +250,9 @@ class AppLocalizationsBn extends AppLocalizations {
@override
String get equalizerSaveAsPresetAction => 'প্রিসেট হিসেবে সংরক্ষণ করুন';
@override
String get equalizerResetToFlatAction => 'সমতলে পুনরায় সেট করুন';
@override
String get equalizerSavePresetDialogTitle => 'প্রিসেট হিসেবে সংরক্ষণ করুন';
+3
View File
@@ -250,6 +250,9 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get equalizerSaveAsPresetAction => 'Als Preset speichern';
@override
String get equalizerResetToFlatAction => 'Auf neutral zurücksetzen';
@override
String get equalizerSavePresetDialogTitle => 'Als Preset speichern';
+3
View File
@@ -247,6 +247,9 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get equalizerSaveAsPresetAction => 'Save as preset';
@override
String get equalizerResetToFlatAction => 'Reset to flat';
@override
String get equalizerSavePresetDialogTitle => 'Save as preset';
+3
View File
@@ -249,6 +249,9 @@ class AppLocalizationsEs extends AppLocalizations {
@override
String get equalizerSaveAsPresetAction => 'Guardar como preset';
@override
String get equalizerResetToFlatAction => 'Restablecer a plano';
@override
String get equalizerSavePresetDialogTitle => 'Guardar como preset';
+3
View File
@@ -251,6 +251,9 @@ class AppLocalizationsFr extends AppLocalizations {
@override
String get equalizerSaveAsPresetAction => 'Enregistrer comme Preset';
@override
String get equalizerResetToFlatAction => 'Réinitialiser à plat';
@override
String get equalizerSavePresetDialogTitle => 'Enregistrer comme Preset';
+3
View File
@@ -249,6 +249,9 @@ class AppLocalizationsHi extends AppLocalizations {
@override
String get equalizerSaveAsPresetAction => 'प्रीसेट के रूप में सहेजें';
@override
String get equalizerResetToFlatAction => 'समतल पर रीसेट करें';
@override
String get equalizerSavePresetDialogTitle => 'प्रीसेट के रूप में सहेजें';
+3
View File
@@ -249,6 +249,9 @@ class AppLocalizationsId extends AppLocalizations {
@override
String get equalizerSaveAsPresetAction => 'Simpan sebagai Preset';
@override
String get equalizerResetToFlatAction => 'Setel ulang ke datar';
@override
String get equalizerSavePresetDialogTitle => 'Simpan sebagai Preset';
+3
View File
@@ -250,6 +250,9 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get equalizerSaveAsPresetAction => 'Salva come Preset';
@override
String get equalizerResetToFlatAction => 'Ripristina piatto';
@override
String get equalizerSavePresetDialogTitle => 'Salva come Preset';
+3
View File
@@ -239,6 +239,9 @@ class AppLocalizationsJa extends AppLocalizations {
@override
String get equalizerSaveAsPresetAction => 'プリセットとして保存';
@override
String get equalizerResetToFlatAction => 'フラットにリセット';
@override
String get equalizerSavePresetDialogTitle => 'プリセットとして保存';
+3
View File
@@ -248,6 +248,9 @@ class AppLocalizationsPt extends AppLocalizations {
@override
String get equalizerSaveAsPresetAction => 'Salvar como Preset';
@override
String get equalizerResetToFlatAction => 'Repor para plano';
@override
String get equalizerSavePresetDialogTitle => 'Salvar como Preset';
+3
View File
@@ -250,6 +250,9 @@ class AppLocalizationsRu extends AppLocalizations {
@override
String get equalizerSaveAsPresetAction => 'Сохранить как пресет';
@override
String get equalizerResetToFlatAction => 'Сбросить на плоский';
@override
String get equalizerSavePresetDialogTitle => 'Сохранить как пресет';
+3
View File
@@ -238,6 +238,9 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get equalizerSaveAsPresetAction => '保存为预设';
@override
String get equalizerResetToFlatAction => '重置为平坦';
@override
String get equalizerSavePresetDialogTitle => '保存为预设';
@@ -6,6 +6,7 @@ import 'package:provider/provider.dart';
import '../../estado/estado_ecualizador.dart';
import '../../estado/estado_radio.dart';
import '../../l10n/gen/app_localizations.dart';
import '../../modelos/preset_ecualizador.dart';
import '../../tema/pluriwave_theme.dart';
import '../../widgets/ecualizador_widget.dart';
import '../../widgets/pluri_glass_surface.dart';
@@ -22,6 +23,15 @@ import '../../widgets/pluri_push_scaffold.dart';
/// base-vs-per-station explainer, the "Salida activa" summary row, the
/// "Emisoras con ajuste propio" drill-down, and the "Guardar como preset"
/// custom-preset flow — see `_CuerpoEcualizador` below.
///
/// Audit 11.10/11.8 (t4 lines 570-602, item 19): the prototype draws 4
/// SEPARATE cards (explainer banner / band sliders / "Salida activa +
/// Guardar como preset + Restablecer a plano" / "Emisoras con ajuste
/// propio"), not one shared glass surface wrapping everything — and adds
/// a "Restablecer a plano" action the build never had. `_CuerpoEcualizador`
/// no longer wraps its children in one outer `PluriGlassSurface`; each
/// section now either already draws its own background
/// ([EcualizadorWidget], unchanged) or gained one here.
class PantallaAjustesEcualizador extends StatelessWidget {
const PantallaAjustesEcualizador({super.key});
@@ -70,67 +80,66 @@ class _CuerpoEcualizadorState extends State<_CuerpoEcualizador> {
emisoraActual != null && estado.emisoraActualEsFavorita;
final usandoEqPropio = eq.emisoraActualTienePresetPropio;
return PluriGlassSurface(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
return Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
SwitchListTile.adaptive(
contentPadding: EdgeInsets.zero,
title: Text(l10n.equalizerEnable),
subtitle: Text(
disponible
? l10n.equalizerRealtimeSubtitle
: l10n.equalizerPendingSubtitle,
),
value: eq.activo,
onChanged: eq.cambiarActivo,
),
if (mostrarModoPorEmisora) ...[
const SizedBox(height: 8),
SwitchListTile.adaptive(
contentPadding: EdgeInsets.zero,
title: Text(l10n.equalizerEnable),
title: Text(l10n.equalizerPerStationTitle),
subtitle: Text(
disponible
? l10n.equalizerRealtimeSubtitle
: l10n.equalizerPendingSubtitle,
),
value: eq.activo,
onChanged: eq.cambiarActivo,
),
if (mostrarModoPorEmisora) ...[
const SizedBox(height: 8),
SwitchListTile.adaptive(
contentPadding: EdgeInsets.zero,
title: Text(l10n.equalizerPerStationTitle),
subtitle: Text(
usandoEqPropio
? l10n.equalizerPerStationActive(emisoraActual.nombre)
: l10n.equalizerPerStationMain(emisoraActual.nombre),
),
value: usandoEqPropio,
onChanged:
(usarPropio) =>
eq.cambiarModoEmisoraActual(usarPropio: usarPropio),
),
],
const SizedBox(height: 12),
_BannerExplicacionBase(l10n: l10n),
const SizedBox(height: 8),
_FilaSalidaActiva(eq: eq, l10n: l10n),
const SizedBox(height: 4),
_FilaEmisorasConAjustePropio(eq: eq, estado: estado, l10n: l10n),
const SizedBox(height: 12),
PresetsEcualizadorWidget(
presetActual: eq.presetActual,
personalizados: eq.presetsPersonalizados,
onSeleccionar: (p) => eq.cambiarPreset(p),
),
const SizedBox(height: 12),
EcualizadorWidget(
preset: eq.presetActual,
habilitado: eq.activo,
onCambio: (p) => eq.cambiarPreset(p),
),
const SizedBox(height: 12),
Align(
alignment: Alignment.centerRight,
child: TextButton.icon(
key: const Key('eq-save-preset-action'),
onPressed: () => _abrirDialogoGuardarPreset(context, eq),
icon: const Icon(Icons.bookmark_add_outlined, size: 20),
label: Text(l10n.equalizerSaveAsPresetAction),
usandoEqPropio
? l10n.equalizerPerStationActive(emisoraActual.nombre)
: l10n.equalizerPerStationMain(emisoraActual.nombre),
),
value: usandoEqPropio,
onChanged:
(usarPropio) =>
eq.cambiarModoEmisoraActual(usarPropio: usarPropio),
),
],
),
const SizedBox(height: 12),
// CARD 1 (t4 line 571) — already its own tinted Container.
_BannerExplicacionBase(l10n: l10n),
const SizedBox(height: 16),
// Bare row, no card (t4 lines 573-578) — unchanged.
PresetsEcualizadorWidget(
presetActual: eq.presetActual,
personalizados: eq.presetsPersonalizados,
onSeleccionar: (p) => eq.cambiarPreset(p),
),
const SizedBox(height: 14),
// CARD 2 (t4 lines 580-590) — EcualizadorWidget already draws
// its own PluriGlassSurface (design ADR-5), unchanged here.
EcualizadorWidget(
preset: eq.presetActual,
habilitado: eq.activo,
onCambio: (p) => eq.cambiarPreset(p),
),
const SizedBox(height: 14),
// CARD 3 (t4 lines 592-598): Salida activa / Guardar como
// preset / Restablecer a plano, grouped.
_TarjetaSalidaYAcciones(
eq: eq,
l10n: l10n,
onGuardarPreset: () => _abrirDialogoGuardarPreset(context, eq),
),
const SizedBox(height: 14),
// CARD 4 (t4 lines 600-602) — its own PluriGlassSurface now.
_FilaEmisorasConAjustePropio(eq: eq, estado: estado, l10n: l10n),
],
);
},
);
@@ -204,7 +213,7 @@ class _FilaSalidaActiva extends StatelessWidget {
return Padding(
key: const Key('eq-active-output-row'),
padding: const EdgeInsets.symmetric(vertical: 4),
padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 12),
child: Row(
children: [
const Icon(Icons.speaker_group_rounded, size: 20),
@@ -230,9 +239,107 @@ class _FilaSalidaActiva extends StatelessWidget {
}
}
/// Audit 11.8 (t4 lines 592-598): groups "Salida activa", "Guardar como
/// preset" and the entirely-missing "Restablecer a plano" into ONE card —
/// the build previously drew the first as a bare row and the second as a
/// floating, right-aligned button at the bottom of the whole screen.
/// "Restablecer a plano" is not a new capability: `PresetEcualizador.flat`
/// is the SAME preset the "Plano" chip in [PresetsEcualizadorWidget]
/// already applies via `EstadoEcualizador.cambiarPreset` — this is just a
/// second, prototype-mandated entry point to it.
class _TarjetaSalidaYAcciones extends StatelessWidget {
const _TarjetaSalidaYAcciones({
required this.eq,
required this.l10n,
required this.onGuardarPreset,
});
final EstadoEcualizador eq;
final AppLocalizations l10n;
final VoidCallback onGuardarPreset;
@override
Widget build(BuildContext context) {
return PluriGlassSurface(
key: const Key('eq-card-output-actions'),
borderRadius: BorderRadius.circular(context.pluriTokens.radiusMd),
padding: EdgeInsets.zero,
child: Column(
children: [
_FilaSalidaActiva(eq: eq, l10n: l10n),
const Divider(height: 1),
_FilaAccionTarjeta(
key: const Key('eq-save-preset-action'),
icon: Icons.bookmark_add_outlined,
label: l10n.equalizerSaveAsPresetAction,
trailing: const Icon(Icons.chevron_right_rounded, size: 19),
onTap: onGuardarPreset,
),
const Divider(height: 1),
_FilaAccionTarjeta(
key: const Key('eq-reset-flat-action'),
icon: Icons.restart_alt_rounded,
label: l10n.equalizerResetToFlatAction,
onTap: () => eq.cambiarPreset(PresetEcualizador.flat),
),
],
),
);
}
}
/// One tappable icon+label row inside [_TarjetaSalidaYAcciones] — shared
/// shape for "Guardar como preset" and "Restablecer a plano" (t4 lines
/// 595, 597: identical row layout, only "Guardar..." has a trailing
/// chevron since it opens a dialog rather than acting immediately).
class _FilaAccionTarjeta extends StatelessWidget {
const _FilaAccionTarjeta({
super.key,
required this.icon,
required this.label,
required this.onTap,
this.trailing,
});
final IconData icon;
final String label;
final VoidCallback onTap;
final Widget? trailing;
@override
Widget build(BuildContext context) {
return Material(
type: MaterialType.transparency,
child: InkWell(
onTap: onTap,
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 13),
child: Row(
children: [
Icon(icon, size: 21),
const SizedBox(width: 12),
Expanded(
child: Text(
label,
style: Theme.of(context).textTheme.bodyMedium,
),
),
if (trailing != null) trailing!,
],
),
),
),
);
}
}
/// "Emisoras con ajuste propio" drill-down row (spec `eq-custom-presets`
/// "Stations-With-Own-EQ Drill-Down"): sourced from the existing
/// `presetsPorEmisora` map, no new state.
///
/// Audit 11.10 (t4 lines 600-602): CARD 4 — now wraps itself in its own
/// `PluriGlassSurface` instead of being one more row inside a shared
/// glass block.
class _FilaEmisorasConAjustePropio extends StatelessWidget {
const _FilaEmisorasConAjustePropio({
required this.eq,
@@ -247,48 +354,53 @@ class _FilaEmisorasConAjustePropio extends StatelessWidget {
@override
Widget build(BuildContext context) {
final uuids = eq.presetsPorEmisora.keys.toList();
return Material(
type: MaterialType.transparency,
child: InkWell(
key: const Key('eq-stations-own-eq-row'),
borderRadius: BorderRadius.circular(context.pluriTokens.radiusSm),
onTap:
() => PluriPushScaffold.push(
context,
(_) => _PantallaEmisorasConAjustePropio(
uuids: uuids,
nombrePorUuid: (uuid) => _resolverNombreEmisora(estado, uuid),
),
),
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 8),
child: Row(
children: [
const Icon(Icons.tune_rounded, size: 20),
const SizedBox(width: 12),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
l10n.equalizerStationsWithOwnEqTitle,
style: Theme.of(context).textTheme.bodyMedium,
),
Text(
l10n.equalizerStationsWithOwnEqSubtitle,
style: Theme.of(context).textTheme.bodySmall,
),
],
return PluriGlassSurface(
key: const Key('eq-card-stations-own-eq'),
borderRadius: BorderRadius.circular(context.pluriTokens.radiusMd),
padding: EdgeInsets.zero,
child: Material(
type: MaterialType.transparency,
child: InkWell(
key: const Key('eq-stations-own-eq-row'),
borderRadius: BorderRadius.circular(context.pluriTokens.radiusMd),
onTap:
() => PluriPushScaffold.push(
context,
(_) => _PantallaEmisorasConAjustePropio(
uuids: uuids,
nombrePorUuid: (uuid) => _resolverNombreEmisora(estado, uuid),
),
),
Text(
key: const Key('eq-stations-own-eq-count'),
'${uuids.length}',
style: Theme.of(context).textTheme.bodySmall,
),
const SizedBox(width: 4),
const Icon(Icons.chevron_right_rounded, size: 20),
],
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 13),
child: Row(
children: [
const Icon(Icons.tune_rounded, size: 20),
const SizedBox(width: 12),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
l10n.equalizerStationsWithOwnEqTitle,
style: Theme.of(context).textTheme.bodyMedium,
),
Text(
l10n.equalizerStationsWithOwnEqSubtitle,
style: Theme.of(context).textTheme.bodySmall,
),
],
),
),
Text(
key: const Key('eq-stations-own-eq-count'),
'${uuids.length}',
style: Theme.of(context).textTheme.bodySmall,
),
const SizedBox(width: 4),
const Icon(Icons.chevron_right_rounded, size: 20),
],
),
),
),
),