feature: Version selection (#235)

Co-authored-by: PartyDonut <PartyDonut@users.noreply.github.com>
This commit is contained in:
PartyDonut 2025-02-23 15:53:17 +01:00 committed by GitHub
parent 935d6fe176
commit f0414439f3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
13 changed files with 142 additions and 60 deletions

View file

@ -8,10 +8,16 @@ import 'package:fladder/util/localization_helper.dart';
class MediaStreamInformation extends ConsumerWidget {
final MediaStreamsModel mediaStream;
final Function(int index)? onVersionIndexChanged;
final Function(int index)? onAudioIndexChanged;
final Function(int index)? onSubIndexChanged;
const MediaStreamInformation(
{required this.mediaStream, this.onAudioIndexChanged, this.onSubIndexChanged, super.key});
const MediaStreamInformation({
required this.mediaStream,
required this.onVersionIndexChanged,
this.onAudioIndexChanged,
this.onSubIndexChanged,
super.key,
});
@override
Widget build(BuildContext context, WidgetRef ref) {
@ -19,6 +25,23 @@ class MediaStreamInformation extends ConsumerWidget {
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (mediaStream.versionStreams.isNotEmpty && mediaStream.versionStreams.length > 1)
_StreamOptionSelect(
label: Text(context.localized.version),
current: mediaStream.currentVersionStream?.name ?? "",
itemBuilder: (context) => mediaStream.versionStreams
.map((e) => PopupMenuItem(
value: e,
padding: EdgeInsets.zero,
child: textWidget(
context,
selected: mediaStream.currentVersionStream == e,
label: e.name,
),
onTap: () => onVersionIndexChanged?.call(e.index),
))
.toList(),
),
if (mediaStream.videoStreams.isNotEmpty)
_StreamOptionSelect(
label: Text(context.localized.video),
@ -112,6 +135,7 @@ class _StreamOptionSelect<T> extends StatelessWidget {
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)),
enabled: itemList.length > 1,
itemBuilder: itemBuilder,
enableFeedback: false,
menuPadding: const EdgeInsets.symmetric(vertical: 16),
padding: padding,
child: Padding(

View file

@ -131,6 +131,9 @@ class _ItemDetailScreenState extends ConsumerState<EpisodeDetailScreen> {
padding: padding,
child: MediaStreamInformation(
mediaStream: details.episode!.mediaStreams,
onVersionIndexChanged: (index) {
ref.read(providerInstance.notifier).setVersionIndex(index);
},
onSubIndexChanged: (index) {
ref.read(providerInstance.notifier).setSubIndex(index);
},

View file

@ -1,5 +1,3 @@
import 'package:fladder/models/settings/home_settings_model.dart';
import 'package:fladder/util/adaptive_layout.dart';
import 'package:flutter/material.dart';
import 'package:auto_route/auto_route.dart';
@ -7,6 +5,7 @@ import 'package:ficonsax/ficonsax.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:fladder/models/item_base_model.dart';
import 'package:fladder/models/settings/home_settings_model.dart';
import 'package:fladder/providers/items/movies_details_provider.dart';
import 'package:fladder/providers/user_provider.dart';
import 'package:fladder/screens/details_screens/components/media_stream_information.dart';
@ -18,6 +17,7 @@ import 'package:fladder/screens/shared/media/expanding_overview.dart';
import 'package:fladder/screens/shared/media/external_urls.dart';
import 'package:fladder/screens/shared/media/people_row.dart';
import 'package:fladder/screens/shared/media/poster_row.dart';
import 'package:fladder/util/adaptive_layout.dart';
import 'package:fladder/util/item_base_model/item_base_model_extensions.dart';
import 'package:fladder/util/item_base_model/play_item_helpers.dart';
import 'package:fladder/util/list_padding.dart';
@ -126,6 +126,9 @@ class _ItemDetailScreenState extends ConsumerState<MovieDetailScreen> {
).padding(padding),
if (details.mediaStreams.isNotEmpty)
MediaStreamInformation(
onVersionIndexChanged: (index) {
ref.read(providerInstance.notifier).setVersionIndex(index);
},
onSubIndexChanged: (index) {
ref.read(providerInstance.notifier).setSubIndex(index);
},

View file

@ -86,6 +86,9 @@ class NextUpEpisode extends ConsumerWidget {
children: [
MediaStreamInformation(
mediaStream: nextEpisode.mediaStreams,
onVersionIndexChanged: (index) => onChanged?.call(nextEpisode.copyWith(
mediaStreams: nextEpisode.mediaStreams.copyWith(versionStreamIndex: index),
)),
onAudioIndexChanged: (index) => onChanged?.call(nextEpisode.copyWith(
mediaStreams: nextEpisode.mediaStreams.copyWith(defaultAudioStreamIndex: index))),
onSubIndexChanged: (index) => onChanged?.call(nextEpisode.copyWith(