Multi-IPTV : nommer l'IPTV active et en changer depuis le rail

Rien à l'écran ne disait sur quelle IPTV on travaillait. Guide,
enregistrements et Auto NBA appartiennent pourtant chacun à une playlist,
et deux playlists montrant le même contenu passaient pour un défaut de
filtrage alors que la sélection elle-même était invisible. Changer d'IPTV
demandait en plus de descendre dans les Réglages.

- PlaylistSelectorButton : nom de l'IPTV active sous son icône dans le
  rail du tableau de bord, et menu de bascule au clic. Écrit comme
  QualitySelectorButton, l'autre sélecteur du projet — même
  PopupMenuButton sous Tooltip, même surfaceContainerHigh, même rayon 16,
  mêmes marques radio. La bascule passe par selectPlaylist, donc le choix
  est persisté avant la première requête.
- Son décalage vaut 68 et non les 56 du menu Profil : ce dernier est
  mesuré depuis un avatar de 40 centré dans le rail de 80, ce
  déclencheur-ci fait 64. Les deux menus s'ouvrent ainsi à la même
  abscisse.
- MobileScaffold n'ayant aucun porteur en haut, l'IPTV active s'affiche
  en sous-titre de l'entrée « Changer de Playlist », dans les réglages
  mobile et desktop.

Vérifié par un agent distinct, après calibration sur une copie portant
une différence plantée. Aucune erreur de compilation relevée à la
lecture ; rien n'est rendu, donc tailles réelles, débordement et
ouverture effective du menu restent non évalués. Le SDK Flutter de cette
machine (3.10.3) est antérieur au ^3.13.0 exigé par le projet.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
MichaelandClaude Opus 5 committed 2026-10-19 14:39:09 +02:00
1 parent 52504d4e1a
commit ccd983d968
4 files changed
+164 -6

No files matched your search

@@ -4,6 +4,7 @@ import 'package:go_router/go_router.dart';
import 'package:google_fonts/google_fonts.dart';
import '../../../../features/auth/providers/auth_provider.dart';
import '../../../../features/iptv/providers/settings_provider.dart';
import '../../../../features/iptv/providers/xtream_provider.dart';
import '../../../../core/providers/theme_provider.dart';
import '../../../../core/theme/app_colors.dart';
@@ -364,6 +365,9 @@ class _MobileSettingsTabState extends ConsumerState<MobileSettingsTab> {
_SettingsButton(
icon: Icons.playlist_play,
label: 'Change Playlist',
// L'IPTV active, pour savoir d'où viennent guide, enregistrements
// et Auto NBA avant d'en changer.
value: ref.watch(selectedPlaylistProvider)?.name,
onTap: () => context.go('/playlists'),
),
const SizedBox(height: 32),
@@ -461,12 +465,16 @@ class _FilterInput extends StatelessWidget {
class _SettingsButton extends StatelessWidget {
final IconData icon;
final String label;
/// Valeur courante de ce réglage, affichée sous le libellé.
final String? value;
final VoidCallback onTap;
const _SettingsButton({
required this.icon,
required this.label,
required this.onTap,
this.value,
});
@override
@@ -484,12 +492,27 @@ class _SettingsButton extends StatelessWidget {
children: [
Icon(icon, color: AppColors.onSurface),
const SizedBox(width: 16),
Text(
label,
style: const TextStyle(
fontWeight: FontWeight.w600,
color: AppColors.onSurface,
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
Text(
label,
style: const TextStyle(
fontWeight: FontWeight.w600,
color: AppColors.onSurface,
),
),
if (value != null)
Text(
value!,
overflow: TextOverflow.ellipsis,
style: GoogleFonts.karla(
color: AppColors.textTertiary,
fontSize: 11,
),
),
],
),
const Spacer(),
const Icon(Icons.chevron_right, color: AppColors.onSurfaceVariant),