diff --git a/lib/main.dart b/lib/main.dart index 8fcb565..bee3eae 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -240,6 +240,7 @@ class _MainState extends ConsumerState
with WindowListener, WidgetsBinding windowManager.waitUntilReadyToShow(windowOptions, () async { await windowManager.show(); + await windowManager.focus(); final startupArguments = ref.read(argumentsStateProvider); if (startupArguments.htpcMode && !(await windowManager.isFullScreen())) { diff --git a/lib/providers/library_screen_provider.dart b/lib/providers/library_screen_provider.dart index 64118cd..7bead5e 100644 --- a/lib/providers/library_screen_provider.dart +++ b/lib/providers/library_screen_provider.dart @@ -84,9 +84,15 @@ class LibraryScreen extends _$LibraryScreen { } Future loadLibrary(ViewModel viewModel) async { - await loadRecommendations(viewModel); - await loadGenres(viewModel); - await loadFavourites(viewModel); + if (state.viewType.contains(LibraryViewType.recommended)) { + await loadRecommendations(viewModel); + } + if (state.viewType.contains(LibraryViewType.favourites)) { + await loadFavourites(viewModel); + } + if (state.viewType.contains(LibraryViewType.genres)) { + await loadGenres(viewModel); + } return null; } @@ -97,7 +103,7 @@ class LibraryScreen extends _$LibraryScreen { final resume = await api.usersUserIdItemsResumeGet( parentId: viewModel.id, - limit: 14, + limit: 9, enableUserData: true, enableImageTypes: [ ImageType.primary, @@ -120,7 +126,7 @@ class LibraryScreen extends _$LibraryScreen { final response = await api.moviesRecommendationsGet( parentId: viewModel.id, categoryLimit: 6, - itemLimit: 14, + itemLimit: 9, fields: [ItemFields.mediasourcecount], ); newRecommendations = [ @@ -133,7 +139,7 @@ class LibraryScreen extends _$LibraryScreen { } else { final nextUp = await api.showsNextUpGet( parentId: viewModel.id, - limit: 14, + limit: 9, imageTypeLimit: 1, fields: [ItemFields.mediasourcecount, ItemFields.primaryimageaspectratio], ); @@ -157,7 +163,7 @@ class LibraryScreen extends _$LibraryScreen { final latest = await api.usersUserIdItemsLatestGet( parentId: viewModel.id, - limit: 14, + limit: 9, imageTypeLimit: 1, includeItemTypes: viewModel.collectionType.itemKinds.map((e) => e.dtoKind).toList(), ); @@ -180,7 +186,7 @@ class LibraryScreen extends _$LibraryScreen { parentId: viewModel.id, isFavorite: true, recursive: true, - limit: 14, + limit: 9, includeItemTypes: viewModel.collectionType.itemKinds.map((e) => e.dtoKind).toList(), enableImageTypes: [ImageType.primary], fields: [ @@ -211,11 +217,13 @@ class LibraryScreen extends _$LibraryScreen { if (filteredGenres.isEmpty) return null; - final results = await Future.wait(filteredGenres.map((genre) async { - final response = await api.itemsGet( + final futures = filteredGenres.map((genre) { + return api + .itemsGet( parentId: viewModel.id, genreIds: [genre.id], - limit: 14, + limit: 9, + recursive: true, includeItemTypes: viewModel.collectionType.itemKinds.map((e) => e.dtoKind).toList(), enableImageTypes: [ImageType.primary], fields: [ @@ -226,14 +234,17 @@ class LibraryScreen extends _$LibraryScreen { enableTotalRecordCount: false, imageTypeLimit: 1, sortOrder: [SortOrder.ascending], - ); + ) + .then((response) { + final items = response.body?.items; + if (items != null && items.isNotEmpty) { + return RecommendedModel(name: Other(genre.name), posters: items); + } + return null; + }); + }).toList(); - final items = response.body?.items; - if (items != null && items.isNotEmpty) { - return RecommendedModel(name: Other(genre.name), posters: items); - } - return null; - })); + final results = await Future.wait(futures); state = state.copyWith( genres: results.whereType().toList(), diff --git a/lib/screens/library/library_screen.dart b/lib/screens/library/library_screen.dart index c9ad1e7..1af90c8 100644 --- a/lib/screens/library/library_screen.dart +++ b/lib/screens/library/library_screen.dart @@ -45,6 +45,11 @@ class _LibraryScreenState extends ConsumerState with SingleTicker @override Widget build(BuildContext context) { + ref.listen(libraryScreenProvider, (previous, next) { + if ((previous?.viewType.length ?? 0) < next.viewType.length) { + refreshKey?.currentState?.show(); + } + }); final libraryScreenState = ref.watch(libraryScreenProvider); final views = libraryScreenState.views; final recommendations = libraryScreenState.recommendations; @@ -133,9 +138,7 @@ class _LibraryScreenState extends ConsumerState with SingleTicker ))) .toList(), selectedValues: viewTypes, - onSelected: (value) { - ref.read(libraryScreenProvider.notifier).setViewType(value); - }, + onSelected: (value) => ref.read(libraryScreenProvider.notifier).setViewType(value), ), const Padding( padding: EdgeInsets.symmetric(horizontal: 4.0), @@ -155,74 +158,71 @@ class _LibraryScreenState extends ConsumerState with SingleTicker SliverFillRemaining( child: Center(child: Text(context.localized.noResults)), ), - if (viewTypes.contains(LibraryViewType.recommended)) ...[ - if (recommendations.isNotEmpty) - ...recommendations.where((element) => element.posters.isNotEmpty).map( - (element) { - return SliverToBoxAdapter( + if (viewTypes.contains(LibraryViewType.recommended) && recommendations.isNotEmpty) ...[ + ...recommendations.where((element) => element.posters.isNotEmpty).map( + (element) { + return SliverToBoxAdapter( + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: PosterRow( + contentPadding: padding, + posters: element.posters, + primaryPosters: element.name is Resume, + label: element.type != null + ? "${element.type?.label(context)} - ${element.name.label(context)}" + : element.name.label(context), + ), + ), + ); + }, + ), + ], + if (viewTypes.contains(LibraryViewType.favourites) && favourites.isNotEmpty) + SliverToBoxAdapter( + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: PosterRow( + contentPadding: padding, + onLabelClick: () => context.pushRoute( + LibrarySearchRoute( + viewModelId: libraryScreenState.selectedViewModel?.id ?? "", + ).withFilter( + const LibraryFilterModel( + favourites: true, + recursive: true, + ), + ), + ), + posters: favourites, + label: context.localized.favorites, + ), + ), + ), + if (viewTypes.contains(LibraryViewType.genres) && genres.isNotEmpty) ...[ + ...genres.where((element) => element.posters.isNotEmpty).map( + (element) => SliverToBoxAdapter( child: Padding( padding: const EdgeInsets.symmetric(vertical: 8.0), child: PosterRow( contentPadding: padding, posters: element.posters, - primaryPosters: element.name is Resume, + onLabelClick: () => context.pushRoute( + LibrarySearchRoute( + viewModelId: libraryScreenState.selectedViewModel?.id ?? "", + ).withFilter( + LibraryFilterModel( + recursive: true, + genres: {(element.name as Other).customLabel: true}, + ), + ), + ), label: element.type != null ? "${element.type?.label(context)} - ${element.name.label(context)}" : element.name.label(context), ), ), - ); - }, - ), - ], - if (viewTypes.contains(LibraryViewType.favourites)) - if (favourites.isNotEmpty) - SliverToBoxAdapter( - child: Padding( - padding: const EdgeInsets.symmetric(vertical: 8.0), - child: PosterRow( - contentPadding: padding, - onLabelClick: () => context.pushRoute( - LibrarySearchRoute( - viewModelId: libraryScreenState.selectedViewModel?.id ?? "", - ).withFilter( - const LibraryFilterModel( - favourites: true, - recursive: true, - ), - ), - ), - posters: favourites, - label: context.localized.favorites, ), - ), - ), - if (viewTypes.contains(LibraryViewType.genres)) ...[ - if (genres.isNotEmpty) - ...genres.where((element) => element.posters.isNotEmpty).map( - (element) => SliverToBoxAdapter( - child: Padding( - padding: const EdgeInsets.symmetric(vertical: 8.0), - child: PosterRow( - contentPadding: padding, - posters: element.posters, - onLabelClick: () => context.pushRoute( - LibrarySearchRoute( - viewModelId: libraryScreenState.selectedViewModel?.id ?? "", - ).withFilter( - LibraryFilterModel( - recursive: true, - genres: {(element.name as Other).customLabel: true}, - ), - ), - ), - label: element.type != null - ? "${element.type?.label(context)} - ${element.name.label(context)}" - : element.name.label(context), - ), - ), - ), - ) + ) ], const DefautlSliverBottomPadding(), ],