mirror of
https://github.com/gabehf/Fladder.git
synced 2026-03-09 07:28:14 -07:00
feat: Improve how unsupported items are shown. (#129)
Co-authored-by: PartyDonut <PartyDonut@users.noreply.github.com>
This commit is contained in:
parent
85e5d34738
commit
e50d666fa9
12 changed files with 213 additions and 41 deletions
4
.vscode/settings.json
vendored
4
.vscode/settings.json
vendored
|
|
@ -1,7 +1,9 @@
|
||||||
{
|
{
|
||||||
"cSpell.words": [
|
"cSpell.words": [
|
||||||
|
"ficonsax",
|
||||||
|
"jellyfin",
|
||||||
"Jellyfin",
|
"Jellyfin",
|
||||||
"jellyfin"
|
"LTRB"
|
||||||
],
|
],
|
||||||
"dart.flutterSdkPath": ".fvm/versions/3.24.3",
|
"dart.flutterSdkPath": ".fvm/versions/3.24.3",
|
||||||
"search.exclude": {
|
"search.exclude": {
|
||||||
|
|
|
||||||
6
.vscode/tasks.json
vendored
6
.vscode/tasks.json
vendored
|
|
@ -99,9 +99,9 @@
|
||||||
"group": "build",
|
"group": "build",
|
||||||
"label": "dart: dart pub run build_runner watch",
|
"label": "dart: dart pub run build_runner watch",
|
||||||
"detail": "",
|
"detail": "",
|
||||||
"runOptions": {
|
// "runOptions": {
|
||||||
"runOn": "folderOpen"
|
// "runOn": "folderOpen"
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
|
|
@ -1119,5 +1119,7 @@
|
||||||
"clientSettingsRequireWifiTitle": "Require Wi-Fi",
|
"clientSettingsRequireWifiTitle": "Require Wi-Fi",
|
||||||
"clientSettingsRequireWifiDesc": "Only download when connected to a Wi-Fi network",
|
"clientSettingsRequireWifiDesc": "Only download when connected to a Wi-Fi network",
|
||||||
"libraryShuffleAndPlayItems": "Shuffle and play items",
|
"libraryShuffleAndPlayItems": "Shuffle and play items",
|
||||||
"libraryPlayItems": "Play items"
|
"libraryPlayItems": "Play items",
|
||||||
|
"clientSettingsShowAllCollectionsTitle": "Show all collection types",
|
||||||
|
"clientSettingsShowAllCollectionsDesc": "When enabled, show all collection types, including those not supported by Fladder"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@ class ClientSettingsModel with _$ClientSettingsModel {
|
||||||
@Default(false) bool pinchPosterZoom,
|
@Default(false) bool pinchPosterZoom,
|
||||||
@Default(false) bool mouseDragSupport,
|
@Default(false) bool mouseDragSupport,
|
||||||
@Default(true) bool requireWifi,
|
@Default(true) bool requireWifi,
|
||||||
|
@Default(false) bool showAllCollectionTypes,
|
||||||
@Default(DynamicSchemeVariant.tonalSpot) DynamicSchemeVariant schemeVariant,
|
@Default(DynamicSchemeVariant.tonalSpot) DynamicSchemeVariant schemeVariant,
|
||||||
int? libraryPageSize,
|
int? libraryPageSize,
|
||||||
}) = _ClientSettingsModel;
|
}) = _ClientSettingsModel;
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,7 @@ mixin _$ClientSettingsModel {
|
||||||
bool get pinchPosterZoom => throw _privateConstructorUsedError;
|
bool get pinchPosterZoom => throw _privateConstructorUsedError;
|
||||||
bool get mouseDragSupport => throw _privateConstructorUsedError;
|
bool get mouseDragSupport => throw _privateConstructorUsedError;
|
||||||
bool get requireWifi => throw _privateConstructorUsedError;
|
bool get requireWifi => throw _privateConstructorUsedError;
|
||||||
|
bool get showAllCollectionTypes => throw _privateConstructorUsedError;
|
||||||
DynamicSchemeVariant get schemeVariant => throw _privateConstructorUsedError;
|
DynamicSchemeVariant get schemeVariant => throw _privateConstructorUsedError;
|
||||||
int? get libraryPageSize => throw _privateConstructorUsedError;
|
int? get libraryPageSize => throw _privateConstructorUsedError;
|
||||||
|
|
||||||
|
|
@ -73,6 +74,7 @@ abstract class $ClientSettingsModelCopyWith<$Res> {
|
||||||
bool pinchPosterZoom,
|
bool pinchPosterZoom,
|
||||||
bool mouseDragSupport,
|
bool mouseDragSupport,
|
||||||
bool requireWifi,
|
bool requireWifi,
|
||||||
|
bool showAllCollectionTypes,
|
||||||
DynamicSchemeVariant schemeVariant,
|
DynamicSchemeVariant schemeVariant,
|
||||||
int? libraryPageSize});
|
int? libraryPageSize});
|
||||||
}
|
}
|
||||||
|
|
@ -108,6 +110,7 @@ class _$ClientSettingsModelCopyWithImpl<$Res, $Val extends ClientSettingsModel>
|
||||||
Object? pinchPosterZoom = null,
|
Object? pinchPosterZoom = null,
|
||||||
Object? mouseDragSupport = null,
|
Object? mouseDragSupport = null,
|
||||||
Object? requireWifi = null,
|
Object? requireWifi = null,
|
||||||
|
Object? showAllCollectionTypes = null,
|
||||||
Object? schemeVariant = null,
|
Object? schemeVariant = null,
|
||||||
Object? libraryPageSize = freezed,
|
Object? libraryPageSize = freezed,
|
||||||
}) {
|
}) {
|
||||||
|
|
@ -176,6 +179,10 @@ class _$ClientSettingsModelCopyWithImpl<$Res, $Val extends ClientSettingsModel>
|
||||||
? _value.requireWifi
|
? _value.requireWifi
|
||||||
: requireWifi // ignore: cast_nullable_to_non_nullable
|
: requireWifi // ignore: cast_nullable_to_non_nullable
|
||||||
as bool,
|
as bool,
|
||||||
|
showAllCollectionTypes: null == showAllCollectionTypes
|
||||||
|
? _value.showAllCollectionTypes
|
||||||
|
: showAllCollectionTypes // ignore: cast_nullable_to_non_nullable
|
||||||
|
as bool,
|
||||||
schemeVariant: null == schemeVariant
|
schemeVariant: null == schemeVariant
|
||||||
? _value.schemeVariant
|
? _value.schemeVariant
|
||||||
: schemeVariant // ignore: cast_nullable_to_non_nullable
|
: schemeVariant // ignore: cast_nullable_to_non_nullable
|
||||||
|
|
@ -213,6 +220,7 @@ abstract class _$$ClientSettingsModelImplCopyWith<$Res>
|
||||||
bool pinchPosterZoom,
|
bool pinchPosterZoom,
|
||||||
bool mouseDragSupport,
|
bool mouseDragSupport,
|
||||||
bool requireWifi,
|
bool requireWifi,
|
||||||
|
bool showAllCollectionTypes,
|
||||||
DynamicSchemeVariant schemeVariant,
|
DynamicSchemeVariant schemeVariant,
|
||||||
int? libraryPageSize});
|
int? libraryPageSize});
|
||||||
}
|
}
|
||||||
|
|
@ -246,6 +254,7 @@ class __$$ClientSettingsModelImplCopyWithImpl<$Res>
|
||||||
Object? pinchPosterZoom = null,
|
Object? pinchPosterZoom = null,
|
||||||
Object? mouseDragSupport = null,
|
Object? mouseDragSupport = null,
|
||||||
Object? requireWifi = null,
|
Object? requireWifi = null,
|
||||||
|
Object? showAllCollectionTypes = null,
|
||||||
Object? schemeVariant = null,
|
Object? schemeVariant = null,
|
||||||
Object? libraryPageSize = freezed,
|
Object? libraryPageSize = freezed,
|
||||||
}) {
|
}) {
|
||||||
|
|
@ -314,6 +323,10 @@ class __$$ClientSettingsModelImplCopyWithImpl<$Res>
|
||||||
? _value.requireWifi
|
? _value.requireWifi
|
||||||
: requireWifi // ignore: cast_nullable_to_non_nullable
|
: requireWifi // ignore: cast_nullable_to_non_nullable
|
||||||
as bool,
|
as bool,
|
||||||
|
showAllCollectionTypes: null == showAllCollectionTypes
|
||||||
|
? _value.showAllCollectionTypes
|
||||||
|
: showAllCollectionTypes // ignore: cast_nullable_to_non_nullable
|
||||||
|
as bool,
|
||||||
schemeVariant: null == schemeVariant
|
schemeVariant: null == schemeVariant
|
||||||
? _value.schemeVariant
|
? _value.schemeVariant
|
||||||
: schemeVariant // ignore: cast_nullable_to_non_nullable
|
: schemeVariant // ignore: cast_nullable_to_non_nullable
|
||||||
|
|
@ -347,6 +360,7 @@ class _$ClientSettingsModelImpl extends _ClientSettingsModel
|
||||||
this.pinchPosterZoom = false,
|
this.pinchPosterZoom = false,
|
||||||
this.mouseDragSupport = false,
|
this.mouseDragSupport = false,
|
||||||
this.requireWifi = true,
|
this.requireWifi = true,
|
||||||
|
this.showAllCollectionTypes = false,
|
||||||
this.schemeVariant = DynamicSchemeVariant.tonalSpot,
|
this.schemeVariant = DynamicSchemeVariant.tonalSpot,
|
||||||
this.libraryPageSize})
|
this.libraryPageSize})
|
||||||
: super._();
|
: super._();
|
||||||
|
|
@ -401,13 +415,16 @@ class _$ClientSettingsModelImpl extends _ClientSettingsModel
|
||||||
final bool requireWifi;
|
final bool requireWifi;
|
||||||
@override
|
@override
|
||||||
@JsonKey()
|
@JsonKey()
|
||||||
|
final bool showAllCollectionTypes;
|
||||||
|
@override
|
||||||
|
@JsonKey()
|
||||||
final DynamicSchemeVariant schemeVariant;
|
final DynamicSchemeVariant schemeVariant;
|
||||||
@override
|
@override
|
||||||
final int? libraryPageSize;
|
final int? libraryPageSize;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) {
|
String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) {
|
||||||
return 'ClientSettingsModel(syncPath: $syncPath, position: $position, size: $size, timeOut: $timeOut, nextUpDateCutoff: $nextUpDateCutoff, themeMode: $themeMode, themeColor: $themeColor, amoledBlack: $amoledBlack, blurPlaceHolders: $blurPlaceHolders, blurUpcomingEpisodes: $blurUpcomingEpisodes, selectedLocale: $selectedLocale, enableMediaKeys: $enableMediaKeys, posterSize: $posterSize, pinchPosterZoom: $pinchPosterZoom, mouseDragSupport: $mouseDragSupport, requireWifi: $requireWifi, schemeVariant: $schemeVariant, libraryPageSize: $libraryPageSize)';
|
return 'ClientSettingsModel(syncPath: $syncPath, position: $position, size: $size, timeOut: $timeOut, nextUpDateCutoff: $nextUpDateCutoff, themeMode: $themeMode, themeColor: $themeColor, amoledBlack: $amoledBlack, blurPlaceHolders: $blurPlaceHolders, blurUpcomingEpisodes: $blurUpcomingEpisodes, selectedLocale: $selectedLocale, enableMediaKeys: $enableMediaKeys, posterSize: $posterSize, pinchPosterZoom: $pinchPosterZoom, mouseDragSupport: $mouseDragSupport, requireWifi: $requireWifi, showAllCollectionTypes: $showAllCollectionTypes, schemeVariant: $schemeVariant, libraryPageSize: $libraryPageSize)';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|
@ -431,6 +448,8 @@ class _$ClientSettingsModelImpl extends _ClientSettingsModel
|
||||||
..add(DiagnosticsProperty('pinchPosterZoom', pinchPosterZoom))
|
..add(DiagnosticsProperty('pinchPosterZoom', pinchPosterZoom))
|
||||||
..add(DiagnosticsProperty('mouseDragSupport', mouseDragSupport))
|
..add(DiagnosticsProperty('mouseDragSupport', mouseDragSupport))
|
||||||
..add(DiagnosticsProperty('requireWifi', requireWifi))
|
..add(DiagnosticsProperty('requireWifi', requireWifi))
|
||||||
|
..add(
|
||||||
|
DiagnosticsProperty('showAllCollectionTypes', showAllCollectionTypes))
|
||||||
..add(DiagnosticsProperty('schemeVariant', schemeVariant))
|
..add(DiagnosticsProperty('schemeVariant', schemeVariant))
|
||||||
..add(DiagnosticsProperty('libraryPageSize', libraryPageSize));
|
..add(DiagnosticsProperty('libraryPageSize', libraryPageSize));
|
||||||
}
|
}
|
||||||
|
|
@ -470,6 +489,8 @@ class _$ClientSettingsModelImpl extends _ClientSettingsModel
|
||||||
other.mouseDragSupport == mouseDragSupport) &&
|
other.mouseDragSupport == mouseDragSupport) &&
|
||||||
(identical(other.requireWifi, requireWifi) ||
|
(identical(other.requireWifi, requireWifi) ||
|
||||||
other.requireWifi == requireWifi) &&
|
other.requireWifi == requireWifi) &&
|
||||||
|
(identical(other.showAllCollectionTypes, showAllCollectionTypes) ||
|
||||||
|
other.showAllCollectionTypes == showAllCollectionTypes) &&
|
||||||
(identical(other.schemeVariant, schemeVariant) ||
|
(identical(other.schemeVariant, schemeVariant) ||
|
||||||
other.schemeVariant == schemeVariant) &&
|
other.schemeVariant == schemeVariant) &&
|
||||||
(identical(other.libraryPageSize, libraryPageSize) ||
|
(identical(other.libraryPageSize, libraryPageSize) ||
|
||||||
|
|
@ -478,26 +499,28 @@ class _$ClientSettingsModelImpl extends _ClientSettingsModel
|
||||||
|
|
||||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
@override
|
@override
|
||||||
int get hashCode => Object.hash(
|
int get hashCode => Object.hashAll([
|
||||||
runtimeType,
|
runtimeType,
|
||||||
syncPath,
|
syncPath,
|
||||||
position,
|
position,
|
||||||
size,
|
size,
|
||||||
timeOut,
|
timeOut,
|
||||||
nextUpDateCutoff,
|
nextUpDateCutoff,
|
||||||
themeMode,
|
themeMode,
|
||||||
themeColor,
|
themeColor,
|
||||||
amoledBlack,
|
amoledBlack,
|
||||||
blurPlaceHolders,
|
blurPlaceHolders,
|
||||||
blurUpcomingEpisodes,
|
blurUpcomingEpisodes,
|
||||||
selectedLocale,
|
selectedLocale,
|
||||||
enableMediaKeys,
|
enableMediaKeys,
|
||||||
posterSize,
|
posterSize,
|
||||||
pinchPosterZoom,
|
pinchPosterZoom,
|
||||||
mouseDragSupport,
|
mouseDragSupport,
|
||||||
requireWifi,
|
requireWifi,
|
||||||
schemeVariant,
|
showAllCollectionTypes,
|
||||||
libraryPageSize);
|
schemeVariant,
|
||||||
|
libraryPageSize
|
||||||
|
]);
|
||||||
|
|
||||||
/// Create a copy of ClientSettingsModel
|
/// Create a copy of ClientSettingsModel
|
||||||
/// with the given fields replaced by the non-null parameter values.
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
|
@ -534,6 +557,7 @@ abstract class _ClientSettingsModel extends ClientSettingsModel {
|
||||||
final bool pinchPosterZoom,
|
final bool pinchPosterZoom,
|
||||||
final bool mouseDragSupport,
|
final bool mouseDragSupport,
|
||||||
final bool requireWifi,
|
final bool requireWifi,
|
||||||
|
final bool showAllCollectionTypes,
|
||||||
final DynamicSchemeVariant schemeVariant,
|
final DynamicSchemeVariant schemeVariant,
|
||||||
final int? libraryPageSize}) = _$ClientSettingsModelImpl;
|
final int? libraryPageSize}) = _$ClientSettingsModelImpl;
|
||||||
_ClientSettingsModel._() : super._();
|
_ClientSettingsModel._() : super._();
|
||||||
|
|
@ -575,6 +599,8 @@ abstract class _ClientSettingsModel extends ClientSettingsModel {
|
||||||
@override
|
@override
|
||||||
bool get requireWifi;
|
bool get requireWifi;
|
||||||
@override
|
@override
|
||||||
|
bool get showAllCollectionTypes;
|
||||||
|
@override
|
||||||
DynamicSchemeVariant get schemeVariant;
|
DynamicSchemeVariant get schemeVariant;
|
||||||
@override
|
@override
|
||||||
int? get libraryPageSize;
|
int? get libraryPageSize;
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,7 @@ _$ClientSettingsModelImpl _$$ClientSettingsModelImplFromJson(
|
||||||
pinchPosterZoom: json['pinchPosterZoom'] as bool? ?? false,
|
pinchPosterZoom: json['pinchPosterZoom'] as bool? ?? false,
|
||||||
mouseDragSupport: json['mouseDragSupport'] as bool? ?? false,
|
mouseDragSupport: json['mouseDragSupport'] as bool? ?? false,
|
||||||
requireWifi: json['requireWifi'] as bool? ?? true,
|
requireWifi: json['requireWifi'] as bool? ?? true,
|
||||||
|
showAllCollectionTypes: json['showAllCollectionTypes'] as bool? ?? false,
|
||||||
schemeVariant: $enumDecodeNullable(
|
schemeVariant: $enumDecodeNullable(
|
||||||
_$DynamicSchemeVariantEnumMap, json['schemeVariant']) ??
|
_$DynamicSchemeVariantEnumMap, json['schemeVariant']) ??
|
||||||
DynamicSchemeVariant.tonalSpot,
|
DynamicSchemeVariant.tonalSpot,
|
||||||
|
|
@ -60,6 +61,7 @@ Map<String, dynamic> _$$ClientSettingsModelImplToJson(
|
||||||
'pinchPosterZoom': instance.pinchPosterZoom,
|
'pinchPosterZoom': instance.pinchPosterZoom,
|
||||||
'mouseDragSupport': instance.mouseDragSupport,
|
'mouseDragSupport': instance.mouseDragSupport,
|
||||||
'requireWifi': instance.requireWifi,
|
'requireWifi': instance.requireWifi,
|
||||||
|
'showAllCollectionTypes': instance.showAllCollectionTypes,
|
||||||
'schemeVariant': _$DynamicSchemeVariantEnumMap[instance.schemeVariant]!,
|
'schemeVariant': _$DynamicSchemeVariantEnumMap[instance.schemeVariant]!,
|
||||||
'libraryPageSize': instance.libraryPageSize,
|
'libraryPageSize': instance.libraryPageSize,
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,25 @@
|
||||||
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
|
|
||||||
import 'package:fladder/jellyfin/jellyfin_open_api.swagger.dart';
|
import 'package:fladder/jellyfin/jellyfin_open_api.swagger.dart';
|
||||||
import 'package:fladder/models/item_base_model.dart';
|
import 'package:fladder/models/item_base_model.dart';
|
||||||
import 'package:fladder/models/view_model.dart';
|
import 'package:fladder/models/view_model.dart';
|
||||||
import 'package:fladder/models/views_model.dart';
|
import 'package:fladder/models/views_model.dart';
|
||||||
import 'package:fladder/providers/api_provider.dart';
|
import 'package:fladder/providers/api_provider.dart';
|
||||||
import 'package:fladder/providers/service_provider.dart';
|
import 'package:fladder/providers/service_provider.dart';
|
||||||
|
import 'package:fladder/providers/settings/client_settings_provider.dart';
|
||||||
import 'package:fladder/providers/user_provider.dart';
|
import 'package:fladder/providers/user_provider.dart';
|
||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
||||||
|
//Known supported collection types
|
||||||
|
const enableCollectionTypes = {
|
||||||
|
CollectionType.movies,
|
||||||
|
CollectionType.books,
|
||||||
|
CollectionType.tvshows,
|
||||||
|
CollectionType.homevideos,
|
||||||
|
CollectionType.boxsets,
|
||||||
|
CollectionType.playlists,
|
||||||
|
CollectionType.photos,
|
||||||
|
CollectionType.folders,
|
||||||
|
};
|
||||||
|
|
||||||
final viewsProvider = StateNotifierProvider<ViewsNotifier, ViewsModel>((ref) {
|
final viewsProvider = StateNotifierProvider<ViewsNotifier, ViewsModel>((ref) {
|
||||||
return ViewsNotifier(ref);
|
return ViewsNotifier(ref);
|
||||||
|
|
@ -20,8 +34,14 @@ class ViewsNotifier extends StateNotifier<ViewsModel> {
|
||||||
|
|
||||||
Future<void> fetchViews() async {
|
Future<void> fetchViews() async {
|
||||||
if (state.loading) return;
|
if (state.loading) return;
|
||||||
final response = await api.usersUserIdViewsGet();
|
final showAllCollections = ref.read(clientSettingsProvider.select((value) => value.showAllCollectionTypes));
|
||||||
final createdViews = response.body?.items?.map((e) => ViewModel.fromBodyDto(e, ref));
|
final response = await api.usersUserIdViewsGet(
|
||||||
|
includeExternalContent: showAllCollections,
|
||||||
|
);
|
||||||
|
final createdViews = response.body?.items?.map((e) => ViewModel.fromBodyDto(e, ref)).where((element) {
|
||||||
|
return showAllCollections ? true : enableCollectionTypes.contains(element.collectionType);
|
||||||
|
});
|
||||||
|
|
||||||
List<ViewModel> newList = [];
|
List<ViewModel> newList = [];
|
||||||
|
|
||||||
if (createdViews != null) {
|
if (createdViews != null) {
|
||||||
|
|
@ -32,6 +52,8 @@ class ViewsNotifier extends StateNotifier<ViewsModel> {
|
||||||
parentId: e.id,
|
parentId: e.id,
|
||||||
imageTypeLimit: 1,
|
imageTypeLimit: 1,
|
||||||
limit: 16,
|
limit: 16,
|
||||||
|
includeItemTypes:
|
||||||
|
(e.collectionType == CollectionType.books && !showAllCollections) ? [BaseItemKind.book] : null,
|
||||||
enableImageTypes: [
|
enableImageTypes: [
|
||||||
ImageType.primary,
|
ImageType.primary,
|
||||||
ImageType.backdrop,
|
ImageType.backdrop,
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,17 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
import 'package:auto_route/auto_route.dart';
|
||||||
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
|
|
||||||
import 'package:fladder/models/item_base_model.dart';
|
import 'package:fladder/models/item_base_model.dart';
|
||||||
import 'package:fladder/screens/shared/detail_scaffold.dart';
|
import 'package:fladder/screens/shared/detail_scaffold.dart';
|
||||||
|
import 'package:fladder/screens/shared/media/components/poster_placeholder.dart';
|
||||||
|
import 'package:fladder/theme.dart';
|
||||||
|
import 'package:fladder/util/fladder_image.dart';
|
||||||
|
import 'package:fladder/util/item_base_model/item_base_model_extensions.dart';
|
||||||
|
import 'package:fladder/util/list_padding.dart';
|
||||||
|
import 'package:fladder/util/router_extension.dart';
|
||||||
import 'package:fladder/util/string_extensions.dart';
|
import 'package:fladder/util/string_extensions.dart';
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
||||||
|
|
||||||
class EmptyItem extends ConsumerWidget {
|
class EmptyItem extends ConsumerWidget {
|
||||||
final ItemBaseModel item;
|
final ItemBaseModel item;
|
||||||
|
|
@ -12,8 +21,53 @@ class EmptyItem extends ConsumerWidget {
|
||||||
Widget build(BuildContext context, WidgetRef ref) {
|
Widget build(BuildContext context, WidgetRef ref) {
|
||||||
return DetailScaffold(
|
return DetailScaffold(
|
||||||
label: "Empty",
|
label: "Empty",
|
||||||
content: (padding) =>
|
item: item,
|
||||||
Center(child: Text("Type of (Jelly.${item.jellyType?.name.capitalize()}) has not been implemented yet.")),
|
backDrops: item.images,
|
||||||
|
actions: (context) => item.generateActions(
|
||||||
|
context,
|
||||||
|
ref,
|
||||||
|
exclude: {
|
||||||
|
ItemActions.play,
|
||||||
|
ItemActions.playFromStart,
|
||||||
|
ItemActions.details,
|
||||||
|
},
|
||||||
|
onDeleteSuccesFully: (item) {
|
||||||
|
if (context.mounted) {
|
||||||
|
context.router.popBack();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
|
content: (padding) => Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
ConstrainedBox(
|
||||||
|
constraints: const BoxConstraints(maxHeight: 350),
|
||||||
|
child: AspectRatio(
|
||||||
|
aspectRatio: 0.67,
|
||||||
|
child: Card(
|
||||||
|
elevation: 6,
|
||||||
|
color: Theme.of(context).colorScheme.secondaryContainer,
|
||||||
|
shape: RoundedRectangleBorder(
|
||||||
|
side: BorderSide(
|
||||||
|
width: 1.0,
|
||||||
|
color: Colors.white.withOpacity(0.10),
|
||||||
|
),
|
||||||
|
borderRadius: FladderTheme.defaultShape.borderRadius,
|
||||||
|
),
|
||||||
|
child: FladderImage(
|
||||||
|
image: item.getPosters?.primary ?? item.getPosters?.backDrop?.lastOrNull,
|
||||||
|
placeHolder: PosterPlaceholder(item: item),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
item.title,
|
||||||
|
style: Theme.of(context).textTheme.titleLarge,
|
||||||
|
),
|
||||||
|
Text("Type of (Jelly.${item.jellyType?.name.capitalize()}) has not been implemented yet."),
|
||||||
|
].addInBetween(const SizedBox(height: 32)),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
import 'package:fladder/util/router_extension.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
import 'package:auto_route/auto_route.dart';
|
import 'package:auto_route/auto_route.dart';
|
||||||
|
|
@ -20,6 +19,7 @@ import 'package:fladder/screens/shared/media/poster_row.dart';
|
||||||
import 'package:fladder/util/item_base_model/item_base_model_extensions.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/item_base_model/play_item_helpers.dart';
|
||||||
import 'package:fladder/util/list_padding.dart';
|
import 'package:fladder/util/list_padding.dart';
|
||||||
|
import 'package:fladder/util/router_extension.dart';
|
||||||
import 'package:fladder/util/widget_extensions.dart';
|
import 'package:fladder/util/widget_extensions.dart';
|
||||||
import 'package:fladder/widgets/shared/selectable_icon_button.dart';
|
import 'package:fladder/widgets/shared/selectable_icon_button.dart';
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -237,6 +237,19 @@ class _ClientSettingsPageState extends ConsumerState<ClientSettingsPage> {
|
||||||
.toList(),
|
.toList(),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
SettingsListTile(
|
||||||
|
label: Text(context.localized.clientSettingsShowAllCollectionsTitle),
|
||||||
|
subLabel: Text(context.localized.clientSettingsShowAllCollectionsDesc),
|
||||||
|
onTap: () => ref
|
||||||
|
.read(clientSettingsProvider.notifier)
|
||||||
|
.update((current) => current.copyWith(showAllCollectionTypes: !current.showAllCollectionTypes)),
|
||||||
|
trailing: Switch(
|
||||||
|
value: clientSettings.showAllCollectionTypes,
|
||||||
|
onChanged: (value) => ref
|
||||||
|
.read(clientSettingsProvider.notifier)
|
||||||
|
.update((current) => current.copyWith(showAllCollectionTypes: value)),
|
||||||
|
),
|
||||||
|
),
|
||||||
const Divider(),
|
const Divider(),
|
||||||
SettingsLabelDivider(label: context.localized.settingsVisual),
|
SettingsLabelDivider(label: context.localized.settingsVisual),
|
||||||
SettingsListTile(
|
SettingsListTile(
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ import 'package:fladder/models/items/item_shared_models.dart';
|
||||||
import 'package:fladder/models/items/photos_model.dart';
|
import 'package:fladder/models/items/photos_model.dart';
|
||||||
import 'package:fladder/models/items/series_model.dart';
|
import 'package:fladder/models/items/series_model.dart';
|
||||||
import 'package:fladder/screens/shared/flat_button.dart';
|
import 'package:fladder/screens/shared/flat_button.dart';
|
||||||
|
import 'package:fladder/screens/shared/media/components/poster_placeholder.dart';
|
||||||
import 'package:fladder/theme.dart';
|
import 'package:fladder/theme.dart';
|
||||||
import 'package:fladder/util/adaptive_layout.dart';
|
import 'package:fladder/util/adaptive_layout.dart';
|
||||||
import 'package:fladder/util/disable_keypad_focus.dart';
|
import 'package:fladder/util/disable_keypad_focus.dart';
|
||||||
|
|
@ -57,12 +58,6 @@ class _PosterImageState extends ConsumerState<PosterImage> {
|
||||||
late String currentTag = widget.heroTag == true ? widget.poster.id : UniqueKey().toString();
|
late String currentTag = widget.heroTag == true ? widget.poster.id : UniqueKey().toString();
|
||||||
bool hover = false;
|
bool hover = false;
|
||||||
|
|
||||||
Widget get placeHolder {
|
|
||||||
return Center(
|
|
||||||
child: Icon(widget.poster.type.icon),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void pressedWidget() async {
|
void pressedWidget() async {
|
||||||
if (widget.heroTag == false) {
|
if (widget.heroTag == false) {
|
||||||
setState(() {
|
setState(() {
|
||||||
|
|
@ -113,7 +108,7 @@ class _PosterImageState extends ConsumerState<PosterImage> {
|
||||||
children: [
|
children: [
|
||||||
FladderImage(
|
FladderImage(
|
||||||
image: widget.poster.getPosters?.primary ?? widget.poster.getPosters?.backDrop?.lastOrNull,
|
image: widget.poster.getPosters?.primary ?? widget.poster.getPosters?.backDrop?.lastOrNull,
|
||||||
placeHolder: placeHolder,
|
placeHolder: PosterPlaceholder(item: widget.poster),
|
||||||
),
|
),
|
||||||
if (poster.userData.progress > 0 && widget.poster.type == FladderItemType.book)
|
if (poster.userData.progress > 0 && widget.poster.type == FladderItemType.book)
|
||||||
Align(
|
Align(
|
||||||
|
|
|
||||||
55
lib/screens/shared/media/components/poster_placeholder.dart
Normal file
55
lib/screens/shared/media/components/poster_placeholder.dart
Normal file
|
|
@ -0,0 +1,55 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
import 'package:fladder/models/item_base_model.dart';
|
||||||
|
|
||||||
|
class PosterPlaceholder extends StatelessWidget {
|
||||||
|
final ItemBaseModel item;
|
||||||
|
const PosterPlaceholder({required this.item, super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Stack(
|
||||||
|
alignment: Alignment.center,
|
||||||
|
children: [
|
||||||
|
Align(
|
||||||
|
alignment: Alignment.topRight,
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.all(12.0),
|
||||||
|
child: Opacity(opacity: 0.5, child: Icon(item.type.icon)),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.all(16.0),
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.all(8.0),
|
||||||
|
child: Column(
|
||||||
|
mainAxisSize: MainAxisSize.max,
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
item.title,
|
||||||
|
maxLines: 2,
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: Theme.of(context).textTheme.titleMedium,
|
||||||
|
softWrap: true,
|
||||||
|
),
|
||||||
|
if (item.label(context) != null) ...[
|
||||||
|
Opacity(
|
||||||
|
opacity: 0.75,
|
||||||
|
child: Text(
|
||||||
|
item.label(context)!,
|
||||||
|
maxLines: 2,
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: Theme.of(context).textTheme.titleSmall,
|
||||||
|
softWrap: true,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue