diff --git a/lib/models/history.dart b/lib/models/history.dart index ea7b50c..7f27807 100644 --- a/lib/models/history.dart +++ b/lib/models/history.dart @@ -12,7 +12,8 @@ class History { int? chapterId; - ItemType? itemType; + @enumerated + late ItemType itemType; final chapter = IsarLink(); diff --git a/lib/models/history.g.dart b/lib/models/history.g.dart index c07edc7..0ac2f83 100644 --- a/lib/models/history.g.dart +++ b/lib/models/history.g.dart @@ -27,10 +27,11 @@ const HistorySchema = CollectionSchema( name: r'date', type: IsarType.string, ), - r'isManga': PropertySchema( + r'itemType': PropertySchema( id: 2, - name: r'isManga', - type: IsarType.bool, + name: r'itemType', + type: IsarType.byte, + enumMap: _HistoryitemTypeEnumValueMap, ), r'mangaId': PropertySchema( id: 3, @@ -82,7 +83,7 @@ void _historySerialize( ) { writer.writeLong(offsets[0], object.chapterId); writer.writeString(offsets[1], object.date); - writer.writeBool(offsets[2], object.isManga); + writer.writeByte(offsets[2], object.itemType.index); writer.writeLong(offsets[3], object.mangaId); } @@ -96,7 +97,8 @@ History _historyDeserialize( chapterId: reader.readLongOrNull(offsets[0]), date: reader.readStringOrNull(offsets[1]), id: id, - isManga: reader.readBoolOrNull(offsets[2]), + itemType: _HistoryitemTypeValueEnumMap[reader.readByteOrNull(offsets[2])] ?? + ItemType.manga, mangaId: reader.readLongOrNull(offsets[3]), ); return object; @@ -114,7 +116,8 @@ P _historyDeserializeProp

( case 1: return (reader.readStringOrNull(offset)) as P; case 2: - return (reader.readBoolOrNull(offset)) as P; + return (_HistoryitemTypeValueEnumMap[reader.readByteOrNull(offset)] ?? + ItemType.manga) as P; case 3: return (reader.readLongOrNull(offset)) as P; default: @@ -122,6 +125,17 @@ P _historyDeserializeProp

( } } +const _HistoryitemTypeEnumValueMap = { + 'manga': 0, + 'anime': 1, + 'novel': 2, +}; +const _HistoryitemTypeValueEnumMap = { + 0: ItemType.manga, + 1: ItemType.anime, + 2: ItemType.novel, +}; + Id _historyGetId(History object) { return object.id ?? Isar.autoIncrement; } @@ -495,32 +509,59 @@ extension HistoryQueryFilter }); } - QueryBuilder isMangaIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'isManga', - )); - }); - } - - QueryBuilder isMangaIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'isManga', - )); - }); - } - - QueryBuilder isMangaEqualTo( - bool? value) { + QueryBuilder itemTypeEqualTo( + ItemType value) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.equalTo( - property: r'isManga', + property: r'itemType', value: value, )); }); } + QueryBuilder itemTypeGreaterThan( + ItemType value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'itemType', + value: value, + )); + }); + } + + QueryBuilder itemTypeLessThan( + ItemType value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'itemType', + value: value, + )); + }); + } + + QueryBuilder itemTypeBetween( + ItemType lower, + ItemType upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'itemType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + QueryBuilder mangaIdIsNull() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(const FilterCondition.isNull( @@ -635,15 +676,15 @@ extension HistoryQuerySortBy on QueryBuilder { }); } - QueryBuilder sortByIsManga() { + QueryBuilder sortByItemType() { return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'isManga', Sort.asc); + return query.addSortBy(r'itemType', Sort.asc); }); } - QueryBuilder sortByIsMangaDesc() { + QueryBuilder sortByItemTypeDesc() { return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'isManga', Sort.desc); + return query.addSortBy(r'itemType', Sort.desc); }); } @@ -698,15 +739,15 @@ extension HistoryQuerySortThenBy }); } - QueryBuilder thenByIsManga() { + QueryBuilder thenByItemType() { return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'isManga', Sort.asc); + return query.addSortBy(r'itemType', Sort.asc); }); } - QueryBuilder thenByIsMangaDesc() { + QueryBuilder thenByItemTypeDesc() { return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'isManga', Sort.desc); + return query.addSortBy(r'itemType', Sort.desc); }); } @@ -738,9 +779,9 @@ extension HistoryQueryWhereDistinct }); } - QueryBuilder distinctByIsManga() { + QueryBuilder distinctByItemType() { return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(r'isManga'); + return query.addDistinctBy(r'itemType'); }); } @@ -771,9 +812,9 @@ extension HistoryQueryProperty }); } - QueryBuilder isMangaProperty() { + QueryBuilder itemTypeProperty() { return QueryBuilder.apply(this, (query) { - return query.addPropertyName(r'isManga'); + return query.addPropertyName(r'itemType'); }); } diff --git a/lib/models/manga.g.dart b/lib/models/manga.g.dart index 19d099d..e15473b 100644 --- a/lib/models/manga.g.dart +++ b/lib/models/manga.g.dart @@ -72,49 +72,44 @@ const MangaSchema = CollectionSchema( name: r'isLocalArchive', type: IsarType.bool, ), - r'isManga': PropertySchema( - id: 11, - name: r'isManga', - type: IsarType.bool, - ), r'itemType': PropertySchema( - id: 12, + id: 11, name: r'itemType', type: IsarType.byte, enumMap: _MangaitemTypeEnumValueMap, ), r'lang': PropertySchema( - id: 13, + id: 12, name: r'lang', type: IsarType.string, ), r'lastRead': PropertySchema( - id: 14, + id: 13, name: r'lastRead', type: IsarType.long, ), r'lastUpdate': PropertySchema( - id: 15, + id: 14, name: r'lastUpdate', type: IsarType.long, ), r'link': PropertySchema( - id: 16, + id: 15, name: r'link', type: IsarType.string, ), r'name': PropertySchema( - id: 17, + id: 16, name: r'name', type: IsarType.string, ), r'source': PropertySchema( - id: 18, + id: 17, name: r'source', type: IsarType.string, ), r'status': PropertySchema( - id: 19, + id: 18, name: r'status', type: IsarType.byte, enumMap: _MangastatusEnumValueMap, @@ -246,15 +241,14 @@ void _mangaSerialize( writer.writeStringList(offsets[8], object.genre); writer.writeString(offsets[9], object.imageUrl); writer.writeBool(offsets[10], object.isLocalArchive); - writer.writeBool(offsets[11], object.isManga); - writer.writeByte(offsets[12], object.itemType.index); - writer.writeString(offsets[13], object.lang); - writer.writeLong(offsets[14], object.lastRead); - writer.writeLong(offsets[15], object.lastUpdate); - writer.writeString(offsets[16], object.link); - writer.writeString(offsets[17], object.name); - writer.writeString(offsets[18], object.source); - writer.writeByte(offsets[19], object.status.index); + writer.writeByte(offsets[11], object.itemType.index); + writer.writeString(offsets[12], object.lang); + writer.writeLong(offsets[13], object.lastRead); + writer.writeLong(offsets[14], object.lastUpdate); + writer.writeString(offsets[15], object.link); + writer.writeString(offsets[16], object.name); + writer.writeString(offsets[17], object.source); + writer.writeByte(offsets[18], object.status.index); } Manga _mangaDeserialize( @@ -276,16 +270,15 @@ Manga _mangaDeserialize( id: id, imageUrl: reader.readStringOrNull(offsets[9]), isLocalArchive: reader.readBoolOrNull(offsets[10]), - isManga: reader.readBoolOrNull(offsets[11]), - itemType: _MangaitemTypeValueEnumMap[reader.readByteOrNull(offsets[12])] ?? + itemType: _MangaitemTypeValueEnumMap[reader.readByteOrNull(offsets[11])] ?? ItemType.manga, - lang: reader.readStringOrNull(offsets[13]), - lastRead: reader.readLongOrNull(offsets[14]), - lastUpdate: reader.readLongOrNull(offsets[15]), - link: reader.readStringOrNull(offsets[16]), - name: reader.readStringOrNull(offsets[17]), - source: reader.readStringOrNull(offsets[18]), - status: _MangastatusValueEnumMap[reader.readByteOrNull(offsets[19])] ?? + lang: reader.readStringOrNull(offsets[12]), + lastRead: reader.readLongOrNull(offsets[13]), + lastUpdate: reader.readLongOrNull(offsets[14]), + link: reader.readStringOrNull(offsets[15]), + name: reader.readStringOrNull(offsets[16]), + source: reader.readStringOrNull(offsets[17]), + status: _MangastatusValueEnumMap[reader.readByteOrNull(offsets[18])] ?? Status.ongoing, ); return object; @@ -321,23 +314,21 @@ P _mangaDeserializeProp

( case 10: return (reader.readBoolOrNull(offset)) as P; case 11: - return (reader.readBoolOrNull(offset)) as P; - case 12: return (_MangaitemTypeValueEnumMap[reader.readByteOrNull(offset)] ?? ItemType.manga) as P; - case 13: + case 12: return (reader.readStringOrNull(offset)) as P; + case 13: + return (reader.readLongOrNull(offset)) as P; case 14: return (reader.readLongOrNull(offset)) as P; case 15: - return (reader.readLongOrNull(offset)) as P; + return (reader.readStringOrNull(offset)) as P; case 16: return (reader.readStringOrNull(offset)) as P; case 17: return (reader.readStringOrNull(offset)) as P; case 18: - return (reader.readStringOrNull(offset)) as P; - case 19: return (_MangastatusValueEnumMap[reader.readByteOrNull(offset)] ?? Status.ongoing) as P; default: @@ -1933,32 +1924,6 @@ extension MangaQueryFilter on QueryBuilder { }); } - QueryBuilder isMangaIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'isManga', - )); - }); - } - - QueryBuilder isMangaIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'isManga', - )); - }); - } - - QueryBuilder isMangaEqualTo( - bool? value) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'isManga', - value: value, - )); - }); - } - QueryBuilder itemTypeEqualTo( ItemType value) { return QueryBuilder.apply(this, (query) { @@ -2938,18 +2903,6 @@ extension MangaQuerySortBy on QueryBuilder { }); } - QueryBuilder sortByIsManga() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'isManga', Sort.asc); - }); - } - - QueryBuilder sortByIsMangaDesc() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'isManga', Sort.desc); - }); - } - QueryBuilder sortByItemType() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'itemType', Sort.asc); @@ -3156,18 +3109,6 @@ extension MangaQuerySortThenBy on QueryBuilder { }); } - QueryBuilder thenByIsManga() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'isManga', Sort.asc); - }); - } - - QueryBuilder thenByIsMangaDesc() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'isManga', Sort.desc); - }); - } - QueryBuilder thenByItemType() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'itemType', Sort.asc); @@ -3338,12 +3279,6 @@ extension MangaQueryWhereDistinct on QueryBuilder { }); } - QueryBuilder distinctByIsManga() { - return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(r'isManga'); - }); - } - QueryBuilder distinctByItemType() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'itemType'); @@ -3471,12 +3406,6 @@ extension MangaQueryProperty on QueryBuilder { }); } - QueryBuilder isMangaProperty() { - return QueryBuilder.apply(this, (query) { - return query.addPropertyName(r'isManga'); - }); - } - QueryBuilder itemTypeProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'itemType'); diff --git a/lib/modules/anime/providers/anime_player_controller_provider.g.dart b/lib/modules/anime/providers/anime_player_controller_provider.g.dart index 66a5354..dfc6c72 100644 --- a/lib/modules/anime/providers/anime_player_controller_provider.g.dart +++ b/lib/modules/anime/providers/anime_player_controller_provider.g.dart @@ -7,7 +7,7 @@ part of 'anime_player_controller_provider.dart'; // ************************************************************************** String _$animeStreamControllerHash() => - r'0d97207a4d015d5089766ccbeeba093c55cb1ef9'; + r'd3ec7fe7ac2af84393b128e430fd2f5b9224ed14'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/history/history_screen.dart b/lib/modules/history/history_screen.dart index 20fc747..bc78e31 100644 --- a/lib/modules/history/history_screen.dart +++ b/lib/modules/history/history_screen.dart @@ -119,10 +119,14 @@ class _HistoryScreenState extends ConsumerState List histories = isar.historys .filter() .idIsNotNull() - .chapter((q) => q.manga((q) => - q.isMangaEqualTo( - _tabBarController.index == - 0))) + .chapter((q) => q.manga((q) => q + .itemTypeEqualTo(_tabBarController + .index == + 0 + ? ItemType.manga + : _tabBarController.index == 1 + ? ItemType.anime + : ItemType.novel))) .findAllSync() .toList(); isar.writeTxnSync(() { @@ -150,6 +154,7 @@ class _HistoryScreenState extends ConsumerState tabs: [ Tab(text: l10n.manga), Tab(text: l10n.anime), + Tab(text: l10n.novel), ], ), ), @@ -157,11 +162,15 @@ class _HistoryScreenState extends ConsumerState padding: const EdgeInsets.only(top: 10), child: TabBarView(controller: _tabBarController, children: [ HistoryTab( - isManga: true, + itemType: ItemType.manga, query: _textEditingController.text, ), HistoryTab( - isManga: false, + itemType: ItemType.anime, + query: _textEditingController.text, + ), + HistoryTab( + itemType: ItemType.novel, query: _textEditingController.text, ) ]), @@ -173,8 +182,8 @@ class _HistoryScreenState extends ConsumerState class HistoryTab extends ConsumerStatefulWidget { final String query; - final bool isManga; - const HistoryTab({required this.isManga, required this.query, super.key}); + final ItemType itemType; + const HistoryTab({required this.itemType, required this.query, super.key}); @override ConsumerState createState() => _HistoryTabState(); @@ -185,7 +194,7 @@ class _HistoryTabState extends ConsumerState { Widget build(BuildContext context) { final l10n = l10nLocalizations(context)!; final history = - ref.watch(getAllHistoryStreamProvider(isManga: widget.isManga)); + ref.watch(getAllHistoryStreamProvider(itemType: widget.itemType)); return Scaffold( body: history.when( data: (data) { diff --git a/lib/modules/history/providers/isar_providers.dart b/lib/modules/history/providers/isar_providers.dart index 049f4a2..4ecd738 100644 --- a/lib/modules/history/providers/isar_providers.dart +++ b/lib/modules/history/providers/isar_providers.dart @@ -9,22 +9,22 @@ part 'isar_providers.g.dart'; @riverpod Stream> getAllHistoryStream(GetAllHistoryStreamRef ref, - {required bool isManga}) async* { + {required ItemType itemType}) async* { yield* isar.historys .filter() .idIsNotNull() .and() - .chapter((q) => q.manga((q) => q.isMangaEqualTo(isManga))) + .chapter((q) => q.manga((q) => q.itemTypeEqualTo(itemType))) .watch(fireImmediately: true); } @riverpod Stream> getAllUpdateStream(GetAllUpdateStreamRef ref, - {required bool isManga}) async* { + {required ItemType itemType}) async* { yield* isar.updates .filter() .idIsNotNull() .and() - .chapter((q) => q.manga((q) => q.isMangaEqualTo(isManga))) + .chapter((q) => q.manga((q) => q.itemTypeEqualTo(itemType))) .watch(fireImmediately: true); } diff --git a/lib/modules/history/providers/isar_providers.g.dart b/lib/modules/history/providers/isar_providers.g.dart index ba1149b..eb4c5a8 100644 --- a/lib/modules/history/providers/isar_providers.g.dart +++ b/lib/modules/history/providers/isar_providers.g.dart @@ -7,7 +7,7 @@ part of 'isar_providers.dart'; // ************************************************************************** String _$getAllHistoryStreamHash() => - r'32dc5fa16315f199a5c86ee99cf59b7190c4d28e'; + r'381b5515484ce36a197b91e7d5f17037177dd0f0'; /// Copied from Dart SDK class _SystemHash { @@ -41,10 +41,10 @@ class GetAllHistoryStreamFamily extends Family>> { /// See also [getAllHistoryStream]. GetAllHistoryStreamProvider call({ - required bool isManga, + required ItemType itemType, }) { return GetAllHistoryStreamProvider( - isManga: isManga, + itemType: itemType, ); } @@ -53,7 +53,7 @@ class GetAllHistoryStreamFamily extends Family>> { covariant GetAllHistoryStreamProvider provider, ) { return call( - isManga: provider.isManga, + itemType: provider.itemType, ); } @@ -77,11 +77,11 @@ class GetAllHistoryStreamProvider extends AutoDisposeStreamProvider> { /// See also [getAllHistoryStream]. GetAllHistoryStreamProvider({ - required bool isManga, + required ItemType itemType, }) : this._internal( (ref) => getAllHistoryStream( ref as GetAllHistoryStreamRef, - isManga: isManga, + itemType: itemType, ), from: getAllHistoryStreamProvider, name: r'getAllHistoryStreamProvider', @@ -92,7 +92,7 @@ class GetAllHistoryStreamProvider dependencies: GetAllHistoryStreamFamily._dependencies, allTransitiveDependencies: GetAllHistoryStreamFamily._allTransitiveDependencies, - isManga: isManga, + itemType: itemType, ); GetAllHistoryStreamProvider._internal( @@ -102,10 +102,10 @@ class GetAllHistoryStreamProvider required super.allTransitiveDependencies, required super.debugGetCreateSourceHash, required super.from, - required this.isManga, + required this.itemType, }) : super.internal(); - final bool isManga; + final ItemType itemType; @override Override overrideWith( @@ -120,7 +120,7 @@ class GetAllHistoryStreamProvider dependencies: null, allTransitiveDependencies: null, debugGetCreateSourceHash: null, - isManga: isManga, + itemType: itemType, ), ); } @@ -132,21 +132,21 @@ class GetAllHistoryStreamProvider @override bool operator ==(Object other) { - return other is GetAllHistoryStreamProvider && other.isManga == isManga; + return other is GetAllHistoryStreamProvider && other.itemType == itemType; } @override int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); return _SystemHash.finish(hash); } } mixin GetAllHistoryStreamRef on AutoDisposeStreamProviderRef> { - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; } class _GetAllHistoryStreamProviderElement @@ -155,11 +155,11 @@ class _GetAllHistoryStreamProviderElement _GetAllHistoryStreamProviderElement(super.provider); @override - bool get isManga => (origin as GetAllHistoryStreamProvider).isManga; + ItemType get itemType => (origin as GetAllHistoryStreamProvider).itemType; } String _$getAllUpdateStreamHash() => - r'9f62b36ef0b268ee8c3cc93a10f8963def8dfbb0'; + r'44fb6b980fb11c51c4b6a6956104b02b7ae0a8ca'; /// See also [getAllUpdateStream]. @ProviderFor(getAllUpdateStream) @@ -172,10 +172,10 @@ class GetAllUpdateStreamFamily extends Family>> { /// See also [getAllUpdateStream]. GetAllUpdateStreamProvider call({ - required bool isManga, + required ItemType itemType, }) { return GetAllUpdateStreamProvider( - isManga: isManga, + itemType: itemType, ); } @@ -184,7 +184,7 @@ class GetAllUpdateStreamFamily extends Family>> { covariant GetAllUpdateStreamProvider provider, ) { return call( - isManga: provider.isManga, + itemType: provider.itemType, ); } @@ -208,11 +208,11 @@ class GetAllUpdateStreamProvider extends AutoDisposeStreamProvider> { /// See also [getAllUpdateStream]. GetAllUpdateStreamProvider({ - required bool isManga, + required ItemType itemType, }) : this._internal( (ref) => getAllUpdateStream( ref as GetAllUpdateStreamRef, - isManga: isManga, + itemType: itemType, ), from: getAllUpdateStreamProvider, name: r'getAllUpdateStreamProvider', @@ -223,7 +223,7 @@ class GetAllUpdateStreamProvider dependencies: GetAllUpdateStreamFamily._dependencies, allTransitiveDependencies: GetAllUpdateStreamFamily._allTransitiveDependencies, - isManga: isManga, + itemType: itemType, ); GetAllUpdateStreamProvider._internal( @@ -233,10 +233,10 @@ class GetAllUpdateStreamProvider required super.allTransitiveDependencies, required super.debugGetCreateSourceHash, required super.from, - required this.isManga, + required this.itemType, }) : super.internal(); - final bool isManga; + final ItemType itemType; @override Override overrideWith( @@ -251,7 +251,7 @@ class GetAllUpdateStreamProvider dependencies: null, allTransitiveDependencies: null, debugGetCreateSourceHash: null, - isManga: isManga, + itemType: itemType, ), ); } @@ -263,21 +263,21 @@ class GetAllUpdateStreamProvider @override bool operator ==(Object other) { - return other is GetAllUpdateStreamProvider && other.isManga == isManga; + return other is GetAllUpdateStreamProvider && other.itemType == itemType; } @override int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); return _SystemHash.finish(hash); } } mixin GetAllUpdateStreamRef on AutoDisposeStreamProviderRef> { - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; } class _GetAllUpdateStreamProviderElement @@ -286,7 +286,7 @@ class _GetAllUpdateStreamProviderElement _GetAllUpdateStreamProviderElement(super.provider); @override - bool get isManga => (origin as GetAllUpdateStreamProvider).isManga; + ItemType get itemType => (origin as GetAllUpdateStreamProvider).itemType; } // ignore_for_file: type=lint // ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member diff --git a/lib/modules/library/providers/add_torrent.g.dart b/lib/modules/library/providers/add_torrent.g.dart index d0cea2f..728fdf6 100644 --- a/lib/modules/library/providers/add_torrent.g.dart +++ b/lib/modules/library/providers/add_torrent.g.dart @@ -7,7 +7,7 @@ part of 'add_torrent.dart'; // ************************************************************************** String _$addTorrentFromUrlOrFromFileHash() => - r'473a3494fd8c5089afdd460637f37faf2a498400'; + r'06b057093b528b06714adbd984d07c5698c2830b'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/library/providers/local_archive.g.dart b/lib/modules/library/providers/local_archive.g.dart index b013531..aee5900 100644 --- a/lib/modules/library/providers/local_archive.g.dart +++ b/lib/modules/library/providers/local_archive.g.dart @@ -7,7 +7,7 @@ part of 'local_archive.dart'; // ************************************************************************** String _$importArchivesFromFileHash() => - r'08e34a4b0ba52b8d3861b297f687c1136f2c5443'; + r'5d196054cc64e03d3efc2f5af098df5542776fec'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/main_view/providers/migration.dart b/lib/modules/main_view/providers/migration.dart index 79b21d3..b316740 100644 --- a/lib/modules/main_view/providers/migration.dart +++ b/lib/modules/main_view/providers/migration.dart @@ -20,10 +20,8 @@ Future migration(MigrationRef ref) async { .chapterIdIsNull() .or() .idIsNotNull() - .isMangaIsNull() .findAllSync(); - final tracks = - isar.tracks.filter().idIsNotNull().isMangaIsNull().findAllSync(); + final tracks = isar.tracks.filter().idIsNotNull().findAllSync(); isar.writeTxnSync(() { //mangaId in chapter @@ -39,15 +37,18 @@ Future migration(MigrationRef ref) async { //chapterId and isManga in History for (var history in histories) { final chapterId = history.chapter.value?.id; - final itemType = history.chapter.value?.manga.value?.itemType; + final itemType = + history.chapter.value?.manga.value?.itemType ?? ItemType.manga; isar.historys.putSync(history ..chapterId = chapterId ..itemType = itemType); } // isManga in Track for (var track in tracks) { - final itemType = isar.mangas.getSync(track.mangaId!)?.itemType; - isar.tracks.putSync(track..itemType = itemType); + final isManga = + (isar.mangas.getSync(track.mangaId!)?.itemType ?? ItemType.manga) == + ItemType.manga; + isar.tracks.putSync(track..isManga = isManga); } }); } diff --git a/lib/modules/main_view/providers/migration.g.dart b/lib/modules/main_view/providers/migration.g.dart index 424c774..6ca4816 100644 --- a/lib/modules/main_view/providers/migration.g.dart +++ b/lib/modules/main_view/providers/migration.g.dart @@ -6,7 +6,7 @@ part of 'migration.dart'; // RiverpodGenerator // ************************************************************************** -String _$migrationHash() => r'6b3ff1b28168381079986d619b30c31ce44f341f'; +String _$migrationHash() => r'8c5ba50ce563fc75a7185a99cb77759a8ef71964'; /// See also [migration]. @ProviderFor(migration) diff --git a/lib/modules/manga/detail/manga_detail_view.dart b/lib/modules/manga/detail/manga_detail_view.dart index a7b801d..5b9dd20 100644 --- a/lib/modules/manga/detail/manga_detail_view.dart +++ b/lib/modules/manga/detail/manga_detail_view.dart @@ -511,7 +511,12 @@ class _MangaDetailViewState extends ConsumerState if (value == 0) { context.push("/categories", extra: ( true, - widget.manga!.isManga! ? 0 : 1 + widget.manga!.itemType == ItemType.manga + ? 0 + : widget.manga!.itemType == + ItemType.anime + ? 1 + : 2 )); } else if (value == 1) { } else if (value == 2) { @@ -585,7 +590,9 @@ class _MangaDetailViewState extends ConsumerState 8), child: Text( widget.manga! - .isManga! + .itemType != + ItemType + .anime ? l10n.n_chapters( chapters .length) @@ -614,7 +621,10 @@ class _MangaDetailViewState extends ConsumerState color: context .secondaryColor), label: Text( - widget.manga!.isManga! + widget.manga! + .itemType != + ItemType + .anime ? l10n .add_chapters : l10n @@ -1363,7 +1373,7 @@ class _MangaDetailViewState extends ConsumerState padding: const EdgeInsets.symmetric(horizontal: 8), child: Text( - widget.manga!.isManga! + widget.manga!.itemType != ItemType.anime ? l10n.n_chapters(chapterLength) : l10n.n_episodes(chapterLength), style: const TextStyle( @@ -1380,7 +1390,7 @@ class _MangaDetailViewState extends ConsumerState icon: Icon(Icons.add, color: context.secondaryColor), label: Text( - widget.manga!.isManga! + widget.manga!.itemType != ItemType.anime ? l10n.add_chapters : l10n.add_episodes, style: TextStyle( @@ -1660,7 +1670,8 @@ class _MangaDetailViewState extends ConsumerState final trackSearch = await trackersSearchraggableMenu( context, - isManga: widget.manga!.isManga!, + isManga: widget.manga!.itemType != + ItemType.anime, track: Track( status: TrackStatus.planToRead, @@ -1978,14 +1989,16 @@ class _MangaDetailViewState extends ConsumerState mangaId: widget.manga!.id!, syncId: entries[index].syncId!, trackRes: trackRes.first, - isManga: widget.manga!.isManga!) + isManga: + widget.manga!.itemType == ItemType.manga) : TrackListile( text: l10nLocalizations(context)!.add_tracker, onTap: () async { final trackSearch = await trackersSearchraggableMenu( context, - isManga: widget.manga!.isManga!, + isManga: widget.manga!.itemType != + ItemType.anime, track: Track( status: TrackStatus.planToRead, syncId: entries[index].syncId!, @@ -1995,7 +2008,9 @@ class _MangaDetailViewState extends ConsumerState await ref .read(trackStateProvider( track: null, - isManga: widget.manga!.isManga!) + isManga: + widget.manga!.itemType != + ItemType.anime) .notifier) .setTrackSearch( trackSearch, diff --git a/lib/modules/manga/detail/manga_details_view.dart b/lib/modules/manga/detail/manga_details_view.dart index 05e9334..0534255 100644 --- a/lib/modules/manga/detail/manga_details_view.dart +++ b/lib/modules/manga/detail/manga_details_view.dart @@ -55,7 +55,7 @@ class _MangaDetailsViewState extends ConsumerState { .idIsNotNull() .and() .chapter((q) => q.manga( - (q) => q.isMangaEqualTo(widget.manga.isManga!))) + (q) => q.itemTypeEqualTo(widget.manga.itemType))) .watch(fireImmediately: true), builder: (context, snapshot) { final isFr = @@ -294,8 +294,14 @@ class _MangaDetailsViewState extends ConsumerState { children: [ TextButton( onPressed: () { - context.push("/categories", - extra: (true, widget.manga.isManga! ? 0 : 1)); + context.push("/categories", extra: ( + true, + widget.manga.itemType == ItemType.manga + ? 0 + : widget.manga.itemType == ItemType.anime + ? 1 + : 2 + )); Navigator.pop(context); }, child: Text(l10n.edit)), diff --git a/lib/modules/manga/detail/providers/update_manga_detail_providers.dart b/lib/modules/manga/detail/providers/update_manga_detail_providers.dart index 26f2426..780b449 100644 --- a/lib/modules/manga/detail/providers/update_manga_detail_providers.dart +++ b/lib/modules/manga/detail/providers/update_manga_detail_providers.dart @@ -48,7 +48,7 @@ Future updateMangaDetail(UpdateMangaDetailRef ref, ..link = getManga.link?.trim().trimLeft().trimRight() ?? manga.link ..source = manga.source ..lang = manga.lang - ..isManga = source.isManga + ..itemType = source.itemType ..lastUpdate = DateTime.now().millisecondsSinceEpoch; final checkManga = isar.mangas.getSync(mangaId); if (checkManga!.chapters.isNotEmpty && isInit) { diff --git a/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart b/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart index 0224ad0..a0d087b 100644 --- a/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart +++ b/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart @@ -6,7 +6,7 @@ part of 'update_manga_detail_providers.dart'; // RiverpodGenerator // ************************************************************************** -String _$updateMangaDetailHash() => r'736b68c65f624da85b15c0a7a2a263aab8e8df7e'; +String _$updateMangaDetailHash() => r'dd2ea98fa3e4fc0c5fb9c0d3ba8334fe76e77249'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/manga/detail/widgets/chapter_list_tile_widget.dart b/lib/modules/manga/detail/widgets/chapter_list_tile_widget.dart index 2d6b8ca..7842e3d 100644 --- a/lib/modules/manga/detail/widgets/chapter_list_tile_widget.dart +++ b/lib/modules/manga/detail/widgets/chapter_list_tile_widget.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:mangayomi/models/chapter.dart'; +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/utils/date.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; @@ -89,7 +90,7 @@ class ChapterListTileWidget extends ConsumerWidget { children: [ const Text(' • '), Text( - !chapter.manga.value!.isManga! + chapter.manga.value!.itemType == ItemType.anime ? l10n.episode_progress(Duration( milliseconds: int.parse(chapter.lastPageRead!)) diff --git a/lib/modules/manga/download/providers/download_provider.dart b/lib/modules/manga/download/providers/download_provider.dart index 915d740..b7fe455 100644 --- a/lib/modules/manga/download/providers/download_provider.dart +++ b/lib/modules/manga/download/providers/download_provider.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'dart:io'; import 'dart:typed_data'; +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/page.dart'; import 'package:mangayomi/services/background_downloader/background_downloader.dart'; import 'package:isar/isar.dart'; @@ -44,9 +45,15 @@ Future> downloadChapter( : ""; final chapterName = chapter.name!.replaceForbiddenCharacters(' '); - final isManga = chapter.manga.value!.isManga!; + final itemType = chapter.manga.value!.itemType; + final isManga = itemType == ItemType.manga; + final itemTypePath = itemType == ItemType.manga + ? "Manga" + : itemType == ItemType.anime + ? "Anime" + : "Novel"; final finalPath = - "downloads/${isManga ? "Manga" : "Anime"}/${manga.source} (${manga.lang!.toUpperCase()})/${manga.name!.replaceForbiddenCharacters('_')}${isManga ? "/$scanlator${chapter.name!.replaceForbiddenCharacters('_')}" : ""}"; + "downloads/$itemTypePath/${manga.source} (${manga.lang!.toUpperCase()})/${manga.name!.replaceForbiddenCharacters('_')}${isManga ? "/$scanlator${chapter.name!.replaceForbiddenCharacters('_')}" : ""}"; path = Directory("${path1!.path}$finalPath/"); Map videoHeader = {}; bool hasM3U8File = false; diff --git a/lib/modules/manga/download/providers/download_provider.g.dart b/lib/modules/manga/download/providers/download_provider.g.dart index d35b088..fc8d456 100644 --- a/lib/modules/manga/download/providers/download_provider.g.dart +++ b/lib/modules/manga/download/providers/download_provider.g.dart @@ -6,7 +6,7 @@ part of 'download_provider.dart'; // RiverpodGenerator // ************************************************************************** -String _$downloadChapterHash() => r'ef2852f888f93e5f344241bc6b486c9dd9037251'; +String _$downloadChapterHash() => r'3f66e451bd49afa53d57630d9f33ce98ab79bfd0'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/manga/home/manga_home_screen.dart b/lib/modules/manga/home/manga_home_screen.dart index 52ab33c..b418618 100644 --- a/lib/modules/manga/home/manga_home_screen.dart +++ b/lib/modules/manga/home/manga_home_screen.dart @@ -5,6 +5,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:mangayomi/eval/dart/model/m_manga.dart'; import 'package:mangayomi/eval/dart/model/m_pages.dart'; +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/modules/library/providers/library_state_provider.dart'; @@ -548,7 +549,7 @@ class _MangaHomeScreenState extends ConsumerState { return buildProgressIndicator(); } return MangaHomeImageCardListTile( - isManga: source.isManga ?? true, + itemType: source.itemType, manga: _mangaList[index], source: source); }) @@ -568,7 +569,7 @@ class _MangaHomeScreenState extends ConsumerState { return buildProgressIndicator(); } return MangaHomeImageCard( - isManga: source.isManga ?? true, + itemType: source.itemType, manga: _mangaList[index], source: source, isComfortableGrid: isComfortableGrid, @@ -693,14 +694,14 @@ class _MangaHomeScreenState extends ConsumerState { class MangaHomeImageCard extends ConsumerStatefulWidget { final MManga manga; - final bool isManga; + final ItemType itemType; final Source source; final bool isComfortableGrid; const MangaHomeImageCard( {super.key, required this.manga, required this.source, - required this.isManga, + required this.itemType, required this.isComfortableGrid}); @override @@ -716,7 +717,7 @@ class _MangaHomeImageCardState extends ConsumerState return MangaImageCardWidget( getMangaDetail: widget.manga, source: widget.source, - isManga: widget.isManga, + itemType: widget.itemType, isComfortableGrid: widget.isComfortableGrid); } @@ -726,13 +727,13 @@ class _MangaHomeImageCardState extends ConsumerState class MangaHomeImageCardListTile extends ConsumerStatefulWidget { final MManga manga; - final bool isManga; + final ItemType itemType; final Source source; const MangaHomeImageCardListTile( {super.key, required this.manga, required this.source, - required this.isManga}); + required this.itemType}); @override ConsumerState createState() => @@ -749,7 +750,7 @@ class _MangaHomeImageCardListTileState return MangaImageCardListTileWidget( getMangaDetail: widget.manga, source: widget.source, - isManga: widget.isManga); + itemType: widget.itemType); } @override diff --git a/lib/modules/manga/reader/providers/reader_controller_provider.g.dart b/lib/modules/manga/reader/providers/reader_controller_provider.g.dart index 26f6b30..e3a7f52 100644 --- a/lib/modules/manga/reader/providers/reader_controller_provider.g.dart +++ b/lib/modules/manga/reader/providers/reader_controller_provider.g.dart @@ -169,7 +169,7 @@ class _CurrentIndexProviderElement Chapter get chapter => (origin as CurrentIndexProvider).chapter; } -String _$readerControllerHash() => r'cc4f5fbe4192def4d19d9150340d305ba0ecf463'; +String _$readerControllerHash() => r'6576f3506dc5ef309f870de3e5c6e92efe03eefd'; abstract class _$ReaderController extends BuildlessAutoDisposeNotifier { late final Chapter chapter; diff --git a/lib/modules/more/categories/categories_screen.dart b/lib/modules/more/categories/categories_screen.dart index c0262d2..40b0d90 100644 --- a/lib/modules/more/categories/categories_screen.dart +++ b/lib/modules/more/categories/categories_screen.dart @@ -48,6 +48,7 @@ class _CategoriesScreenState extends ConsumerState tabs: [ Tab(text: l10n.manga), Tab(text: l10n.anime), + Tab(text: l10n.novel), ], ), ), @@ -189,7 +190,8 @@ class _CategoriesTabState extends ConsumerState { .notifier) .addDeletedCategoryAsync( _entries[ - index], false); + index], + false); await isar .categorys .delete(_entries[ diff --git a/lib/modules/updates/updates_screen.dart b/lib/modules/updates/updates_screen.dart index f369e2a..028a029 100644 --- a/lib/modules/updates/updates_screen.dart +++ b/lib/modules/updates/updates_screen.dart @@ -42,7 +42,11 @@ class _UpdatesScreenState extends ConsumerState .idIsNotNull() .favoriteEqualTo(true) .and() - .isMangaEqualTo(_tabBarController.index == 0) + .itemTypeEqualTo(_tabBarController.index == 0 + ? ItemType.manga + : _tabBarController.index == 1 + ? ItemType.anime + : ItemType.novel) .findAllSync(); int numbers = 0; @@ -160,10 +164,14 @@ class _UpdatesScreenState extends ConsumerState List updates = isar.updates .filter() .idIsNotNull() - .chapter((q) => q.manga((q) => - q.isMangaEqualTo( - _tabBarController.index == - 0))) + .chapter((q) => q.manga((q) => q + .itemTypeEqualTo(_tabBarController + .index == + 0 + ? ItemType.manga + : _tabBarController.index == 1 + ? ItemType.anime + : ItemType.novel))) .findAllSync() .toList(); isar.writeTxnSync(() { @@ -191,6 +199,7 @@ class _UpdatesScreenState extends ConsumerState tabs: [ Tab(text: l10n.manga), Tab(text: l10n.anime), + Tab(text: l10n.novel), ], ), ), @@ -198,11 +207,15 @@ class _UpdatesScreenState extends ConsumerState padding: const EdgeInsets.only(top: 10), child: TabBarView(controller: _tabBarController, children: [ UpdateTab( - isManga: true, + itemType: ItemType.manga, query: _textEditingController.text, isLoading: _isLoading), UpdateTab( - isManga: false, + itemType: ItemType.anime, + query: _textEditingController.text, + isLoading: _isLoading), + UpdateTab( + itemType: ItemType.novel, query: _textEditingController.text, isLoading: _isLoading) ]), @@ -214,10 +227,10 @@ class _UpdatesScreenState extends ConsumerState class UpdateTab extends ConsumerStatefulWidget { final String query; - final bool isManga; + final ItemType itemType; final bool isLoading; const UpdateTab( - {required this.isManga, + {required this.itemType, required this.query, required this.isLoading, super.key}); @@ -231,7 +244,7 @@ class _UpdateTabState extends ConsumerState { Widget build(BuildContext context) { final l10n = l10nLocalizations(context)!; final update = - ref.watch(getAllUpdateStreamProvider(isManga: widget.isManga)); + ref.watch(getAllUpdateStreamProvider(itemType: widget.itemType)); return Scaffold( body: Stack( children: [ diff --git a/lib/providers/storage_provider.dart b/lib/providers/storage_provider.dart index 6bff6af..8219349 100644 --- a/lib/providers/storage_provider.dart +++ b/lib/providers/storage_provider.dart @@ -83,18 +83,28 @@ class StorageProvider { String scanlator = chapter.scanlator?.isNotEmpty ?? false ? "${chapter.scanlator!.replaceForbiddenCharacters('_')}_" : ""; - final isManga = chapter.manga.value!.isManga!; + final itemType = chapter.manga.value!.itemType; + final itemTypePath = itemType == ItemType.manga + ? "Manga" + : itemType == ItemType.anime + ? "Anime" + : "Novel"; final dir = await getDirectory(); return Directory( - "${dir!.path}/downloads/${isManga ? "Manga" : "Anime"}/${manga.source} (${manga.lang!.toUpperCase()})/${manga.name!.replaceForbiddenCharacters('_')}/$scanlator${chapter.name!.replaceForbiddenCharacters('_')}/"); + "${dir!.path}/downloads/$itemTypePath/${manga.source} (${manga.lang!.toUpperCase()})/${manga.name!.replaceForbiddenCharacters('_')}/$scanlator${chapter.name!.replaceForbiddenCharacters('_')}/"); } Future getMangaMainDirectory(Chapter chapter) async { final manga = chapter.manga.value!; - final isManga = chapter.manga.value!.isManga!; + final itemType = chapter.manga.value!.itemType; + final itemTypePath = itemType == ItemType.manga + ? "Manga" + : itemType == ItemType.anime + ? "Anime" + : "Novel"; final dir = await getDirectory(); return Directory( - "${dir!.path}/downloads/${isManga ? "Manga" : "Anime"}/${manga.source} (${manga.lang!.toUpperCase()})/${manga.name!.replaceForbiddenCharacters('_')}/"); + "${dir!.path}/downloads/$itemTypePath/${manga.source} (${manga.lang!.toUpperCase()})/${manga.name!.replaceForbiddenCharacters('_')}/"); } Future getDatabaseDirectory() async {