feat: Improve library search screen (#477)

Co-authored-by: PartyDonut <PartyDonut@users.noreply.github.com>
This commit is contained in:
PartyDonut 2025-08-28 23:26:10 +02:00 committed by GitHub
parent 571b682b80
commit d22d340181
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
41 changed files with 2881 additions and 2026 deletions

View file

@ -2,102 +2,36 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:collection/collection.dart';
import 'package:dart_mappable/dart_mappable.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:fladder/jellyfin/jellyfin_open_api.enums.swagger.dart';
import 'package:fladder/jellyfin/jellyfin_open_api.swagger.dart';
import 'package:fladder/models/item_base_model.dart';
import 'package:fladder/models/items/item_shared_models.dart';
import 'package:fladder/models/library_search/library_search_options.dart';
import 'package:fladder/models/library_filter_model.dart';
import 'package:fladder/models/view_model.dart';
import 'package:fladder/util/list_extensions.dart';
import 'package:fladder/util/localization_helper.dart';
import 'package:fladder/util/map_bool_helper.dart';
part 'library_search_model.mapper.dart';
part 'library_search_model.freezed.dart';
@MappableClass()
class LibrarySearchModel with LibrarySearchModelMappable {
final bool loading;
final bool selecteMode;
final String searchQuery;
final List<ItemBaseModel> folderOverwrite;
final Map<ViewModel, bool> views;
final List<ItemBaseModel> posters;
final List<ItemBaseModel> selectedPosters;
final Map<ItemFilter, bool> filters;
final Map<String, bool> genres;
final Map<Studio, bool> studios;
final Map<String, bool> tags;
final Map<int, bool> years;
final Map<String, bool> officialRatings;
final Map<FladderItemType, bool> types;
final SortingOptions sortingOption;
final SortingOrder sortOrder;
final bool favourites;
final bool hideEmptyShows;
final bool recursive;
final GroupBy groupBy;
final Map<String, int> lastIndices;
final Map<String, int> libraryItemCounts;
final bool fetchingItems;
@Freezed(copyWith: true)
abstract class LibrarySearchModel with _$LibrarySearchModel {
const factory LibrarySearchModel({
@Default(false) bool loading,
@Default(false) bool selecteMode,
@Default(<ItemBaseModel>[]) List<ItemBaseModel> folderOverwrite,
@Default("") String searchQuery,
@Default(<ViewModel, bool>{}) Map<ViewModel, bool> views,
@Default(<ItemBaseModel>[]) List<ItemBaseModel> posters,
@Default(<ItemBaseModel>[]) List<ItemBaseModel> selectedPosters,
@Default(LibraryFilterModel()) LibraryFilterModel filters,
@Default(<String, int>{}) Map<String, int> lastIndices,
@Default(<String, int>{}) Map<String, int> libraryItemCounts,
@Default(false) bool fetchingItems,
}) = _LibrarySearchModel;
}
const LibrarySearchModel({
this.loading = false,
this.selecteMode = false,
this.folderOverwrite = const [],
this.searchQuery = "",
this.views = const {},
this.posters = const [],
this.selectedPosters = const [],
this.filters = const {
ItemFilter.isplayed: false,
ItemFilter.isunplayed: false,
ItemFilter.isresumable: false,
},
this.genres = const {},
this.studios = const {},
this.tags = const {},
this.years = const {},
this.officialRatings = const {},
this.types = const {
FladderItemType.audio: false,
FladderItemType.boxset: false,
FladderItemType.book: false,
FladderItemType.collectionFolder: false,
FladderItemType.episode: false,
FladderItemType.folder: false,
FladderItemType.movie: true,
FladderItemType.musicAlbum: false,
FladderItemType.musicVideo: false,
FladderItemType.photo: false,
FladderItemType.person: false,
FladderItemType.photoAlbum: false,
FladderItemType.series: true,
FladderItemType.video: true,
},
this.favourites = false,
this.sortingOption = SortingOptions.sortName,
this.sortOrder = SortingOrder.ascending,
this.hideEmptyShows = true,
this.recursive = false,
this.groupBy = GroupBy.none,
this.lastIndices = const {},
this.libraryItemCounts = const {},
this.fetchingItems = false,
});
bool get hasActiveFilters {
return genres.hasEnabled ||
studios.hasEnabled ||
tags.hasEnabled ||
years.hasEnabled ||
officialRatings.hasEnabled ||
hideEmptyShows ||
filters.hasEnabled ||
favourites ||
searchQuery.isNotEmpty;
}
extension LibrarySearchModelX on LibrarySearchModel {
bool get hasActiveFilters => filters.hasActiveFilters || searchQuery.isNotEmpty;
int get totalItemCount {
if (libraryItemCounts.isEmpty) return posters.length;
@ -137,16 +71,16 @@ class LibrarySearchModel with LibrarySearchModelMappable {
bool get showPlayButtons {
if (totalItemCount == 0) return false;
return types.included.isEmpty ||
types.included.containsAny(
return filters.types.included.isEmpty ||
filters.types.included.containsAny(
{...FladderItemType.playable, FladderItemType.folder},
);
}
bool get showGalleryButtons {
if (totalItemCount == 0) return false;
return types.included.isEmpty ||
types.included.containsAny(
return filters.types.included.isEmpty ||
filters.types.included.containsAny(
{...FladderItemType.galleryItem, FladderItemType.photoAlbum, FladderItemType.folder},
);
}
@ -170,55 +104,8 @@ class LibrarySearchModel with LibrarySearchModelMappable {
LibrarySearchModel setFiltersToDefault() {
return copyWith(
genres: const {},
tags: const {},
officialRatings: const {},
years: const {},
searchQuery: '',
favourites: false,
recursive: false,
studios: const {},
hideEmptyShows: true,
filters: const LibraryFilterModel(),
);
}
@override
bool operator ==(covariant LibrarySearchModel other) {
if (identical(this, other)) return true;
return other.searchQuery == searchQuery &&
listEquals(other.folderOverwrite, folderOverwrite) &&
mapEquals(other.views, views) &&
mapEquals(other.filters, filters) &&
mapEquals(other.genres, genres) &&
mapEquals(other.studios, studios) &&
mapEquals(other.tags, tags) &&
mapEquals(other.years, years) &&
mapEquals(other.officialRatings, officialRatings) &&
mapEquals(other.types, types) &&
other.sortingOption == sortingOption &&
other.sortOrder == sortOrder &&
other.favourites == favourites &&
other.recursive == recursive;
}
@override
int get hashCode {
return searchQuery.hashCode ^
folderOverwrite.hashCode ^
views.hashCode ^
posters.hashCode ^
selectedPosters.hashCode ^
filters.hashCode ^
genres.hashCode ^
studios.hashCode ^
tags.hashCode ^
years.hashCode ^
officialRatings.hashCode ^
types.hashCode ^
sortingOption.hashCode ^
sortOrder.hashCode ^
favourites.hashCode ^
recursive.hashCode;
}
}

View file

@ -0,0 +1,627 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// coverage:ignore-file
// ignore_for_file: type=lint
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
part of 'library_search_model.dart';
// **************************************************************************
// FreezedGenerator
// **************************************************************************
// dart format off
T _$identity<T>(T value) => value;
/// @nodoc
mixin _$LibrarySearchModel implements DiagnosticableTreeMixin {
bool get loading;
bool get selecteMode;
List<ItemBaseModel> get folderOverwrite;
String get searchQuery;
Map<ViewModel, bool> get views;
List<ItemBaseModel> get posters;
List<ItemBaseModel> get selectedPosters;
LibraryFilterModel get filters;
Map<String, int> get lastIndices;
Map<String, int> get libraryItemCounts;
bool get fetchingItems;
/// Create a copy of LibrarySearchModel
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
$LibrarySearchModelCopyWith<LibrarySearchModel> get copyWith =>
_$LibrarySearchModelCopyWithImpl<LibrarySearchModel>(
this as LibrarySearchModel, _$identity);
@override
void debugFillProperties(DiagnosticPropertiesBuilder properties) {
properties
..add(DiagnosticsProperty('type', 'LibrarySearchModel'))
..add(DiagnosticsProperty('loading', loading))
..add(DiagnosticsProperty('selecteMode', selecteMode))
..add(DiagnosticsProperty('folderOverwrite', folderOverwrite))
..add(DiagnosticsProperty('searchQuery', searchQuery))
..add(DiagnosticsProperty('views', views))
..add(DiagnosticsProperty('posters', posters))
..add(DiagnosticsProperty('selectedPosters', selectedPosters))
..add(DiagnosticsProperty('filters', filters))
..add(DiagnosticsProperty('lastIndices', lastIndices))
..add(DiagnosticsProperty('libraryItemCounts', libraryItemCounts))
..add(DiagnosticsProperty('fetchingItems', fetchingItems));
}
@override
String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) {
return 'LibrarySearchModel(loading: $loading, selecteMode: $selecteMode, folderOverwrite: $folderOverwrite, searchQuery: $searchQuery, views: $views, posters: $posters, selectedPosters: $selectedPosters, filters: $filters, lastIndices: $lastIndices, libraryItemCounts: $libraryItemCounts, fetchingItems: $fetchingItems)';
}
}
/// @nodoc
abstract mixin class $LibrarySearchModelCopyWith<$Res> {
factory $LibrarySearchModelCopyWith(
LibrarySearchModel value, $Res Function(LibrarySearchModel) _then) =
_$LibrarySearchModelCopyWithImpl;
@useResult
$Res call(
{bool loading,
bool selecteMode,
List<ItemBaseModel> folderOverwrite,
String searchQuery,
Map<ViewModel, bool> views,
List<ItemBaseModel> posters,
List<ItemBaseModel> selectedPosters,
LibraryFilterModel filters,
Map<String, int> lastIndices,
Map<String, int> libraryItemCounts,
bool fetchingItems});
$LibraryFilterModelCopyWith<$Res> get filters;
}
/// @nodoc
class _$LibrarySearchModelCopyWithImpl<$Res>
implements $LibrarySearchModelCopyWith<$Res> {
_$LibrarySearchModelCopyWithImpl(this._self, this._then);
final LibrarySearchModel _self;
final $Res Function(LibrarySearchModel) _then;
/// Create a copy of LibrarySearchModel
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
Object? loading = null,
Object? selecteMode = null,
Object? folderOverwrite = null,
Object? searchQuery = null,
Object? views = null,
Object? posters = null,
Object? selectedPosters = null,
Object? filters = null,
Object? lastIndices = null,
Object? libraryItemCounts = null,
Object? fetchingItems = null,
}) {
return _then(_self.copyWith(
loading: null == loading
? _self.loading
: loading // ignore: cast_nullable_to_non_nullable
as bool,
selecteMode: null == selecteMode
? _self.selecteMode
: selecteMode // ignore: cast_nullable_to_non_nullable
as bool,
folderOverwrite: null == folderOverwrite
? _self.folderOverwrite
: folderOverwrite // ignore: cast_nullable_to_non_nullable
as List<ItemBaseModel>,
searchQuery: null == searchQuery
? _self.searchQuery
: searchQuery // ignore: cast_nullable_to_non_nullable
as String,
views: null == views
? _self.views
: views // ignore: cast_nullable_to_non_nullable
as Map<ViewModel, bool>,
posters: null == posters
? _self.posters
: posters // ignore: cast_nullable_to_non_nullable
as List<ItemBaseModel>,
selectedPosters: null == selectedPosters
? _self.selectedPosters
: selectedPosters // ignore: cast_nullable_to_non_nullable
as List<ItemBaseModel>,
filters: null == filters
? _self.filters
: filters // ignore: cast_nullable_to_non_nullable
as LibraryFilterModel,
lastIndices: null == lastIndices
? _self.lastIndices
: lastIndices // ignore: cast_nullable_to_non_nullable
as Map<String, int>,
libraryItemCounts: null == libraryItemCounts
? _self.libraryItemCounts
: libraryItemCounts // ignore: cast_nullable_to_non_nullable
as Map<String, int>,
fetchingItems: null == fetchingItems
? _self.fetchingItems
: fetchingItems // ignore: cast_nullable_to_non_nullable
as bool,
));
}
/// Create a copy of LibrarySearchModel
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$LibraryFilterModelCopyWith<$Res> get filters {
return $LibraryFilterModelCopyWith<$Res>(_self.filters, (value) {
return _then(_self.copyWith(filters: value));
});
}
}
/// Adds pattern-matching-related methods to [LibrarySearchModel].
extension LibrarySearchModelPatterns on LibrarySearchModel {
/// A variant of `map` that fallback to returning `orElse`.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case _:
/// return orElse();
/// }
/// ```
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>(
TResult Function(_LibrarySearchModel value)? $default, {
required TResult orElse(),
}) {
final _that = this;
switch (_that) {
case _LibrarySearchModel() when $default != null:
return $default(_that);
case _:
return orElse();
}
}
/// A `switch`-like method, using callbacks.
///
/// Callbacks receives the raw object, upcasted.
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case final Subclass2 value:
/// return ...;
/// }
/// ```
@optionalTypeArgs
TResult map<TResult extends Object?>(
TResult Function(_LibrarySearchModel value) $default,
) {
final _that = this;
switch (_that) {
case _LibrarySearchModel():
return $default(_that);
case _:
throw StateError('Unexpected subclass');
}
}
/// A variant of `map` that fallback to returning `null`.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case _:
/// return null;
/// }
/// ```
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>(
TResult? Function(_LibrarySearchModel value)? $default,
) {
final _that = this;
switch (_that) {
case _LibrarySearchModel() when $default != null:
return $default(_that);
case _:
return null;
}
}
/// A variant of `when` that fallback to an `orElse` callback.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case _:
/// return orElse();
/// }
/// ```
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>(
TResult Function(
bool loading,
bool selecteMode,
List<ItemBaseModel> folderOverwrite,
String searchQuery,
Map<ViewModel, bool> views,
List<ItemBaseModel> posters,
List<ItemBaseModel> selectedPosters,
LibraryFilterModel filters,
Map<String, int> lastIndices,
Map<String, int> libraryItemCounts,
bool fetchingItems)?
$default, {
required TResult orElse(),
}) {
final _that = this;
switch (_that) {
case _LibrarySearchModel() when $default != null:
return $default(
_that.loading,
_that.selecteMode,
_that.folderOverwrite,
_that.searchQuery,
_that.views,
_that.posters,
_that.selectedPosters,
_that.filters,
_that.lastIndices,
_that.libraryItemCounts,
_that.fetchingItems);
case _:
return orElse();
}
}
/// A `switch`-like method, using callbacks.
///
/// As opposed to `map`, this offers destructuring.
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case Subclass2(:final field2):
/// return ...;
/// }
/// ```
@optionalTypeArgs
TResult when<TResult extends Object?>(
TResult Function(
bool loading,
bool selecteMode,
List<ItemBaseModel> folderOverwrite,
String searchQuery,
Map<ViewModel, bool> views,
List<ItemBaseModel> posters,
List<ItemBaseModel> selectedPosters,
LibraryFilterModel filters,
Map<String, int> lastIndices,
Map<String, int> libraryItemCounts,
bool fetchingItems)
$default,
) {
final _that = this;
switch (_that) {
case _LibrarySearchModel():
return $default(
_that.loading,
_that.selecteMode,
_that.folderOverwrite,
_that.searchQuery,
_that.views,
_that.posters,
_that.selectedPosters,
_that.filters,
_that.lastIndices,
_that.libraryItemCounts,
_that.fetchingItems);
case _:
throw StateError('Unexpected subclass');
}
}
/// A variant of `when` that fallback to returning `null`
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case _:
/// return null;
/// }
/// ```
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>(
TResult? Function(
bool loading,
bool selecteMode,
List<ItemBaseModel> folderOverwrite,
String searchQuery,
Map<ViewModel, bool> views,
List<ItemBaseModel> posters,
List<ItemBaseModel> selectedPosters,
LibraryFilterModel filters,
Map<String, int> lastIndices,
Map<String, int> libraryItemCounts,
bool fetchingItems)?
$default,
) {
final _that = this;
switch (_that) {
case _LibrarySearchModel() when $default != null:
return $default(
_that.loading,
_that.selecteMode,
_that.folderOverwrite,
_that.searchQuery,
_that.views,
_that.posters,
_that.selectedPosters,
_that.filters,
_that.lastIndices,
_that.libraryItemCounts,
_that.fetchingItems);
case _:
return null;
}
}
}
/// @nodoc
class _LibrarySearchModel
with DiagnosticableTreeMixin
implements LibrarySearchModel {
const _LibrarySearchModel(
{this.loading = false,
this.selecteMode = false,
final List<ItemBaseModel> folderOverwrite = const <ItemBaseModel>[],
this.searchQuery = "",
final Map<ViewModel, bool> views = const <ViewModel, bool>{},
final List<ItemBaseModel> posters = const <ItemBaseModel>[],
final List<ItemBaseModel> selectedPosters = const <ItemBaseModel>[],
this.filters = const LibraryFilterModel(),
final Map<String, int> lastIndices = const <String, int>{},
final Map<String, int> libraryItemCounts = const <String, int>{},
this.fetchingItems = false})
: _folderOverwrite = folderOverwrite,
_views = views,
_posters = posters,
_selectedPosters = selectedPosters,
_lastIndices = lastIndices,
_libraryItemCounts = libraryItemCounts;
@override
@JsonKey()
final bool loading;
@override
@JsonKey()
final bool selecteMode;
final List<ItemBaseModel> _folderOverwrite;
@override
@JsonKey()
List<ItemBaseModel> get folderOverwrite {
if (_folderOverwrite is EqualUnmodifiableListView) return _folderOverwrite;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(_folderOverwrite);
}
@override
@JsonKey()
final String searchQuery;
final Map<ViewModel, bool> _views;
@override
@JsonKey()
Map<ViewModel, bool> get views {
if (_views is EqualUnmodifiableMapView) return _views;
// ignore: implicit_dynamic_type
return EqualUnmodifiableMapView(_views);
}
final List<ItemBaseModel> _posters;
@override
@JsonKey()
List<ItemBaseModel> get posters {
if (_posters is EqualUnmodifiableListView) return _posters;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(_posters);
}
final List<ItemBaseModel> _selectedPosters;
@override
@JsonKey()
List<ItemBaseModel> get selectedPosters {
if (_selectedPosters is EqualUnmodifiableListView) return _selectedPosters;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(_selectedPosters);
}
@override
@JsonKey()
final LibraryFilterModel filters;
final Map<String, int> _lastIndices;
@override
@JsonKey()
Map<String, int> get lastIndices {
if (_lastIndices is EqualUnmodifiableMapView) return _lastIndices;
// ignore: implicit_dynamic_type
return EqualUnmodifiableMapView(_lastIndices);
}
final Map<String, int> _libraryItemCounts;
@override
@JsonKey()
Map<String, int> get libraryItemCounts {
if (_libraryItemCounts is EqualUnmodifiableMapView)
return _libraryItemCounts;
// ignore: implicit_dynamic_type
return EqualUnmodifiableMapView(_libraryItemCounts);
}
@override
@JsonKey()
final bool fetchingItems;
/// Create a copy of LibrarySearchModel
/// with the given fields replaced by the non-null parameter values.
@override
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
_$LibrarySearchModelCopyWith<_LibrarySearchModel> get copyWith =>
__$LibrarySearchModelCopyWithImpl<_LibrarySearchModel>(this, _$identity);
@override
void debugFillProperties(DiagnosticPropertiesBuilder properties) {
properties
..add(DiagnosticsProperty('type', 'LibrarySearchModel'))
..add(DiagnosticsProperty('loading', loading))
..add(DiagnosticsProperty('selecteMode', selecteMode))
..add(DiagnosticsProperty('folderOverwrite', folderOverwrite))
..add(DiagnosticsProperty('searchQuery', searchQuery))
..add(DiagnosticsProperty('views', views))
..add(DiagnosticsProperty('posters', posters))
..add(DiagnosticsProperty('selectedPosters', selectedPosters))
..add(DiagnosticsProperty('filters', filters))
..add(DiagnosticsProperty('lastIndices', lastIndices))
..add(DiagnosticsProperty('libraryItemCounts', libraryItemCounts))
..add(DiagnosticsProperty('fetchingItems', fetchingItems));
}
@override
String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) {
return 'LibrarySearchModel(loading: $loading, selecteMode: $selecteMode, folderOverwrite: $folderOverwrite, searchQuery: $searchQuery, views: $views, posters: $posters, selectedPosters: $selectedPosters, filters: $filters, lastIndices: $lastIndices, libraryItemCounts: $libraryItemCounts, fetchingItems: $fetchingItems)';
}
}
/// @nodoc
abstract mixin class _$LibrarySearchModelCopyWith<$Res>
implements $LibrarySearchModelCopyWith<$Res> {
factory _$LibrarySearchModelCopyWith(
_LibrarySearchModel value, $Res Function(_LibrarySearchModel) _then) =
__$LibrarySearchModelCopyWithImpl;
@override
@useResult
$Res call(
{bool loading,
bool selecteMode,
List<ItemBaseModel> folderOverwrite,
String searchQuery,
Map<ViewModel, bool> views,
List<ItemBaseModel> posters,
List<ItemBaseModel> selectedPosters,
LibraryFilterModel filters,
Map<String, int> lastIndices,
Map<String, int> libraryItemCounts,
bool fetchingItems});
@override
$LibraryFilterModelCopyWith<$Res> get filters;
}
/// @nodoc
class __$LibrarySearchModelCopyWithImpl<$Res>
implements _$LibrarySearchModelCopyWith<$Res> {
__$LibrarySearchModelCopyWithImpl(this._self, this._then);
final _LibrarySearchModel _self;
final $Res Function(_LibrarySearchModel) _then;
/// Create a copy of LibrarySearchModel
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$Res call({
Object? loading = null,
Object? selecteMode = null,
Object? folderOverwrite = null,
Object? searchQuery = null,
Object? views = null,
Object? posters = null,
Object? selectedPosters = null,
Object? filters = null,
Object? lastIndices = null,
Object? libraryItemCounts = null,
Object? fetchingItems = null,
}) {
return _then(_LibrarySearchModel(
loading: null == loading
? _self.loading
: loading // ignore: cast_nullable_to_non_nullable
as bool,
selecteMode: null == selecteMode
? _self.selecteMode
: selecteMode // ignore: cast_nullable_to_non_nullable
as bool,
folderOverwrite: null == folderOverwrite
? _self._folderOverwrite
: folderOverwrite // ignore: cast_nullable_to_non_nullable
as List<ItemBaseModel>,
searchQuery: null == searchQuery
? _self.searchQuery
: searchQuery // ignore: cast_nullable_to_non_nullable
as String,
views: null == views
? _self._views
: views // ignore: cast_nullable_to_non_nullable
as Map<ViewModel, bool>,
posters: null == posters
? _self._posters
: posters // ignore: cast_nullable_to_non_nullable
as List<ItemBaseModel>,
selectedPosters: null == selectedPosters
? _self._selectedPosters
: selectedPosters // ignore: cast_nullable_to_non_nullable
as List<ItemBaseModel>,
filters: null == filters
? _self.filters
: filters // ignore: cast_nullable_to_non_nullable
as LibraryFilterModel,
lastIndices: null == lastIndices
? _self._lastIndices
: lastIndices // ignore: cast_nullable_to_non_nullable
as Map<String, int>,
libraryItemCounts: null == libraryItemCounts
? _self._libraryItemCounts
: libraryItemCounts // ignore: cast_nullable_to_non_nullable
as Map<String, int>,
fetchingItems: null == fetchingItems
? _self.fetchingItems
: fetchingItems // ignore: cast_nullable_to_non_nullable
as bool,
));
}
/// Create a copy of LibrarySearchModel
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$LibraryFilterModelCopyWith<$Res> get filters {
return $LibraryFilterModelCopyWith<$Res>(_self.filters, (value) {
return _then(_self.copyWith(filters: value));
});
}
}
// dart format on

View file

@ -1,395 +0,0 @@
// coverage:ignore-file
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint
// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member
// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter
part of 'library_search_model.dart';
class LibrarySearchModelMapper extends ClassMapperBase<LibrarySearchModel> {
LibrarySearchModelMapper._();
static LibrarySearchModelMapper? _instance;
static LibrarySearchModelMapper ensureInitialized() {
if (_instance == null) {
MapperContainer.globals.use(_instance = LibrarySearchModelMapper._());
ItemBaseModelMapper.ensureInitialized();
}
return _instance!;
}
@override
final String id = 'LibrarySearchModel';
static bool _$loading(LibrarySearchModel v) => v.loading;
static const Field<LibrarySearchModel, bool> _f$loading =
Field('loading', _$loading, opt: true, def: false);
static bool _$selecteMode(LibrarySearchModel v) => v.selecteMode;
static const Field<LibrarySearchModel, bool> _f$selecteMode =
Field('selecteMode', _$selecteMode, opt: true, def: false);
static List<ItemBaseModel> _$folderOverwrite(LibrarySearchModel v) =>
v.folderOverwrite;
static const Field<LibrarySearchModel, List<ItemBaseModel>>
_f$folderOverwrite =
Field('folderOverwrite', _$folderOverwrite, opt: true, def: const []);
static String _$searchQuery(LibrarySearchModel v) => v.searchQuery;
static const Field<LibrarySearchModel, String> _f$searchQuery =
Field('searchQuery', _$searchQuery, opt: true, def: "");
static Map<ViewModel, bool> _$views(LibrarySearchModel v) => v.views;
static const Field<LibrarySearchModel, Map<ViewModel, bool>> _f$views =
Field('views', _$views, opt: true, def: const {});
static List<ItemBaseModel> _$posters(LibrarySearchModel v) => v.posters;
static const Field<LibrarySearchModel, List<ItemBaseModel>> _f$posters =
Field('posters', _$posters, opt: true, def: const []);
static List<ItemBaseModel> _$selectedPosters(LibrarySearchModel v) =>
v.selectedPosters;
static const Field<LibrarySearchModel, List<ItemBaseModel>>
_f$selectedPosters =
Field('selectedPosters', _$selectedPosters, opt: true, def: const []);
static Map<ItemFilter, bool> _$filters(LibrarySearchModel v) => v.filters;
static const Field<LibrarySearchModel, Map<ItemFilter, bool>> _f$filters =
Field('filters', _$filters, opt: true, def: const {
ItemFilter.isplayed: false,
ItemFilter.isunplayed: false,
ItemFilter.isresumable: false
});
static Map<String, bool> _$genres(LibrarySearchModel v) => v.genres;
static const Field<LibrarySearchModel, Map<String, bool>> _f$genres =
Field('genres', _$genres, opt: true, def: const {});
static Map<Studio, bool> _$studios(LibrarySearchModel v) => v.studios;
static const Field<LibrarySearchModel, Map<Studio, bool>> _f$studios =
Field('studios', _$studios, opt: true, def: const {});
static Map<String, bool> _$tags(LibrarySearchModel v) => v.tags;
static const Field<LibrarySearchModel, Map<String, bool>> _f$tags =
Field('tags', _$tags, opt: true, def: const {});
static Map<int, bool> _$years(LibrarySearchModel v) => v.years;
static const Field<LibrarySearchModel, Map<int, bool>> _f$years =
Field('years', _$years, opt: true, def: const {});
static Map<String, bool> _$officialRatings(LibrarySearchModel v) =>
v.officialRatings;
static const Field<LibrarySearchModel, Map<String, bool>> _f$officialRatings =
Field('officialRatings', _$officialRatings, opt: true, def: const {});
static Map<FladderItemType, bool> _$types(LibrarySearchModel v) => v.types;
static const Field<LibrarySearchModel, Map<FladderItemType, bool>> _f$types =
Field('types', _$types, opt: true, def: const {
FladderItemType.audio: false,
FladderItemType.boxset: false,
FladderItemType.book: false,
FladderItemType.collectionFolder: false,
FladderItemType.episode: false,
FladderItemType.folder: false,
FladderItemType.movie: true,
FladderItemType.musicAlbum: false,
FladderItemType.musicVideo: false,
FladderItemType.photo: false,
FladderItemType.person: false,
FladderItemType.photoAlbum: false,
FladderItemType.series: true,
FladderItemType.video: true
});
static bool _$favourites(LibrarySearchModel v) => v.favourites;
static const Field<LibrarySearchModel, bool> _f$favourites =
Field('favourites', _$favourites, opt: true, def: false);
static SortingOptions _$sortingOption(LibrarySearchModel v) =>
v.sortingOption;
static const Field<LibrarySearchModel, SortingOptions> _f$sortingOption =
Field('sortingOption', _$sortingOption,
opt: true, def: SortingOptions.sortName);
static SortingOrder _$sortOrder(LibrarySearchModel v) => v.sortOrder;
static const Field<LibrarySearchModel, SortingOrder> _f$sortOrder =
Field('sortOrder', _$sortOrder, opt: true, def: SortingOrder.ascending);
static bool _$hideEmptyShows(LibrarySearchModel v) => v.hideEmptyShows;
static const Field<LibrarySearchModel, bool> _f$hideEmptyShows =
Field('hideEmptyShows', _$hideEmptyShows, opt: true, def: true);
static bool _$recursive(LibrarySearchModel v) => v.recursive;
static const Field<LibrarySearchModel, bool> _f$recursive =
Field('recursive', _$recursive, opt: true, def: false);
static GroupBy _$groupBy(LibrarySearchModel v) => v.groupBy;
static const Field<LibrarySearchModel, GroupBy> _f$groupBy =
Field('groupBy', _$groupBy, opt: true, def: GroupBy.none);
static Map<String, int> _$lastIndices(LibrarySearchModel v) => v.lastIndices;
static const Field<LibrarySearchModel, Map<String, int>> _f$lastIndices =
Field('lastIndices', _$lastIndices, opt: true, def: const {});
static Map<String, int> _$libraryItemCounts(LibrarySearchModel v) =>
v.libraryItemCounts;
static const Field<LibrarySearchModel, Map<String, int>>
_f$libraryItemCounts =
Field('libraryItemCounts', _$libraryItemCounts, opt: true, def: const {});
static bool _$fetchingItems(LibrarySearchModel v) => v.fetchingItems;
static const Field<LibrarySearchModel, bool> _f$fetchingItems =
Field('fetchingItems', _$fetchingItems, opt: true, def: false);
@override
final MappableFields<LibrarySearchModel> fields = const {
#loading: _f$loading,
#selecteMode: _f$selecteMode,
#folderOverwrite: _f$folderOverwrite,
#searchQuery: _f$searchQuery,
#views: _f$views,
#posters: _f$posters,
#selectedPosters: _f$selectedPosters,
#filters: _f$filters,
#genres: _f$genres,
#studios: _f$studios,
#tags: _f$tags,
#years: _f$years,
#officialRatings: _f$officialRatings,
#types: _f$types,
#favourites: _f$favourites,
#sortingOption: _f$sortingOption,
#sortOrder: _f$sortOrder,
#hideEmptyShows: _f$hideEmptyShows,
#recursive: _f$recursive,
#groupBy: _f$groupBy,
#lastIndices: _f$lastIndices,
#libraryItemCounts: _f$libraryItemCounts,
#fetchingItems: _f$fetchingItems,
};
@override
final bool ignoreNull = true;
static LibrarySearchModel _instantiate(DecodingData data) {
return LibrarySearchModel(
loading: data.dec(_f$loading),
selecteMode: data.dec(_f$selecteMode),
folderOverwrite: data.dec(_f$folderOverwrite),
searchQuery: data.dec(_f$searchQuery),
views: data.dec(_f$views),
posters: data.dec(_f$posters),
selectedPosters: data.dec(_f$selectedPosters),
filters: data.dec(_f$filters),
genres: data.dec(_f$genres),
studios: data.dec(_f$studios),
tags: data.dec(_f$tags),
years: data.dec(_f$years),
officialRatings: data.dec(_f$officialRatings),
types: data.dec(_f$types),
favourites: data.dec(_f$favourites),
sortingOption: data.dec(_f$sortingOption),
sortOrder: data.dec(_f$sortOrder),
hideEmptyShows: data.dec(_f$hideEmptyShows),
recursive: data.dec(_f$recursive),
groupBy: data.dec(_f$groupBy),
lastIndices: data.dec(_f$lastIndices),
libraryItemCounts: data.dec(_f$libraryItemCounts),
fetchingItems: data.dec(_f$fetchingItems));
}
@override
final Function instantiate = _instantiate;
}
mixin LibrarySearchModelMappable {
LibrarySearchModelCopyWith<LibrarySearchModel, LibrarySearchModel,
LibrarySearchModel>
get copyWith => _LibrarySearchModelCopyWithImpl<LibrarySearchModel,
LibrarySearchModel>(this as LibrarySearchModel, $identity, $identity);
}
extension LibrarySearchModelValueCopy<$R, $Out>
on ObjectCopyWith<$R, LibrarySearchModel, $Out> {
LibrarySearchModelCopyWith<$R, LibrarySearchModel, $Out>
get $asLibrarySearchModel => $base.as(
(v, t, t2) => _LibrarySearchModelCopyWithImpl<$R, $Out>(v, t, t2));
}
abstract class LibrarySearchModelCopyWith<$R, $In extends LibrarySearchModel,
$Out> implements ClassCopyWith<$R, $In, $Out> {
ListCopyWith<$R, ItemBaseModel,
ItemBaseModelCopyWith<$R, ItemBaseModel, ItemBaseModel>>
get folderOverwrite;
MapCopyWith<$R, ViewModel, bool, ObjectCopyWith<$R, bool, bool>> get views;
ListCopyWith<$R, ItemBaseModel,
ItemBaseModelCopyWith<$R, ItemBaseModel, ItemBaseModel>> get posters;
ListCopyWith<$R, ItemBaseModel,
ItemBaseModelCopyWith<$R, ItemBaseModel, ItemBaseModel>>
get selectedPosters;
MapCopyWith<$R, ItemFilter, bool, ObjectCopyWith<$R, bool, bool>> get filters;
MapCopyWith<$R, String, bool, ObjectCopyWith<$R, bool, bool>> get genres;
MapCopyWith<$R, Studio, bool, ObjectCopyWith<$R, bool, bool>> get studios;
MapCopyWith<$R, String, bool, ObjectCopyWith<$R, bool, bool>> get tags;
MapCopyWith<$R, int, bool, ObjectCopyWith<$R, bool, bool>> get years;
MapCopyWith<$R, String, bool, ObjectCopyWith<$R, bool, bool>>
get officialRatings;
MapCopyWith<$R, FladderItemType, bool, ObjectCopyWith<$R, bool, bool>>
get types;
MapCopyWith<$R, String, int, ObjectCopyWith<$R, int, int>> get lastIndices;
MapCopyWith<$R, String, int, ObjectCopyWith<$R, int, int>>
get libraryItemCounts;
$R call(
{bool? loading,
bool? selecteMode,
List<ItemBaseModel>? folderOverwrite,
String? searchQuery,
Map<ViewModel, bool>? views,
List<ItemBaseModel>? posters,
List<ItemBaseModel>? selectedPosters,
Map<ItemFilter, bool>? filters,
Map<String, bool>? genres,
Map<Studio, bool>? studios,
Map<String, bool>? tags,
Map<int, bool>? years,
Map<String, bool>? officialRatings,
Map<FladderItemType, bool>? types,
bool? favourites,
SortingOptions? sortingOption,
SortingOrder? sortOrder,
bool? hideEmptyShows,
bool? recursive,
GroupBy? groupBy,
Map<String, int>? lastIndices,
Map<String, int>? libraryItemCounts,
bool? fetchingItems});
LibrarySearchModelCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>(
Then<$Out2, $R2> t);
}
class _LibrarySearchModelCopyWithImpl<$R, $Out>
extends ClassCopyWithBase<$R, LibrarySearchModel, $Out>
implements LibrarySearchModelCopyWith<$R, LibrarySearchModel, $Out> {
_LibrarySearchModelCopyWithImpl(super.value, super.then, super.then2);
@override
late final ClassMapperBase<LibrarySearchModel> $mapper =
LibrarySearchModelMapper.ensureInitialized();
@override
ListCopyWith<$R, ItemBaseModel,
ItemBaseModelCopyWith<$R, ItemBaseModel, ItemBaseModel>>
get folderOverwrite => ListCopyWith($value.folderOverwrite,
(v, t) => v.copyWith.$chain(t), (v) => call(folderOverwrite: v));
@override
MapCopyWith<$R, ViewModel, bool, ObjectCopyWith<$R, bool, bool>> get views =>
MapCopyWith($value.views, (v, t) => ObjectCopyWith(v, $identity, t),
(v) => call(views: v));
@override
ListCopyWith<$R, ItemBaseModel,
ItemBaseModelCopyWith<$R, ItemBaseModel, ItemBaseModel>>
get posters => ListCopyWith($value.posters,
(v, t) => v.copyWith.$chain(t), (v) => call(posters: v));
@override
ListCopyWith<$R, ItemBaseModel,
ItemBaseModelCopyWith<$R, ItemBaseModel, ItemBaseModel>>
get selectedPosters => ListCopyWith($value.selectedPosters,
(v, t) => v.copyWith.$chain(t), (v) => call(selectedPosters: v));
@override
MapCopyWith<$R, ItemFilter, bool, ObjectCopyWith<$R, bool, bool>>
get filters => MapCopyWith($value.filters,
(v, t) => ObjectCopyWith(v, $identity, t), (v) => call(filters: v));
@override
MapCopyWith<$R, String, bool, ObjectCopyWith<$R, bool, bool>> get genres =>
MapCopyWith($value.genres, (v, t) => ObjectCopyWith(v, $identity, t),
(v) => call(genres: v));
@override
MapCopyWith<$R, Studio, bool, ObjectCopyWith<$R, bool, bool>> get studios =>
MapCopyWith($value.studios, (v, t) => ObjectCopyWith(v, $identity, t),
(v) => call(studios: v));
@override
MapCopyWith<$R, String, bool, ObjectCopyWith<$R, bool, bool>> get tags =>
MapCopyWith($value.tags, (v, t) => ObjectCopyWith(v, $identity, t),
(v) => call(tags: v));
@override
MapCopyWith<$R, int, bool, ObjectCopyWith<$R, bool, bool>> get years =>
MapCopyWith($value.years, (v, t) => ObjectCopyWith(v, $identity, t),
(v) => call(years: v));
@override
MapCopyWith<$R, String, bool, ObjectCopyWith<$R, bool, bool>>
get officialRatings => MapCopyWith(
$value.officialRatings,
(v, t) => ObjectCopyWith(v, $identity, t),
(v) => call(officialRatings: v));
@override
MapCopyWith<$R, FladderItemType, bool, ObjectCopyWith<$R, bool, bool>>
get types => MapCopyWith($value.types,
(v, t) => ObjectCopyWith(v, $identity, t), (v) => call(types: v));
@override
MapCopyWith<$R, String, int, ObjectCopyWith<$R, int, int>> get lastIndices =>
MapCopyWith($value.lastIndices, (v, t) => ObjectCopyWith(v, $identity, t),
(v) => call(lastIndices: v));
@override
MapCopyWith<$R, String, int, ObjectCopyWith<$R, int, int>>
get libraryItemCounts => MapCopyWith(
$value.libraryItemCounts,
(v, t) => ObjectCopyWith(v, $identity, t),
(v) => call(libraryItemCounts: v));
@override
$R call(
{bool? loading,
bool? selecteMode,
List<ItemBaseModel>? folderOverwrite,
String? searchQuery,
Map<ViewModel, bool>? views,
List<ItemBaseModel>? posters,
List<ItemBaseModel>? selectedPosters,
Map<ItemFilter, bool>? filters,
Map<String, bool>? genres,
Map<Studio, bool>? studios,
Map<String, bool>? tags,
Map<int, bool>? years,
Map<String, bool>? officialRatings,
Map<FladderItemType, bool>? types,
bool? favourites,
SortingOptions? sortingOption,
SortingOrder? sortOrder,
bool? hideEmptyShows,
bool? recursive,
GroupBy? groupBy,
Map<String, int>? lastIndices,
Map<String, int>? libraryItemCounts,
bool? fetchingItems}) =>
$apply(FieldCopyWithData({
if (loading != null) #loading: loading,
if (selecteMode != null) #selecteMode: selecteMode,
if (folderOverwrite != null) #folderOverwrite: folderOverwrite,
if (searchQuery != null) #searchQuery: searchQuery,
if (views != null) #views: views,
if (posters != null) #posters: posters,
if (selectedPosters != null) #selectedPosters: selectedPosters,
if (filters != null) #filters: filters,
if (genres != null) #genres: genres,
if (studios != null) #studios: studios,
if (tags != null) #tags: tags,
if (years != null) #years: years,
if (officialRatings != null) #officialRatings: officialRatings,
if (types != null) #types: types,
if (favourites != null) #favourites: favourites,
if (sortingOption != null) #sortingOption: sortingOption,
if (sortOrder != null) #sortOrder: sortOrder,
if (hideEmptyShows != null) #hideEmptyShows: hideEmptyShows,
if (recursive != null) #recursive: recursive,
if (groupBy != null) #groupBy: groupBy,
if (lastIndices != null) #lastIndices: lastIndices,
if (libraryItemCounts != null) #libraryItemCounts: libraryItemCounts,
if (fetchingItems != null) #fetchingItems: fetchingItems
}));
@override
LibrarySearchModel $make(CopyWithData data) => LibrarySearchModel(
loading: data.get(#loading, or: $value.loading),
selecteMode: data.get(#selecteMode, or: $value.selecteMode),
folderOverwrite: data.get(#folderOverwrite, or: $value.folderOverwrite),
searchQuery: data.get(#searchQuery, or: $value.searchQuery),
views: data.get(#views, or: $value.views),
posters: data.get(#posters, or: $value.posters),
selectedPosters: data.get(#selectedPosters, or: $value.selectedPosters),
filters: data.get(#filters, or: $value.filters),
genres: data.get(#genres, or: $value.genres),
studios: data.get(#studios, or: $value.studios),
tags: data.get(#tags, or: $value.tags),
years: data.get(#years, or: $value.years),
officialRatings: data.get(#officialRatings, or: $value.officialRatings),
types: data.get(#types, or: $value.types),
favourites: data.get(#favourites, or: $value.favourites),
sortingOption: data.get(#sortingOption, or: $value.sortingOption),
sortOrder: data.get(#sortOrder, or: $value.sortOrder),
hideEmptyShows: data.get(#hideEmptyShows, or: $value.hideEmptyShows),
recursive: data.get(#recursive, or: $value.recursive),
groupBy: data.get(#groupBy, or: $value.groupBy),
lastIndices: data.get(#lastIndices, or: $value.lastIndices),
libraryItemCounts:
data.get(#libraryItemCounts, or: $value.libraryItemCounts),
fetchingItems: data.get(#fetchingItems, or: $value.fetchingItems));
@override
LibrarySearchModelCopyWith<$R2, LibrarySearchModel, $Out2> $chain<$R2, $Out2>(
Then<$Out2, $R2> t) =>
_LibrarySearchModelCopyWithImpl<$R2, $Out2>($value, $cast, t);
}