Files

83 lines
2.2 KiB
Dart
Raw Permalink Normal View History

2026-07-14 11:11:36 +08:00
import 'package:flutter/material.dart';
import '../../../core/contracts/playback.dart';
import '../../../core/infra/player_engine/player_engine.dart';
import 'panel_toggle_affordance.dart';
class SubtitleTracksButton extends StatelessWidget {
final PlayerEngine player;
final List<EmbySubtitleTrack> embySubtitles;
final bool isPanelOpen;
final VoidCallback onTogglePanel;
const SubtitleTracksButton({
super.key,
required this.player,
required this.embySubtitles,
required this.isPanelOpen,
required this.onTogglePanel,
});
@override
Widget build(BuildContext context) {
return StreamBuilder<PlayerTracks>(
key: ObjectKey(player),
stream: player.stream.tracks,
initialData: player.state.tracks,
builder: (_, snapshot) {
final hasSubtitles =
(snapshot.data?.embeddedSubtitles.isNotEmpty ?? false) ||
embySubtitles.isNotEmpty;
if (!hasSubtitles) return const SizedBox.shrink();
return PanelToggleAffordance(
isOpen: isPanelOpen,
onTap: onTogglePanel,
tooltip: '字幕',
child: const Icon(
Icons.subtitles_outlined,
color: Color(0xFFFFFFFF),
size: 28,
),
);
},
);
}
}
class AudioTracksButton extends StatelessWidget {
final PlayerEngine player;
final bool isPanelOpen;
final VoidCallback onTogglePanel;
const AudioTracksButton({
super.key,
required this.player,
required this.isPanelOpen,
required this.onTogglePanel,
});
@override
Widget build(BuildContext context) {
return StreamBuilder<PlayerTracks>(
key: ObjectKey(player),
stream: player.stream.tracks,
initialData: player.state.tracks,
builder: (_, snapshot) {
if ((snapshot.data?.embeddedAudio.length ?? 0) <= 1) {
return const SizedBox.shrink();
}
return PanelToggleAffordance(
isOpen: isPanelOpen,
onTap: onTogglePanel,
tooltip: '音轨',
child: const Icon(
Icons.multitrack_audio,
color: Color(0xFFFFFFFF),
size: 28,
),
);
},
);
}
}