feat: Add IPTV player screen supporting live, VOD, and series playback with interactive controls.

This commit is contained in:
Michael committed 2026-01-01 19:56:31 +01:00
1 parent aa75347d0a
commit e27fa6fec3
1 file changed
+21 -22
+21 -22
View File
@@ -421,29 +421,24 @@ class _PlayerScreenState extends ConsumerState<PlayerScreen> {
), ),
), ),
// Bottom Controls // Bottom Controls - styled like EPG
AnimatedPositioned( AnimatedPositioned(
duration: const Duration(milliseconds: 200), duration: const Duration(milliseconds: 200),
bottom: _showControls ? 0 : -150, bottom: _showControls ? 130 : -100,
left: 0, left: 0,
right: 0, right: 0,
child: Container( child: Center(
padding: const EdgeInsets.symmetric( child: Container(
horizontal: 24, vertical: 24), padding: const EdgeInsets.symmetric(
decoration: BoxDecoration( horizontal: 24, vertical: 12),
gradient: LinearGradient( decoration: BoxDecoration(
begin: Alignment.bottomCenter, color: Colors.black.withOpacity(0.5),
end: Alignment.topCenter, borderRadius: BorderRadius.circular(12),
colors: [ border: Border.all(
Colors.black.withOpacity(0.8), color: Colors.white.withOpacity(0.1)),
Colors.transparent,
],
), ),
),
child: SafeArea(
top: false,
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisSize: MainAxisSize.min,
children: [ children: [
// Previous Channel // Previous Channel
if (widget.channels != null && if (widget.channels != null &&
@@ -454,7 +449,9 @@ class _PlayerScreenState extends ConsumerState<PlayerScreen> {
size: 48, size: 48,
), ),
const SizedBox(width: 32), if (widget.channels != null &&
widget.channels!.length > 1)
const SizedBox(width: 24),
// Play/Pause (Large) // Play/Pause (Large)
_buildSimpleIconButton( _buildSimpleIconButton(
@@ -462,12 +459,14 @@ class _PlayerScreenState extends ConsumerState<PlayerScreen> {
? Icons.pause_rounded ? Icons.pause_rounded
: Icons.play_arrow_rounded, : Icons.play_arrow_rounded,
onTap: _togglePlayPause, onTap: _togglePlayPause,
size: 64, size: 56,
iconSize: 36, iconSize: 32,
highlighted: true, highlighted: true,
), ),
const SizedBox(width: 32), if (widget.channels != null &&
widget.channels!.length > 1)
const SizedBox(width: 24),
// Next Channel // Next Channel
if (widget.channels != null && if (widget.channels != null &&
@@ -494,7 +493,7 @@ class _PlayerScreenState extends ConsumerState<PlayerScreen> {
if (widget.streamType == StreamType.live) if (widget.streamType == StreamType.live)
AnimatedPositioned( AnimatedPositioned(
duration: const Duration(milliseconds: 200), duration: const Duration(milliseconds: 200),
bottom: _showControls ? 120 : -140, bottom: _showControls ? 24 : -140,
left: 24, left: 24,
right: 24, right: 24,
child: PointerInterceptor( child: PointerInterceptor(